diff --git a/.eslintignore b/.eslintignore index 63daa4c0..60640ba7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,4 +3,4 @@ node_modules local old src/libfaust-wasm.js -webpack.config.js \ No newline at end of file +webpack.config.js diff --git a/.eslintrc.json b/.eslintrc.json index f5239b87..281a9637 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -214,4 +214,4 @@ }, "parser": "@typescript-eslint/parser", "plugins": ["@typescript-eslint"] -} \ No newline at end of file +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..fd5994a6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +package-lock.json -diff diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..4447b335 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,51 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ['master'] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: 'pages' + cancel-in-progress: true + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + - name: Install dependencies + run: npm install + - name: Build + run: npm run dist + - name: Setup Pages + uses: actions/configure-pages@v3 + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + # Upload dist repository + path: './dist' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.gitignore b/.gitignore index 401f19c5..d56ef1e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,94 +1,94 @@ -# Logs -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules -jspm_packages - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history - -# ========================= -# Operating System Files -# ========================= - -# OSX -# ========================= - -.DS_Store -.AppleDouble -.LSOverride - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# Windows -# ========================= - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# Local files -local/ -old/ - -.vscode/ - -# Dist -# dist/ \ No newline at end of file +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Local files +local/ +old/ + +.vscode/ + +# Dist +# dist/ diff --git a/.stylelintrc.json b/.stylelintrc.json index f1b0f070..66a4279d 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -5,4 +5,4 @@ "selector-combinator-space-before": "always", "no-descending-specificity": null } -} \ No newline at end of file +} diff --git a/Makefile b/Makefile deleted file mode 100644 index 18cc4333..00000000 --- a/Makefile +++ /dev/null @@ -1,55 +0,0 @@ - - -EXSRC := $(shell find dist/examples -name "*.dsp") $(shell find dist/examples -name "*.lib") -DIST := dist -FAUSTUI := node_modules/faust-ui/dist -LIBFAUST := node_modules/faust2webaudio/dist - -DEPS := $(DIST)/examples.json $(DIST)/faust-ui.html $(DIST)/faust-ui.js $(DIST)/faust-ui.js.map $(DIST)/libfaust-wasm.wasm $(DIST)/libfaust-wasm.data - -.PHONY: dist - -build: $(DEPS) - npm run build - -#################################################################### -help: - @echo "============================================================" - @echo " Faust IDE" - @echo "This Makefile is intended to generate the faust IDE web site" - @echo "============================================================" - @echo "Available targets are:" - @echo " build : build the development version of the ide" - @echo " dist : build the production version of the ide" - @echo " publish : prepare the docs folder publication (using github master/docs)" - - -dist: - npm run dist - -publish: -# make dist - rm -rf docs/* - git checkout docs/CNAME - cp -r $(DIST)/* docs - @echo Check the docs folder and commit when ready and push - - -$(DIST)/examples.json: $(EXSRC) - node ./src/listEx.js - -$(DIST)/faust-ui.html: $(FAUSTUI)/index.html - cp $< $@ - -$(DIST)/faust-ui.js: $(FAUSTUI)/faust-ui.js - cp $< $@ - -$(DIST)/faust-ui.js.map: $(FAUSTUI)/faust-ui.js.map - cp $< $@ - -$(DIST)/libfaust-wasm.wasm : $(LIBFAUST)/libfaust-wasm.wasm - cp $< $@ - -$(DIST)/libfaust-wasm.data : $(LIBFAUST)/libfaust-wasm.data - cp $< $@ - diff --git a/README.md b/README.md index b1933a09..d5358d61 100644 --- a/README.md +++ b/README.md @@ -7,23 +7,108 @@ The online [Faust IDE](https://faustide.grame.fr) can be used to _edit_, _compil ## Features #### Code Editing -The editor engine is based on [Monaco Editor](https://microsoft.github.io/monaco-editor/). It provides _syntax highlighting_, _auto completion_, _code hinting_ and direct access to the _online documentation_. The documentation command (Ctrl-D) uses the function name at the cursor position to locate to the relevant information. +The editor engine is based on [Monaco Editor](https://microsoft.github.io/monaco-editor/). It provides _syntax highlighting_, _auto completion_, _code hinting_ and direct access to the _online documentation_. The documentation command (Ctrl-D) uses the function name at the cursor position to locate the relevant information. + +#### Vim Mode Support +The Monaco Editor supports an optional mode for Vim users. To enable it, open the command pane (F1) and search for 'Toggle Vim Mode'. The same command is used to desactivate this functionality. Alternatively, you can right click on the editor and press 'Open Command Palette' to open the contextual menu. + +#### Project Files +Several DSP files can be added in the top-left *Project Files* section and edited independently. Any non standard library, like a *foo.lib* file, can simply be added by drag/drop, then used in the DSP code with `import("foo.lib");`. +DSP files or libraries can also be loaded or saved with the *Upload* and *Save As* buttons in the left column. #### Auto-Compiling -While the option is turning on, the diagram or the DSP UI will automatically be updated from the code. The editor will also try to tell if there is an error in your code. +While the option is turned on, the diagram or the DSP UI will automatically be updated from the code. The editor will also try to tell if there is an error in your code. + +#### MIDI input +MIDI Input is available for Chrome and Firefox browsers. You can also use the computer keyboard to input MIDI notes. We are using key map as Ablelon Live: A-line and Q-line for keys, ZX to move octave, CV to change velocity. + +#### Polyphonic mode +The polyphonic mode can be activated by selecting a number of voices in the _Poly Voices_ menu on the left. [Standard Polyphony Parameters](https://faustdoc.grame.fr/manual/midi/#standard-polyphony-parameters) have to be used in the DSP voice. -#### MIDI API -MIDI Input is available for Chrome Browser, you can also use the computer keyboard to input MIDI notes. We are using key map as Ablelon Live: A-line and Q-line for keys, ZX to move octave, CV to change velocity. +A global effect can be added using the `effect = foo;` [convention](https://faustdoc.grame.fr/manual/midi/#audio-effects-and-polyphonic-synthesizer), possibly adapting the voice and effect inputs/outputs to make them compatible. #### Audio Input You can choose your audio device or use an audio file to simulate the audio input of DSP. Drap and drop your file to the waveform below to substitute the file. -#### Analyzer -Both input and output have an audio analyzer. You can switch the visualization between oscilloscope and spectroscope, or change buffer size and channel. Three numbers showing at right side are current value, estimated frequency and RMS. +#### Audio Output +Audio output can be switched on/off using the he *Output is On/Output is Off* button on the bottom-right. -## Recommended Browsers +#### Audio Recording +The generated sound can be recorded on the fly then possibly saved using the *Record/Save* section on the bottom-right. + +#### Remote compilation +The currently edited DSP program can be sent to the [remote compilation service](https://github.com/grame-cncm/faustservice) which allows to export for a large number of targets, like various standalone formats, a Max/MSP external on macOS or Windows, a SuperCollider UGen.etc. Use the *Truck* button on the left column to access the list of possible *Platform* and the list of associated *Architecture*. Select one *Platform/Architecture* pair and wait a bit until you get the compiled result as a binary zipped file. +Note that some targets produce a source file (like *source/cplusplus*), or ready to be compiled projects (like *juce/plug-in* to create a [JUCE](https://juce.com) project). + +#### Audio analyzers +Tools to display audio signals are available in the left panel: + +- **Mode** can be _Offline_, _Continuous_, _On Event_ (to synchronize visualisation with control event changes), and _Manual_ (to be triggered with the _Plot (Snapshot)_ button at the bottom) + +- **Samples** changes the number of displayed samples (so corresponding to the window width) + +- **Sample Rate** displays the currently selected audio device sample rate + +- **FFT Size** and **FFT Overlap** value are used when using _Oscilloscope_ and _Spectroscope_ modes + +In the _Plot_ Tab in the middle section, you can switch the visualization between _Data_, _Interleaved_, _Oscilloscope_ and _Spectroscope_. Note that when used with _On Event_ mode, values in the _Data_ visualisation mode only change at sample 128 (since _On Event_ mode plots from 128 samples before the event). + +Both input and output have an audio analyzer in the right panel. In the small audio output window at the bottom, you can switch the visualization between _Oscilloscope_ and _Spectroscope_, or change buffer size and channel. Three numbers showing at right side are current value, estimated frequency and RMS. + +In the display zone, zoom can be changed with *2 fingers up/down slide* on macOS from 1x up to 800x. + +#### SVG Diagrams +The _Diagram_ tab allows displaying the circuit SVG diagram. You can navigate inside it by clicking on the dark blue part to go down in the circuit hierarchy, or clicking on the diagram border to go up in the circuit hierarchy. + +#### Soundfiles access + +The [soundfile](https://faustdoc.grame.fr/manual/syntax/#soundfile-primitive) primitive can be used in the IDE, **in ScriptProcessor only for now**. The audio files have to be accessed: + +- either using a full URL like https://raw.githubusercontent.com/grame-cncm/GameLAN/master/baliphone/Gamelan_1_1_C_gauche.flac + +- or by defining the soundfile base URL folder with the `declare soundfiles "https://raw.githubusercontent.com/grame-cncm/GameLAN/master/baliphone";` metadata, then the actual audio file name in the code. See this [example](https://github.com/grame-cncm/GameLAN/blob/master/baliphone/Baliphone.dsp). Several base URL can be listed with the `declare soundfiles "https://url1;https://url2;https://url3";` kind of syntax + +To access local audio files, a local server can be started: + +- install the required package with `pip install Flask Flask-CORS` (or `pip3 install Flask Flask-CORS`) + +- create a folder *my_faust_server*. Inside create a text file *server.py* with the following code and a folder *static_files*. Place your audio files inside *static_files*. + +```Python +from flask import Flask, send_from_directory, abort +from flask_cors import CORS +import os + +app = Flask(__name__) + +# Specify trusted origins +trusted_origins = os.getenv( + "TRUSTED_ORIGINS", "http://localhost,http://127.0.0.1,https://faustide.grame.fr" +).split(",") + +CORS(app, origins=trusted_origins) -The recommended browsers are the latest versions of Chrome for AudioWorklet, MIDI, but it requires an https connection to use the audio inputs. +# Serve files from a dedicated directory (e.g., "static_files") +STATIC_FILES_DIR = "static_files" +os.makedirs(STATIC_FILES_DIR, exist_ok=True) # Ensure the directory exists + +@app.route("/") +def download_file(filename): + # Simple validation to prevent directory traversal + if ".." in filename or filename.startswith("/"): + abort(404) # Not found for invalid paths + return send_from_directory(STATIC_FILES_DIR, filename) + +if __name__ == "__main__": + app.run(debug=False, port=8001) # Disable debug mode in production +``` + +- then launch the script with `python server.py`(or `python3 server.py`). Note that server URL `http://127.0.0.1:8000` is actually hardcoded in the Faust IDE and does not need to be added explicitly with `declare soundfiles "http://localhost:8000";`, but additional URLs can always be declared if needed. + +Here are polyphonic [samplers examples](https://github.com/sletz/faust-sampler). + +## Recommended Browsers +The recommended browsers are the latest versions of Chrome and Firefox for AudioWorklet and MIDI, but it requires an https connection to use the audio inputs. ## Building @@ -32,7 +117,7 @@ Firstly ensure that you have [Git](https://git-scm.com/downloads) and [Node.js]( Clone a copy of the repo then change to the directory: ```bash -git clone https://github.com/grame-cncm/faustide.git +git clone https://github.com/grame-cncm/faustide.git --depth 1 cd faustide ``` Beware: on Windows, before cloning the repository, and for the libfaust-wasm.data file line ending to be correctly handled, you'll have to do: @@ -64,55 +149,20 @@ If you need to update the editor's version using `git pull`, as the repository h ## Launching the local editor -A local HTTP server has to be started with `python -m http.server 8000` (or something similar), then use `http://127.0.0.1:8000/dist/` to launch the local editor. +A local HTTP server has to be started with `npm run serve` (or something similar), then use `http://127.0.0.1:8000/dist/` to launch the local editor. ## Versioning You'll have to raise the package version number in `package.json` before `npm run build` to properly work. ------- +## Useful links -## Deployment - -Deployment remains an operation that must take place under the user control. It must be made from the master branch. The procedure consists of: - -1) generating the site -2) copying the contents of the `dist` directory into the `docs` directory -3) checking the proper functioning of the site from the `docs` directory - -For 1), see **Building** section above -For 2), you can run: - -```bash -npm run publish -``` -If you run the copy manually, BE CAREFUL not to delete the files `CNAME` and `.nojekyll`. - -For 3), you can launch a local web server from the `docs` directory: - -```bash -python -m http.server 8000 # python 3 -``` -or -```bash -python -m SimpleHTTPServer 8000 # python 2 -``` - -**WARNING: the following step is mandatory for the deployed site to properly work !** - -Once the site is validated add (using `git add docs`) and commit the entire contents of the `docs` directory then push to git. - - -### Useful links - -- [https://faustide.grame.fr](https://faustide.grame.fr): the official link on the Faust IDE website. +- [https://faustide.grame.fr](https://faustide.grame.fr): the official link on the Faust IDE website - [https://github.com/grame-cncm/faustide](https://github.com/grame-cncm/faustide): the github repository - -### Known problems and solutions +## Known problems and solutions - evaluating a heavy DSP program may hang the IDE, which will stay in this state even if you open it again, if the **Real-time Compile** checkbox was set. You can deactivate the checkbox by opening the IDE with the `https://faustide.grame.fr/?realtime_compile=0` URL -- MIDI is only working in Chrome -- a bug in the Safari/Webkit implementation (see https://bugs.webkit.org/show_bug.cgi?id=220038) makes the AudioWorklet mode fails. You'll have to use the old ScriptProcessor mode for now +- MIDI is only working in Chrome and Firefox - the **ExpressVPN** browser extension runs a background loop when "Not Connected" which causes any instantiated FaustUI element to fail after a few seconds. Disabling the extension will solve this problem (not tested on Safari) - some users report random problems when exporting the code, like missing labels when exporting on osx/coreaudio-qt. Clearing the browser's cache and cookies can fix the issue diff --git a/dist/02-XYLO1.mp3 b/dist/02-XYLO1.mp3 deleted file mode 100644 index 5f1c9b92..00000000 Binary files a/dist/02-XYLO1.mp3 and /dev/null differ diff --git a/dist/assets/1551f4f60c37af51121f.woff2 b/dist/assets/1551f4f60c37af51121f.woff2 deleted file mode 100644 index 2217164f..00000000 Binary files a/dist/assets/1551f4f60c37af51121f.woff2 and /dev/null differ diff --git a/dist/assets/2285773e6b4b172f07d9.woff b/dist/assets/2285773e6b4b172f07d9.woff deleted file mode 100644 index 3375bef0..00000000 Binary files a/dist/assets/2285773e6b4b172f07d9.woff and /dev/null differ diff --git a/dist/assets/23f19bb08961f37aaf69.eot b/dist/assets/23f19bb08961f37aaf69.eot deleted file mode 100644 index cba6c6cc..00000000 Binary files a/dist/assets/23f19bb08961f37aaf69.eot and /dev/null differ diff --git a/dist/assets/2f517e09eb2ca6650ff5.svg b/dist/assets/2f517e09eb2ca6650ff5.svg deleted file mode 100644 index b9881a43..00000000 --- a/dist/assets/2f517e09eb2ca6650ff5.svg +++ /dev/null @@ -1,3717 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/assets/4689f52cc96215721344.svg b/dist/assets/4689f52cc96215721344.svg deleted file mode 100644 index 463af27c..00000000 --- a/dist/assets/4689f52cc96215721344.svg +++ /dev/null @@ -1,801 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/assets/491974d108fe4002b2aa.ttf b/dist/assets/491974d108fe4002b2aa.ttf deleted file mode 100644 index 7157aafb..00000000 Binary files a/dist/assets/491974d108fe4002b2aa.ttf and /dev/null differ diff --git a/dist/assets/527940b104eb2ea366c8.ttf b/dist/assets/527940b104eb2ea366c8.ttf deleted file mode 100644 index 8d75dedd..00000000 Binary files a/dist/assets/527940b104eb2ea366c8.ttf and /dev/null differ diff --git a/dist/assets/77206a6bb316fa0aded5.eot b/dist/assets/77206a6bb316fa0aded5.eot deleted file mode 100644 index a4e59893..00000000 Binary files a/dist/assets/77206a6bb316fa0aded5.eot and /dev/null differ diff --git a/dist/assets/7a3337626410ca2f4071.woff2 b/dist/assets/7a3337626410ca2f4071.woff2 deleted file mode 100644 index 56328948..00000000 Binary files a/dist/assets/7a3337626410ca2f4071.woff2 and /dev/null differ diff --git a/dist/assets/7a8b4f130182d19a2d7c.svg b/dist/assets/7a8b4f130182d19a2d7c.svg deleted file mode 100644 index 00296e95..00000000 --- a/dist/assets/7a8b4f130182d19a2d7c.svg +++ /dev/null @@ -1,5034 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/assets/9bbb245e67a133f6e486.eot b/dist/assets/9bbb245e67a133f6e486.eot deleted file mode 100644 index e9941719..00000000 Binary files a/dist/assets/9bbb245e67a133f6e486.eot and /dev/null differ diff --git a/dist/assets/b797181c93b3755f4fa1.ttf b/dist/assets/b797181c93b3755f4fa1.ttf deleted file mode 100644 index 5abfa748..00000000 Binary files a/dist/assets/b797181c93b3755f4fa1.ttf and /dev/null differ diff --git a/dist/assets/bb58e57c48a3e911f15f.woff b/dist/assets/bb58e57c48a3e911f15f.woff deleted file mode 100644 index ad077c6b..00000000 Binary files a/dist/assets/bb58e57c48a3e911f15f.woff and /dev/null differ diff --git a/dist/assets/be9ee23c0c6390141475.ttf b/dist/assets/be9ee23c0c6390141475.ttf deleted file mode 100644 index 25abf389..00000000 Binary files a/dist/assets/be9ee23c0c6390141475.ttf and /dev/null differ diff --git a/dist/assets/d878b0a6a1144760244f.woff2 b/dist/assets/d878b0a6a1144760244f.woff2 deleted file mode 100644 index 402f81c0..00000000 Binary files a/dist/assets/d878b0a6a1144760244f.woff2 and /dev/null differ diff --git a/dist/assets/eeccf4f66002c6f2ba24.woff b/dist/assets/eeccf4f66002c6f2ba24.woff deleted file mode 100644 index 23ee6634..00000000 Binary files a/dist/assets/eeccf4f66002c6f2ba24.woff and /dev/null differ diff --git a/dist/editor.worker.js b/dist/editor.worker.js deleted file mode 100644 index 4e58b88c..00000000 --- a/dist/editor.worker.js +++ /dev/null @@ -1,13926 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/arrays.js": -/*!*****************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/arrays.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ArrayQueue: () => (/* binding */ ArrayQueue), -/* harmony export */ CompareResult: () => (/* binding */ CompareResult), -/* harmony export */ arrayInsert: () => (/* binding */ arrayInsert), -/* harmony export */ asArray: () => (/* binding */ asArray), -/* harmony export */ binarySearch: () => (/* binding */ binarySearch), -/* harmony export */ binarySearch2: () => (/* binding */ binarySearch2), -/* harmony export */ coalesce: () => (/* binding */ coalesce), -/* harmony export */ compareBy: () => (/* binding */ compareBy), -/* harmony export */ distinct: () => (/* binding */ distinct), -/* harmony export */ equals: () => (/* binding */ equals), -/* harmony export */ findFirstInSorted: () => (/* binding */ findFirstInSorted), -/* harmony export */ findLast: () => (/* binding */ findLast), -/* harmony export */ findLastMaxBy: () => (/* binding */ findLastMaxBy), -/* harmony export */ findMaxBy: () => (/* binding */ findMaxBy), -/* harmony export */ findMinBy: () => (/* binding */ findMinBy), -/* harmony export */ firstOrDefault: () => (/* binding */ firstOrDefault), -/* harmony export */ groupBy: () => (/* binding */ groupBy), -/* harmony export */ insertInto: () => (/* binding */ insertInto), -/* harmony export */ isFalsyOrEmpty: () => (/* binding */ isFalsyOrEmpty), -/* harmony export */ isNonEmptyArray: () => (/* binding */ isNonEmptyArray), -/* harmony export */ lastIndex: () => (/* binding */ lastIndex), -/* harmony export */ numberComparator: () => (/* binding */ numberComparator), -/* harmony export */ pushMany: () => (/* binding */ pushMany), -/* harmony export */ pushToEnd: () => (/* binding */ pushToEnd), -/* harmony export */ pushToStart: () => (/* binding */ pushToStart), -/* harmony export */ quickSelect: () => (/* binding */ quickSelect), -/* harmony export */ range: () => (/* binding */ range), -/* harmony export */ removeFastWithoutKeepingOrder: () => (/* binding */ removeFastWithoutKeepingOrder), -/* harmony export */ splice: () => (/* binding */ splice), -/* harmony export */ tail: () => (/* binding */ tail), -/* harmony export */ tail2: () => (/* binding */ tail2) -/* harmony export */ }); -/** - * Returns the last element of an array. - * @param array The array. - * @param n Which element from the end (default is zero). - */ -function tail(array, n = 0) { - return array[array.length - (1 + n)]; -} -function tail2(arr) { - if (arr.length === 0) { - throw new Error('Invalid tail call'); - } - return [arr.slice(0, arr.length - 1), arr[arr.length - 1]]; -} -function equals(one, other, itemEquals = (a, b) => a === b) { - if (one === other) { - return true; - } - if (!one || !other) { - return false; - } - if (one.length !== other.length) { - return false; - } - for (let i = 0, len = one.length; i < len; i++) { - if (!itemEquals(one[i], other[i])) { - return false; - } - } - return true; -} -/** - * Remove the element at `index` by replacing it with the last element. This is faster than `splice` - * but changes the order of the array - */ -function removeFastWithoutKeepingOrder(array, index) { - const last = array.length - 1; - if (index < last) { - array[index] = array[last]; - } - array.pop(); -} -/** - * Performs a binary search algorithm over a sorted array. - * - * @param array The array being searched. - * @param key The value we search for. - * @param comparator A function that takes two array elements and returns zero - * if they are equal, a negative number if the first element precedes the - * second one in the sorting order, or a positive number if the second element - * precedes the first one. - * @return See {@link binarySearch2} - */ -function binarySearch(array, key, comparator) { - return binarySearch2(array.length, i => comparator(array[i], key)); -} -/** - * Performs a binary search algorithm over a sorted collection. Useful for cases - * when we need to perform a binary search over something that isn't actually an - * array, and converting data to an array would defeat the use of binary search - * in the first place. - * - * @param length The collection length. - * @param compareToKey A function that takes an index of an element in the - * collection and returns zero if the value at this index is equal to the - * search key, a negative number if the value precedes the search key in the - * sorting order, or a positive number if the search key precedes the value. - * @return A non-negative index of an element, if found. If not found, the - * result is -(n+1) (or ~n, using bitwise notation), where n is the index - * where the key should be inserted to maintain the sorting order. - */ -function binarySearch2(length, compareToKey) { - let low = 0, high = length - 1; - while (low <= high) { - const mid = ((low + high) / 2) | 0; - const comp = compareToKey(mid); - if (comp < 0) { - low = mid + 1; - } - else if (comp > 0) { - high = mid - 1; - } - else { - return mid; - } - } - return -(low + 1); -} -/** - * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false - * are located before all elements where p(x) is true. - * @returns the least x for which p(x) is true or array.length if no element fullfills the given function. - */ -function findFirstInSorted(array, p) { - let low = 0, high = array.length; - if (high === 0) { - return 0; // no children - } - while (low < high) { - const mid = Math.floor((low + high) / 2); - if (p(array[mid])) { - high = mid; - } - else { - low = mid + 1; - } - } - return low; -} -function quickSelect(nth, data, compare) { - nth = nth | 0; - if (nth >= data.length) { - throw new TypeError('invalid index'); - } - const pivotValue = data[Math.floor(data.length * Math.random())]; - const lower = []; - const higher = []; - const pivots = []; - for (const value of data) { - const val = compare(value, pivotValue); - if (val < 0) { - lower.push(value); - } - else if (val > 0) { - higher.push(value); - } - else { - pivots.push(value); - } - } - if (nth < lower.length) { - return quickSelect(nth, lower, compare); - } - else if (nth < lower.length + pivots.length) { - return pivots[0]; - } - else { - return quickSelect(nth - (lower.length + pivots.length), higher, compare); - } -} -function groupBy(data, compare) { - const result = []; - let currentGroup = undefined; - for (const element of data.slice(0).sort(compare)) { - if (!currentGroup || compare(currentGroup[0], element) !== 0) { - currentGroup = [element]; - result.push(currentGroup); - } - else { - currentGroup.push(element); - } - } - return result; -} -/** - * @returns New array with all falsy values removed. The original array IS NOT modified. - */ -function coalesce(array) { - return array.filter(e => !!e); -} -/** - * @returns false if the provided object is an array and not empty. - */ -function isFalsyOrEmpty(obj) { - return !Array.isArray(obj) || obj.length === 0; -} -function isNonEmptyArray(obj) { - return Array.isArray(obj) && obj.length > 0; -} -/** - * Removes duplicates from the given array. The optional keyFn allows to specify - * how elements are checked for equality by returning an alternate value for each. - */ -function distinct(array, keyFn = value => value) { - const seen = new Set(); - return array.filter(element => { - const key = keyFn(element); - if (seen.has(key)) { - return false; - } - seen.add(key); - return true; - }); -} -function findLast(arr, predicate) { - const idx = lastIndex(arr, predicate); - if (idx === -1) { - return undefined; - } - return arr[idx]; -} -function lastIndex(array, fn) { - for (let i = array.length - 1; i >= 0; i--) { - const element = array[i]; - if (fn(element)) { - return i; - } - } - return -1; -} -function firstOrDefault(array, notFoundValue) { - return array.length > 0 ? array[0] : notFoundValue; -} -function range(arg, to) { - let from = typeof to === 'number' ? arg : 0; - if (typeof to === 'number') { - from = arg; - } - else { - from = 0; - to = arg; - } - const result = []; - if (from <= to) { - for (let i = from; i < to; i++) { - result.push(i); - } - } - else { - for (let i = from; i > to; i--) { - result.push(i); - } - } - return result; -} -/** - * Insert `insertArr` inside `target` at `insertIndex`. - * Please don't touch unless you understand https://jsperf.com/inserting-an-array-within-an-array - */ -function arrayInsert(target, insertIndex, insertArr) { - const before = target.slice(0, insertIndex); - const after = target.slice(insertIndex); - return before.concat(insertArr, after); -} -/** - * Pushes an element to the start of the array, if found. - */ -function pushToStart(arr, value) { - const index = arr.indexOf(value); - if (index > -1) { - arr.splice(index, 1); - arr.unshift(value); - } -} -/** - * Pushes an element to the end of the array, if found. - */ -function pushToEnd(arr, value) { - const index = arr.indexOf(value); - if (index > -1) { - arr.splice(index, 1); - arr.push(value); - } -} -function pushMany(arr, items) { - for (const item of items) { - arr.push(item); - } -} -function asArray(x) { - return Array.isArray(x) ? x : [x]; -} -/** - * Insert the new items in the array. - * @param array The original array. - * @param start The zero-based location in the array from which to start inserting elements. - * @param newItems The items to be inserted - */ -function insertInto(array, start, newItems) { - const startIdx = getActualStartIndex(array, start); - const originalLength = array.length; - const newItemsLength = newItems.length; - array.length = originalLength + newItemsLength; - // Move the items after the start index, start from the end so that we don't overwrite any value. - for (let i = originalLength - 1; i >= startIdx; i--) { - array[i + newItemsLength] = array[i]; - } - for (let i = 0; i < newItemsLength; i++) { - array[i + startIdx] = newItems[i]; - } -} -/** - * Removes elements from an array and inserts new elements in their place, returning the deleted elements. Alternative to the native Array.splice method, it - * can only support limited number of items due to the maximum call stack size limit. - * @param array The original array. - * @param start The zero-based location in the array from which to start removing elements. - * @param deleteCount The number of elements to remove. - * @returns An array containing the elements that were deleted. - */ -function splice(array, start, deleteCount, newItems) { - const index = getActualStartIndex(array, start); - const result = array.splice(index, deleteCount); - insertInto(array, index, newItems); - return result; -} -/** - * Determine the actual start index (same logic as the native splice() or slice()) - * If greater than the length of the array, start will be set to the length of the array. In this case, no element will be deleted but the method will behave as an adding function, adding as many element as item[n*] provided. - * If negative, it will begin that many elements from the end of the array. (In this case, the origin -1, meaning -n is the index of the nth last element, and is therefore equivalent to the index of array.length - n.) If array.length + start is less than 0, it will begin from index 0. - * @param array The target array. - * @param start The operation index. - */ -function getActualStartIndex(array, start) { - return start < 0 ? Math.max(start + array.length, 0) : Math.min(start, array.length); -} -var CompareResult; -(function (CompareResult) { - function isLessThan(result) { - return result < 0; - } - CompareResult.isLessThan = isLessThan; - function isGreaterThan(result) { - return result > 0; - } - CompareResult.isGreaterThan = isGreaterThan; - function isNeitherLessOrGreaterThan(result) { - return result === 0; - } - CompareResult.isNeitherLessOrGreaterThan = isNeitherLessOrGreaterThan; - CompareResult.greaterThan = 1; - CompareResult.lessThan = -1; - CompareResult.neitherLessOrGreaterThan = 0; -})(CompareResult || (CompareResult = {})); -function compareBy(selector, comparator) { - return (a, b) => comparator(selector(a), selector(b)); -} -/** - * The natural order on numbers. -*/ -const numberComparator = (a, b) => a - b; -/** - * Returns the first item that is equal to or greater than every other item. -*/ -function findMaxBy(items, comparator) { - if (items.length === 0) { - return undefined; - } - let max = items[0]; - for (let i = 1; i < items.length; i++) { - const item = items[i]; - if (comparator(item, max) > 0) { - max = item; - } - } - return max; -} -/** - * Returns the last item that is equal to or greater than every other item. -*/ -function findLastMaxBy(items, comparator) { - if (items.length === 0) { - return undefined; - } - let max = items[0]; - for (let i = 1; i < items.length; i++) { - const item = items[i]; - if (comparator(item, max) >= 0) { - max = item; - } - } - return max; -} -/** - * Returns the first item that is equal to or less than every other item. -*/ -function findMinBy(items, comparator) { - return findMaxBy(items, (a, b) => -comparator(a, b)); -} -class ArrayQueue { - /** - * Constructs a queue that is backed by the given array. Runtime is O(1). - */ - constructor(items) { - this.items = items; - this.firstIdx = 0; - this.lastIdx = this.items.length - 1; - } - get length() { - return this.lastIdx - this.firstIdx + 1; - } - /** - * Consumes elements from the beginning of the queue as long as the predicate returns true. - * If no elements were consumed, `null` is returned. Has a runtime of O(result.length). - */ - takeWhile(predicate) { - // P(k) := k <= this.lastIdx && predicate(this.items[k]) - // Find s := min { k | k >= this.firstIdx && !P(k) } and return this.data[this.firstIdx...s) - let startIdx = this.firstIdx; - while (startIdx < this.items.length && predicate(this.items[startIdx])) { - startIdx++; - } - const result = startIdx === this.firstIdx ? null : this.items.slice(this.firstIdx, startIdx); - this.firstIdx = startIdx; - return result; - } - /** - * Consumes elements from the end of the queue as long as the predicate returns true. - * If no elements were consumed, `null` is returned. - * The result has the same order as the underlying array! - */ - takeFromEndWhile(predicate) { - // P(k) := this.firstIdx >= k && predicate(this.items[k]) - // Find s := max { k | k <= this.lastIdx && !P(k) } and return this.data(s...this.lastIdx] - let endIdx = this.lastIdx; - while (endIdx >= 0 && predicate(this.items[endIdx])) { - endIdx--; - } - const result = endIdx === this.lastIdx ? null : this.items.slice(endIdx + 1, this.lastIdx + 1); - this.lastIdx = endIdx; - return result; - } - peek() { - if (this.length === 0) { - return undefined; - } - return this.items[this.firstIdx]; - } - dequeue() { - const result = this.items[this.firstIdx]; - this.firstIdx++; - return result; - } - takeCount(count) { - const result = this.items.slice(this.firstIdx, this.firstIdx + count); - this.firstIdx += count; - return result; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/cache.js": -/*!****************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/cache.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CachedFunction: () => (/* binding */ CachedFunction), -/* harmony export */ LRUCachedFunction: () => (/* binding */ LRUCachedFunction) -/* harmony export */ }); -/** - * Uses a LRU cache to make a given parametrized function cached. - * Caches just the last value. - * The key must be JSON serializable. -*/ -class LRUCachedFunction { - constructor(fn) { - this.fn = fn; - this.lastCache = undefined; - this.lastArgKey = undefined; - } - get(arg) { - const key = JSON.stringify(arg); - if (this.lastArgKey !== key) { - this.lastArgKey = key; - this.lastCache = this.fn(arg); - } - return this.lastCache; - } -} -/** - * Uses an unbounded cache (referential equality) to memoize the results of the given function. -*/ -class CachedFunction { - constructor(fn) { - this.fn = fn; - this._map = new Map(); - } - get cachedValues() { - return this._map; - } - get(arg) { - if (this._map.has(arg)) { - return this._map.get(arg); - } - const value = this.fn(arg); - this._map.set(arg, value); - return value; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/cancellation.js": -/*!***********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/cancellation.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CancellationToken: () => (/* binding */ CancellationToken), -/* harmony export */ CancellationTokenSource: () => (/* binding */ CancellationTokenSource) -/* harmony export */ }); -/* harmony import */ var _event_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./event.js */ "./node_modules/monaco-editor/esm/vs/base/common/event.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const shortcutEvent = Object.freeze(function (callback, context) { - const handle = setTimeout(callback.bind(context), 0); - return { dispose() { clearTimeout(handle); } }; -}); -var CancellationToken; -(function (CancellationToken) { - function isCancellationToken(thing) { - if (thing === CancellationToken.None || thing === CancellationToken.Cancelled) { - return true; - } - if (thing instanceof MutableToken) { - return true; - } - if (!thing || typeof thing !== 'object') { - return false; - } - return typeof thing.isCancellationRequested === 'boolean' - && typeof thing.onCancellationRequested === 'function'; - } - CancellationToken.isCancellationToken = isCancellationToken; - CancellationToken.None = Object.freeze({ - isCancellationRequested: false, - onCancellationRequested: _event_js__WEBPACK_IMPORTED_MODULE_0__.Event.None - }); - CancellationToken.Cancelled = Object.freeze({ - isCancellationRequested: true, - onCancellationRequested: shortcutEvent - }); -})(CancellationToken || (CancellationToken = {})); -class MutableToken { - constructor() { - this._isCancelled = false; - this._emitter = null; - } - cancel() { - if (!this._isCancelled) { - this._isCancelled = true; - if (this._emitter) { - this._emitter.fire(undefined); - this.dispose(); - } - } - } - get isCancellationRequested() { - return this._isCancelled; - } - get onCancellationRequested() { - if (this._isCancelled) { - return shortcutEvent; - } - if (!this._emitter) { - this._emitter = new _event_js__WEBPACK_IMPORTED_MODULE_0__.Emitter(); - } - return this._emitter.event; - } - dispose() { - if (this._emitter) { - this._emitter.dispose(); - this._emitter = null; - } - } -} -class CancellationTokenSource { - constructor(parent) { - this._token = undefined; - this._parentListener = undefined; - this._parentListener = parent && parent.onCancellationRequested(this.cancel, this); - } - get token() { - if (!this._token) { - // be lazy and create the token only when - // actually needed - this._token = new MutableToken(); - } - return this._token; - } - cancel() { - if (!this._token) { - // save an object by returning the default - // cancelled token when cancellation happens - // before someone asks for the token - this._token = CancellationToken.Cancelled; - } - else if (this._token instanceof MutableToken) { - // actually cancel - this._token.cancel(); - } - } - dispose(cancel = false) { - if (cancel) { - this.cancel(); - } - if (this._parentListener) { - this._parentListener.dispose(); - } - if (!this._token) { - // ensure to initialize with an empty token if we had none - this._token = CancellationToken.None; - } - else if (this._token instanceof MutableToken) { - // actually dispose - this._token.dispose(); - } - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/codicons.js": -/*!*******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/codicons.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CSSIcon: () => (/* binding */ CSSIcon), -/* harmony export */ Codicon: () => (/* binding */ Codicon), -/* harmony export */ getCodiconAriaLabel: () => (/* binding */ getCodiconAriaLabel) -/* harmony export */ }); -// Selects all codicon names encapsulated in the `$()` syntax and wraps the -// results with spaces so that screen readers can read the text better. -function getCodiconAriaLabel(text) { - if (!text) { - return ''; - } - return text.replace(/\$\((.*?)\)/g, (_match, codiconName) => ` ${codiconName} `).trim(); -} -/** - * The Codicon library is a set of default icons that are built-in in VS Code. - * - * In the product (outside of base) Codicons should only be used as defaults. In order to have all icons in VS Code - * themeable, component should define new, UI component specific icons using `iconRegistry.registerIcon`. - * In that call a Codicon can be named as default. - */ -class Codicon { - constructor(id, definition, description) { - this.id = id; - this.definition = definition; - this.description = description; - Codicon._allCodicons.push(this); - } - get classNames() { return 'codicon codicon-' + this.id; } - // classNamesArray is useful for migrating to ES6 classlist - get classNamesArray() { return ['codicon', 'codicon-' + this.id]; } - get cssSelector() { return '.codicon.codicon-' + this.id; } - /** - * @returns Returns all default icons covered by the codicon font. Only to be used by the icon registry in platform. - */ - static getAll() { - return Codicon._allCodicons; - } -} -// registry -Codicon._allCodicons = []; -// built-in icons, with image name -Codicon.add = new Codicon('add', { fontCharacter: '\\ea60' }); -Codicon.plus = new Codicon('plus', Codicon.add.definition); -Codicon.gistNew = new Codicon('gist-new', Codicon.add.definition); -Codicon.repoCreate = new Codicon('repo-create', Codicon.add.definition); -Codicon.lightbulb = new Codicon('lightbulb', { fontCharacter: '\\ea61' }); -Codicon.lightBulb = new Codicon('light-bulb', { fontCharacter: '\\ea61' }); -Codicon.repo = new Codicon('repo', { fontCharacter: '\\ea62' }); -Codicon.repoDelete = new Codicon('repo-delete', { fontCharacter: '\\ea62' }); -Codicon.gistFork = new Codicon('gist-fork', { fontCharacter: '\\ea63' }); -Codicon.repoForked = new Codicon('repo-forked', { fontCharacter: '\\ea63' }); -Codicon.gitPullRequest = new Codicon('git-pull-request', { fontCharacter: '\\ea64' }); -Codicon.gitPullRequestAbandoned = new Codicon('git-pull-request-abandoned', { fontCharacter: '\\ea64' }); -Codicon.recordKeys = new Codicon('record-keys', { fontCharacter: '\\ea65' }); -Codicon.keyboard = new Codicon('keyboard', { fontCharacter: '\\ea65' }); -Codicon.tag = new Codicon('tag', { fontCharacter: '\\ea66' }); -Codicon.tagAdd = new Codicon('tag-add', { fontCharacter: '\\ea66' }); -Codicon.tagRemove = new Codicon('tag-remove', { fontCharacter: '\\ea66' }); -Codicon.person = new Codicon('person', { fontCharacter: '\\ea67' }); -Codicon.personFollow = new Codicon('person-follow', { fontCharacter: '\\ea67' }); -Codicon.personOutline = new Codicon('person-outline', { fontCharacter: '\\ea67' }); -Codicon.personFilled = new Codicon('person-filled', { fontCharacter: '\\ea67' }); -Codicon.gitBranch = new Codicon('git-branch', { fontCharacter: '\\ea68' }); -Codicon.gitBranchCreate = new Codicon('git-branch-create', { fontCharacter: '\\ea68' }); -Codicon.gitBranchDelete = new Codicon('git-branch-delete', { fontCharacter: '\\ea68' }); -Codicon.sourceControl = new Codicon('source-control', { fontCharacter: '\\ea68' }); -Codicon.mirror = new Codicon('mirror', { fontCharacter: '\\ea69' }); -Codicon.mirrorPublic = new Codicon('mirror-public', { fontCharacter: '\\ea69' }); -Codicon.star = new Codicon('star', { fontCharacter: '\\ea6a' }); -Codicon.starAdd = new Codicon('star-add', { fontCharacter: '\\ea6a' }); -Codicon.starDelete = new Codicon('star-delete', { fontCharacter: '\\ea6a' }); -Codicon.starEmpty = new Codicon('star-empty', { fontCharacter: '\\ea6a' }); -Codicon.comment = new Codicon('comment', { fontCharacter: '\\ea6b' }); -Codicon.commentAdd = new Codicon('comment-add', { fontCharacter: '\\ea6b' }); -Codicon.alert = new Codicon('alert', { fontCharacter: '\\ea6c' }); -Codicon.warning = new Codicon('warning', { fontCharacter: '\\ea6c' }); -Codicon.search = new Codicon('search', { fontCharacter: '\\ea6d' }); -Codicon.searchSave = new Codicon('search-save', { fontCharacter: '\\ea6d' }); -Codicon.logOut = new Codicon('log-out', { fontCharacter: '\\ea6e' }); -Codicon.signOut = new Codicon('sign-out', { fontCharacter: '\\ea6e' }); -Codicon.logIn = new Codicon('log-in', { fontCharacter: '\\ea6f' }); -Codicon.signIn = new Codicon('sign-in', { fontCharacter: '\\ea6f' }); -Codicon.eye = new Codicon('eye', { fontCharacter: '\\ea70' }); -Codicon.eyeUnwatch = new Codicon('eye-unwatch', { fontCharacter: '\\ea70' }); -Codicon.eyeWatch = new Codicon('eye-watch', { fontCharacter: '\\ea70' }); -Codicon.circleFilled = new Codicon('circle-filled', { fontCharacter: '\\ea71' }); -Codicon.primitiveDot = new Codicon('primitive-dot', { fontCharacter: '\\ea71' }); -Codicon.closeDirty = new Codicon('close-dirty', { fontCharacter: '\\ea71' }); -Codicon.debugBreakpoint = new Codicon('debug-breakpoint', { fontCharacter: '\\ea71' }); -Codicon.debugBreakpointDisabled = new Codicon('debug-breakpoint-disabled', { fontCharacter: '\\ea71' }); -Codicon.debugHint = new Codicon('debug-hint', { fontCharacter: '\\ea71' }); -Codicon.primitiveSquare = new Codicon('primitive-square', { fontCharacter: '\\ea72' }); -Codicon.edit = new Codicon('edit', { fontCharacter: '\\ea73' }); -Codicon.pencil = new Codicon('pencil', { fontCharacter: '\\ea73' }); -Codicon.info = new Codicon('info', { fontCharacter: '\\ea74' }); -Codicon.issueOpened = new Codicon('issue-opened', { fontCharacter: '\\ea74' }); -Codicon.gistPrivate = new Codicon('gist-private', { fontCharacter: '\\ea75' }); -Codicon.gitForkPrivate = new Codicon('git-fork-private', { fontCharacter: '\\ea75' }); -Codicon.lock = new Codicon('lock', { fontCharacter: '\\ea75' }); -Codicon.mirrorPrivate = new Codicon('mirror-private', { fontCharacter: '\\ea75' }); -Codicon.close = new Codicon('close', { fontCharacter: '\\ea76' }); -Codicon.removeClose = new Codicon('remove-close', { fontCharacter: '\\ea76' }); -Codicon.x = new Codicon('x', { fontCharacter: '\\ea76' }); -Codicon.repoSync = new Codicon('repo-sync', { fontCharacter: '\\ea77' }); -Codicon.sync = new Codicon('sync', { fontCharacter: '\\ea77' }); -Codicon.clone = new Codicon('clone', { fontCharacter: '\\ea78' }); -Codicon.desktopDownload = new Codicon('desktop-download', { fontCharacter: '\\ea78' }); -Codicon.beaker = new Codicon('beaker', { fontCharacter: '\\ea79' }); -Codicon.microscope = new Codicon('microscope', { fontCharacter: '\\ea79' }); -Codicon.vm = new Codicon('vm', { fontCharacter: '\\ea7a' }); -Codicon.deviceDesktop = new Codicon('device-desktop', { fontCharacter: '\\ea7a' }); -Codicon.file = new Codicon('file', { fontCharacter: '\\ea7b' }); -Codicon.fileText = new Codicon('file-text', { fontCharacter: '\\ea7b' }); -Codicon.more = new Codicon('more', { fontCharacter: '\\ea7c' }); -Codicon.ellipsis = new Codicon('ellipsis', { fontCharacter: '\\ea7c' }); -Codicon.kebabHorizontal = new Codicon('kebab-horizontal', { fontCharacter: '\\ea7c' }); -Codicon.mailReply = new Codicon('mail-reply', { fontCharacter: '\\ea7d' }); -Codicon.reply = new Codicon('reply', { fontCharacter: '\\ea7d' }); -Codicon.organization = new Codicon('organization', { fontCharacter: '\\ea7e' }); -Codicon.organizationFilled = new Codicon('organization-filled', { fontCharacter: '\\ea7e' }); -Codicon.organizationOutline = new Codicon('organization-outline', { fontCharacter: '\\ea7e' }); -Codicon.newFile = new Codicon('new-file', { fontCharacter: '\\ea7f' }); -Codicon.fileAdd = new Codicon('file-add', { fontCharacter: '\\ea7f' }); -Codicon.newFolder = new Codicon('new-folder', { fontCharacter: '\\ea80' }); -Codicon.fileDirectoryCreate = new Codicon('file-directory-create', { fontCharacter: '\\ea80' }); -Codicon.trash = new Codicon('trash', { fontCharacter: '\\ea81' }); -Codicon.trashcan = new Codicon('trashcan', { fontCharacter: '\\ea81' }); -Codicon.history = new Codicon('history', { fontCharacter: '\\ea82' }); -Codicon.clock = new Codicon('clock', { fontCharacter: '\\ea82' }); -Codicon.folder = new Codicon('folder', { fontCharacter: '\\ea83' }); -Codicon.fileDirectory = new Codicon('file-directory', { fontCharacter: '\\ea83' }); -Codicon.symbolFolder = new Codicon('symbol-folder', { fontCharacter: '\\ea83' }); -Codicon.logoGithub = new Codicon('logo-github', { fontCharacter: '\\ea84' }); -Codicon.markGithub = new Codicon('mark-github', { fontCharacter: '\\ea84' }); -Codicon.github = new Codicon('github', { fontCharacter: '\\ea84' }); -Codicon.terminal = new Codicon('terminal', { fontCharacter: '\\ea85' }); -Codicon.console = new Codicon('console', { fontCharacter: '\\ea85' }); -Codicon.repl = new Codicon('repl', { fontCharacter: '\\ea85' }); -Codicon.zap = new Codicon('zap', { fontCharacter: '\\ea86' }); -Codicon.symbolEvent = new Codicon('symbol-event', { fontCharacter: '\\ea86' }); -Codicon.error = new Codicon('error', { fontCharacter: '\\ea87' }); -Codicon.stop = new Codicon('stop', { fontCharacter: '\\ea87' }); -Codicon.variable = new Codicon('variable', { fontCharacter: '\\ea88' }); -Codicon.symbolVariable = new Codicon('symbol-variable', { fontCharacter: '\\ea88' }); -Codicon.array = new Codicon('array', { fontCharacter: '\\ea8a' }); -Codicon.symbolArray = new Codicon('symbol-array', { fontCharacter: '\\ea8a' }); -Codicon.symbolModule = new Codicon('symbol-module', { fontCharacter: '\\ea8b' }); -Codicon.symbolPackage = new Codicon('symbol-package', { fontCharacter: '\\ea8b' }); -Codicon.symbolNamespace = new Codicon('symbol-namespace', { fontCharacter: '\\ea8b' }); -Codicon.symbolObject = new Codicon('symbol-object', { fontCharacter: '\\ea8b' }); -Codicon.symbolMethod = new Codicon('symbol-method', { fontCharacter: '\\ea8c' }); -Codicon.symbolFunction = new Codicon('symbol-function', { fontCharacter: '\\ea8c' }); -Codicon.symbolConstructor = new Codicon('symbol-constructor', { fontCharacter: '\\ea8c' }); -Codicon.symbolBoolean = new Codicon('symbol-boolean', { fontCharacter: '\\ea8f' }); -Codicon.symbolNull = new Codicon('symbol-null', { fontCharacter: '\\ea8f' }); -Codicon.symbolNumeric = new Codicon('symbol-numeric', { fontCharacter: '\\ea90' }); -Codicon.symbolNumber = new Codicon('symbol-number', { fontCharacter: '\\ea90' }); -Codicon.symbolStructure = new Codicon('symbol-structure', { fontCharacter: '\\ea91' }); -Codicon.symbolStruct = new Codicon('symbol-struct', { fontCharacter: '\\ea91' }); -Codicon.symbolParameter = new Codicon('symbol-parameter', { fontCharacter: '\\ea92' }); -Codicon.symbolTypeParameter = new Codicon('symbol-type-parameter', { fontCharacter: '\\ea92' }); -Codicon.symbolKey = new Codicon('symbol-key', { fontCharacter: '\\ea93' }); -Codicon.symbolText = new Codicon('symbol-text', { fontCharacter: '\\ea93' }); -Codicon.symbolReference = new Codicon('symbol-reference', { fontCharacter: '\\ea94' }); -Codicon.goToFile = new Codicon('go-to-file', { fontCharacter: '\\ea94' }); -Codicon.symbolEnum = new Codicon('symbol-enum', { fontCharacter: '\\ea95' }); -Codicon.symbolValue = new Codicon('symbol-value', { fontCharacter: '\\ea95' }); -Codicon.symbolRuler = new Codicon('symbol-ruler', { fontCharacter: '\\ea96' }); -Codicon.symbolUnit = new Codicon('symbol-unit', { fontCharacter: '\\ea96' }); -Codicon.activateBreakpoints = new Codicon('activate-breakpoints', { fontCharacter: '\\ea97' }); -Codicon.archive = new Codicon('archive', { fontCharacter: '\\ea98' }); -Codicon.arrowBoth = new Codicon('arrow-both', { fontCharacter: '\\ea99' }); -Codicon.arrowDown = new Codicon('arrow-down', { fontCharacter: '\\ea9a' }); -Codicon.arrowLeft = new Codicon('arrow-left', { fontCharacter: '\\ea9b' }); -Codicon.arrowRight = new Codicon('arrow-right', { fontCharacter: '\\ea9c' }); -Codicon.arrowSmallDown = new Codicon('arrow-small-down', { fontCharacter: '\\ea9d' }); -Codicon.arrowSmallLeft = new Codicon('arrow-small-left', { fontCharacter: '\\ea9e' }); -Codicon.arrowSmallRight = new Codicon('arrow-small-right', { fontCharacter: '\\ea9f' }); -Codicon.arrowSmallUp = new Codicon('arrow-small-up', { fontCharacter: '\\eaa0' }); -Codicon.arrowUp = new Codicon('arrow-up', { fontCharacter: '\\eaa1' }); -Codicon.bell = new Codicon('bell', { fontCharacter: '\\eaa2' }); -Codicon.bold = new Codicon('bold', { fontCharacter: '\\eaa3' }); -Codicon.book = new Codicon('book', { fontCharacter: '\\eaa4' }); -Codicon.bookmark = new Codicon('bookmark', { fontCharacter: '\\eaa5' }); -Codicon.debugBreakpointConditionalUnverified = new Codicon('debug-breakpoint-conditional-unverified', { fontCharacter: '\\eaa6' }); -Codicon.debugBreakpointConditional = new Codicon('debug-breakpoint-conditional', { fontCharacter: '\\eaa7' }); -Codicon.debugBreakpointConditionalDisabled = new Codicon('debug-breakpoint-conditional-disabled', { fontCharacter: '\\eaa7' }); -Codicon.debugBreakpointDataUnverified = new Codicon('debug-breakpoint-data-unverified', { fontCharacter: '\\eaa8' }); -Codicon.debugBreakpointData = new Codicon('debug-breakpoint-data', { fontCharacter: '\\eaa9' }); -Codicon.debugBreakpointDataDisabled = new Codicon('debug-breakpoint-data-disabled', { fontCharacter: '\\eaa9' }); -Codicon.debugBreakpointLogUnverified = new Codicon('debug-breakpoint-log-unverified', { fontCharacter: '\\eaaa' }); -Codicon.debugBreakpointLog = new Codicon('debug-breakpoint-log', { fontCharacter: '\\eaab' }); -Codicon.debugBreakpointLogDisabled = new Codicon('debug-breakpoint-log-disabled', { fontCharacter: '\\eaab' }); -Codicon.briefcase = new Codicon('briefcase', { fontCharacter: '\\eaac' }); -Codicon.broadcast = new Codicon('broadcast', { fontCharacter: '\\eaad' }); -Codicon.browser = new Codicon('browser', { fontCharacter: '\\eaae' }); -Codicon.bug = new Codicon('bug', { fontCharacter: '\\eaaf' }); -Codicon.calendar = new Codicon('calendar', { fontCharacter: '\\eab0' }); -Codicon.caseSensitive = new Codicon('case-sensitive', { fontCharacter: '\\eab1' }); -Codicon.check = new Codicon('check', { fontCharacter: '\\eab2' }); -Codicon.checklist = new Codicon('checklist', { fontCharacter: '\\eab3' }); -Codicon.chevronDown = new Codicon('chevron-down', { fontCharacter: '\\eab4' }); -Codicon.dropDownButton = new Codicon('drop-down-button', Codicon.chevronDown.definition); -Codicon.chevronLeft = new Codicon('chevron-left', { fontCharacter: '\\eab5' }); -Codicon.chevronRight = new Codicon('chevron-right', { fontCharacter: '\\eab6' }); -Codicon.chevronUp = new Codicon('chevron-up', { fontCharacter: '\\eab7' }); -Codicon.chromeClose = new Codicon('chrome-close', { fontCharacter: '\\eab8' }); -Codicon.chromeMaximize = new Codicon('chrome-maximize', { fontCharacter: '\\eab9' }); -Codicon.chromeMinimize = new Codicon('chrome-minimize', { fontCharacter: '\\eaba' }); -Codicon.chromeRestore = new Codicon('chrome-restore', { fontCharacter: '\\eabb' }); -Codicon.circleOutline = new Codicon('circle-outline', { fontCharacter: '\\eabc' }); -Codicon.debugBreakpointUnverified = new Codicon('debug-breakpoint-unverified', { fontCharacter: '\\eabc' }); -Codicon.circleSlash = new Codicon('circle-slash', { fontCharacter: '\\eabd' }); -Codicon.circuitBoard = new Codicon('circuit-board', { fontCharacter: '\\eabe' }); -Codicon.clearAll = new Codicon('clear-all', { fontCharacter: '\\eabf' }); -Codicon.clippy = new Codicon('clippy', { fontCharacter: '\\eac0' }); -Codicon.closeAll = new Codicon('close-all', { fontCharacter: '\\eac1' }); -Codicon.cloudDownload = new Codicon('cloud-download', { fontCharacter: '\\eac2' }); -Codicon.cloudUpload = new Codicon('cloud-upload', { fontCharacter: '\\eac3' }); -Codicon.code = new Codicon('code', { fontCharacter: '\\eac4' }); -Codicon.collapseAll = new Codicon('collapse-all', { fontCharacter: '\\eac5' }); -Codicon.colorMode = new Codicon('color-mode', { fontCharacter: '\\eac6' }); -Codicon.commentDiscussion = new Codicon('comment-discussion', { fontCharacter: '\\eac7' }); -Codicon.compareChanges = new Codicon('compare-changes', { fontCharacter: '\\eafd' }); -Codicon.creditCard = new Codicon('credit-card', { fontCharacter: '\\eac9' }); -Codicon.dash = new Codicon('dash', { fontCharacter: '\\eacc' }); -Codicon.dashboard = new Codicon('dashboard', { fontCharacter: '\\eacd' }); -Codicon.database = new Codicon('database', { fontCharacter: '\\eace' }); -Codicon.debugContinue = new Codicon('debug-continue', { fontCharacter: '\\eacf' }); -Codicon.debugDisconnect = new Codicon('debug-disconnect', { fontCharacter: '\\ead0' }); -Codicon.debugPause = new Codicon('debug-pause', { fontCharacter: '\\ead1' }); -Codicon.debugRestart = new Codicon('debug-restart', { fontCharacter: '\\ead2' }); -Codicon.debugStart = new Codicon('debug-start', { fontCharacter: '\\ead3' }); -Codicon.debugStepInto = new Codicon('debug-step-into', { fontCharacter: '\\ead4' }); -Codicon.debugStepOut = new Codicon('debug-step-out', { fontCharacter: '\\ead5' }); -Codicon.debugStepOver = new Codicon('debug-step-over', { fontCharacter: '\\ead6' }); -Codicon.debugStop = new Codicon('debug-stop', { fontCharacter: '\\ead7' }); -Codicon.debug = new Codicon('debug', { fontCharacter: '\\ead8' }); -Codicon.deviceCameraVideo = new Codicon('device-camera-video', { fontCharacter: '\\ead9' }); -Codicon.deviceCamera = new Codicon('device-camera', { fontCharacter: '\\eada' }); -Codicon.deviceMobile = new Codicon('device-mobile', { fontCharacter: '\\eadb' }); -Codicon.diffAdded = new Codicon('diff-added', { fontCharacter: '\\eadc' }); -Codicon.diffIgnored = new Codicon('diff-ignored', { fontCharacter: '\\eadd' }); -Codicon.diffModified = new Codicon('diff-modified', { fontCharacter: '\\eade' }); -Codicon.diffRemoved = new Codicon('diff-removed', { fontCharacter: '\\eadf' }); -Codicon.diffRenamed = new Codicon('diff-renamed', { fontCharacter: '\\eae0' }); -Codicon.diff = new Codicon('diff', { fontCharacter: '\\eae1' }); -Codicon.discard = new Codicon('discard', { fontCharacter: '\\eae2' }); -Codicon.editorLayout = new Codicon('editor-layout', { fontCharacter: '\\eae3' }); -Codicon.emptyWindow = new Codicon('empty-window', { fontCharacter: '\\eae4' }); -Codicon.exclude = new Codicon('exclude', { fontCharacter: '\\eae5' }); -Codicon.extensions = new Codicon('extensions', { fontCharacter: '\\eae6' }); -Codicon.eyeClosed = new Codicon('eye-closed', { fontCharacter: '\\eae7' }); -Codicon.fileBinary = new Codicon('file-binary', { fontCharacter: '\\eae8' }); -Codicon.fileCode = new Codicon('file-code', { fontCharacter: '\\eae9' }); -Codicon.fileMedia = new Codicon('file-media', { fontCharacter: '\\eaea' }); -Codicon.filePdf = new Codicon('file-pdf', { fontCharacter: '\\eaeb' }); -Codicon.fileSubmodule = new Codicon('file-submodule', { fontCharacter: '\\eaec' }); -Codicon.fileSymlinkDirectory = new Codicon('file-symlink-directory', { fontCharacter: '\\eaed' }); -Codicon.fileSymlinkFile = new Codicon('file-symlink-file', { fontCharacter: '\\eaee' }); -Codicon.fileZip = new Codicon('file-zip', { fontCharacter: '\\eaef' }); -Codicon.files = new Codicon('files', { fontCharacter: '\\eaf0' }); -Codicon.filter = new Codicon('filter', { fontCharacter: '\\eaf1' }); -Codicon.flame = new Codicon('flame', { fontCharacter: '\\eaf2' }); -Codicon.foldDown = new Codicon('fold-down', { fontCharacter: '\\eaf3' }); -Codicon.foldUp = new Codicon('fold-up', { fontCharacter: '\\eaf4' }); -Codicon.fold = new Codicon('fold', { fontCharacter: '\\eaf5' }); -Codicon.folderActive = new Codicon('folder-active', { fontCharacter: '\\eaf6' }); -Codicon.folderOpened = new Codicon('folder-opened', { fontCharacter: '\\eaf7' }); -Codicon.gear = new Codicon('gear', { fontCharacter: '\\eaf8' }); -Codicon.gift = new Codicon('gift', { fontCharacter: '\\eaf9' }); -Codicon.gistSecret = new Codicon('gist-secret', { fontCharacter: '\\eafa' }); -Codicon.gist = new Codicon('gist', { fontCharacter: '\\eafb' }); -Codicon.gitCommit = new Codicon('git-commit', { fontCharacter: '\\eafc' }); -Codicon.gitCompare = new Codicon('git-compare', { fontCharacter: '\\eafd' }); -Codicon.gitMerge = new Codicon('git-merge', { fontCharacter: '\\eafe' }); -Codicon.githubAction = new Codicon('github-action', { fontCharacter: '\\eaff' }); -Codicon.githubAlt = new Codicon('github-alt', { fontCharacter: '\\eb00' }); -Codicon.globe = new Codicon('globe', { fontCharacter: '\\eb01' }); -Codicon.grabber = new Codicon('grabber', { fontCharacter: '\\eb02' }); -Codicon.graph = new Codicon('graph', { fontCharacter: '\\eb03' }); -Codicon.gripper = new Codicon('gripper', { fontCharacter: '\\eb04' }); -Codicon.heart = new Codicon('heart', { fontCharacter: '\\eb05' }); -Codicon.home = new Codicon('home', { fontCharacter: '\\eb06' }); -Codicon.horizontalRule = new Codicon('horizontal-rule', { fontCharacter: '\\eb07' }); -Codicon.hubot = new Codicon('hubot', { fontCharacter: '\\eb08' }); -Codicon.inbox = new Codicon('inbox', { fontCharacter: '\\eb09' }); -Codicon.issueClosed = new Codicon('issue-closed', { fontCharacter: '\\eba4' }); -Codicon.issueReopened = new Codicon('issue-reopened', { fontCharacter: '\\eb0b' }); -Codicon.issues = new Codicon('issues', { fontCharacter: '\\eb0c' }); -Codicon.italic = new Codicon('italic', { fontCharacter: '\\eb0d' }); -Codicon.jersey = new Codicon('jersey', { fontCharacter: '\\eb0e' }); -Codicon.json = new Codicon('json', { fontCharacter: '\\eb0f' }); -Codicon.kebabVertical = new Codicon('kebab-vertical', { fontCharacter: '\\eb10' }); -Codicon.key = new Codicon('key', { fontCharacter: '\\eb11' }); -Codicon.law = new Codicon('law', { fontCharacter: '\\eb12' }); -Codicon.lightbulbAutofix = new Codicon('lightbulb-autofix', { fontCharacter: '\\eb13' }); -Codicon.linkExternal = new Codicon('link-external', { fontCharacter: '\\eb14' }); -Codicon.link = new Codicon('link', { fontCharacter: '\\eb15' }); -Codicon.listOrdered = new Codicon('list-ordered', { fontCharacter: '\\eb16' }); -Codicon.listUnordered = new Codicon('list-unordered', { fontCharacter: '\\eb17' }); -Codicon.liveShare = new Codicon('live-share', { fontCharacter: '\\eb18' }); -Codicon.loading = new Codicon('loading', { fontCharacter: '\\eb19' }); -Codicon.location = new Codicon('location', { fontCharacter: '\\eb1a' }); -Codicon.mailRead = new Codicon('mail-read', { fontCharacter: '\\eb1b' }); -Codicon.mail = new Codicon('mail', { fontCharacter: '\\eb1c' }); -Codicon.markdown = new Codicon('markdown', { fontCharacter: '\\eb1d' }); -Codicon.megaphone = new Codicon('megaphone', { fontCharacter: '\\eb1e' }); -Codicon.mention = new Codicon('mention', { fontCharacter: '\\eb1f' }); -Codicon.milestone = new Codicon('milestone', { fontCharacter: '\\eb20' }); -Codicon.mortarBoard = new Codicon('mortar-board', { fontCharacter: '\\eb21' }); -Codicon.move = new Codicon('move', { fontCharacter: '\\eb22' }); -Codicon.multipleWindows = new Codicon('multiple-windows', { fontCharacter: '\\eb23' }); -Codicon.mute = new Codicon('mute', { fontCharacter: '\\eb24' }); -Codicon.noNewline = new Codicon('no-newline', { fontCharacter: '\\eb25' }); -Codicon.note = new Codicon('note', { fontCharacter: '\\eb26' }); -Codicon.octoface = new Codicon('octoface', { fontCharacter: '\\eb27' }); -Codicon.openPreview = new Codicon('open-preview', { fontCharacter: '\\eb28' }); -Codicon.package_ = new Codicon('package', { fontCharacter: '\\eb29' }); -Codicon.paintcan = new Codicon('paintcan', { fontCharacter: '\\eb2a' }); -Codicon.pin = new Codicon('pin', { fontCharacter: '\\eb2b' }); -Codicon.play = new Codicon('play', { fontCharacter: '\\eb2c' }); -Codicon.run = new Codicon('run', { fontCharacter: '\\eb2c' }); -Codicon.plug = new Codicon('plug', { fontCharacter: '\\eb2d' }); -Codicon.preserveCase = new Codicon('preserve-case', { fontCharacter: '\\eb2e' }); -Codicon.preview = new Codicon('preview', { fontCharacter: '\\eb2f' }); -Codicon.project = new Codicon('project', { fontCharacter: '\\eb30' }); -Codicon.pulse = new Codicon('pulse', { fontCharacter: '\\eb31' }); -Codicon.question = new Codicon('question', { fontCharacter: '\\eb32' }); -Codicon.quote = new Codicon('quote', { fontCharacter: '\\eb33' }); -Codicon.radioTower = new Codicon('radio-tower', { fontCharacter: '\\eb34' }); -Codicon.reactions = new Codicon('reactions', { fontCharacter: '\\eb35' }); -Codicon.references = new Codicon('references', { fontCharacter: '\\eb36' }); -Codicon.refresh = new Codicon('refresh', { fontCharacter: '\\eb37' }); -Codicon.regex = new Codicon('regex', { fontCharacter: '\\eb38' }); -Codicon.remoteExplorer = new Codicon('remote-explorer', { fontCharacter: '\\eb39' }); -Codicon.remote = new Codicon('remote', { fontCharacter: '\\eb3a' }); -Codicon.remove = new Codicon('remove', { fontCharacter: '\\eb3b' }); -Codicon.replaceAll = new Codicon('replace-all', { fontCharacter: '\\eb3c' }); -Codicon.replace = new Codicon('replace', { fontCharacter: '\\eb3d' }); -Codicon.repoClone = new Codicon('repo-clone', { fontCharacter: '\\eb3e' }); -Codicon.repoForcePush = new Codicon('repo-force-push', { fontCharacter: '\\eb3f' }); -Codicon.repoPull = new Codicon('repo-pull', { fontCharacter: '\\eb40' }); -Codicon.repoPush = new Codicon('repo-push', { fontCharacter: '\\eb41' }); -Codicon.report = new Codicon('report', { fontCharacter: '\\eb42' }); -Codicon.requestChanges = new Codicon('request-changes', { fontCharacter: '\\eb43' }); -Codicon.rocket = new Codicon('rocket', { fontCharacter: '\\eb44' }); -Codicon.rootFolderOpened = new Codicon('root-folder-opened', { fontCharacter: '\\eb45' }); -Codicon.rootFolder = new Codicon('root-folder', { fontCharacter: '\\eb46' }); -Codicon.rss = new Codicon('rss', { fontCharacter: '\\eb47' }); -Codicon.ruby = new Codicon('ruby', { fontCharacter: '\\eb48' }); -Codicon.saveAll = new Codicon('save-all', { fontCharacter: '\\eb49' }); -Codicon.saveAs = new Codicon('save-as', { fontCharacter: '\\eb4a' }); -Codicon.save = new Codicon('save', { fontCharacter: '\\eb4b' }); -Codicon.screenFull = new Codicon('screen-full', { fontCharacter: '\\eb4c' }); -Codicon.screenNormal = new Codicon('screen-normal', { fontCharacter: '\\eb4d' }); -Codicon.searchStop = new Codicon('search-stop', { fontCharacter: '\\eb4e' }); -Codicon.server = new Codicon('server', { fontCharacter: '\\eb50' }); -Codicon.settingsGear = new Codicon('settings-gear', { fontCharacter: '\\eb51' }); -Codicon.settings = new Codicon('settings', { fontCharacter: '\\eb52' }); -Codicon.shield = new Codicon('shield', { fontCharacter: '\\eb53' }); -Codicon.smiley = new Codicon('smiley', { fontCharacter: '\\eb54' }); -Codicon.sortPrecedence = new Codicon('sort-precedence', { fontCharacter: '\\eb55' }); -Codicon.splitHorizontal = new Codicon('split-horizontal', { fontCharacter: '\\eb56' }); -Codicon.splitVertical = new Codicon('split-vertical', { fontCharacter: '\\eb57' }); -Codicon.squirrel = new Codicon('squirrel', { fontCharacter: '\\eb58' }); -Codicon.starFull = new Codicon('star-full', { fontCharacter: '\\eb59' }); -Codicon.starHalf = new Codicon('star-half', { fontCharacter: '\\eb5a' }); -Codicon.symbolClass = new Codicon('symbol-class', { fontCharacter: '\\eb5b' }); -Codicon.symbolColor = new Codicon('symbol-color', { fontCharacter: '\\eb5c' }); -Codicon.symbolCustomColor = new Codicon('symbol-customcolor', { fontCharacter: '\\eb5c' }); -Codicon.symbolConstant = new Codicon('symbol-constant', { fontCharacter: '\\eb5d' }); -Codicon.symbolEnumMember = new Codicon('symbol-enum-member', { fontCharacter: '\\eb5e' }); -Codicon.symbolField = new Codicon('symbol-field', { fontCharacter: '\\eb5f' }); -Codicon.symbolFile = new Codicon('symbol-file', { fontCharacter: '\\eb60' }); -Codicon.symbolInterface = new Codicon('symbol-interface', { fontCharacter: '\\eb61' }); -Codicon.symbolKeyword = new Codicon('symbol-keyword', { fontCharacter: '\\eb62' }); -Codicon.symbolMisc = new Codicon('symbol-misc', { fontCharacter: '\\eb63' }); -Codicon.symbolOperator = new Codicon('symbol-operator', { fontCharacter: '\\eb64' }); -Codicon.symbolProperty = new Codicon('symbol-property', { fontCharacter: '\\eb65' }); -Codicon.wrench = new Codicon('wrench', { fontCharacter: '\\eb65' }); -Codicon.wrenchSubaction = new Codicon('wrench-subaction', { fontCharacter: '\\eb65' }); -Codicon.symbolSnippet = new Codicon('symbol-snippet', { fontCharacter: '\\eb66' }); -Codicon.tasklist = new Codicon('tasklist', { fontCharacter: '\\eb67' }); -Codicon.telescope = new Codicon('telescope', { fontCharacter: '\\eb68' }); -Codicon.textSize = new Codicon('text-size', { fontCharacter: '\\eb69' }); -Codicon.threeBars = new Codicon('three-bars', { fontCharacter: '\\eb6a' }); -Codicon.thumbsdown = new Codicon('thumbsdown', { fontCharacter: '\\eb6b' }); -Codicon.thumbsup = new Codicon('thumbsup', { fontCharacter: '\\eb6c' }); -Codicon.tools = new Codicon('tools', { fontCharacter: '\\eb6d' }); -Codicon.triangleDown = new Codicon('triangle-down', { fontCharacter: '\\eb6e' }); -Codicon.triangleLeft = new Codicon('triangle-left', { fontCharacter: '\\eb6f' }); -Codicon.triangleRight = new Codicon('triangle-right', { fontCharacter: '\\eb70' }); -Codicon.triangleUp = new Codicon('triangle-up', { fontCharacter: '\\eb71' }); -Codicon.twitter = new Codicon('twitter', { fontCharacter: '\\eb72' }); -Codicon.unfold = new Codicon('unfold', { fontCharacter: '\\eb73' }); -Codicon.unlock = new Codicon('unlock', { fontCharacter: '\\eb74' }); -Codicon.unmute = new Codicon('unmute', { fontCharacter: '\\eb75' }); -Codicon.unverified = new Codicon('unverified', { fontCharacter: '\\eb76' }); -Codicon.verified = new Codicon('verified', { fontCharacter: '\\eb77' }); -Codicon.versions = new Codicon('versions', { fontCharacter: '\\eb78' }); -Codicon.vmActive = new Codicon('vm-active', { fontCharacter: '\\eb79' }); -Codicon.vmOutline = new Codicon('vm-outline', { fontCharacter: '\\eb7a' }); -Codicon.vmRunning = new Codicon('vm-running', { fontCharacter: '\\eb7b' }); -Codicon.watch = new Codicon('watch', { fontCharacter: '\\eb7c' }); -Codicon.whitespace = new Codicon('whitespace', { fontCharacter: '\\eb7d' }); -Codicon.wholeWord = new Codicon('whole-word', { fontCharacter: '\\eb7e' }); -Codicon.window = new Codicon('window', { fontCharacter: '\\eb7f' }); -Codicon.wordWrap = new Codicon('word-wrap', { fontCharacter: '\\eb80' }); -Codicon.zoomIn = new Codicon('zoom-in', { fontCharacter: '\\eb81' }); -Codicon.zoomOut = new Codicon('zoom-out', { fontCharacter: '\\eb82' }); -Codicon.listFilter = new Codicon('list-filter', { fontCharacter: '\\eb83' }); -Codicon.listFlat = new Codicon('list-flat', { fontCharacter: '\\eb84' }); -Codicon.listSelection = new Codicon('list-selection', { fontCharacter: '\\eb85' }); -Codicon.selection = new Codicon('selection', { fontCharacter: '\\eb85' }); -Codicon.listTree = new Codicon('list-tree', { fontCharacter: '\\eb86' }); -Codicon.debugBreakpointFunctionUnverified = new Codicon('debug-breakpoint-function-unverified', { fontCharacter: '\\eb87' }); -Codicon.debugBreakpointFunction = new Codicon('debug-breakpoint-function', { fontCharacter: '\\eb88' }); -Codicon.debugBreakpointFunctionDisabled = new Codicon('debug-breakpoint-function-disabled', { fontCharacter: '\\eb88' }); -Codicon.debugStackframeActive = new Codicon('debug-stackframe-active', { fontCharacter: '\\eb89' }); -Codicon.circleSmallFilled = new Codicon('circle-small-filled', { fontCharacter: '\\eb8a' }); -Codicon.debugStackframeDot = new Codicon('debug-stackframe-dot', Codicon.circleSmallFilled.definition); -Codicon.debugStackframe = new Codicon('debug-stackframe', { fontCharacter: '\\eb8b' }); -Codicon.debugStackframeFocused = new Codicon('debug-stackframe-focused', { fontCharacter: '\\eb8b' }); -Codicon.debugBreakpointUnsupported = new Codicon('debug-breakpoint-unsupported', { fontCharacter: '\\eb8c' }); -Codicon.symbolString = new Codicon('symbol-string', { fontCharacter: '\\eb8d' }); -Codicon.debugReverseContinue = new Codicon('debug-reverse-continue', { fontCharacter: '\\eb8e' }); -Codicon.debugStepBack = new Codicon('debug-step-back', { fontCharacter: '\\eb8f' }); -Codicon.debugRestartFrame = new Codicon('debug-restart-frame', { fontCharacter: '\\eb90' }); -Codicon.callIncoming = new Codicon('call-incoming', { fontCharacter: '\\eb92' }); -Codicon.callOutgoing = new Codicon('call-outgoing', { fontCharacter: '\\eb93' }); -Codicon.menu = new Codicon('menu', { fontCharacter: '\\eb94' }); -Codicon.expandAll = new Codicon('expand-all', { fontCharacter: '\\eb95' }); -Codicon.feedback = new Codicon('feedback', { fontCharacter: '\\eb96' }); -Codicon.groupByRefType = new Codicon('group-by-ref-type', { fontCharacter: '\\eb97' }); -Codicon.ungroupByRefType = new Codicon('ungroup-by-ref-type', { fontCharacter: '\\eb98' }); -Codicon.account = new Codicon('account', { fontCharacter: '\\eb99' }); -Codicon.bellDot = new Codicon('bell-dot', { fontCharacter: '\\eb9a' }); -Codicon.debugConsole = new Codicon('debug-console', { fontCharacter: '\\eb9b' }); -Codicon.library = new Codicon('library', { fontCharacter: '\\eb9c' }); -Codicon.output = new Codicon('output', { fontCharacter: '\\eb9d' }); -Codicon.runAll = new Codicon('run-all', { fontCharacter: '\\eb9e' }); -Codicon.syncIgnored = new Codicon('sync-ignored', { fontCharacter: '\\eb9f' }); -Codicon.pinned = new Codicon('pinned', { fontCharacter: '\\eba0' }); -Codicon.githubInverted = new Codicon('github-inverted', { fontCharacter: '\\eba1' }); -Codicon.debugAlt = new Codicon('debug-alt', { fontCharacter: '\\eb91' }); -Codicon.serverProcess = new Codicon('server-process', { fontCharacter: '\\eba2' }); -Codicon.serverEnvironment = new Codicon('server-environment', { fontCharacter: '\\eba3' }); -Codicon.pass = new Codicon('pass', { fontCharacter: '\\eba4' }); -Codicon.stopCircle = new Codicon('stop-circle', { fontCharacter: '\\eba5' }); -Codicon.playCircle = new Codicon('play-circle', { fontCharacter: '\\eba6' }); -Codicon.record = new Codicon('record', { fontCharacter: '\\eba7' }); -Codicon.debugAltSmall = new Codicon('debug-alt-small', { fontCharacter: '\\eba8' }); -Codicon.vmConnect = new Codicon('vm-connect', { fontCharacter: '\\eba9' }); -Codicon.cloud = new Codicon('cloud', { fontCharacter: '\\ebaa' }); -Codicon.merge = new Codicon('merge', { fontCharacter: '\\ebab' }); -Codicon.exportIcon = new Codicon('export', { fontCharacter: '\\ebac' }); -Codicon.graphLeft = new Codicon('graph-left', { fontCharacter: '\\ebad' }); -Codicon.magnet = new Codicon('magnet', { fontCharacter: '\\ebae' }); -Codicon.notebook = new Codicon('notebook', { fontCharacter: '\\ebaf' }); -Codicon.redo = new Codicon('redo', { fontCharacter: '\\ebb0' }); -Codicon.checkAll = new Codicon('check-all', { fontCharacter: '\\ebb1' }); -Codicon.pinnedDirty = new Codicon('pinned-dirty', { fontCharacter: '\\ebb2' }); -Codicon.passFilled = new Codicon('pass-filled', { fontCharacter: '\\ebb3' }); -Codicon.circleLargeFilled = new Codicon('circle-large-filled', { fontCharacter: '\\ebb4' }); -Codicon.circleLargeOutline = new Codicon('circle-large-outline', { fontCharacter: '\\ebb5' }); -Codicon.combine = new Codicon('combine', { fontCharacter: '\\ebb6' }); -Codicon.gather = new Codicon('gather', { fontCharacter: '\\ebb6' }); -Codicon.table = new Codicon('table', { fontCharacter: '\\ebb7' }); -Codicon.variableGroup = new Codicon('variable-group', { fontCharacter: '\\ebb8' }); -Codicon.typeHierarchy = new Codicon('type-hierarchy', { fontCharacter: '\\ebb9' }); -Codicon.typeHierarchySub = new Codicon('type-hierarchy-sub', { fontCharacter: '\\ebba' }); -Codicon.typeHierarchySuper = new Codicon('type-hierarchy-super', { fontCharacter: '\\ebbb' }); -Codicon.gitPullRequestCreate = new Codicon('git-pull-request-create', { fontCharacter: '\\ebbc' }); -Codicon.runAbove = new Codicon('run-above', { fontCharacter: '\\ebbd' }); -Codicon.runBelow = new Codicon('run-below', { fontCharacter: '\\ebbe' }); -Codicon.notebookTemplate = new Codicon('notebook-template', { fontCharacter: '\\ebbf' }); -Codicon.debugRerun = new Codicon('debug-rerun', { fontCharacter: '\\ebc0' }); -Codicon.workspaceTrusted = new Codicon('workspace-trusted', { fontCharacter: '\\ebc1' }); -Codicon.workspaceUntrusted = new Codicon('workspace-untrusted', { fontCharacter: '\\ebc2' }); -Codicon.workspaceUnspecified = new Codicon('workspace-unspecified', { fontCharacter: '\\ebc3' }); -Codicon.terminalCmd = new Codicon('terminal-cmd', { fontCharacter: '\\ebc4' }); -Codicon.terminalDebian = new Codicon('terminal-debian', { fontCharacter: '\\ebc5' }); -Codicon.terminalLinux = new Codicon('terminal-linux', { fontCharacter: '\\ebc6' }); -Codicon.terminalPowershell = new Codicon('terminal-powershell', { fontCharacter: '\\ebc7' }); -Codicon.terminalTmux = new Codicon('terminal-tmux', { fontCharacter: '\\ebc8' }); -Codicon.terminalUbuntu = new Codicon('terminal-ubuntu', { fontCharacter: '\\ebc9' }); -Codicon.terminalBash = new Codicon('terminal-bash', { fontCharacter: '\\ebca' }); -Codicon.arrowSwap = new Codicon('arrow-swap', { fontCharacter: '\\ebcb' }); -Codicon.copy = new Codicon('copy', { fontCharacter: '\\ebcc' }); -Codicon.personAdd = new Codicon('person-add', { fontCharacter: '\\ebcd' }); -Codicon.filterFilled = new Codicon('filter-filled', { fontCharacter: '\\ebce' }); -Codicon.wand = new Codicon('wand', { fontCharacter: '\\ebcf' }); -Codicon.debugLineByLine = new Codicon('debug-line-by-line', { fontCharacter: '\\ebd0' }); -Codicon.inspect = new Codicon('inspect', { fontCharacter: '\\ebd1' }); -Codicon.layers = new Codicon('layers', { fontCharacter: '\\ebd2' }); -Codicon.layersDot = new Codicon('layers-dot', { fontCharacter: '\\ebd3' }); -Codicon.layersActive = new Codicon('layers-active', { fontCharacter: '\\ebd4' }); -Codicon.compass = new Codicon('compass', { fontCharacter: '\\ebd5' }); -Codicon.compassDot = new Codicon('compass-dot', { fontCharacter: '\\ebd6' }); -Codicon.compassActive = new Codicon('compass-active', { fontCharacter: '\\ebd7' }); -Codicon.azure = new Codicon('azure', { fontCharacter: '\\ebd8' }); -Codicon.issueDraft = new Codicon('issue-draft', { fontCharacter: '\\ebd9' }); -Codicon.gitPullRequestClosed = new Codicon('git-pull-request-closed', { fontCharacter: '\\ebda' }); -Codicon.gitPullRequestDraft = new Codicon('git-pull-request-draft', { fontCharacter: '\\ebdb' }); -Codicon.debugAll = new Codicon('debug-all', { fontCharacter: '\\ebdc' }); -Codicon.debugCoverage = new Codicon('debug-coverage', { fontCharacter: '\\ebdd' }); -Codicon.runErrors = new Codicon('run-errors', { fontCharacter: '\\ebde' }); -Codicon.folderLibrary = new Codicon('folder-library', { fontCharacter: '\\ebdf' }); -Codicon.debugContinueSmall = new Codicon('debug-continue-small', { fontCharacter: '\\ebe0' }); -Codicon.beakerStop = new Codicon('beaker-stop', { fontCharacter: '\\ebe1' }); -Codicon.graphLine = new Codicon('graph-line', { fontCharacter: '\\ebe2' }); -Codicon.graphScatter = new Codicon('graph-scatter', { fontCharacter: '\\ebe3' }); -Codicon.pieChart = new Codicon('pie-chart', { fontCharacter: '\\ebe4' }); -Codicon.bracket = new Codicon('bracket', Codicon.json.definition); -Codicon.bracketDot = new Codicon('bracket-dot', { fontCharacter: '\\ebe5' }); -Codicon.bracketError = new Codicon('bracket-error', { fontCharacter: '\\ebe6' }); -Codicon.lockSmall = new Codicon('lock-small', { fontCharacter: '\\ebe7' }); -Codicon.azureDevops = new Codicon('azure-devops', { fontCharacter: '\\ebe8' }); -Codicon.verifiedFilled = new Codicon('verified-filled', { fontCharacter: '\\ebe9' }); -Codicon.newLine = new Codicon('newline', { fontCharacter: '\\ebea' }); -Codicon.layout = new Codicon('layout', { fontCharacter: '\\ebeb' }); -Codicon.layoutActivitybarLeft = new Codicon('layout-activitybar-left', { fontCharacter: '\\ebec' }); -Codicon.layoutActivitybarRight = new Codicon('layout-activitybar-right', { fontCharacter: '\\ebed' }); -Codicon.layoutPanelLeft = new Codicon('layout-panel-left', { fontCharacter: '\\ebee' }); -Codicon.layoutPanelCenter = new Codicon('layout-panel-center', { fontCharacter: '\\ebef' }); -Codicon.layoutPanelJustify = new Codicon('layout-panel-justify', { fontCharacter: '\\ebf0' }); -Codicon.layoutPanelRight = new Codicon('layout-panel-right', { fontCharacter: '\\ebf1' }); -Codicon.layoutPanel = new Codicon('layout-panel', { fontCharacter: '\\ebf2' }); -Codicon.layoutSidebarLeft = new Codicon('layout-sidebar-left', { fontCharacter: '\\ebf3' }); -Codicon.layoutSidebarRight = new Codicon('layout-sidebar-right', { fontCharacter: '\\ebf4' }); -Codicon.layoutStatusbar = new Codicon('layout-statusbar', { fontCharacter: '\\ebf5' }); -Codicon.layoutMenubar = new Codicon('layout-menubar', { fontCharacter: '\\ebf6' }); -Codicon.layoutCentered = new Codicon('layout-centered', { fontCharacter: '\\ebf7' }); -Codicon.layoutSidebarRightOff = new Codicon('layout-sidebar-right-off', { fontCharacter: '\\ec00' }); -Codicon.layoutPanelOff = new Codicon('layout-panel-off', { fontCharacter: '\\ec01' }); -Codicon.layoutSidebarLeftOff = new Codicon('layout-sidebar-left-off', { fontCharacter: '\\ec02' }); -Codicon.target = new Codicon('target', { fontCharacter: '\\ebf8' }); -Codicon.indent = new Codicon('indent', { fontCharacter: '\\ebf9' }); -Codicon.recordSmall = new Codicon('record-small', { fontCharacter: '\\ebfa' }); -Codicon.errorSmall = new Codicon('error-small', { fontCharacter: '\\ebfb' }); -Codicon.arrowCircleDown = new Codicon('arrow-circle-down', { fontCharacter: '\\ebfc' }); -Codicon.arrowCircleLeft = new Codicon('arrow-circle-left', { fontCharacter: '\\ebfd' }); -Codicon.arrowCircleRight = new Codicon('arrow-circle-right', { fontCharacter: '\\ebfe' }); -Codicon.arrowCircleUp = new Codicon('arrow-circle-up', { fontCharacter: '\\ebff' }); -Codicon.heartFilled = new Codicon('heart-filled', { fontCharacter: '\\ec04' }); -Codicon.map = new Codicon('map', { fontCharacter: '\\ec05' }); -Codicon.mapFilled = new Codicon('map-filled', { fontCharacter: '\\ec06' }); -Codicon.circleSmall = new Codicon('circle-small', { fontCharacter: '\\ec07' }); -Codicon.bellSlash = new Codicon('bell-slash', { fontCharacter: '\\ec08' }); -Codicon.bellSlashDot = new Codicon('bell-slash-dot', { fontCharacter: '\\ec09' }); -Codicon.commentUnresolved = new Codicon('comment-unresolved', { fontCharacter: '\\ec0a' }); -Codicon.gitPullRequestGoToChanges = new Codicon('git-pull-request-go-to-changes', { fontCharacter: '\\ec0b' }); -Codicon.gitPullRequestNewChanges = new Codicon('git-pull-request-new-changes', { fontCharacter: '\\ec0c' }); -// derived icons, that could become separate icons -Codicon.dialogError = new Codicon('dialog-error', Codicon.error.definition); -Codicon.dialogWarning = new Codicon('dialog-warning', Codicon.warning.definition); -Codicon.dialogInfo = new Codicon('dialog-info', Codicon.info.definition); -Codicon.dialogClose = new Codicon('dialog-close', Codicon.close.definition); -Codicon.treeItemExpanded = new Codicon('tree-item-expanded', Codicon.chevronDown.definition); // collapsed is done with rotation -Codicon.treeFilterOnTypeOn = new Codicon('tree-filter-on-type-on', Codicon.listFilter.definition); -Codicon.treeFilterOnTypeOff = new Codicon('tree-filter-on-type-off', Codicon.listSelection.definition); -Codicon.treeFilterClear = new Codicon('tree-filter-clear', Codicon.close.definition); -Codicon.treeItemLoading = new Codicon('tree-item-loading', Codicon.loading.definition); -Codicon.menuSelection = new Codicon('menu-selection', Codicon.check.definition); -Codicon.menuSubmenu = new Codicon('menu-submenu', Codicon.chevronRight.definition); -Codicon.menuBarMore = new Codicon('menubar-more', Codicon.more.definition); -Codicon.scrollbarButtonLeft = new Codicon('scrollbar-button-left', Codicon.triangleLeft.definition); -Codicon.scrollbarButtonRight = new Codicon('scrollbar-button-right', Codicon.triangleRight.definition); -Codicon.scrollbarButtonUp = new Codicon('scrollbar-button-up', Codicon.triangleUp.definition); -Codicon.scrollbarButtonDown = new Codicon('scrollbar-button-down', Codicon.triangleDown.definition); -Codicon.toolBarMore = new Codicon('toolbar-more', Codicon.more.definition); -Codicon.quickInputBack = new Codicon('quick-input-back', Codicon.arrowLeft.definition); -var CSSIcon; -(function (CSSIcon) { - CSSIcon.iconNameSegment = '[A-Za-z0-9]+'; - CSSIcon.iconNameExpression = '[A-Za-z0-9-]+'; - CSSIcon.iconModifierExpression = '~[A-Za-z]+'; - CSSIcon.iconNameCharacter = '[A-Za-z0-9~-]'; - const cssIconIdRegex = new RegExp(`^(${CSSIcon.iconNameExpression})(${CSSIcon.iconModifierExpression})?$`); - function asClassNameArray(icon) { - if (icon instanceof Codicon) { - return ['codicon', 'codicon-' + icon.id]; - } - const match = cssIconIdRegex.exec(icon.id); - if (!match) { - return asClassNameArray(Codicon.error); - } - const [, id, modifier] = match; - const classNames = ['codicon', 'codicon-' + id]; - if (modifier) { - classNames.push('codicon-modifier-' + modifier.substr(1)); - } - return classNames; - } - CSSIcon.asClassNameArray = asClassNameArray; - function asClassName(icon) { - return asClassNameArray(icon).join(' '); - } - CSSIcon.asClassName = asClassName; - function asCSSSelector(icon) { - return '.' + asClassNameArray(icon).join('.'); - } - CSSIcon.asCSSSelector = asCSSSelector; -})(CSSIcon || (CSSIcon = {})); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/diff/diff.js": -/*!********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/diff/diff.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Debug: () => (/* binding */ Debug), -/* harmony export */ LcsDiff: () => (/* binding */ LcsDiff), -/* harmony export */ MyArray: () => (/* binding */ MyArray), -/* harmony export */ StringDiffSequence: () => (/* binding */ StringDiffSequence), -/* harmony export */ stringDiff: () => (/* binding */ stringDiff) -/* harmony export */ }); -/* harmony import */ var _diffChange_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diffChange.js */ "./node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js"); -/* harmony import */ var _hash_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../hash.js */ "./node_modules/monaco-editor/esm/vs/base/common/hash.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -class StringDiffSequence { - constructor(source) { - this.source = source; - } - getElements() { - const source = this.source; - const characters = new Int32Array(source.length); - for (let i = 0, len = source.length; i < len; i++) { - characters[i] = source.charCodeAt(i); - } - return characters; - } -} -function stringDiff(original, modified, pretty) { - return new LcsDiff(new StringDiffSequence(original), new StringDiffSequence(modified)).ComputeDiff(pretty).changes; -} -// -// The code below has been ported from a C# implementation in VS -// -class Debug { - static Assert(condition, message) { - if (!condition) { - throw new Error(message); - } - } -} -class MyArray { - /** - * Copies a range of elements from an Array starting at the specified source index and pastes - * them to another Array starting at the specified destination index. The length and the indexes - * are specified as 64-bit integers. - * sourceArray: - * The Array that contains the data to copy. - * sourceIndex: - * A 64-bit integer that represents the index in the sourceArray at which copying begins. - * destinationArray: - * The Array that receives the data. - * destinationIndex: - * A 64-bit integer that represents the index in the destinationArray at which storing begins. - * length: - * A 64-bit integer that represents the number of elements to copy. - */ - static Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length) { - for (let i = 0; i < length; i++) { - destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i]; - } - } - static Copy2(sourceArray, sourceIndex, destinationArray, destinationIndex, length) { - for (let i = 0; i < length; i++) { - destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i]; - } - } -} -/** - * A utility class which helps to create the set of DiffChanges from - * a difference operation. This class accepts original DiffElements and - * modified DiffElements that are involved in a particular change. The - * MarkNextChange() method can be called to mark the separation between - * distinct changes. At the end, the Changes property can be called to retrieve - * the constructed changes. - */ -class DiffChangeHelper { - /** - * Constructs a new DiffChangeHelper for the given DiffSequences. - */ - constructor() { - this.m_changes = []; - this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */; - this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */; - this.m_originalCount = 0; - this.m_modifiedCount = 0; - } - /** - * Marks the beginning of the next change in the set of differences. - */ - MarkNextChange() { - // Only add to the list if there is something to add - if (this.m_originalCount > 0 || this.m_modifiedCount > 0) { - // Add the new change to our list - this.m_changes.push(new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount)); - } - // Reset for the next change - this.m_originalCount = 0; - this.m_modifiedCount = 0; - this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */; - this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */; - } - /** - * Adds the original element at the given position to the elements - * affected by the current change. The modified index gives context - * to the change position with respect to the original sequence. - * @param originalIndex The index of the original element to add. - * @param modifiedIndex The index of the modified element that provides corresponding position in the modified sequence. - */ - AddOriginalElement(originalIndex, modifiedIndex) { - // The 'true' start index is the smallest of the ones we've seen - this.m_originalStart = Math.min(this.m_originalStart, originalIndex); - this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex); - this.m_originalCount++; - } - /** - * Adds the modified element at the given position to the elements - * affected by the current change. The original index gives context - * to the change position with respect to the modified sequence. - * @param originalIndex The index of the original element that provides corresponding position in the original sequence. - * @param modifiedIndex The index of the modified element to add. - */ - AddModifiedElement(originalIndex, modifiedIndex) { - // The 'true' start index is the smallest of the ones we've seen - this.m_originalStart = Math.min(this.m_originalStart, originalIndex); - this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex); - this.m_modifiedCount++; - } - /** - * Retrieves all of the changes marked by the class. - */ - getChanges() { - if (this.m_originalCount > 0 || this.m_modifiedCount > 0) { - // Finish up on whatever is left - this.MarkNextChange(); - } - return this.m_changes; - } - /** - * Retrieves all of the changes marked by the class in the reverse order - */ - getReverseChanges() { - if (this.m_originalCount > 0 || this.m_modifiedCount > 0) { - // Finish up on whatever is left - this.MarkNextChange(); - } - this.m_changes.reverse(); - return this.m_changes; - } -} -/** - * An implementation of the difference algorithm described in - * "An O(ND) Difference Algorithm and its variations" by Eugene W. Myers - */ -class LcsDiff { - /** - * Constructs the DiffFinder - */ - constructor(originalSequence, modifiedSequence, continueProcessingPredicate = null) { - this.ContinueProcessingPredicate = continueProcessingPredicate; - this._originalSequence = originalSequence; - this._modifiedSequence = modifiedSequence; - const [originalStringElements, originalElementsOrHash, originalHasStrings] = LcsDiff._getElements(originalSequence); - const [modifiedStringElements, modifiedElementsOrHash, modifiedHasStrings] = LcsDiff._getElements(modifiedSequence); - this._hasStrings = (originalHasStrings && modifiedHasStrings); - this._originalStringElements = originalStringElements; - this._originalElementsOrHash = originalElementsOrHash; - this._modifiedStringElements = modifiedStringElements; - this._modifiedElementsOrHash = modifiedElementsOrHash; - this.m_forwardHistory = []; - this.m_reverseHistory = []; - } - static _isStringArray(arr) { - return (arr.length > 0 && typeof arr[0] === 'string'); - } - static _getElements(sequence) { - const elements = sequence.getElements(); - if (LcsDiff._isStringArray(elements)) { - const hashes = new Int32Array(elements.length); - for (let i = 0, len = elements.length; i < len; i++) { - hashes[i] = (0,_hash_js__WEBPACK_IMPORTED_MODULE_1__.stringHash)(elements[i], 0); - } - return [elements, hashes, true]; - } - if (elements instanceof Int32Array) { - return [[], elements, false]; - } - return [[], new Int32Array(elements), false]; - } - ElementsAreEqual(originalIndex, newIndex) { - if (this._originalElementsOrHash[originalIndex] !== this._modifiedElementsOrHash[newIndex]) { - return false; - } - return (this._hasStrings ? this._originalStringElements[originalIndex] === this._modifiedStringElements[newIndex] : true); - } - ElementsAreStrictEqual(originalIndex, newIndex) { - if (!this.ElementsAreEqual(originalIndex, newIndex)) { - return false; - } - const originalElement = LcsDiff._getStrictElement(this._originalSequence, originalIndex); - const modifiedElement = LcsDiff._getStrictElement(this._modifiedSequence, newIndex); - return (originalElement === modifiedElement); - } - static _getStrictElement(sequence, index) { - if (typeof sequence.getStrictElement === 'function') { - return sequence.getStrictElement(index); - } - return null; - } - OriginalElementsAreEqual(index1, index2) { - if (this._originalElementsOrHash[index1] !== this._originalElementsOrHash[index2]) { - return false; - } - return (this._hasStrings ? this._originalStringElements[index1] === this._originalStringElements[index2] : true); - } - ModifiedElementsAreEqual(index1, index2) { - if (this._modifiedElementsOrHash[index1] !== this._modifiedElementsOrHash[index2]) { - return false; - } - return (this._hasStrings ? this._modifiedStringElements[index1] === this._modifiedStringElements[index2] : true); - } - ComputeDiff(pretty) { - return this._ComputeDiff(0, this._originalElementsOrHash.length - 1, 0, this._modifiedElementsOrHash.length - 1, pretty); - } - /** - * Computes the differences between the original and modified input - * sequences on the bounded range. - * @returns An array of the differences between the two input sequences. - */ - _ComputeDiff(originalStart, originalEnd, modifiedStart, modifiedEnd, pretty) { - const quitEarlyArr = [false]; - let changes = this.ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr); - if (pretty) { - // We have to clean up the computed diff to be more intuitive - // but it turns out this cannot be done correctly until the entire set - // of diffs have been computed - changes = this.PrettifyChanges(changes); - } - return { - quitEarly: quitEarlyArr[0], - changes: changes - }; - } - /** - * Private helper method which computes the differences on the bounded range - * recursively. - * @returns An array of the differences between the two input sequences. - */ - ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr) { - quitEarlyArr[0] = false; - // Find the start of the differences - while (originalStart <= originalEnd && modifiedStart <= modifiedEnd && this.ElementsAreEqual(originalStart, modifiedStart)) { - originalStart++; - modifiedStart++; - } - // Find the end of the differences - while (originalEnd >= originalStart && modifiedEnd >= modifiedStart && this.ElementsAreEqual(originalEnd, modifiedEnd)) { - originalEnd--; - modifiedEnd--; - } - // In the special case where we either have all insertions or all deletions or the sequences are identical - if (originalStart > originalEnd || modifiedStart > modifiedEnd) { - let changes; - if (modifiedStart <= modifiedEnd) { - Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd'); - // All insertions - changes = [ - new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(originalStart, 0, modifiedStart, modifiedEnd - modifiedStart + 1) - ]; - } - else if (originalStart <= originalEnd) { - Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd'); - // All deletions - changes = [ - new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, 0) - ]; - } - else { - Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd'); - Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd'); - // Identical sequences - No differences - changes = []; - } - return changes; - } - // This problem can be solved using the Divide-And-Conquer technique. - const midOriginalArr = [0]; - const midModifiedArr = [0]; - const result = this.ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr); - const midOriginal = midOriginalArr[0]; - const midModified = midModifiedArr[0]; - if (result !== null) { - // Result is not-null when there was enough memory to compute the changes while - // searching for the recursion point - return result; - } - else if (!quitEarlyArr[0]) { - // We can break the problem down recursively by finding the changes in the - // First Half: (originalStart, modifiedStart) to (midOriginal, midModified) - // Second Half: (midOriginal + 1, minModified + 1) to (originalEnd, modifiedEnd) - // NOTE: ComputeDiff() is inclusive, therefore the second range starts on the next point - const leftChanges = this.ComputeDiffRecursive(originalStart, midOriginal, modifiedStart, midModified, quitEarlyArr); - let rightChanges = []; - if (!quitEarlyArr[0]) { - rightChanges = this.ComputeDiffRecursive(midOriginal + 1, originalEnd, midModified + 1, modifiedEnd, quitEarlyArr); - } - else { - // We didn't have time to finish the first half, so we don't have time to compute this half. - // Consider the entire rest of the sequence different. - rightChanges = [ - new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(midOriginal + 1, originalEnd - (midOriginal + 1) + 1, midModified + 1, modifiedEnd - (midModified + 1) + 1) - ]; - } - return this.ConcatenateChanges(leftChanges, rightChanges); - } - // If we hit here, we quit early, and so can't return anything meaningful - return [ - new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1) - ]; - } - WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr) { - let forwardChanges = null; - let reverseChanges = null; - // First, walk backward through the forward diagonals history - let changeHelper = new DiffChangeHelper(); - let diagonalMin = diagonalForwardStart; - let diagonalMax = diagonalForwardEnd; - let diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalForwardOffset; - let lastOriginalIndex = -1073741824 /* Constants.MIN_SAFE_SMALL_INTEGER */; - let historyIndex = this.m_forwardHistory.length - 1; - do { - // Get the diagonal index from the relative diagonal number - const diagonal = diagonalRelative + diagonalForwardBase; - // Figure out where we came from - if (diagonal === diagonalMin || (diagonal < diagonalMax && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) { - // Vertical line (the element is an insert) - originalIndex = forwardPoints[diagonal + 1]; - modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset; - if (originalIndex < lastOriginalIndex) { - changeHelper.MarkNextChange(); - } - lastOriginalIndex = originalIndex; - changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex); - diagonalRelative = (diagonal + 1) - diagonalForwardBase; //Setup for the next iteration - } - else { - // Horizontal line (the element is a deletion) - originalIndex = forwardPoints[diagonal - 1] + 1; - modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset; - if (originalIndex < lastOriginalIndex) { - changeHelper.MarkNextChange(); - } - lastOriginalIndex = originalIndex - 1; - changeHelper.AddOriginalElement(originalIndex, modifiedIndex + 1); - diagonalRelative = (diagonal - 1) - diagonalForwardBase; //Setup for the next iteration - } - if (historyIndex >= 0) { - forwardPoints = this.m_forwardHistory[historyIndex]; - diagonalForwardBase = forwardPoints[0]; //We stored this in the first spot - diagonalMin = 1; - diagonalMax = forwardPoints.length - 1; - } - } while (--historyIndex >= -1); - // Ironically, we get the forward changes as the reverse of the - // order we added them since we technically added them backwards - forwardChanges = changeHelper.getReverseChanges(); - if (quitEarlyArr[0]) { - // TODO: Calculate a partial from the reverse diagonals. - // For now, just assume everything after the midOriginal/midModified point is a diff - let originalStartPoint = midOriginalArr[0] + 1; - let modifiedStartPoint = midModifiedArr[0] + 1; - if (forwardChanges !== null && forwardChanges.length > 0) { - const lastForwardChange = forwardChanges[forwardChanges.length - 1]; - originalStartPoint = Math.max(originalStartPoint, lastForwardChange.getOriginalEnd()); - modifiedStartPoint = Math.max(modifiedStartPoint, lastForwardChange.getModifiedEnd()); - } - reverseChanges = [ - new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(originalStartPoint, originalEnd - originalStartPoint + 1, modifiedStartPoint, modifiedEnd - modifiedStartPoint + 1) - ]; - } - else { - // Now walk backward through the reverse diagonals history - changeHelper = new DiffChangeHelper(); - diagonalMin = diagonalReverseStart; - diagonalMax = diagonalReverseEnd; - diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalReverseOffset; - lastOriginalIndex = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */; - historyIndex = (deltaIsEven) ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2; - do { - // Get the diagonal index from the relative diagonal number - const diagonal = diagonalRelative + diagonalReverseBase; - // Figure out where we came from - if (diagonal === diagonalMin || (diagonal < diagonalMax && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) { - // Horizontal line (the element is a deletion)) - originalIndex = reversePoints[diagonal + 1] - 1; - modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset; - if (originalIndex > lastOriginalIndex) { - changeHelper.MarkNextChange(); - } - lastOriginalIndex = originalIndex + 1; - changeHelper.AddOriginalElement(originalIndex + 1, modifiedIndex + 1); - diagonalRelative = (diagonal + 1) - diagonalReverseBase; //Setup for the next iteration - } - else { - // Vertical line (the element is an insertion) - originalIndex = reversePoints[diagonal - 1]; - modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset; - if (originalIndex > lastOriginalIndex) { - changeHelper.MarkNextChange(); - } - lastOriginalIndex = originalIndex; - changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex + 1); - diagonalRelative = (diagonal - 1) - diagonalReverseBase; //Setup for the next iteration - } - if (historyIndex >= 0) { - reversePoints = this.m_reverseHistory[historyIndex]; - diagonalReverseBase = reversePoints[0]; //We stored this in the first spot - diagonalMin = 1; - diagonalMax = reversePoints.length - 1; - } - } while (--historyIndex >= -1); - // There are cases where the reverse history will find diffs that - // are correct, but not intuitive, so we need shift them. - reverseChanges = changeHelper.getChanges(); - } - return this.ConcatenateChanges(forwardChanges, reverseChanges); - } - /** - * Given the range to compute the diff on, this method finds the point: - * (midOriginal, midModified) - * that exists in the middle of the LCS of the two sequences and - * is the point at which the LCS problem may be broken down recursively. - * This method will try to keep the LCS trace in memory. If the LCS recursion - * point is calculated and the full trace is available in memory, then this method - * will return the change list. - * @param originalStart The start bound of the original sequence range - * @param originalEnd The end bound of the original sequence range - * @param modifiedStart The start bound of the modified sequence range - * @param modifiedEnd The end bound of the modified sequence range - * @param midOriginal The middle point of the original sequence range - * @param midModified The middle point of the modified sequence range - * @returns The diff changes, if available, otherwise null - */ - ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr) { - let originalIndex = 0, modifiedIndex = 0; - let diagonalForwardStart = 0, diagonalForwardEnd = 0; - let diagonalReverseStart = 0, diagonalReverseEnd = 0; - // To traverse the edit graph and produce the proper LCS, our actual - // start position is just outside the given boundary - originalStart--; - modifiedStart--; - // We set these up to make the compiler happy, but they will - // be replaced before we return with the actual recursion point - midOriginalArr[0] = 0; - midModifiedArr[0] = 0; - // Clear out the history - this.m_forwardHistory = []; - this.m_reverseHistory = []; - // Each cell in the two arrays corresponds to a diagonal in the edit graph. - // The integer value in the cell represents the originalIndex of the furthest - // reaching point found so far that ends in that diagonal. - // The modifiedIndex can be computed mathematically from the originalIndex and the diagonal number. - const maxDifferences = (originalEnd - originalStart) + (modifiedEnd - modifiedStart); - const numDiagonals = maxDifferences + 1; - const forwardPoints = new Int32Array(numDiagonals); - const reversePoints = new Int32Array(numDiagonals); - // diagonalForwardBase: Index into forwardPoints of the diagonal which passes through (originalStart, modifiedStart) - // diagonalReverseBase: Index into reversePoints of the diagonal which passes through (originalEnd, modifiedEnd) - const diagonalForwardBase = (modifiedEnd - modifiedStart); - const diagonalReverseBase = (originalEnd - originalStart); - // diagonalForwardOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the - // diagonal number (relative to diagonalForwardBase) - // diagonalReverseOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the - // diagonal number (relative to diagonalReverseBase) - const diagonalForwardOffset = (originalStart - modifiedStart); - const diagonalReverseOffset = (originalEnd - modifiedEnd); - // delta: The difference between the end diagonal and the start diagonal. This is used to relate diagonal numbers - // relative to the start diagonal with diagonal numbers relative to the end diagonal. - // The Even/Oddn-ness of this delta is important for determining when we should check for overlap - const delta = diagonalReverseBase - diagonalForwardBase; - const deltaIsEven = (delta % 2 === 0); - // Here we set up the start and end points as the furthest points found so far - // in both the forward and reverse directions, respectively - forwardPoints[diagonalForwardBase] = originalStart; - reversePoints[diagonalReverseBase] = originalEnd; - // Remember if we quit early, and thus need to do a best-effort result instead of a real result. - quitEarlyArr[0] = false; - // A couple of points: - // --With this method, we iterate on the number of differences between the two sequences. - // The more differences there actually are, the longer this will take. - // --Also, as the number of differences increases, we have to search on diagonals further - // away from the reference diagonal (which is diagonalForwardBase for forward, diagonalReverseBase for reverse). - // --We extend on even diagonals (relative to the reference diagonal) only when numDifferences - // is even and odd diagonals only when numDifferences is odd. - for (let numDifferences = 1; numDifferences <= (maxDifferences / 2) + 1; numDifferences++) { - let furthestOriginalIndex = 0; - let furthestModifiedIndex = 0; - // Run the algorithm in the forward direction - diagonalForwardStart = this.ClipDiagonalBound(diagonalForwardBase - numDifferences, numDifferences, diagonalForwardBase, numDiagonals); - diagonalForwardEnd = this.ClipDiagonalBound(diagonalForwardBase + numDifferences, numDifferences, diagonalForwardBase, numDiagonals); - for (let diagonal = diagonalForwardStart; diagonal <= diagonalForwardEnd; diagonal += 2) { - // STEP 1: We extend the furthest reaching point in the present diagonal - // by looking at the diagonals above and below and picking the one whose point - // is further away from the start point (originalStart, modifiedStart) - if (diagonal === diagonalForwardStart || (diagonal < diagonalForwardEnd && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) { - originalIndex = forwardPoints[diagonal + 1]; - } - else { - originalIndex = forwardPoints[diagonal - 1] + 1; - } - modifiedIndex = originalIndex - (diagonal - diagonalForwardBase) - diagonalForwardOffset; - // Save the current originalIndex so we can test for false overlap in step 3 - const tempOriginalIndex = originalIndex; - // STEP 2: We can continue to extend the furthest reaching point in the present diagonal - // so long as the elements are equal. - while (originalIndex < originalEnd && modifiedIndex < modifiedEnd && this.ElementsAreEqual(originalIndex + 1, modifiedIndex + 1)) { - originalIndex++; - modifiedIndex++; - } - forwardPoints[diagonal] = originalIndex; - if (originalIndex + modifiedIndex > furthestOriginalIndex + furthestModifiedIndex) { - furthestOriginalIndex = originalIndex; - furthestModifiedIndex = modifiedIndex; - } - // STEP 3: If delta is odd (overlap first happens on forward when delta is odd) - // and diagonal is in the range of reverse diagonals computed for numDifferences-1 - // (the previous iteration; we haven't computed reverse diagonals for numDifferences yet) - // then check for overlap. - if (!deltaIsEven && Math.abs(diagonal - diagonalReverseBase) <= (numDifferences - 1)) { - if (originalIndex >= reversePoints[diagonal]) { - midOriginalArr[0] = originalIndex; - midModifiedArr[0] = modifiedIndex; - if (tempOriginalIndex <= reversePoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) { - // BINGO! We overlapped, and we have the full trace in memory! - return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); - } - else { - // Either false overlap, or we didn't have enough memory for the full trace - // Just return the recursion point - return null; - } - } - } - } - // Check to see if we should be quitting early, before moving on to the next iteration. - const matchLengthOfLongest = ((furthestOriginalIndex - originalStart) + (furthestModifiedIndex - modifiedStart) - numDifferences) / 2; - if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(furthestOriginalIndex, matchLengthOfLongest)) { - // We can't finish, so skip ahead to generating a result from what we have. - quitEarlyArr[0] = true; - // Use the furthest distance we got in the forward direction. - midOriginalArr[0] = furthestOriginalIndex; - midModifiedArr[0] = furthestModifiedIndex; - if (matchLengthOfLongest > 0 && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) { - // Enough of the history is in memory to walk it backwards - return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); - } - else { - // We didn't actually remember enough of the history. - //Since we are quitting the diff early, we need to shift back the originalStart and modified start - //back into the boundary limits since we decremented their value above beyond the boundary limit. - originalStart++; - modifiedStart++; - return [ - new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1) - ]; - } - } - // Run the algorithm in the reverse direction - diagonalReverseStart = this.ClipDiagonalBound(diagonalReverseBase - numDifferences, numDifferences, diagonalReverseBase, numDiagonals); - diagonalReverseEnd = this.ClipDiagonalBound(diagonalReverseBase + numDifferences, numDifferences, diagonalReverseBase, numDiagonals); - for (let diagonal = diagonalReverseStart; diagonal <= diagonalReverseEnd; diagonal += 2) { - // STEP 1: We extend the furthest reaching point in the present diagonal - // by looking at the diagonals above and below and picking the one whose point - // is further away from the start point (originalEnd, modifiedEnd) - if (diagonal === diagonalReverseStart || (diagonal < diagonalReverseEnd && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) { - originalIndex = reversePoints[diagonal + 1] - 1; - } - else { - originalIndex = reversePoints[diagonal - 1]; - } - modifiedIndex = originalIndex - (diagonal - diagonalReverseBase) - diagonalReverseOffset; - // Save the current originalIndex so we can test for false overlap - const tempOriginalIndex = originalIndex; - // STEP 2: We can continue to extend the furthest reaching point in the present diagonal - // as long as the elements are equal. - while (originalIndex > originalStart && modifiedIndex > modifiedStart && this.ElementsAreEqual(originalIndex, modifiedIndex)) { - originalIndex--; - modifiedIndex--; - } - reversePoints[diagonal] = originalIndex; - // STEP 4: If delta is even (overlap first happens on reverse when delta is even) - // and diagonal is in the range of forward diagonals computed for numDifferences - // then check for overlap. - if (deltaIsEven && Math.abs(diagonal - diagonalForwardBase) <= numDifferences) { - if (originalIndex <= forwardPoints[diagonal]) { - midOriginalArr[0] = originalIndex; - midModifiedArr[0] = modifiedIndex; - if (tempOriginalIndex >= forwardPoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) { - // BINGO! We overlapped, and we have the full trace in memory! - return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); - } - else { - // Either false overlap, or we didn't have enough memory for the full trace - // Just return the recursion point - return null; - } - } - } - } - // Save current vectors to history before the next iteration - if (numDifferences <= 1447 /* LocalConstants.MaxDifferencesHistory */) { - // We are allocating space for one extra int, which we fill with - // the index of the diagonal base index - let temp = new Int32Array(diagonalForwardEnd - diagonalForwardStart + 2); - temp[0] = diagonalForwardBase - diagonalForwardStart + 1; - MyArray.Copy2(forwardPoints, diagonalForwardStart, temp, 1, diagonalForwardEnd - diagonalForwardStart + 1); - this.m_forwardHistory.push(temp); - temp = new Int32Array(diagonalReverseEnd - diagonalReverseStart + 2); - temp[0] = diagonalReverseBase - diagonalReverseStart + 1; - MyArray.Copy2(reversePoints, diagonalReverseStart, temp, 1, diagonalReverseEnd - diagonalReverseStart + 1); - this.m_reverseHistory.push(temp); - } - } - // If we got here, then we have the full trace in history. We just have to convert it to a change list - // NOTE: This part is a bit messy - return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); - } - /** - * Shifts the given changes to provide a more intuitive diff. - * While the first element in a diff matches the first element after the diff, - * we shift the diff down. - * - * @param changes The list of changes to shift - * @returns The shifted changes - */ - PrettifyChanges(changes) { - // Shift all the changes down first - for (let i = 0; i < changes.length; i++) { - const change = changes[i]; - const originalStop = (i < changes.length - 1) ? changes[i + 1].originalStart : this._originalElementsOrHash.length; - const modifiedStop = (i < changes.length - 1) ? changes[i + 1].modifiedStart : this._modifiedElementsOrHash.length; - const checkOriginal = change.originalLength > 0; - const checkModified = change.modifiedLength > 0; - while (change.originalStart + change.originalLength < originalStop - && change.modifiedStart + change.modifiedLength < modifiedStop - && (!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength)) - && (!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))) { - const startStrictEqual = this.ElementsAreStrictEqual(change.originalStart, change.modifiedStart); - const endStrictEqual = this.ElementsAreStrictEqual(change.originalStart + change.originalLength, change.modifiedStart + change.modifiedLength); - if (endStrictEqual && !startStrictEqual) { - // moving the change down would create an equal change, but the elements are not strict equal - break; - } - change.originalStart++; - change.modifiedStart++; - } - const mergedChangeArr = [null]; - if (i < changes.length - 1 && this.ChangesOverlap(changes[i], changes[i + 1], mergedChangeArr)) { - changes[i] = mergedChangeArr[0]; - changes.splice(i + 1, 1); - i--; - continue; - } - } - // Shift changes back up until we hit empty or whitespace-only lines - for (let i = changes.length - 1; i >= 0; i--) { - const change = changes[i]; - let originalStop = 0; - let modifiedStop = 0; - if (i > 0) { - const prevChange = changes[i - 1]; - originalStop = prevChange.originalStart + prevChange.originalLength; - modifiedStop = prevChange.modifiedStart + prevChange.modifiedLength; - } - const checkOriginal = change.originalLength > 0; - const checkModified = change.modifiedLength > 0; - let bestDelta = 0; - let bestScore = this._boundaryScore(change.originalStart, change.originalLength, change.modifiedStart, change.modifiedLength); - for (let delta = 1;; delta++) { - const originalStart = change.originalStart - delta; - const modifiedStart = change.modifiedStart - delta; - if (originalStart < originalStop || modifiedStart < modifiedStop) { - break; - } - if (checkOriginal && !this.OriginalElementsAreEqual(originalStart, originalStart + change.originalLength)) { - break; - } - if (checkModified && !this.ModifiedElementsAreEqual(modifiedStart, modifiedStart + change.modifiedLength)) { - break; - } - const touchingPreviousChange = (originalStart === originalStop && modifiedStart === modifiedStop); - const score = ((touchingPreviousChange ? 5 : 0) - + this._boundaryScore(originalStart, change.originalLength, modifiedStart, change.modifiedLength)); - if (score > bestScore) { - bestScore = score; - bestDelta = delta; - } - } - change.originalStart -= bestDelta; - change.modifiedStart -= bestDelta; - const mergedChangeArr = [null]; - if (i > 0 && this.ChangesOverlap(changes[i - 1], changes[i], mergedChangeArr)) { - changes[i - 1] = mergedChangeArr[0]; - changes.splice(i, 1); - i++; - continue; - } - } - // There could be multiple longest common substrings. - // Give preference to the ones containing longer lines - if (this._hasStrings) { - for (let i = 1, len = changes.length; i < len; i++) { - const aChange = changes[i - 1]; - const bChange = changes[i]; - const matchedLength = bChange.originalStart - aChange.originalStart - aChange.originalLength; - const aOriginalStart = aChange.originalStart; - const bOriginalEnd = bChange.originalStart + bChange.originalLength; - const abOriginalLength = bOriginalEnd - aOriginalStart; - const aModifiedStart = aChange.modifiedStart; - const bModifiedEnd = bChange.modifiedStart + bChange.modifiedLength; - const abModifiedLength = bModifiedEnd - aModifiedStart; - // Avoid wasting a lot of time with these searches - if (matchedLength < 5 && abOriginalLength < 20 && abModifiedLength < 20) { - const t = this._findBetterContiguousSequence(aOriginalStart, abOriginalLength, aModifiedStart, abModifiedLength, matchedLength); - if (t) { - const [originalMatchStart, modifiedMatchStart] = t; - if (originalMatchStart !== aChange.originalStart + aChange.originalLength || modifiedMatchStart !== aChange.modifiedStart + aChange.modifiedLength) { - // switch to another sequence that has a better score - aChange.originalLength = originalMatchStart - aChange.originalStart; - aChange.modifiedLength = modifiedMatchStart - aChange.modifiedStart; - bChange.originalStart = originalMatchStart + matchedLength; - bChange.modifiedStart = modifiedMatchStart + matchedLength; - bChange.originalLength = bOriginalEnd - bChange.originalStart; - bChange.modifiedLength = bModifiedEnd - bChange.modifiedStart; - } - } - } - } - } - return changes; - } - _findBetterContiguousSequence(originalStart, originalLength, modifiedStart, modifiedLength, desiredLength) { - if (originalLength < desiredLength || modifiedLength < desiredLength) { - return null; - } - const originalMax = originalStart + originalLength - desiredLength + 1; - const modifiedMax = modifiedStart + modifiedLength - desiredLength + 1; - let bestScore = 0; - let bestOriginalStart = 0; - let bestModifiedStart = 0; - for (let i = originalStart; i < originalMax; i++) { - for (let j = modifiedStart; j < modifiedMax; j++) { - const score = this._contiguousSequenceScore(i, j, desiredLength); - if (score > 0 && score > bestScore) { - bestScore = score; - bestOriginalStart = i; - bestModifiedStart = j; - } - } - } - if (bestScore > 0) { - return [bestOriginalStart, bestModifiedStart]; - } - return null; - } - _contiguousSequenceScore(originalStart, modifiedStart, length) { - let score = 0; - for (let l = 0; l < length; l++) { - if (!this.ElementsAreEqual(originalStart + l, modifiedStart + l)) { - return 0; - } - score += this._originalStringElements[originalStart + l].length; - } - return score; - } - _OriginalIsBoundary(index) { - if (index <= 0 || index >= this._originalElementsOrHash.length - 1) { - return true; - } - return (this._hasStrings && /^\s*$/.test(this._originalStringElements[index])); - } - _OriginalRegionIsBoundary(originalStart, originalLength) { - if (this._OriginalIsBoundary(originalStart) || this._OriginalIsBoundary(originalStart - 1)) { - return true; - } - if (originalLength > 0) { - const originalEnd = originalStart + originalLength; - if (this._OriginalIsBoundary(originalEnd - 1) || this._OriginalIsBoundary(originalEnd)) { - return true; - } - } - return false; - } - _ModifiedIsBoundary(index) { - if (index <= 0 || index >= this._modifiedElementsOrHash.length - 1) { - return true; - } - return (this._hasStrings && /^\s*$/.test(this._modifiedStringElements[index])); - } - _ModifiedRegionIsBoundary(modifiedStart, modifiedLength) { - if (this._ModifiedIsBoundary(modifiedStart) || this._ModifiedIsBoundary(modifiedStart - 1)) { - return true; - } - if (modifiedLength > 0) { - const modifiedEnd = modifiedStart + modifiedLength; - if (this._ModifiedIsBoundary(modifiedEnd - 1) || this._ModifiedIsBoundary(modifiedEnd)) { - return true; - } - } - return false; - } - _boundaryScore(originalStart, originalLength, modifiedStart, modifiedLength) { - const originalScore = (this._OriginalRegionIsBoundary(originalStart, originalLength) ? 1 : 0); - const modifiedScore = (this._ModifiedRegionIsBoundary(modifiedStart, modifiedLength) ? 1 : 0); - return (originalScore + modifiedScore); - } - /** - * Concatenates the two input DiffChange lists and returns the resulting - * list. - * @param The left changes - * @param The right changes - * @returns The concatenated list - */ - ConcatenateChanges(left, right) { - const mergedChangeArr = []; - if (left.length === 0 || right.length === 0) { - return (right.length > 0) ? right : left; - } - else if (this.ChangesOverlap(left[left.length - 1], right[0], mergedChangeArr)) { - // Since we break the problem down recursively, it is possible that we - // might recurse in the middle of a change thereby splitting it into - // two changes. Here in the combining stage, we detect and fuse those - // changes back together - const result = new Array(left.length + right.length - 1); - MyArray.Copy(left, 0, result, 0, left.length - 1); - result[left.length - 1] = mergedChangeArr[0]; - MyArray.Copy(right, 1, result, left.length, right.length - 1); - return result; - } - else { - const result = new Array(left.length + right.length); - MyArray.Copy(left, 0, result, 0, left.length); - MyArray.Copy(right, 0, result, left.length, right.length); - return result; - } - } - /** - * Returns true if the two changes overlap and can be merged into a single - * change - * @param left The left change - * @param right The right change - * @param mergedChange The merged change if the two overlap, null otherwise - * @returns True if the two changes overlap - */ - ChangesOverlap(left, right, mergedChangeArr) { - Debug.Assert(left.originalStart <= right.originalStart, 'Left change is not less than or equal to right change'); - Debug.Assert(left.modifiedStart <= right.modifiedStart, 'Left change is not less than or equal to right change'); - if (left.originalStart + left.originalLength >= right.originalStart || left.modifiedStart + left.modifiedLength >= right.modifiedStart) { - const originalStart = left.originalStart; - let originalLength = left.originalLength; - const modifiedStart = left.modifiedStart; - let modifiedLength = left.modifiedLength; - if (left.originalStart + left.originalLength >= right.originalStart) { - originalLength = right.originalStart + right.originalLength - left.originalStart; - } - if (left.modifiedStart + left.modifiedLength >= right.modifiedStart) { - modifiedLength = right.modifiedStart + right.modifiedLength - left.modifiedStart; - } - mergedChangeArr[0] = new _diffChange_js__WEBPACK_IMPORTED_MODULE_0__.DiffChange(originalStart, originalLength, modifiedStart, modifiedLength); - return true; - } - else { - mergedChangeArr[0] = null; - return false; - } - } - /** - * Helper method used to clip a diagonal index to the range of valid - * diagonals. This also decides whether or not the diagonal index, - * if it exceeds the boundary, should be clipped to the boundary or clipped - * one inside the boundary depending on the Even/Odd status of the boundary - * and numDifferences. - * @param diagonal The index of the diagonal to clip. - * @param numDifferences The current number of differences being iterated upon. - * @param diagonalBaseIndex The base reference diagonal. - * @param numDiagonals The total number of diagonals. - * @returns The clipped diagonal index. - */ - ClipDiagonalBound(diagonal, numDifferences, diagonalBaseIndex, numDiagonals) { - if (diagonal >= 0 && diagonal < numDiagonals) { - // Nothing to clip, its in range - return diagonal; - } - // diagonalsBelow: The number of diagonals below the reference diagonal - // diagonalsAbove: The number of diagonals above the reference diagonal - const diagonalsBelow = diagonalBaseIndex; - const diagonalsAbove = numDiagonals - diagonalBaseIndex - 1; - const diffEven = (numDifferences % 2 === 0); - if (diagonal < 0) { - const lowerBoundEven = (diagonalsBelow % 2 === 0); - return (diffEven === lowerBoundEven) ? 0 : 1; - } - else { - const upperBoundEven = (diagonalsAbove % 2 === 0); - return (diffEven === upperBoundEven) ? numDiagonals - 1 : numDiagonals - 2; - } - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js": -/*!**************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DiffChange: () => (/* binding */ DiffChange) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/** - * Represents information about a specific difference between two sequences. - */ -class DiffChange { - /** - * Constructs a new DiffChange with the given sequence information - * and content. - */ - constructor(originalStart, originalLength, modifiedStart, modifiedLength) { - //Debug.Assert(originalLength > 0 || modifiedLength > 0, "originalLength and modifiedLength cannot both be <= 0"); - this.originalStart = originalStart; - this.originalLength = originalLength; - this.modifiedStart = modifiedStart; - this.modifiedLength = modifiedLength; - } - /** - * The end point (exclusive) of the change in the original sequence. - */ - getOriginalEnd() { - return this.originalStart + this.originalLength; - } - /** - * The end point (exclusive) of the change in the modified sequence. - */ - getModifiedEnd() { - return this.modifiedStart + this.modifiedLength; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/errors.js": -/*!*****************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/errors.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BugIndicatingError: () => (/* binding */ BugIndicatingError), -/* harmony export */ CancellationError: () => (/* binding */ CancellationError), -/* harmony export */ ErrorHandler: () => (/* binding */ ErrorHandler), -/* harmony export */ ErrorNoTelemetry: () => (/* binding */ ErrorNoTelemetry), -/* harmony export */ NotSupportedError: () => (/* binding */ NotSupportedError), -/* harmony export */ canceled: () => (/* binding */ canceled), -/* harmony export */ errorHandler: () => (/* binding */ errorHandler), -/* harmony export */ illegalArgument: () => (/* binding */ illegalArgument), -/* harmony export */ illegalState: () => (/* binding */ illegalState), -/* harmony export */ isCancellationError: () => (/* binding */ isCancellationError), -/* harmony export */ onUnexpectedError: () => (/* binding */ onUnexpectedError), -/* harmony export */ onUnexpectedExternalError: () => (/* binding */ onUnexpectedExternalError), -/* harmony export */ transformErrorForSerialization: () => (/* binding */ transformErrorForSerialization) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Avoid circular dependency on EventEmitter by implementing a subset of the interface. -class ErrorHandler { - constructor() { - this.listeners = []; - this.unexpectedErrorHandler = function (e) { - setTimeout(() => { - if (e.stack) { - if (ErrorNoTelemetry.isErrorNoTelemetry(e)) { - throw new ErrorNoTelemetry(e.message + '\n\n' + e.stack); - } - throw new Error(e.message + '\n\n' + e.stack); - } - throw e; - }, 0); - }; - } - emit(e) { - this.listeners.forEach((listener) => { - listener(e); - }); - } - onUnexpectedError(e) { - this.unexpectedErrorHandler(e); - this.emit(e); - } - // For external errors, we don't want the listeners to be called - onUnexpectedExternalError(e) { - this.unexpectedErrorHandler(e); - } -} -const errorHandler = new ErrorHandler(); -function onUnexpectedError(e) { - // ignore errors from cancelled promises - if (!isCancellationError(e)) { - errorHandler.onUnexpectedError(e); - } - return undefined; -} -function onUnexpectedExternalError(e) { - // ignore errors from cancelled promises - if (!isCancellationError(e)) { - errorHandler.onUnexpectedExternalError(e); - } - return undefined; -} -function transformErrorForSerialization(error) { - if (error instanceof Error) { - const { name, message } = error; - const stack = error.stacktrace || error.stack; - return { - $isError: true, - name, - message, - stack, - noTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error) - }; - } - // return as is - return error; -} -const canceledName = 'Canceled'; -/** - * Checks if the given error is a promise in canceled state - */ -function isCancellationError(error) { - if (error instanceof CancellationError) { - return true; - } - return error instanceof Error && error.name === canceledName && error.message === canceledName; -} -// !!!IMPORTANT!!! -// Do NOT change this class because it is also used as an API-type. -class CancellationError extends Error { - constructor() { - super(canceledName); - this.name = this.message; - } -} -/** - * @deprecated use {@link CancellationError `new CancellationError()`} instead - */ -function canceled() { - const error = new Error(canceledName); - error.name = error.message; - return error; -} -function illegalArgument(name) { - if (name) { - return new Error(`Illegal argument: ${name}`); - } - else { - return new Error('Illegal argument'); - } -} -function illegalState(name) { - if (name) { - return new Error(`Illegal state: ${name}`); - } - else { - return new Error('Illegal state'); - } -} -class NotSupportedError extends Error { - constructor(message) { - super('NotSupported'); - if (message) { - this.message = message; - } - } -} -/** - * Error that when thrown won't be logged in telemetry as an unhandled error. - */ -class ErrorNoTelemetry extends Error { - constructor(msg) { - super(msg); - this.name = 'ErrorNoTelemetry'; - } - static fromError(err) { - if (err instanceof ErrorNoTelemetry) { - return err; - } - const result = new ErrorNoTelemetry(); - result.message = err.message; - result.stack = err.stack; - return result; - } - static isErrorNoTelemetry(err) { - return err.name === 'ErrorNoTelemetry'; - } -} -/** - * This error indicates a bug. - * Do not throw this for invalid user input. - * Only catch this error to recover gracefully from bugs. - */ -class BugIndicatingError extends Error { - constructor(message) { - super(message || 'An unexpected bug occurred.'); - Object.setPrototypeOf(this, BugIndicatingError.prototype); - // Because we know for sure only buggy code throws this, - // we definitely want to break here and fix the bug. - // eslint-disable-next-line no-debugger - debugger; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/event.js": -/*!****************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/event.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DebounceEmitter: () => (/* binding */ DebounceEmitter), -/* harmony export */ Emitter: () => (/* binding */ Emitter), -/* harmony export */ Event: () => (/* binding */ Event), -/* harmony export */ EventBufferer: () => (/* binding */ EventBufferer), -/* harmony export */ EventDeliveryQueue: () => (/* binding */ EventDeliveryQueue), -/* harmony export */ PauseableEmitter: () => (/* binding */ PauseableEmitter), -/* harmony export */ Relay: () => (/* binding */ Relay) -/* harmony export */ }); -/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errors.js */ "./node_modules/monaco-editor/esm/vs/base/common/errors.js"); -/* harmony import */ var _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lifecycle.js */ "./node_modules/monaco-editor/esm/vs/base/common/lifecycle.js"); -/* harmony import */ var _linkedList_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linkedList.js */ "./node_modules/monaco-editor/esm/vs/base/common/linkedList.js"); -/* harmony import */ var _stopwatch_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stopwatch.js */ "./node_modules/monaco-editor/esm/vs/base/common/stopwatch.js"); - - - - -// ----------------------------------------------------------------------------------------------------------------------- -// Uncomment the next line to print warnings whenever an emitter with listeners is disposed. That is a sign of code smell. -// ----------------------------------------------------------------------------------------------------------------------- -const _enableDisposeWithListenerWarning = false; -// _enableDisposeWithListenerWarning = Boolean("TRUE"); // causes a linter warning so that it cannot be pushed -// ----------------------------------------------------------------------------------------------------------------------- -// Uncomment the next line to print warnings whenever a snapshotted event is used repeatedly without cleanup. -// See https://github.com/microsoft/vscode/issues/142851 -// ----------------------------------------------------------------------------------------------------------------------- -const _enableSnapshotPotentialLeakWarning = false; -var Event; -(function (Event) { - Event.None = () => _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.Disposable.None; - function _addLeakageTraceLogic(options) { - if (_enableSnapshotPotentialLeakWarning) { - const { onListenerDidAdd: origListenerDidAdd } = options; - const stack = Stacktrace.create(); - let count = 0; - options.onListenerDidAdd = () => { - if (++count === 2) { - console.warn('snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here'); - stack.print(); - } - origListenerDidAdd === null || origListenerDidAdd === void 0 ? void 0 : origListenerDidAdd(); - }; - } - } - /** - * Given an event, returns another event which only fires once. - */ - function once(event) { - return (listener, thisArgs = null, disposables) => { - // we need this, in case the event fires during the listener call - let didFire = false; - let result = undefined; - result = event(e => { - if (didFire) { - return; - } - else if (result) { - result.dispose(); - } - else { - didFire = true; - } - return listener.call(thisArgs, e); - }, null, disposables); - if (didFire) { - result.dispose(); - } - return result; - }; - } - Event.once = once; - /** - * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned - * event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the - * returned event causes this utility to leak a listener on the original event. - */ - function map(event, map, disposable) { - return snapshot((listener, thisArgs = null, disposables) => event(i => listener.call(thisArgs, map(i)), null, disposables), disposable); - } - Event.map = map; - /** - * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned - * event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the - * returned event causes this utility to leak a listener on the original event. - */ - function forEach(event, each, disposable) { - return snapshot((listener, thisArgs = null, disposables) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables), disposable); - } - Event.forEach = forEach; - function filter(event, filter, disposable) { - return snapshot((listener, thisArgs = null, disposables) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables), disposable); - } - Event.filter = filter; - /** - * Given an event, returns the same event but typed as `Event`. - */ - function signal(event) { - return event; - } - Event.signal = signal; - function any(...events) { - return (listener, thisArgs = null, disposables) => (0,_lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.combinedDisposable)(...events.map(event => event(e => listener.call(thisArgs, e), null, disposables))); - } - Event.any = any; - /** - * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned - * event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the - * returned event causes this utility to leak a listener on the original event. - */ - function reduce(event, merge, initial, disposable) { - let output = initial; - return map(event, e => { - output = merge(output, e); - return output; - }, disposable); - } - Event.reduce = reduce; - function snapshot(event, disposable) { - let listener; - const options = { - onFirstListenerAdd() { - listener = event(emitter.fire, emitter); - }, - onLastListenerRemove() { - listener === null || listener === void 0 ? void 0 : listener.dispose(); - } - }; - if (!disposable) { - _addLeakageTraceLogic(options); - } - const emitter = new Emitter(options); - disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter); - return emitter.event; - } - function debounce(event, merge, delay = 100, leading = false, leakWarningThreshold, disposable) { - let subscription; - let output = undefined; - let handle = undefined; - let numDebouncedCalls = 0; - const options = { - leakWarningThreshold, - onFirstListenerAdd() { - subscription = event(cur => { - numDebouncedCalls++; - output = merge(output, cur); - if (leading && !handle) { - emitter.fire(output); - output = undefined; - } - clearTimeout(handle); - handle = setTimeout(() => { - const _output = output; - output = undefined; - handle = undefined; - if (!leading || numDebouncedCalls > 1) { - emitter.fire(_output); - } - numDebouncedCalls = 0; - }, delay); - }); - }, - onLastListenerRemove() { - subscription.dispose(); - } - }; - if (!disposable) { - _addLeakageTraceLogic(options); - } - const emitter = new Emitter(options); - disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter); - return emitter.event; - } - Event.debounce = debounce; - /** - * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned - * event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the - * returned event causes this utility to leak a listener on the original event. - */ - function latch(event, equals = (a, b) => a === b, disposable) { - let firstCall = true; - let cache; - return filter(event, value => { - const shouldEmit = firstCall || !equals(value, cache); - firstCall = false; - cache = value; - return shouldEmit; - }, disposable); - } - Event.latch = latch; - /** - * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned - * event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the - * returned event causes this utility to leak a listener on the original event. - */ - function split(event, isT, disposable) { - return [ - Event.filter(event, isT, disposable), - Event.filter(event, e => !isT(e), disposable), - ]; - } - Event.split = split; - /** - * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned - * event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the - * returned event causes this utility to leak a listener on the original event. - */ - function buffer(event, flushAfterTimeout = false, _buffer = []) { - let buffer = _buffer.slice(); - let listener = event(e => { - if (buffer) { - buffer.push(e); - } - else { - emitter.fire(e); - } - }); - const flush = () => { - buffer === null || buffer === void 0 ? void 0 : buffer.forEach(e => emitter.fire(e)); - buffer = null; - }; - const emitter = new Emitter({ - onFirstListenerAdd() { - if (!listener) { - listener = event(e => emitter.fire(e)); - } - }, - onFirstListenerDidAdd() { - if (buffer) { - if (flushAfterTimeout) { - setTimeout(flush); - } - else { - flush(); - } - } - }, - onLastListenerRemove() { - if (listener) { - listener.dispose(); - } - listener = null; - } - }); - return emitter.event; - } - Event.buffer = buffer; - class ChainableEvent { - constructor(event) { - this.event = event; - this.disposables = new _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.DisposableStore(); - } - map(fn) { - return new ChainableEvent(map(this.event, fn, this.disposables)); - } - forEach(fn) { - return new ChainableEvent(forEach(this.event, fn, this.disposables)); - } - filter(fn) { - return new ChainableEvent(filter(this.event, fn, this.disposables)); - } - reduce(merge, initial) { - return new ChainableEvent(reduce(this.event, merge, initial, this.disposables)); - } - latch() { - return new ChainableEvent(latch(this.event, undefined, this.disposables)); - } - debounce(merge, delay = 100, leading = false, leakWarningThreshold) { - return new ChainableEvent(debounce(this.event, merge, delay, leading, leakWarningThreshold, this.disposables)); - } - on(listener, thisArgs, disposables) { - return this.event(listener, thisArgs, disposables); - } - once(listener, thisArgs, disposables) { - return once(this.event)(listener, thisArgs, disposables); - } - dispose() { - this.disposables.dispose(); - } - } - function chain(event) { - return new ChainableEvent(event); - } - Event.chain = chain; - function fromNodeEventEmitter(emitter, eventName, map = id => id) { - const fn = (...args) => result.fire(map(...args)); - const onFirstListenerAdd = () => emitter.on(eventName, fn); - const onLastListenerRemove = () => emitter.removeListener(eventName, fn); - const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove }); - return result.event; - } - Event.fromNodeEventEmitter = fromNodeEventEmitter; - function fromDOMEventEmitter(emitter, eventName, map = id => id) { - const fn = (...args) => result.fire(map(...args)); - const onFirstListenerAdd = () => emitter.addEventListener(eventName, fn); - const onLastListenerRemove = () => emitter.removeEventListener(eventName, fn); - const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove }); - return result.event; - } - Event.fromDOMEventEmitter = fromDOMEventEmitter; - function toPromise(event) { - return new Promise(resolve => once(event)(resolve)); - } - Event.toPromise = toPromise; - function runAndSubscribe(event, handler) { - handler(undefined); - return event(e => handler(e)); - } - Event.runAndSubscribe = runAndSubscribe; - function runAndSubscribeWithStore(event, handler) { - let store = null; - function run(e) { - store === null || store === void 0 ? void 0 : store.dispose(); - store = new _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.DisposableStore(); - handler(e, store); - } - run(undefined); - const disposable = event(e => run(e)); - return (0,_lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.toDisposable)(() => { - disposable.dispose(); - store === null || store === void 0 ? void 0 : store.dispose(); - }); - } - Event.runAndSubscribeWithStore = runAndSubscribeWithStore; - class EmitterObserver { - constructor(obs, store) { - this.obs = obs; - this._counter = 0; - this._hasChanged = false; - const options = { - onFirstListenerAdd: () => { - obs.addObserver(this); - }, - onLastListenerRemove: () => { - obs.removeObserver(this); - } - }; - if (!store) { - _addLeakageTraceLogic(options); - } - this.emitter = new Emitter(options); - if (store) { - store.add(this.emitter); - } - } - beginUpdate(_observable) { - // console.assert(_observable === this.obs); - this._counter++; - } - handleChange(_observable, _change) { - this._hasChanged = true; - } - endUpdate(_observable) { - if (--this._counter === 0) { - if (this._hasChanged) { - this._hasChanged = false; - this.emitter.fire(this.obs.get()); - } - } - } - } - function fromObservable(obs, store) { - const observer = new EmitterObserver(obs, store); - return observer.emitter.event; - } - Event.fromObservable = fromObservable; -})(Event || (Event = {})); -class EventProfiling { - constructor(name) { - this._listenerCount = 0; - this._invocationCount = 0; - this._elapsedOverall = 0; - this._name = `${name}_${EventProfiling._idPool++}`; - } - start(listenerCount) { - this._stopWatch = new _stopwatch_js__WEBPACK_IMPORTED_MODULE_3__.StopWatch(true); - this._listenerCount = listenerCount; - } - stop() { - if (this._stopWatch) { - const elapsed = this._stopWatch.elapsed(); - this._elapsedOverall += elapsed; - this._invocationCount += 1; - console.info(`did FIRE ${this._name}: elapsed_ms: ${elapsed.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`); - this._stopWatch = undefined; - } - } -} -EventProfiling._idPool = 0; -let _globalLeakWarningThreshold = -1; -class LeakageMonitor { - constructor(customThreshold, name = Math.random().toString(18).slice(2, 5)) { - this.customThreshold = customThreshold; - this.name = name; - this._warnCountdown = 0; - } - dispose() { - if (this._stacks) { - this._stacks.clear(); - } - } - check(stack, listenerCount) { - let threshold = _globalLeakWarningThreshold; - if (typeof this.customThreshold === 'number') { - threshold = this.customThreshold; - } - if (threshold <= 0 || listenerCount < threshold) { - return undefined; - } - if (!this._stacks) { - this._stacks = new Map(); - } - const count = (this._stacks.get(stack.value) || 0); - this._stacks.set(stack.value, count + 1); - this._warnCountdown -= 1; - if (this._warnCountdown <= 0) { - // only warn on first exceed and then every time the limit - // is exceeded by 50% again - this._warnCountdown = threshold * 0.5; - // find most frequent listener and print warning - let topStack; - let topCount = 0; - for (const [stack, count] of this._stacks) { - if (!topStack || topCount < count) { - topStack = stack; - topCount = count; - } - } - console.warn(`[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`); - console.warn(topStack); - } - return () => { - const count = (this._stacks.get(stack.value) || 0); - this._stacks.set(stack.value, count - 1); - }; - } -} -class Stacktrace { - constructor(value) { - this.value = value; - } - static create() { - var _a; - return new Stacktrace((_a = new Error().stack) !== null && _a !== void 0 ? _a : ''); - } - print() { - console.warn(this.value.split('\n').slice(2).join('\n')); - } -} -class Listener { - constructor(callback, callbackThis, stack) { - this.callback = callback; - this.callbackThis = callbackThis; - this.stack = stack; - this.subscription = new _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.SafeDisposable(); - } - invoke(e) { - this.callback.call(this.callbackThis, e); - } -} -/** - * The Emitter can be used to expose an Event to the public - * to fire it from the insides. - * Sample: - class Document { - - private readonly _onDidChange = new Emitter<(value:string)=>any>(); - - public onDidChange = this._onDidChange.event; - - // getter-style - // get onDidChange(): Event<(value:string)=>any> { - // return this._onDidChange.event; - // } - - private _doIt() { - //... - this._onDidChange.fire(value); - } - } - */ -class Emitter { - constructor(options) { - var _a, _b; - this._disposed = false; - this._options = options; - this._leakageMon = _globalLeakWarningThreshold > 0 ? new LeakageMonitor(this._options && this._options.leakWarningThreshold) : undefined; - this._perfMon = ((_a = this._options) === null || _a === void 0 ? void 0 : _a._profName) ? new EventProfiling(this._options._profName) : undefined; - this._deliveryQueue = (_b = this._options) === null || _b === void 0 ? void 0 : _b.deliveryQueue; - } - dispose() { - var _a, _b, _c, _d; - if (!this._disposed) { - this._disposed = true; - // It is bad to have listeners at the time of disposing an emitter, it is worst to have listeners keep the emitter - // alive via the reference that's embedded in their disposables. Therefore we loop over all remaining listeners and - // unset their subscriptions/disposables. Looping and blaming remaining listeners is done on next tick because the - // the following programming pattern is very popular: - // - // const someModel = this._disposables.add(new ModelObject()); // (1) create and register model - // this._disposables.add(someModel.onDidChange(() => { ... }); // (2) subscribe and register model-event listener - // ...later... - // this._disposables.dispose(); disposes (1) then (2): don't warn after (1) but after the "overall dispose" is done - if (this._listeners) { - if (_enableDisposeWithListenerWarning) { - const listeners = Array.from(this._listeners); - queueMicrotask(() => { - var _a; - for (const listener of listeners) { - if (listener.subscription.isset()) { - listener.subscription.unset(); - (_a = listener.stack) === null || _a === void 0 ? void 0 : _a.print(); - } - } - }); - } - this._listeners.clear(); - } - (_a = this._deliveryQueue) === null || _a === void 0 ? void 0 : _a.clear(this); - (_c = (_b = this._options) === null || _b === void 0 ? void 0 : _b.onLastListenerRemove) === null || _c === void 0 ? void 0 : _c.call(_b); - (_d = this._leakageMon) === null || _d === void 0 ? void 0 : _d.dispose(); - } - } - /** - * For the public to allow to subscribe - * to events from this Emitter - */ - get event() { - if (!this._event) { - this._event = (callback, thisArgs, disposables) => { - var _a, _b, _c; - if (!this._listeners) { - this._listeners = new _linkedList_js__WEBPACK_IMPORTED_MODULE_2__.LinkedList(); - } - const firstListener = this._listeners.isEmpty(); - if (firstListener && ((_a = this._options) === null || _a === void 0 ? void 0 : _a.onFirstListenerAdd)) { - this._options.onFirstListenerAdd(this); - } - let removeMonitor; - let stack; - if (this._leakageMon && this._listeners.size >= 30) { - // check and record this emitter for potential leakage - stack = Stacktrace.create(); - removeMonitor = this._leakageMon.check(stack, this._listeners.size + 1); - } - if (_enableDisposeWithListenerWarning) { - stack = stack !== null && stack !== void 0 ? stack : Stacktrace.create(); - } - const listener = new Listener(callback, thisArgs, stack); - const removeListener = this._listeners.push(listener); - if (firstListener && ((_b = this._options) === null || _b === void 0 ? void 0 : _b.onFirstListenerDidAdd)) { - this._options.onFirstListenerDidAdd(this); - } - if ((_c = this._options) === null || _c === void 0 ? void 0 : _c.onListenerDidAdd) { - this._options.onListenerDidAdd(this, callback, thisArgs); - } - const result = listener.subscription.set(() => { - removeMonitor === null || removeMonitor === void 0 ? void 0 : removeMonitor(); - if (!this._disposed) { - removeListener(); - if (this._options && this._options.onLastListenerRemove) { - const hasListeners = (this._listeners && !this._listeners.isEmpty()); - if (!hasListeners) { - this._options.onLastListenerRemove(this); - } - } - } - }); - if (disposables instanceof _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.DisposableStore) { - disposables.add(result); - } - else if (Array.isArray(disposables)) { - disposables.push(result); - } - return result; - }; - } - return this._event; - } - /** - * To be kept private to fire an event to - * subscribers - */ - fire(event) { - var _a, _b; - if (this._listeners) { - // put all [listener,event]-pairs into delivery queue - // then emit all event. an inner/nested event might be - // the driver of this - if (!this._deliveryQueue) { - this._deliveryQueue = new PrivateEventDeliveryQueue(); - } - for (const listener of this._listeners) { - this._deliveryQueue.push(this, listener, event); - } - // start/stop performance insight collection - (_a = this._perfMon) === null || _a === void 0 ? void 0 : _a.start(this._deliveryQueue.size); - this._deliveryQueue.deliver(); - (_b = this._perfMon) === null || _b === void 0 ? void 0 : _b.stop(); - } - } -} -class EventDeliveryQueue { - constructor() { - this._queue = new _linkedList_js__WEBPACK_IMPORTED_MODULE_2__.LinkedList(); - } - get size() { - return this._queue.size; - } - push(emitter, listener, event) { - this._queue.push(new EventDeliveryQueueElement(emitter, listener, event)); - } - clear(emitter) { - const newQueue = new _linkedList_js__WEBPACK_IMPORTED_MODULE_2__.LinkedList(); - for (const element of this._queue) { - if (element.emitter !== emitter) { - newQueue.push(element); - } - } - this._queue = newQueue; - } - deliver() { - while (this._queue.size > 0) { - const element = this._queue.shift(); - try { - element.listener.invoke(element.event); - } - catch (e) { - (0,_errors_js__WEBPACK_IMPORTED_MODULE_0__.onUnexpectedError)(e); - } - } - } -} -/** - * An `EventDeliveryQueue` that is guaranteed to be used by a single `Emitter`. - */ -class PrivateEventDeliveryQueue extends EventDeliveryQueue { - clear(emitter) { - // Here we can just clear the entire linked list because - // all elements are guaranteed to belong to this emitter - this._queue.clear(); - } -} -class EventDeliveryQueueElement { - constructor(emitter, listener, event) { - this.emitter = emitter; - this.listener = listener; - this.event = event; - } -} -class PauseableEmitter extends Emitter { - constructor(options) { - super(options); - this._isPaused = 0; - this._eventQueue = new _linkedList_js__WEBPACK_IMPORTED_MODULE_2__.LinkedList(); - this._mergeFn = options === null || options === void 0 ? void 0 : options.merge; - } - pause() { - this._isPaused++; - } - resume() { - if (this._isPaused !== 0 && --this._isPaused === 0) { - if (this._mergeFn) { - // use the merge function to create a single composite - // event. make a copy in case firing pauses this emitter - const events = Array.from(this._eventQueue); - this._eventQueue.clear(); - super.fire(this._mergeFn(events)); - } - else { - // no merging, fire each event individually and test - // that this emitter isn't paused halfway through - while (!this._isPaused && this._eventQueue.size !== 0) { - super.fire(this._eventQueue.shift()); - } - } - } - } - fire(event) { - if (this._listeners) { - if (this._isPaused !== 0) { - this._eventQueue.push(event); - } - else { - super.fire(event); - } - } - } -} -class DebounceEmitter extends PauseableEmitter { - constructor(options) { - var _a; - super(options); - this._delay = (_a = options.delay) !== null && _a !== void 0 ? _a : 100; - } - fire(event) { - if (!this._handle) { - this.pause(); - this._handle = setTimeout(() => { - this._handle = undefined; - this.resume(); - }, this._delay); - } - super.fire(event); - } -} -/** - * The EventBufferer is useful in situations in which you want - * to delay firing your events during some code. - * You can wrap that code and be sure that the event will not - * be fired during that wrap. - * - * ``` - * const emitter: Emitter; - * const delayer = new EventDelayer(); - * const delayedEvent = delayer.wrapEvent(emitter.event); - * - * delayedEvent(console.log); - * - * delayer.bufferEvents(() => { - * emitter.fire(); // event will not be fired yet - * }); - * - * // event will only be fired at this point - * ``` - */ -class EventBufferer { - constructor() { - this.buffers = []; - } - wrapEvent(event) { - return (listener, thisArgs, disposables) => { - return event(i => { - const buffer = this.buffers[this.buffers.length - 1]; - if (buffer) { - buffer.push(() => listener.call(thisArgs, i)); - } - else { - listener.call(thisArgs, i); - } - }, undefined, disposables); - }; - } - bufferEvents(fn) { - const buffer = []; - this.buffers.push(buffer); - const r = fn(); - this.buffers.pop(); - buffer.forEach(flush => flush()); - return r; - } -} -/** - * A Relay is an event forwarder which functions as a replugabble event pipe. - * Once created, you can connect an input event to it and it will simply forward - * events from that input event through its own `event` property. The `input` - * can be changed at any point in time. - */ -class Relay { - constructor() { - this.listening = false; - this.inputEvent = Event.None; - this.inputEventListener = _lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.Disposable.None; - this.emitter = new Emitter({ - onFirstListenerDidAdd: () => { - this.listening = true; - this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter); - }, - onLastListenerRemove: () => { - this.listening = false; - this.inputEventListener.dispose(); - } - }); - this.event = this.emitter.event; - } - set input(event) { - this.inputEvent = event; - if (this.listening) { - this.inputEventListener.dispose(); - this.inputEventListener = event(this.emitter.fire, this.emitter); - } - } - dispose() { - this.inputEventListener.dispose(); - this.emitter.dispose(); - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/functional.js": -/*!*********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/functional.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ once: () => (/* binding */ once) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -function once(fn) { - const _this = this; - let didCall = false; - let result; - return function () { - if (didCall) { - return result; - } - didCall = true; - result = fn.apply(_this, arguments); - return result; - }; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/hash.js": -/*!***************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/hash.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ StringSHA1: () => (/* binding */ StringSHA1), -/* harmony export */ doHash: () => (/* binding */ doHash), -/* harmony export */ hash: () => (/* binding */ hash), -/* harmony export */ numberHash: () => (/* binding */ numberHash), -/* harmony export */ stringHash: () => (/* binding */ stringHash), -/* harmony export */ toHexString: () => (/* binding */ toHexString) -/* harmony export */ }); -/* harmony import */ var _strings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./strings.js */ "./node_modules/monaco-editor/esm/vs/base/common/strings.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/** - * Return a hash value for an object. - */ -function hash(obj) { - return doHash(obj, 0); -} -function doHash(obj, hashVal) { - switch (typeof obj) { - case 'object': - if (obj === null) { - return numberHash(349, hashVal); - } - else if (Array.isArray(obj)) { - return arrayHash(obj, hashVal); - } - return objectHash(obj, hashVal); - case 'string': - return stringHash(obj, hashVal); - case 'boolean': - return booleanHash(obj, hashVal); - case 'number': - return numberHash(obj, hashVal); - case 'undefined': - return numberHash(937, hashVal); - default: - return numberHash(617, hashVal); - } -} -function numberHash(val, initialHashVal) { - return (((initialHashVal << 5) - initialHashVal) + val) | 0; // hashVal * 31 + ch, keep as int32 -} -function booleanHash(b, initialHashVal) { - return numberHash(b ? 433 : 863, initialHashVal); -} -function stringHash(s, hashVal) { - hashVal = numberHash(149417, hashVal); - for (let i = 0, length = s.length; i < length; i++) { - hashVal = numberHash(s.charCodeAt(i), hashVal); - } - return hashVal; -} -function arrayHash(arr, initialHashVal) { - initialHashVal = numberHash(104579, initialHashVal); - return arr.reduce((hashVal, item) => doHash(item, hashVal), initialHashVal); -} -function objectHash(obj, initialHashVal) { - initialHashVal = numberHash(181387, initialHashVal); - return Object.keys(obj).sort().reduce((hashVal, key) => { - hashVal = stringHash(key, hashVal); - return doHash(obj[key], hashVal); - }, initialHashVal); -} -function leftRotate(value, bits, totalBits = 32) { - // delta + bits = totalBits - const delta = totalBits - bits; - // All ones, expect `delta` zeros aligned to the right - const mask = ~((1 << delta) - 1); - // Join (value left-shifted `bits` bits) with (masked value right-shifted `delta` bits) - return ((value << bits) | ((mask & value) >>> delta)) >>> 0; -} -function fill(dest, index = 0, count = dest.byteLength, value = 0) { - for (let i = 0; i < count; i++) { - dest[index + i] = value; - } -} -function leftPad(value, length, char = '0') { - while (value.length < length) { - value = char + value; - } - return value; -} -function toHexString(bufferOrValue, bitsize = 32) { - if (bufferOrValue instanceof ArrayBuffer) { - return Array.from(new Uint8Array(bufferOrValue)).map(b => b.toString(16).padStart(2, '0')).join(''); - } - return leftPad((bufferOrValue >>> 0).toString(16), bitsize / 4); -} -/** - * A SHA1 implementation that works with strings and does not allocate. - */ -class StringSHA1 { - constructor() { - this._h0 = 0x67452301; - this._h1 = 0xEFCDAB89; - this._h2 = 0x98BADCFE; - this._h3 = 0x10325476; - this._h4 = 0xC3D2E1F0; - this._buff = new Uint8Array(64 /* SHA1Constant.BLOCK_SIZE */ + 3 /* to fit any utf-8 */); - this._buffDV = new DataView(this._buff.buffer); - this._buffLen = 0; - this._totalLen = 0; - this._leftoverHighSurrogate = 0; - this._finished = false; - } - update(str) { - const strLen = str.length; - if (strLen === 0) { - return; - } - const buff = this._buff; - let buffLen = this._buffLen; - let leftoverHighSurrogate = this._leftoverHighSurrogate; - let charCode; - let offset; - if (leftoverHighSurrogate !== 0) { - charCode = leftoverHighSurrogate; - offset = -1; - leftoverHighSurrogate = 0; - } - else { - charCode = str.charCodeAt(0); - offset = 0; - } - while (true) { - let codePoint = charCode; - if (_strings_js__WEBPACK_IMPORTED_MODULE_0__.isHighSurrogate(charCode)) { - if (offset + 1 < strLen) { - const nextCharCode = str.charCodeAt(offset + 1); - if (_strings_js__WEBPACK_IMPORTED_MODULE_0__.isLowSurrogate(nextCharCode)) { - offset++; - codePoint = _strings_js__WEBPACK_IMPORTED_MODULE_0__.computeCodePoint(charCode, nextCharCode); - } - else { - // illegal => unicode replacement character - codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */; - } - } - else { - // last character is a surrogate pair - leftoverHighSurrogate = charCode; - break; - } - } - else if (_strings_js__WEBPACK_IMPORTED_MODULE_0__.isLowSurrogate(charCode)) { - // illegal => unicode replacement character - codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */; - } - buffLen = this._push(buff, buffLen, codePoint); - offset++; - if (offset < strLen) { - charCode = str.charCodeAt(offset); - } - else { - break; - } - } - this._buffLen = buffLen; - this._leftoverHighSurrogate = leftoverHighSurrogate; - } - _push(buff, buffLen, codePoint) { - if (codePoint < 0x0080) { - buff[buffLen++] = codePoint; - } - else if (codePoint < 0x0800) { - buff[buffLen++] = 0b11000000 | ((codePoint & 0b00000000000000000000011111000000) >>> 6); - buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0); - } - else if (codePoint < 0x10000) { - buff[buffLen++] = 0b11100000 | ((codePoint & 0b00000000000000001111000000000000) >>> 12); - buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6); - buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0); - } - else { - buff[buffLen++] = 0b11110000 | ((codePoint & 0b00000000000111000000000000000000) >>> 18); - buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000111111000000000000) >>> 12); - buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6); - buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0); - } - if (buffLen >= 64 /* SHA1Constant.BLOCK_SIZE */) { - this._step(); - buffLen -= 64 /* SHA1Constant.BLOCK_SIZE */; - this._totalLen += 64 /* SHA1Constant.BLOCK_SIZE */; - // take last 3 in case of UTF8 overflow - buff[0] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 0]; - buff[1] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 1]; - buff[2] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 2]; - } - return buffLen; - } - digest() { - if (!this._finished) { - this._finished = true; - if (this._leftoverHighSurrogate) { - // illegal => unicode replacement character - this._leftoverHighSurrogate = 0; - this._buffLen = this._push(this._buff, this._buffLen, 65533 /* SHA1Constant.UNICODE_REPLACEMENT */); - } - this._totalLen += this._buffLen; - this._wrapUp(); - } - return toHexString(this._h0) + toHexString(this._h1) + toHexString(this._h2) + toHexString(this._h3) + toHexString(this._h4); - } - _wrapUp() { - this._buff[this._buffLen++] = 0x80; - fill(this._buff, this._buffLen); - if (this._buffLen > 56) { - this._step(); - fill(this._buff); - } - // this will fit because the mantissa can cover up to 52 bits - const ml = 8 * this._totalLen; - this._buffDV.setUint32(56, Math.floor(ml / 4294967296), false); - this._buffDV.setUint32(60, ml % 4294967296, false); - this._step(); - } - _step() { - const bigBlock32 = StringSHA1._bigBlock32; - const data = this._buffDV; - for (let j = 0; j < 64 /* 16*4 */; j += 4) { - bigBlock32.setUint32(j, data.getUint32(j, false), false); - } - for (let j = 64; j < 320 /* 80*4 */; j += 4) { - bigBlock32.setUint32(j, leftRotate((bigBlock32.getUint32(j - 12, false) ^ bigBlock32.getUint32(j - 32, false) ^ bigBlock32.getUint32(j - 56, false) ^ bigBlock32.getUint32(j - 64, false)), 1), false); - } - let a = this._h0; - let b = this._h1; - let c = this._h2; - let d = this._h3; - let e = this._h4; - let f, k; - let temp; - for (let j = 0; j < 80; j++) { - if (j < 20) { - f = (b & c) | ((~b) & d); - k = 0x5A827999; - } - else if (j < 40) { - f = b ^ c ^ d; - k = 0x6ED9EBA1; - } - else if (j < 60) { - f = (b & c) | (b & d) | (c & d); - k = 0x8F1BBCDC; - } - else { - f = b ^ c ^ d; - k = 0xCA62C1D6; - } - temp = (leftRotate(a, 5) + f + e + k + bigBlock32.getUint32(j * 4, false)) & 0xffffffff; - e = d; - d = c; - c = leftRotate(b, 30); - b = a; - a = temp; - } - this._h0 = (this._h0 + a) & 0xffffffff; - this._h1 = (this._h1 + b) & 0xffffffff; - this._h2 = (this._h2 + c) & 0xffffffff; - this._h3 = (this._h3 + d) & 0xffffffff; - this._h4 = (this._h4 + e) & 0xffffffff; - } -} -StringSHA1._bigBlock32 = new DataView(new ArrayBuffer(320)); // 80 * 4 = 320 - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/iterator.js": -/*!*******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/iterator.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Iterable: () => (/* binding */ Iterable) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var Iterable; -(function (Iterable) { - function is(thing) { - return thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function'; - } - Iterable.is = is; - const _empty = Object.freeze([]); - function empty() { - return _empty; - } - Iterable.empty = empty; - function* single(element) { - yield element; - } - Iterable.single = single; - function from(iterable) { - return iterable || _empty; - } - Iterable.from = from; - function isEmpty(iterable) { - return !iterable || iterable[Symbol.iterator]().next().done === true; - } - Iterable.isEmpty = isEmpty; - function first(iterable) { - return iterable[Symbol.iterator]().next().value; - } - Iterable.first = first; - function some(iterable, predicate) { - for (const element of iterable) { - if (predicate(element)) { - return true; - } - } - return false; - } - Iterable.some = some; - function find(iterable, predicate) { - for (const element of iterable) { - if (predicate(element)) { - return element; - } - } - return undefined; - } - Iterable.find = find; - function* filter(iterable, predicate) { - for (const element of iterable) { - if (predicate(element)) { - yield element; - } - } - } - Iterable.filter = filter; - function* map(iterable, fn) { - let index = 0; - for (const element of iterable) { - yield fn(element, index++); - } - } - Iterable.map = map; - function* concat(...iterables) { - for (const iterable of iterables) { - for (const element of iterable) { - yield element; - } - } - } - Iterable.concat = concat; - function* concatNested(iterables) { - for (const iterable of iterables) { - for (const element of iterable) { - yield element; - } - } - } - Iterable.concatNested = concatNested; - function reduce(iterable, reducer, initialValue) { - let value = initialValue; - for (const element of iterable) { - value = reducer(value, element); - } - return value; - } - Iterable.reduce = reduce; - function forEach(iterable, fn) { - let index = 0; - for (const element of iterable) { - fn(element, index++); - } - } - Iterable.forEach = forEach; - /** - * Returns an iterable slice of the array, with the same semantics as `array.slice()`. - */ - function* slice(arr, from, to = arr.length) { - if (from < 0) { - from += arr.length; - } - if (to < 0) { - to += arr.length; - } - else if (to > arr.length) { - to = arr.length; - } - for (; from < to; from++) { - yield arr[from]; - } - } - Iterable.slice = slice; - /** - * Consumes `atMost` elements from iterable and returns the consumed elements, - * and an iterable for the rest of the elements. - */ - function consume(iterable, atMost = Number.POSITIVE_INFINITY) { - const consumed = []; - if (atMost === 0) { - return [consumed, iterable]; - } - const iterator = iterable[Symbol.iterator](); - for (let i = 0; i < atMost; i++) { - const next = iterator.next(); - if (next.done) { - return [consumed, Iterable.empty()]; - } - consumed.push(next.value); - } - return [consumed, { [Symbol.iterator]() { return iterator; } }]; - } - Iterable.consume = consume; - /** - * Consumes `atMost` elements from iterable and returns the consumed elements, - * and an iterable for the rest of the elements. - */ - function collect(iterable) { - return consume(iterable)[0]; - } - Iterable.collect = collect; - /** - * Returns whether the iterables are the same length and all items are - * equal using the comparator function. - */ - function equals(a, b, comparator = (at, bt) => at === bt) { - const ai = a[Symbol.iterator](); - const bi = b[Symbol.iterator](); - while (true) { - const an = ai.next(); - const bn = bi.next(); - if (an.done !== bn.done) { - return false; - } - else if (an.done) { - return true; - } - else if (!comparator(an.value, bn.value)) { - return false; - } - } - } - Iterable.equals = equals; -})(Iterable || (Iterable = {})); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/keyCodes.js": -/*!*******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/keyCodes.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EVENT_KEY_CODE_MAP: () => (/* binding */ EVENT_KEY_CODE_MAP), -/* harmony export */ IMMUTABLE_CODE_TO_KEY_CODE: () => (/* binding */ IMMUTABLE_CODE_TO_KEY_CODE), -/* harmony export */ IMMUTABLE_KEY_CODE_TO_CODE: () => (/* binding */ IMMUTABLE_KEY_CODE_TO_CODE), -/* harmony export */ KeyChord: () => (/* binding */ KeyChord), -/* harmony export */ KeyCodeUtils: () => (/* binding */ KeyCodeUtils), -/* harmony export */ NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE: () => (/* binding */ NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -class KeyCodeStrMap { - constructor() { - this._keyCodeToStr = []; - this._strToKeyCode = Object.create(null); - } - define(keyCode, str) { - this._keyCodeToStr[keyCode] = str; - this._strToKeyCode[str.toLowerCase()] = keyCode; - } - keyCodeToStr(keyCode) { - return this._keyCodeToStr[keyCode]; - } - strToKeyCode(str) { - return this._strToKeyCode[str.toLowerCase()] || 0 /* KeyCode.Unknown */; - } -} -const uiMap = new KeyCodeStrMap(); -const userSettingsUSMap = new KeyCodeStrMap(); -const userSettingsGeneralMap = new KeyCodeStrMap(); -const EVENT_KEY_CODE_MAP = new Array(230); -const NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE = {}; -const scanCodeIntToStr = []; -const scanCodeStrToInt = Object.create(null); -const scanCodeLowerCaseStrToInt = Object.create(null); -/** - * -1 if a ScanCode => KeyCode mapping depends on kb layout. - */ -const IMMUTABLE_CODE_TO_KEY_CODE = []; -/** - * -1 if a KeyCode => ScanCode mapping depends on kb layout. - */ -const IMMUTABLE_KEY_CODE_TO_CODE = []; -for (let i = 0; i <= 193 /* ScanCode.MAX_VALUE */; i++) { - IMMUTABLE_CODE_TO_KEY_CODE[i] = -1 /* KeyCode.DependsOnKbLayout */; -} -for (let i = 0; i <= 127 /* KeyCode.MAX_VALUE */; i++) { - IMMUTABLE_KEY_CODE_TO_CODE[i] = -1 /* ScanCode.DependsOnKbLayout */; -} -(function () { - // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx - // See https://github.com/microsoft/node-native-keymap/blob/master/deps/chromium/keyboard_codes_win.h - const empty = ''; - const mappings = [ - // keyCodeOrd, immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel - [0, 1, 0 /* ScanCode.None */, 'None', 0 /* KeyCode.Unknown */, 'unknown', 0, 'VK_UNKNOWN', empty, empty], - [0, 1, 1 /* ScanCode.Hyper */, 'Hyper', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 2 /* ScanCode.Super */, 'Super', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 3 /* ScanCode.Fn */, 'Fn', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 4 /* ScanCode.FnLock */, 'FnLock', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 5 /* ScanCode.Suspend */, 'Suspend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 6 /* ScanCode.Resume */, 'Resume', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 7 /* ScanCode.Turbo */, 'Turbo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 8 /* ScanCode.Sleep */, 'Sleep', 0 /* KeyCode.Unknown */, empty, 0, 'VK_SLEEP', empty, empty], - [0, 1, 9 /* ScanCode.WakeUp */, 'WakeUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [31, 0, 10 /* ScanCode.KeyA */, 'KeyA', 31 /* KeyCode.KeyA */, 'A', 65, 'VK_A', empty, empty], - [32, 0, 11 /* ScanCode.KeyB */, 'KeyB', 32 /* KeyCode.KeyB */, 'B', 66, 'VK_B', empty, empty], - [33, 0, 12 /* ScanCode.KeyC */, 'KeyC', 33 /* KeyCode.KeyC */, 'C', 67, 'VK_C', empty, empty], - [34, 0, 13 /* ScanCode.KeyD */, 'KeyD', 34 /* KeyCode.KeyD */, 'D', 68, 'VK_D', empty, empty], - [35, 0, 14 /* ScanCode.KeyE */, 'KeyE', 35 /* KeyCode.KeyE */, 'E', 69, 'VK_E', empty, empty], - [36, 0, 15 /* ScanCode.KeyF */, 'KeyF', 36 /* KeyCode.KeyF */, 'F', 70, 'VK_F', empty, empty], - [37, 0, 16 /* ScanCode.KeyG */, 'KeyG', 37 /* KeyCode.KeyG */, 'G', 71, 'VK_G', empty, empty], - [38, 0, 17 /* ScanCode.KeyH */, 'KeyH', 38 /* KeyCode.KeyH */, 'H', 72, 'VK_H', empty, empty], - [39, 0, 18 /* ScanCode.KeyI */, 'KeyI', 39 /* KeyCode.KeyI */, 'I', 73, 'VK_I', empty, empty], - [40, 0, 19 /* ScanCode.KeyJ */, 'KeyJ', 40 /* KeyCode.KeyJ */, 'J', 74, 'VK_J', empty, empty], - [41, 0, 20 /* ScanCode.KeyK */, 'KeyK', 41 /* KeyCode.KeyK */, 'K', 75, 'VK_K', empty, empty], - [42, 0, 21 /* ScanCode.KeyL */, 'KeyL', 42 /* KeyCode.KeyL */, 'L', 76, 'VK_L', empty, empty], - [43, 0, 22 /* ScanCode.KeyM */, 'KeyM', 43 /* KeyCode.KeyM */, 'M', 77, 'VK_M', empty, empty], - [44, 0, 23 /* ScanCode.KeyN */, 'KeyN', 44 /* KeyCode.KeyN */, 'N', 78, 'VK_N', empty, empty], - [45, 0, 24 /* ScanCode.KeyO */, 'KeyO', 45 /* KeyCode.KeyO */, 'O', 79, 'VK_O', empty, empty], - [46, 0, 25 /* ScanCode.KeyP */, 'KeyP', 46 /* KeyCode.KeyP */, 'P', 80, 'VK_P', empty, empty], - [47, 0, 26 /* ScanCode.KeyQ */, 'KeyQ', 47 /* KeyCode.KeyQ */, 'Q', 81, 'VK_Q', empty, empty], - [48, 0, 27 /* ScanCode.KeyR */, 'KeyR', 48 /* KeyCode.KeyR */, 'R', 82, 'VK_R', empty, empty], - [49, 0, 28 /* ScanCode.KeyS */, 'KeyS', 49 /* KeyCode.KeyS */, 'S', 83, 'VK_S', empty, empty], - [50, 0, 29 /* ScanCode.KeyT */, 'KeyT', 50 /* KeyCode.KeyT */, 'T', 84, 'VK_T', empty, empty], - [51, 0, 30 /* ScanCode.KeyU */, 'KeyU', 51 /* KeyCode.KeyU */, 'U', 85, 'VK_U', empty, empty], - [52, 0, 31 /* ScanCode.KeyV */, 'KeyV', 52 /* KeyCode.KeyV */, 'V', 86, 'VK_V', empty, empty], - [53, 0, 32 /* ScanCode.KeyW */, 'KeyW', 53 /* KeyCode.KeyW */, 'W', 87, 'VK_W', empty, empty], - [54, 0, 33 /* ScanCode.KeyX */, 'KeyX', 54 /* KeyCode.KeyX */, 'X', 88, 'VK_X', empty, empty], - [55, 0, 34 /* ScanCode.KeyY */, 'KeyY', 55 /* KeyCode.KeyY */, 'Y', 89, 'VK_Y', empty, empty], - [56, 0, 35 /* ScanCode.KeyZ */, 'KeyZ', 56 /* KeyCode.KeyZ */, 'Z', 90, 'VK_Z', empty, empty], - [22, 0, 36 /* ScanCode.Digit1 */, 'Digit1', 22 /* KeyCode.Digit1 */, '1', 49, 'VK_1', empty, empty], - [23, 0, 37 /* ScanCode.Digit2 */, 'Digit2', 23 /* KeyCode.Digit2 */, '2', 50, 'VK_2', empty, empty], - [24, 0, 38 /* ScanCode.Digit3 */, 'Digit3', 24 /* KeyCode.Digit3 */, '3', 51, 'VK_3', empty, empty], - [25, 0, 39 /* ScanCode.Digit4 */, 'Digit4', 25 /* KeyCode.Digit4 */, '4', 52, 'VK_4', empty, empty], - [26, 0, 40 /* ScanCode.Digit5 */, 'Digit5', 26 /* KeyCode.Digit5 */, '5', 53, 'VK_5', empty, empty], - [27, 0, 41 /* ScanCode.Digit6 */, 'Digit6', 27 /* KeyCode.Digit6 */, '6', 54, 'VK_6', empty, empty], - [28, 0, 42 /* ScanCode.Digit7 */, 'Digit7', 28 /* KeyCode.Digit7 */, '7', 55, 'VK_7', empty, empty], - [29, 0, 43 /* ScanCode.Digit8 */, 'Digit8', 29 /* KeyCode.Digit8 */, '8', 56, 'VK_8', empty, empty], - [30, 0, 44 /* ScanCode.Digit9 */, 'Digit9', 30 /* KeyCode.Digit9 */, '9', 57, 'VK_9', empty, empty], - [21, 0, 45 /* ScanCode.Digit0 */, 'Digit0', 21 /* KeyCode.Digit0 */, '0', 48, 'VK_0', empty, empty], - [3, 1, 46 /* ScanCode.Enter */, 'Enter', 3 /* KeyCode.Enter */, 'Enter', 13, 'VK_RETURN', empty, empty], - [9, 1, 47 /* ScanCode.Escape */, 'Escape', 9 /* KeyCode.Escape */, 'Escape', 27, 'VK_ESCAPE', empty, empty], - [1, 1, 48 /* ScanCode.Backspace */, 'Backspace', 1 /* KeyCode.Backspace */, 'Backspace', 8, 'VK_BACK', empty, empty], - [2, 1, 49 /* ScanCode.Tab */, 'Tab', 2 /* KeyCode.Tab */, 'Tab', 9, 'VK_TAB', empty, empty], - [10, 1, 50 /* ScanCode.Space */, 'Space', 10 /* KeyCode.Space */, 'Space', 32, 'VK_SPACE', empty, empty], - [83, 0, 51 /* ScanCode.Minus */, 'Minus', 83 /* KeyCode.Minus */, '-', 189, 'VK_OEM_MINUS', '-', 'OEM_MINUS'], - [81, 0, 52 /* ScanCode.Equal */, 'Equal', 81 /* KeyCode.Equal */, '=', 187, 'VK_OEM_PLUS', '=', 'OEM_PLUS'], - [87, 0, 53 /* ScanCode.BracketLeft */, 'BracketLeft', 87 /* KeyCode.BracketLeft */, '[', 219, 'VK_OEM_4', '[', 'OEM_4'], - [89, 0, 54 /* ScanCode.BracketRight */, 'BracketRight', 89 /* KeyCode.BracketRight */, ']', 221, 'VK_OEM_6', ']', 'OEM_6'], - [88, 0, 55 /* ScanCode.Backslash */, 'Backslash', 88 /* KeyCode.Backslash */, '\\', 220, 'VK_OEM_5', '\\', 'OEM_5'], - [0, 0, 56 /* ScanCode.IntlHash */, 'IntlHash', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [80, 0, 57 /* ScanCode.Semicolon */, 'Semicolon', 80 /* KeyCode.Semicolon */, ';', 186, 'VK_OEM_1', ';', 'OEM_1'], - [90, 0, 58 /* ScanCode.Quote */, 'Quote', 90 /* KeyCode.Quote */, '\'', 222, 'VK_OEM_7', '\'', 'OEM_7'], - [86, 0, 59 /* ScanCode.Backquote */, 'Backquote', 86 /* KeyCode.Backquote */, '`', 192, 'VK_OEM_3', '`', 'OEM_3'], - [82, 0, 60 /* ScanCode.Comma */, 'Comma', 82 /* KeyCode.Comma */, ',', 188, 'VK_OEM_COMMA', ',', 'OEM_COMMA'], - [84, 0, 61 /* ScanCode.Period */, 'Period', 84 /* KeyCode.Period */, '.', 190, 'VK_OEM_PERIOD', '.', 'OEM_PERIOD'], - [85, 0, 62 /* ScanCode.Slash */, 'Slash', 85 /* KeyCode.Slash */, '/', 191, 'VK_OEM_2', '/', 'OEM_2'], - [8, 1, 63 /* ScanCode.CapsLock */, 'CapsLock', 8 /* KeyCode.CapsLock */, 'CapsLock', 20, 'VK_CAPITAL', empty, empty], - [59, 1, 64 /* ScanCode.F1 */, 'F1', 59 /* KeyCode.F1 */, 'F1', 112, 'VK_F1', empty, empty], - [60, 1, 65 /* ScanCode.F2 */, 'F2', 60 /* KeyCode.F2 */, 'F2', 113, 'VK_F2', empty, empty], - [61, 1, 66 /* ScanCode.F3 */, 'F3', 61 /* KeyCode.F3 */, 'F3', 114, 'VK_F3', empty, empty], - [62, 1, 67 /* ScanCode.F4 */, 'F4', 62 /* KeyCode.F4 */, 'F4', 115, 'VK_F4', empty, empty], - [63, 1, 68 /* ScanCode.F5 */, 'F5', 63 /* KeyCode.F5 */, 'F5', 116, 'VK_F5', empty, empty], - [64, 1, 69 /* ScanCode.F6 */, 'F6', 64 /* KeyCode.F6 */, 'F6', 117, 'VK_F6', empty, empty], - [65, 1, 70 /* ScanCode.F7 */, 'F7', 65 /* KeyCode.F7 */, 'F7', 118, 'VK_F7', empty, empty], - [66, 1, 71 /* ScanCode.F8 */, 'F8', 66 /* KeyCode.F8 */, 'F8', 119, 'VK_F8', empty, empty], - [67, 1, 72 /* ScanCode.F9 */, 'F9', 67 /* KeyCode.F9 */, 'F9', 120, 'VK_F9', empty, empty], - [68, 1, 73 /* ScanCode.F10 */, 'F10', 68 /* KeyCode.F10 */, 'F10', 121, 'VK_F10', empty, empty], - [69, 1, 74 /* ScanCode.F11 */, 'F11', 69 /* KeyCode.F11 */, 'F11', 122, 'VK_F11', empty, empty], - [70, 1, 75 /* ScanCode.F12 */, 'F12', 70 /* KeyCode.F12 */, 'F12', 123, 'VK_F12', empty, empty], - [0, 1, 76 /* ScanCode.PrintScreen */, 'PrintScreen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [79, 1, 77 /* ScanCode.ScrollLock */, 'ScrollLock', 79 /* KeyCode.ScrollLock */, 'ScrollLock', 145, 'VK_SCROLL', empty, empty], - [7, 1, 78 /* ScanCode.Pause */, 'Pause', 7 /* KeyCode.PauseBreak */, 'PauseBreak', 19, 'VK_PAUSE', empty, empty], - [19, 1, 79 /* ScanCode.Insert */, 'Insert', 19 /* KeyCode.Insert */, 'Insert', 45, 'VK_INSERT', empty, empty], - [14, 1, 80 /* ScanCode.Home */, 'Home', 14 /* KeyCode.Home */, 'Home', 36, 'VK_HOME', empty, empty], - [11, 1, 81 /* ScanCode.PageUp */, 'PageUp', 11 /* KeyCode.PageUp */, 'PageUp', 33, 'VK_PRIOR', empty, empty], - [20, 1, 82 /* ScanCode.Delete */, 'Delete', 20 /* KeyCode.Delete */, 'Delete', 46, 'VK_DELETE', empty, empty], - [13, 1, 83 /* ScanCode.End */, 'End', 13 /* KeyCode.End */, 'End', 35, 'VK_END', empty, empty], - [12, 1, 84 /* ScanCode.PageDown */, 'PageDown', 12 /* KeyCode.PageDown */, 'PageDown', 34, 'VK_NEXT', empty, empty], - [17, 1, 85 /* ScanCode.ArrowRight */, 'ArrowRight', 17 /* KeyCode.RightArrow */, 'RightArrow', 39, 'VK_RIGHT', 'Right', empty], - [15, 1, 86 /* ScanCode.ArrowLeft */, 'ArrowLeft', 15 /* KeyCode.LeftArrow */, 'LeftArrow', 37, 'VK_LEFT', 'Left', empty], - [18, 1, 87 /* ScanCode.ArrowDown */, 'ArrowDown', 18 /* KeyCode.DownArrow */, 'DownArrow', 40, 'VK_DOWN', 'Down', empty], - [16, 1, 88 /* ScanCode.ArrowUp */, 'ArrowUp', 16 /* KeyCode.UpArrow */, 'UpArrow', 38, 'VK_UP', 'Up', empty], - [78, 1, 89 /* ScanCode.NumLock */, 'NumLock', 78 /* KeyCode.NumLock */, 'NumLock', 144, 'VK_NUMLOCK', empty, empty], - [108, 1, 90 /* ScanCode.NumpadDivide */, 'NumpadDivide', 108 /* KeyCode.NumpadDivide */, 'NumPad_Divide', 111, 'VK_DIVIDE', empty, empty], - [103, 1, 91 /* ScanCode.NumpadMultiply */, 'NumpadMultiply', 103 /* KeyCode.NumpadMultiply */, 'NumPad_Multiply', 106, 'VK_MULTIPLY', empty, empty], - [106, 1, 92 /* ScanCode.NumpadSubtract */, 'NumpadSubtract', 106 /* KeyCode.NumpadSubtract */, 'NumPad_Subtract', 109, 'VK_SUBTRACT', empty, empty], - [104, 1, 93 /* ScanCode.NumpadAdd */, 'NumpadAdd', 104 /* KeyCode.NumpadAdd */, 'NumPad_Add', 107, 'VK_ADD', empty, empty], - [3, 1, 94 /* ScanCode.NumpadEnter */, 'NumpadEnter', 3 /* KeyCode.Enter */, empty, 0, empty, empty, empty], - [94, 1, 95 /* ScanCode.Numpad1 */, 'Numpad1', 94 /* KeyCode.Numpad1 */, 'NumPad1', 97, 'VK_NUMPAD1', empty, empty], - [95, 1, 96 /* ScanCode.Numpad2 */, 'Numpad2', 95 /* KeyCode.Numpad2 */, 'NumPad2', 98, 'VK_NUMPAD2', empty, empty], - [96, 1, 97 /* ScanCode.Numpad3 */, 'Numpad3', 96 /* KeyCode.Numpad3 */, 'NumPad3', 99, 'VK_NUMPAD3', empty, empty], - [97, 1, 98 /* ScanCode.Numpad4 */, 'Numpad4', 97 /* KeyCode.Numpad4 */, 'NumPad4', 100, 'VK_NUMPAD4', empty, empty], - [98, 1, 99 /* ScanCode.Numpad5 */, 'Numpad5', 98 /* KeyCode.Numpad5 */, 'NumPad5', 101, 'VK_NUMPAD5', empty, empty], - [99, 1, 100 /* ScanCode.Numpad6 */, 'Numpad6', 99 /* KeyCode.Numpad6 */, 'NumPad6', 102, 'VK_NUMPAD6', empty, empty], - [100, 1, 101 /* ScanCode.Numpad7 */, 'Numpad7', 100 /* KeyCode.Numpad7 */, 'NumPad7', 103, 'VK_NUMPAD7', empty, empty], - [101, 1, 102 /* ScanCode.Numpad8 */, 'Numpad8', 101 /* KeyCode.Numpad8 */, 'NumPad8', 104, 'VK_NUMPAD8', empty, empty], - [102, 1, 103 /* ScanCode.Numpad9 */, 'Numpad9', 102 /* KeyCode.Numpad9 */, 'NumPad9', 105, 'VK_NUMPAD9', empty, empty], - [93, 1, 104 /* ScanCode.Numpad0 */, 'Numpad0', 93 /* KeyCode.Numpad0 */, 'NumPad0', 96, 'VK_NUMPAD0', empty, empty], - [107, 1, 105 /* ScanCode.NumpadDecimal */, 'NumpadDecimal', 107 /* KeyCode.NumpadDecimal */, 'NumPad_Decimal', 110, 'VK_DECIMAL', empty, empty], - [92, 0, 106 /* ScanCode.IntlBackslash */, 'IntlBackslash', 92 /* KeyCode.IntlBackslash */, 'OEM_102', 226, 'VK_OEM_102', empty, empty], - [58, 1, 107 /* ScanCode.ContextMenu */, 'ContextMenu', 58 /* KeyCode.ContextMenu */, 'ContextMenu', 93, empty, empty, empty], - [0, 1, 108 /* ScanCode.Power */, 'Power', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 109 /* ScanCode.NumpadEqual */, 'NumpadEqual', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [71, 1, 110 /* ScanCode.F13 */, 'F13', 71 /* KeyCode.F13 */, 'F13', 124, 'VK_F13', empty, empty], - [72, 1, 111 /* ScanCode.F14 */, 'F14', 72 /* KeyCode.F14 */, 'F14', 125, 'VK_F14', empty, empty], - [73, 1, 112 /* ScanCode.F15 */, 'F15', 73 /* KeyCode.F15 */, 'F15', 126, 'VK_F15', empty, empty], - [74, 1, 113 /* ScanCode.F16 */, 'F16', 74 /* KeyCode.F16 */, 'F16', 127, 'VK_F16', empty, empty], - [75, 1, 114 /* ScanCode.F17 */, 'F17', 75 /* KeyCode.F17 */, 'F17', 128, 'VK_F17', empty, empty], - [76, 1, 115 /* ScanCode.F18 */, 'F18', 76 /* KeyCode.F18 */, 'F18', 129, 'VK_F18', empty, empty], - [77, 1, 116 /* ScanCode.F19 */, 'F19', 77 /* KeyCode.F19 */, 'F19', 130, 'VK_F19', empty, empty], - [0, 1, 117 /* ScanCode.F20 */, 'F20', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F20', empty, empty], - [0, 1, 118 /* ScanCode.F21 */, 'F21', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F21', empty, empty], - [0, 1, 119 /* ScanCode.F22 */, 'F22', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F22', empty, empty], - [0, 1, 120 /* ScanCode.F23 */, 'F23', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F23', empty, empty], - [0, 1, 121 /* ScanCode.F24 */, 'F24', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F24', empty, empty], - [0, 1, 122 /* ScanCode.Open */, 'Open', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 123 /* ScanCode.Help */, 'Help', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 124 /* ScanCode.Select */, 'Select', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 125 /* ScanCode.Again */, 'Again', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 126 /* ScanCode.Undo */, 'Undo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 127 /* ScanCode.Cut */, 'Cut', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 128 /* ScanCode.Copy */, 'Copy', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 129 /* ScanCode.Paste */, 'Paste', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 130 /* ScanCode.Find */, 'Find', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 131 /* ScanCode.AudioVolumeMute */, 'AudioVolumeMute', 112 /* KeyCode.AudioVolumeMute */, 'AudioVolumeMute', 173, 'VK_VOLUME_MUTE', empty, empty], - [0, 1, 132 /* ScanCode.AudioVolumeUp */, 'AudioVolumeUp', 113 /* KeyCode.AudioVolumeUp */, 'AudioVolumeUp', 175, 'VK_VOLUME_UP', empty, empty], - [0, 1, 133 /* ScanCode.AudioVolumeDown */, 'AudioVolumeDown', 114 /* KeyCode.AudioVolumeDown */, 'AudioVolumeDown', 174, 'VK_VOLUME_DOWN', empty, empty], - [105, 1, 134 /* ScanCode.NumpadComma */, 'NumpadComma', 105 /* KeyCode.NUMPAD_SEPARATOR */, 'NumPad_Separator', 108, 'VK_SEPARATOR', empty, empty], - [110, 0, 135 /* ScanCode.IntlRo */, 'IntlRo', 110 /* KeyCode.ABNT_C1 */, 'ABNT_C1', 193, 'VK_ABNT_C1', empty, empty], - [0, 1, 136 /* ScanCode.KanaMode */, 'KanaMode', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 0, 137 /* ScanCode.IntlYen */, 'IntlYen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 138 /* ScanCode.Convert */, 'Convert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 139 /* ScanCode.NonConvert */, 'NonConvert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 140 /* ScanCode.Lang1 */, 'Lang1', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 141 /* ScanCode.Lang2 */, 'Lang2', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 142 /* ScanCode.Lang3 */, 'Lang3', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 143 /* ScanCode.Lang4 */, 'Lang4', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 144 /* ScanCode.Lang5 */, 'Lang5', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 145 /* ScanCode.Abort */, 'Abort', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 146 /* ScanCode.Props */, 'Props', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 147 /* ScanCode.NumpadParenLeft */, 'NumpadParenLeft', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 148 /* ScanCode.NumpadParenRight */, 'NumpadParenRight', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 149 /* ScanCode.NumpadBackspace */, 'NumpadBackspace', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 150 /* ScanCode.NumpadMemoryStore */, 'NumpadMemoryStore', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 151 /* ScanCode.NumpadMemoryRecall */, 'NumpadMemoryRecall', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 152 /* ScanCode.NumpadMemoryClear */, 'NumpadMemoryClear', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 153 /* ScanCode.NumpadMemoryAdd */, 'NumpadMemoryAdd', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 154 /* ScanCode.NumpadMemorySubtract */, 'NumpadMemorySubtract', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 155 /* ScanCode.NumpadClear */, 'NumpadClear', 126 /* KeyCode.Clear */, 'Clear', 12, 'VK_CLEAR', empty, empty], - [0, 1, 156 /* ScanCode.NumpadClearEntry */, 'NumpadClearEntry', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [5, 1, 0 /* ScanCode.None */, empty, 5 /* KeyCode.Ctrl */, 'Ctrl', 17, 'VK_CONTROL', empty, empty], - [4, 1, 0 /* ScanCode.None */, empty, 4 /* KeyCode.Shift */, 'Shift', 16, 'VK_SHIFT', empty, empty], - [6, 1, 0 /* ScanCode.None */, empty, 6 /* KeyCode.Alt */, 'Alt', 18, 'VK_MENU', empty, empty], - [57, 1, 0 /* ScanCode.None */, empty, 57 /* KeyCode.Meta */, 'Meta', 0, 'VK_COMMAND', empty, empty], - [5, 1, 157 /* ScanCode.ControlLeft */, 'ControlLeft', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_LCONTROL', empty, empty], - [4, 1, 158 /* ScanCode.ShiftLeft */, 'ShiftLeft', 4 /* KeyCode.Shift */, empty, 0, 'VK_LSHIFT', empty, empty], - [6, 1, 159 /* ScanCode.AltLeft */, 'AltLeft', 6 /* KeyCode.Alt */, empty, 0, 'VK_LMENU', empty, empty], - [57, 1, 160 /* ScanCode.MetaLeft */, 'MetaLeft', 57 /* KeyCode.Meta */, empty, 0, 'VK_LWIN', empty, empty], - [5, 1, 161 /* ScanCode.ControlRight */, 'ControlRight', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_RCONTROL', empty, empty], - [4, 1, 162 /* ScanCode.ShiftRight */, 'ShiftRight', 4 /* KeyCode.Shift */, empty, 0, 'VK_RSHIFT', empty, empty], - [6, 1, 163 /* ScanCode.AltRight */, 'AltRight', 6 /* KeyCode.Alt */, empty, 0, 'VK_RMENU', empty, empty], - [57, 1, 164 /* ScanCode.MetaRight */, 'MetaRight', 57 /* KeyCode.Meta */, empty, 0, 'VK_RWIN', empty, empty], - [0, 1, 165 /* ScanCode.BrightnessUp */, 'BrightnessUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 166 /* ScanCode.BrightnessDown */, 'BrightnessDown', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 167 /* ScanCode.MediaPlay */, 'MediaPlay', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 168 /* ScanCode.MediaRecord */, 'MediaRecord', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 169 /* ScanCode.MediaFastForward */, 'MediaFastForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 170 /* ScanCode.MediaRewind */, 'MediaRewind', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [114, 1, 171 /* ScanCode.MediaTrackNext */, 'MediaTrackNext', 119 /* KeyCode.MediaTrackNext */, 'MediaTrackNext', 176, 'VK_MEDIA_NEXT_TRACK', empty, empty], - [115, 1, 172 /* ScanCode.MediaTrackPrevious */, 'MediaTrackPrevious', 120 /* KeyCode.MediaTrackPrevious */, 'MediaTrackPrevious', 177, 'VK_MEDIA_PREV_TRACK', empty, empty], - [116, 1, 173 /* ScanCode.MediaStop */, 'MediaStop', 121 /* KeyCode.MediaStop */, 'MediaStop', 178, 'VK_MEDIA_STOP', empty, empty], - [0, 1, 174 /* ScanCode.Eject */, 'Eject', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [117, 1, 175 /* ScanCode.MediaPlayPause */, 'MediaPlayPause', 122 /* KeyCode.MediaPlayPause */, 'MediaPlayPause', 179, 'VK_MEDIA_PLAY_PAUSE', empty, empty], - [0, 1, 176 /* ScanCode.MediaSelect */, 'MediaSelect', 123 /* KeyCode.LaunchMediaPlayer */, 'LaunchMediaPlayer', 181, 'VK_MEDIA_LAUNCH_MEDIA_SELECT', empty, empty], - [0, 1, 177 /* ScanCode.LaunchMail */, 'LaunchMail', 124 /* KeyCode.LaunchMail */, 'LaunchMail', 180, 'VK_MEDIA_LAUNCH_MAIL', empty, empty], - [0, 1, 178 /* ScanCode.LaunchApp2 */, 'LaunchApp2', 125 /* KeyCode.LaunchApp2 */, 'LaunchApp2', 183, 'VK_MEDIA_LAUNCH_APP2', empty, empty], - [0, 1, 179 /* ScanCode.LaunchApp1 */, 'LaunchApp1', 0 /* KeyCode.Unknown */, empty, 0, 'VK_MEDIA_LAUNCH_APP1', empty, empty], - [0, 1, 180 /* ScanCode.SelectTask */, 'SelectTask', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 181 /* ScanCode.LaunchScreenSaver */, 'LaunchScreenSaver', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 182 /* ScanCode.BrowserSearch */, 'BrowserSearch', 115 /* KeyCode.BrowserSearch */, 'BrowserSearch', 170, 'VK_BROWSER_SEARCH', empty, empty], - [0, 1, 183 /* ScanCode.BrowserHome */, 'BrowserHome', 116 /* KeyCode.BrowserHome */, 'BrowserHome', 172, 'VK_BROWSER_HOME', empty, empty], - [112, 1, 184 /* ScanCode.BrowserBack */, 'BrowserBack', 117 /* KeyCode.BrowserBack */, 'BrowserBack', 166, 'VK_BROWSER_BACK', empty, empty], - [113, 1, 185 /* ScanCode.BrowserForward */, 'BrowserForward', 118 /* KeyCode.BrowserForward */, 'BrowserForward', 167, 'VK_BROWSER_FORWARD', empty, empty], - [0, 1, 186 /* ScanCode.BrowserStop */, 'BrowserStop', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_STOP', empty, empty], - [0, 1, 187 /* ScanCode.BrowserRefresh */, 'BrowserRefresh', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_REFRESH', empty, empty], - [0, 1, 188 /* ScanCode.BrowserFavorites */, 'BrowserFavorites', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_FAVORITES', empty, empty], - [0, 1, 189 /* ScanCode.ZoomToggle */, 'ZoomToggle', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 190 /* ScanCode.MailReply */, 'MailReply', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 191 /* ScanCode.MailForward */, 'MailForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - [0, 1, 192 /* ScanCode.MailSend */, 'MailSend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], - // See https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html - // If an Input Method Editor is processing key input and the event is keydown, return 229. - [109, 1, 0 /* ScanCode.None */, empty, 109 /* KeyCode.KEY_IN_COMPOSITION */, 'KeyInComposition', 229, empty, empty, empty], - [111, 1, 0 /* ScanCode.None */, empty, 111 /* KeyCode.ABNT_C2 */, 'ABNT_C2', 194, 'VK_ABNT_C2', empty, empty], - [91, 1, 0 /* ScanCode.None */, empty, 91 /* KeyCode.OEM_8 */, 'OEM_8', 223, 'VK_OEM_8', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANA', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANGUL', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_JUNJA', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_FINAL', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANJA', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANJI', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CONVERT', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONCONVERT', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ACCEPT', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_MODECHANGE', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SELECT', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PRINT', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXECUTE', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SNAPSHOT', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HELP', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_APPS', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PROCESSKEY', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PACKET', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_SBCSCHAR', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_DBCSCHAR', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ATTN', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CRSEL', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXSEL', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EREOF', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PLAY', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ZOOM', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONAME', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PA1', empty, empty], - [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_OEM_CLEAR', empty, empty], - ]; - const seenKeyCode = []; - const seenScanCode = []; - for (const mapping of mappings) { - const [_keyCodeOrd, immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel] = mapping; - if (!seenScanCode[scanCode]) { - seenScanCode[scanCode] = true; - scanCodeIntToStr[scanCode] = scanCodeStr; - scanCodeStrToInt[scanCodeStr] = scanCode; - scanCodeLowerCaseStrToInt[scanCodeStr.toLowerCase()] = scanCode; - if (immutable) { - IMMUTABLE_CODE_TO_KEY_CODE[scanCode] = keyCode; - if ((keyCode !== 0 /* KeyCode.Unknown */) - && (keyCode !== 3 /* KeyCode.Enter */) - && (keyCode !== 5 /* KeyCode.Ctrl */) - && (keyCode !== 4 /* KeyCode.Shift */) - && (keyCode !== 6 /* KeyCode.Alt */) - && (keyCode !== 57 /* KeyCode.Meta */)) { - IMMUTABLE_KEY_CODE_TO_CODE[keyCode] = scanCode; - } - } - } - if (!seenKeyCode[keyCode]) { - seenKeyCode[keyCode] = true; - if (!keyCodeStr) { - throw new Error(`String representation missing for key code ${keyCode} around scan code ${scanCodeStr}`); - } - uiMap.define(keyCode, keyCodeStr); - userSettingsUSMap.define(keyCode, usUserSettingsLabel || keyCodeStr); - userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel || usUserSettingsLabel || keyCodeStr); - } - if (eventKeyCode) { - EVENT_KEY_CODE_MAP[eventKeyCode] = keyCode; - } - if (vkey) { - NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE[vkey] = keyCode; - } - } - // Manually added due to the exclusion above (due to duplication with NumpadEnter) - IMMUTABLE_KEY_CODE_TO_CODE[3 /* KeyCode.Enter */] = 46 /* ScanCode.Enter */; -})(); -var KeyCodeUtils; -(function (KeyCodeUtils) { - function toString(keyCode) { - return uiMap.keyCodeToStr(keyCode); - } - KeyCodeUtils.toString = toString; - function fromString(key) { - return uiMap.strToKeyCode(key); - } - KeyCodeUtils.fromString = fromString; - function toUserSettingsUS(keyCode) { - return userSettingsUSMap.keyCodeToStr(keyCode); - } - KeyCodeUtils.toUserSettingsUS = toUserSettingsUS; - function toUserSettingsGeneral(keyCode) { - return userSettingsGeneralMap.keyCodeToStr(keyCode); - } - KeyCodeUtils.toUserSettingsGeneral = toUserSettingsGeneral; - function fromUserSettings(key) { - return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key); - } - KeyCodeUtils.fromUserSettings = fromUserSettings; - function toElectronAccelerator(keyCode) { - if (keyCode >= 93 /* KeyCode.Numpad0 */ && keyCode <= 108 /* KeyCode.NumpadDivide */) { - // [Electron Accelerators] Electron is able to parse numpad keys, but unfortunately it - // renders them just as regular keys in menus. For example, num0 is rendered as "0", - // numdiv is rendered as "/", numsub is rendered as "-". - // - // This can lead to incredible confusion, as it makes numpad based keybindings indistinguishable - // from keybindings based on regular keys. - // - // We therefore need to fall back to custom rendering for numpad keys. - return null; - } - switch (keyCode) { - case 16 /* KeyCode.UpArrow */: - return 'Up'; - case 18 /* KeyCode.DownArrow */: - return 'Down'; - case 15 /* KeyCode.LeftArrow */: - return 'Left'; - case 17 /* KeyCode.RightArrow */: - return 'Right'; - } - return uiMap.keyCodeToStr(keyCode); - } - KeyCodeUtils.toElectronAccelerator = toElectronAccelerator; -})(KeyCodeUtils || (KeyCodeUtils = {})); -function KeyChord(firstPart, secondPart) { - const chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0; - return (firstPart | chordPart) >>> 0; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/lazy.js": -/*!***************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/lazy.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Lazy: () => (/* binding */ Lazy) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -class Lazy { - constructor(executor) { - this.executor = executor; - this._didRun = false; - } - /** - * True if the lazy value has been resolved. - */ - hasValue() { return this._didRun; } - /** - * Get the wrapped value. - * - * This will force evaluation of the lazy value if it has not been resolved yet. Lazy values are only - * resolved once. `getValue` will re-throw exceptions that are hit while resolving the value - */ - getValue() { - if (!this._didRun) { - try { - this._value = this.executor(); - } - catch (err) { - this._error = err; - } - finally { - this._didRun = true; - } - } - if (this._error) { - throw this._error; - } - return this._value; - } - /** - * Get the wrapped value without forcing evaluation. - */ - get rawValue() { return this._value; } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/lifecycle.js": -/*!********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/lifecycle.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Disposable: () => (/* binding */ Disposable), -/* harmony export */ DisposableStore: () => (/* binding */ DisposableStore), -/* harmony export */ ImmortalReference: () => (/* binding */ ImmortalReference), -/* harmony export */ MultiDisposeError: () => (/* binding */ MultiDisposeError), -/* harmony export */ MutableDisposable: () => (/* binding */ MutableDisposable), -/* harmony export */ RefCountedDisposable: () => (/* binding */ RefCountedDisposable), -/* harmony export */ SafeDisposable: () => (/* binding */ SafeDisposable), -/* harmony export */ combinedDisposable: () => (/* binding */ combinedDisposable), -/* harmony export */ dispose: () => (/* binding */ dispose), -/* harmony export */ isDisposable: () => (/* binding */ isDisposable), -/* harmony export */ markAsSingleton: () => (/* binding */ markAsSingleton), -/* harmony export */ setDisposableTracker: () => (/* binding */ setDisposableTracker), -/* harmony export */ toDisposable: () => (/* binding */ toDisposable) -/* harmony export */ }); -/* harmony import */ var _functional_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functional.js */ "./node_modules/monaco-editor/esm/vs/base/common/functional.js"); -/* harmony import */ var _iterator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterator.js */ "./node_modules/monaco-editor/esm/vs/base/common/iterator.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -/** - * Enables logging of potentially leaked disposables. - * - * A disposable is considered leaked if it is not disposed or not registered as the child of - * another disposable. This tracking is very simple an only works for classes that either - * extend Disposable or use a DisposableStore. This means there are a lot of false positives. - */ -const TRACK_DISPOSABLES = false; -let disposableTracker = null; -function setDisposableTracker(tracker) { - disposableTracker = tracker; -} -if (TRACK_DISPOSABLES) { - const __is_disposable_tracked__ = '__is_disposable_tracked__'; - setDisposableTracker(new class { - trackDisposable(x) { - const stack = new Error('Potentially leaked disposable').stack; - setTimeout(() => { - if (!x[__is_disposable_tracked__]) { - console.log(stack); - } - }, 3000); - } - setParent(child, parent) { - if (child && child !== Disposable.None) { - try { - child[__is_disposable_tracked__] = true; - } - catch (_a) { - // noop - } - } - } - markAsDisposed(disposable) { - if (disposable && disposable !== Disposable.None) { - try { - disposable[__is_disposable_tracked__] = true; - } - catch (_a) { - // noop - } - } - } - markAsSingleton(disposable) { } - }); -} -function trackDisposable(x) { - disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.trackDisposable(x); - return x; -} -function markAsDisposed(disposable) { - disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsDisposed(disposable); -} -function setParentOfDisposable(child, parent) { - disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.setParent(child, parent); -} -function setParentOfDisposables(children, parent) { - if (!disposableTracker) { - return; - } - for (const child of children) { - disposableTracker.setParent(child, parent); - } -} -/** - * Indicates that the given object is a singleton which does not need to be disposed. -*/ -function markAsSingleton(singleton) { - disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsSingleton(singleton); - return singleton; -} -class MultiDisposeError extends Error { - constructor(errors) { - super(`Encountered errors while disposing of store. Errors: [${errors.join(', ')}]`); - this.errors = errors; - } -} -function isDisposable(thing) { - return typeof thing.dispose === 'function' && thing.dispose.length === 0; -} -function dispose(arg) { - if (_iterator_js__WEBPACK_IMPORTED_MODULE_1__.Iterable.is(arg)) { - const errors = []; - for (const d of arg) { - if (d) { - try { - d.dispose(); - } - catch (e) { - errors.push(e); - } - } - } - if (errors.length === 1) { - throw errors[0]; - } - else if (errors.length > 1) { - throw new MultiDisposeError(errors); - } - return Array.isArray(arg) ? [] : arg; - } - else if (arg) { - arg.dispose(); - return arg; - } -} -function combinedDisposable(...disposables) { - const parent = toDisposable(() => dispose(disposables)); - setParentOfDisposables(disposables, parent); - return parent; -} -function toDisposable(fn) { - const self = trackDisposable({ - dispose: (0,_functional_js__WEBPACK_IMPORTED_MODULE_0__.once)(() => { - markAsDisposed(self); - fn(); - }) - }); - return self; -} -class DisposableStore { - constructor() { - this._toDispose = new Set(); - this._isDisposed = false; - trackDisposable(this); - } - /** - * Dispose of all registered disposables and mark this object as disposed. - * - * Any future disposables added to this object will be disposed of on `add`. - */ - dispose() { - if (this._isDisposed) { - return; - } - markAsDisposed(this); - this._isDisposed = true; - this.clear(); - } - /** - * Returns `true` if this object has been disposed - */ - get isDisposed() { - return this._isDisposed; - } - /** - * Dispose of all registered disposables but do not mark this object as disposed. - */ - clear() { - try { - dispose(this._toDispose.values()); - } - finally { - this._toDispose.clear(); - } - } - add(o) { - if (!o) { - return o; - } - if (o === this) { - throw new Error('Cannot register a disposable on itself!'); - } - setParentOfDisposable(o, this); - if (this._isDisposed) { - if (!DisposableStore.DISABLE_DISPOSED_WARNING) { - console.warn(new Error('Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!').stack); - } - } - else { - this._toDispose.add(o); - } - return o; - } -} -DisposableStore.DISABLE_DISPOSED_WARNING = false; -class Disposable { - constructor() { - this._store = new DisposableStore(); - trackDisposable(this); - setParentOfDisposable(this._store, this); - } - dispose() { - markAsDisposed(this); - this._store.dispose(); - } - _register(o) { - if (o === this) { - throw new Error('Cannot register a disposable on itself!'); - } - return this._store.add(o); - } -} -Disposable.None = Object.freeze({ dispose() { } }); -/** - * Manages the lifecycle of a disposable value that may be changed. - * - * This ensures that when the disposable value is changed, the previously held disposable is disposed of. You can - * also register a `MutableDisposable` on a `Disposable` to ensure it is automatically cleaned up. - */ -class MutableDisposable { - constructor() { - this._isDisposed = false; - trackDisposable(this); - } - get value() { - return this._isDisposed ? undefined : this._value; - } - set value(value) { - var _a; - if (this._isDisposed || value === this._value) { - return; - } - (_a = this._value) === null || _a === void 0 ? void 0 : _a.dispose(); - if (value) { - setParentOfDisposable(value, this); - } - this._value = value; - } - clear() { - this.value = undefined; - } - dispose() { - var _a; - this._isDisposed = true; - markAsDisposed(this); - (_a = this._value) === null || _a === void 0 ? void 0 : _a.dispose(); - this._value = undefined; - } - /** - * Clears the value, but does not dispose it. - * The old value is returned. - */ - clearAndLeak() { - const oldValue = this._value; - this._value = undefined; - if (oldValue) { - setParentOfDisposable(oldValue, null); - } - return oldValue; - } -} -class RefCountedDisposable { - constructor(_disposable) { - this._disposable = _disposable; - this._counter = 1; - } - acquire() { - this._counter++; - return this; - } - release() { - if (--this._counter === 0) { - this._disposable.dispose(); - } - return this; - } -} -/** - * A safe disposable can be `unset` so that a leaked reference (listener) - * can be cut-off. - */ -class SafeDisposable { - constructor() { - this.dispose = () => { }; - this.unset = () => { }; - this.isset = () => false; - trackDisposable(this); - } - set(fn) { - let callback = fn; - this.unset = () => callback = undefined; - this.isset = () => callback !== undefined; - this.dispose = () => { - if (callback) { - callback(); - callback = undefined; - markAsDisposed(this); - } - }; - return this; - } -} -class ImmortalReference { - constructor(object) { - this.object = object; - } - dispose() { } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/linkedList.js": -/*!*********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/linkedList.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LinkedList: () => (/* binding */ LinkedList) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -class Node { - constructor(element) { - this.element = element; - this.next = Node.Undefined; - this.prev = Node.Undefined; - } -} -Node.Undefined = new Node(undefined); -class LinkedList { - constructor() { - this._first = Node.Undefined; - this._last = Node.Undefined; - this._size = 0; - } - get size() { - return this._size; - } - isEmpty() { - return this._first === Node.Undefined; - } - clear() { - let node = this._first; - while (node !== Node.Undefined) { - const next = node.next; - node.prev = Node.Undefined; - node.next = Node.Undefined; - node = next; - } - this._first = Node.Undefined; - this._last = Node.Undefined; - this._size = 0; - } - unshift(element) { - return this._insert(element, false); - } - push(element) { - return this._insert(element, true); - } - _insert(element, atTheEnd) { - const newNode = new Node(element); - if (this._first === Node.Undefined) { - this._first = newNode; - this._last = newNode; - } - else if (atTheEnd) { - // push - const oldLast = this._last; - this._last = newNode; - newNode.prev = oldLast; - oldLast.next = newNode; - } - else { - // unshift - const oldFirst = this._first; - this._first = newNode; - newNode.next = oldFirst; - oldFirst.prev = newNode; - } - this._size += 1; - let didRemove = false; - return () => { - if (!didRemove) { - didRemove = true; - this._remove(newNode); - } - }; - } - shift() { - if (this._first === Node.Undefined) { - return undefined; - } - else { - const res = this._first.element; - this._remove(this._first); - return res; - } - } - pop() { - if (this._last === Node.Undefined) { - return undefined; - } - else { - const res = this._last.element; - this._remove(this._last); - return res; - } - } - _remove(node) { - if (node.prev !== Node.Undefined && node.next !== Node.Undefined) { - // middle - const anchor = node.prev; - anchor.next = node.next; - node.next.prev = anchor; - } - else if (node.prev === Node.Undefined && node.next === Node.Undefined) { - // only node - this._first = Node.Undefined; - this._last = Node.Undefined; - } - else if (node.next === Node.Undefined) { - // last - this._last = this._last.prev; - this._last.next = Node.Undefined; - } - else if (node.prev === Node.Undefined) { - // first - this._first = this._first.next; - this._first.prev = Node.Undefined; - } - // done - this._size -= 1; - } - *[Symbol.iterator]() { - let node = this._first; - while (node !== Node.Undefined) { - yield node.element; - node = node.next; - } - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/objects.js": -/*!******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/objects.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ cloneAndChange: () => (/* binding */ cloneAndChange), -/* harmony export */ deepClone: () => (/* binding */ deepClone), -/* harmony export */ deepFreeze: () => (/* binding */ deepFreeze), -/* harmony export */ equals: () => (/* binding */ equals), -/* harmony export */ mixin: () => (/* binding */ mixin) -/* harmony export */ }); -/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types.js */ "./node_modules/monaco-editor/esm/vs/base/common/types.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -function deepClone(obj) { - if (!obj || typeof obj !== 'object') { - return obj; - } - if (obj instanceof RegExp) { - // See https://github.com/microsoft/TypeScript/issues/10990 - return obj; - } - const result = Array.isArray(obj) ? [] : {}; - Object.keys(obj).forEach((key) => { - if (obj[key] && typeof obj[key] === 'object') { - result[key] = deepClone(obj[key]); - } - else { - result[key] = obj[key]; - } - }); - return result; -} -function deepFreeze(obj) { - if (!obj || typeof obj !== 'object') { - return obj; - } - const stack = [obj]; - while (stack.length > 0) { - const obj = stack.shift(); - Object.freeze(obj); - for (const key in obj) { - if (_hasOwnProperty.call(obj, key)) { - const prop = obj[key]; - if (typeof prop === 'object' && !Object.isFrozen(prop) && !(0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isTypedArray)(prop)) { - stack.push(prop); - } - } - } - } - return obj; -} -const _hasOwnProperty = Object.prototype.hasOwnProperty; -function cloneAndChange(obj, changer) { - return _cloneAndChange(obj, changer, new Set()); -} -function _cloneAndChange(obj, changer, seen) { - if ((0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isUndefinedOrNull)(obj)) { - return obj; - } - const changed = changer(obj); - if (typeof changed !== 'undefined') { - return changed; - } - if ((0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(obj)) { - const r1 = []; - for (const e of obj) { - r1.push(_cloneAndChange(e, changer, seen)); - } - return r1; - } - if ((0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(obj)) { - if (seen.has(obj)) { - throw new Error('Cannot clone recursive data-structure'); - } - seen.add(obj); - const r2 = {}; - for (const i2 in obj) { - if (_hasOwnProperty.call(obj, i2)) { - r2[i2] = _cloneAndChange(obj[i2], changer, seen); - } - } - seen.delete(obj); - return r2; - } - return obj; -} -/** - * Copies all properties of source into destination. The optional parameter "overwrite" allows to control - * if existing properties on the destination should be overwritten or not. Defaults to true (overwrite). - */ -function mixin(destination, source, overwrite = true) { - if (!(0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(destination)) { - return source; - } - if ((0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(source)) { - Object.keys(source).forEach(key => { - if (key in destination) { - if (overwrite) { - if ((0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(destination[key]) && (0,_types_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(source[key])) { - mixin(destination[key], source[key], overwrite); - } - else { - destination[key] = source[key]; - } - } - } - else { - destination[key] = source[key]; - } - }); - } - return destination; -} -function equals(one, other) { - if (one === other) { - return true; - } - if (one === null || one === undefined || other === null || other === undefined) { - return false; - } - if (typeof one !== typeof other) { - return false; - } - if (typeof one !== 'object') { - return false; - } - if ((Array.isArray(one)) !== (Array.isArray(other))) { - return false; - } - let i; - let key; - if (Array.isArray(one)) { - if (one.length !== other.length) { - return false; - } - for (i = 0; i < one.length; i++) { - if (!equals(one[i], other[i])) { - return false; - } - } - } - else { - const oneKeys = []; - for (key in one) { - oneKeys.push(key); - } - oneKeys.sort(); - const otherKeys = []; - for (key in other) { - otherKeys.push(key); - } - otherKeys.sort(); - if (!equals(oneKeys, otherKeys)) { - return false; - } - for (i = 0; i < oneKeys.length; i++) { - if (!equals(one[oneKeys[i]], other[oneKeys[i]])) { - return false; - } - } - } - return true; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/path.js": -/*!***************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/path.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ basename: () => (/* binding */ basename), -/* harmony export */ dirname: () => (/* binding */ dirname), -/* harmony export */ extname: () => (/* binding */ extname), -/* harmony export */ normalize: () => (/* binding */ normalize), -/* harmony export */ posix: () => (/* binding */ posix), -/* harmony export */ relative: () => (/* binding */ relative), -/* harmony export */ resolve: () => (/* binding */ resolve), -/* harmony export */ sep: () => (/* binding */ sep), -/* harmony export */ win32: () => (/* binding */ win32) -/* harmony export */ }); -/* harmony import */ var _process_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./process.js */ "./node_modules/monaco-editor/esm/vs/base/common/process.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// NOTE: VSCode's copy of nodejs path library to be usable in common (non-node) namespace -// Copied from: https://github.com/nodejs/node/blob/v14.16.0/lib/path.js -/** - * Copyright Joyent, Inc. and other Node contributors. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to permit - * persons to whom the Software is furnished to do so, subject to the - * following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -const CHAR_UPPERCASE_A = 65; /* A */ -const CHAR_LOWERCASE_A = 97; /* a */ -const CHAR_UPPERCASE_Z = 90; /* Z */ -const CHAR_LOWERCASE_Z = 122; /* z */ -const CHAR_DOT = 46; /* . */ -const CHAR_FORWARD_SLASH = 47; /* / */ -const CHAR_BACKWARD_SLASH = 92; /* \ */ -const CHAR_COLON = 58; /* : */ -const CHAR_QUESTION_MARK = 63; /* ? */ -class ErrorInvalidArgType extends Error { - constructor(name, expected, actual) { - // determiner: 'must be' or 'must not be' - let determiner; - if (typeof expected === 'string' && expected.indexOf('not ') === 0) { - determiner = 'must not be'; - expected = expected.replace(/^not /, ''); - } - else { - determiner = 'must be'; - } - const type = name.indexOf('.') !== -1 ? 'property' : 'argument'; - let msg = `The "${name}" ${type} ${determiner} of type ${expected}`; - msg += `. Received type ${typeof actual}`; - super(msg); - this.code = 'ERR_INVALID_ARG_TYPE'; - } -} -function validateString(value, name) { - if (typeof value !== 'string') { - throw new ErrorInvalidArgType(name, 'string', value); - } -} -function isPathSeparator(code) { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; -} -function isPosixPathSeparator(code) { - return code === CHAR_FORWARD_SLASH; -} -function isWindowsDeviceRoot(code) { - return (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) || - (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z); -} -// Resolves . and .. elements in a path with directory names -function normalizeString(path, allowAboveRoot, separator, isPathSeparator) { - let res = ''; - let lastSegmentLength = 0; - let lastSlash = -1; - let dots = 0; - let code = 0; - for (let i = 0; i <= path.length; ++i) { - if (i < path.length) { - code = path.charCodeAt(i); - } - else if (isPathSeparator(code)) { - break; - } - else { - code = CHAR_FORWARD_SLASH; - } - if (isPathSeparator(code)) { - if (lastSlash === i - 1 || dots === 1) { - // NOOP - } - else if (dots === 2) { - if (res.length < 2 || lastSegmentLength !== 2 || - res.charCodeAt(res.length - 1) !== CHAR_DOT || - res.charCodeAt(res.length - 2) !== CHAR_DOT) { - if (res.length > 2) { - const lastSlashIndex = res.lastIndexOf(separator); - if (lastSlashIndex === -1) { - res = ''; - lastSegmentLength = 0; - } - else { - res = res.slice(0, lastSlashIndex); - lastSegmentLength = res.length - 1 - res.lastIndexOf(separator); - } - lastSlash = i; - dots = 0; - continue; - } - else if (res.length !== 0) { - res = ''; - lastSegmentLength = 0; - lastSlash = i; - dots = 0; - continue; - } - } - if (allowAboveRoot) { - res += res.length > 0 ? `${separator}..` : '..'; - lastSegmentLength = 2; - } - } - else { - if (res.length > 0) { - res += `${separator}${path.slice(lastSlash + 1, i)}`; - } - else { - res = path.slice(lastSlash + 1, i); - } - lastSegmentLength = i - lastSlash - 1; - } - lastSlash = i; - dots = 0; - } - else if (code === CHAR_DOT && dots !== -1) { - ++dots; - } - else { - dots = -1; - } - } - return res; -} -function _format(sep, pathObject) { - if (pathObject === null || typeof pathObject !== 'object') { - throw new ErrorInvalidArgType('pathObject', 'Object', pathObject); - } - const dir = pathObject.dir || pathObject.root; - const base = pathObject.base || - `${pathObject.name || ''}${pathObject.ext || ''}`; - if (!dir) { - return base; - } - return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`; -} -const win32 = { - // path.resolve([from ...], to) - resolve(...pathSegments) { - let resolvedDevice = ''; - let resolvedTail = ''; - let resolvedAbsolute = false; - for (let i = pathSegments.length - 1; i >= -1; i--) { - let path; - if (i >= 0) { - path = pathSegments[i]; - validateString(path, 'path'); - // Skip empty entries - if (path.length === 0) { - continue; - } - } - else if (resolvedDevice.length === 0) { - path = _process_js__WEBPACK_IMPORTED_MODULE_0__.cwd(); - } - else { - // Windows has the concept of drive-specific current working - // directories. If we've resolved a drive letter but not yet an - // absolute path, get cwd for that drive, or the process cwd if - // the drive cwd is not available. We're sure the device is not - // a UNC path at this points, because UNC paths are always absolute. - path = _process_js__WEBPACK_IMPORTED_MODULE_0__.env[`=${resolvedDevice}`] || _process_js__WEBPACK_IMPORTED_MODULE_0__.cwd(); - // Verify that a cwd was found and that it actually points - // to our drive. If not, default to the drive's root. - if (path === undefined || - (path.slice(0, 2).toLowerCase() !== resolvedDevice.toLowerCase() && - path.charCodeAt(2) === CHAR_BACKWARD_SLASH)) { - path = `${resolvedDevice}\\`; - } - } - const len = path.length; - let rootEnd = 0; - let device = ''; - let isAbsolute = false; - const code = path.charCodeAt(0); - // Try to match a root - if (len === 1) { - if (isPathSeparator(code)) { - // `path` contains just a path separator - rootEnd = 1; - isAbsolute = true; - } - } - else if (isPathSeparator(code)) { - // Possible UNC root - // If we started with a separator, we know we at least have an - // absolute path of some kind (UNC or otherwise) - isAbsolute = true; - if (isPathSeparator(path.charCodeAt(1))) { - // Matched double path separator at beginning - let j = 2; - let last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - const firstPart = path.slice(last, j); - // Matched! - last = j; - // Match 1 or more path separators - while (j < len && isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j === len || j !== last) { - // We matched a UNC root - device = `\\\\${firstPart}\\${path.slice(last, j)}`; - rootEnd = j; - } - } - } - } - else { - rootEnd = 1; - } - } - else if (isWindowsDeviceRoot(code) && - path.charCodeAt(1) === CHAR_COLON) { - // Possible device root - device = path.slice(0, 2); - rootEnd = 2; - if (len > 2 && isPathSeparator(path.charCodeAt(2))) { - // Treat separator following drive name as an absolute path - // indicator - isAbsolute = true; - rootEnd = 3; - } - } - if (device.length > 0) { - if (resolvedDevice.length > 0) { - if (device.toLowerCase() !== resolvedDevice.toLowerCase()) { - // This path points to another device so it is not applicable - continue; - } - } - else { - resolvedDevice = device; - } - } - if (resolvedAbsolute) { - if (resolvedDevice.length > 0) { - break; - } - } - else { - resolvedTail = `${path.slice(rootEnd)}\\${resolvedTail}`; - resolvedAbsolute = isAbsolute; - if (isAbsolute && resolvedDevice.length > 0) { - break; - } - } - } - // At this point the path should be resolved to a full absolute path, - // but handle relative paths to be safe (might happen when process.cwd() - // fails) - // Normalize the tail path - resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, '\\', isPathSeparator); - return resolvedAbsolute ? - `${resolvedDevice}\\${resolvedTail}` : - `${resolvedDevice}${resolvedTail}` || '.'; - }, - normalize(path) { - validateString(path, 'path'); - const len = path.length; - if (len === 0) { - return '.'; - } - let rootEnd = 0; - let device; - let isAbsolute = false; - const code = path.charCodeAt(0); - // Try to match a root - if (len === 1) { - // `path` contains just a single char, exit early to avoid - // unnecessary work - return isPosixPathSeparator(code) ? '\\' : path; - } - if (isPathSeparator(code)) { - // Possible UNC root - // If we started with a separator, we know we at least have an absolute - // path of some kind (UNC or otherwise) - isAbsolute = true; - if (isPathSeparator(path.charCodeAt(1))) { - // Matched double path separator at beginning - let j = 2; - let last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - const firstPart = path.slice(last, j); - // Matched! - last = j; - // Match 1 or more path separators - while (j < len && isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j === len) { - // We matched a UNC root only - // Return the normalized version of the UNC root since there - // is nothing left to process - return `\\\\${firstPart}\\${path.slice(last)}\\`; - } - if (j !== last) { - // We matched a UNC root with leftovers - device = `\\\\${firstPart}\\${path.slice(last, j)}`; - rootEnd = j; - } - } - } - } - else { - rootEnd = 1; - } - } - else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { - // Possible device root - device = path.slice(0, 2); - rootEnd = 2; - if (len > 2 && isPathSeparator(path.charCodeAt(2))) { - // Treat separator following drive name as an absolute path - // indicator - isAbsolute = true; - rootEnd = 3; - } - } - let tail = rootEnd < len ? - normalizeString(path.slice(rootEnd), !isAbsolute, '\\', isPathSeparator) : - ''; - if (tail.length === 0 && !isAbsolute) { - tail = '.'; - } - if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) { - tail += '\\'; - } - if (device === undefined) { - return isAbsolute ? `\\${tail}` : tail; - } - return isAbsolute ? `${device}\\${tail}` : `${device}${tail}`; - }, - isAbsolute(path) { - validateString(path, 'path'); - const len = path.length; - if (len === 0) { - return false; - } - const code = path.charCodeAt(0); - return isPathSeparator(code) || - // Possible device root - (len > 2 && - isWindowsDeviceRoot(code) && - path.charCodeAt(1) === CHAR_COLON && - isPathSeparator(path.charCodeAt(2))); - }, - join(...paths) { - if (paths.length === 0) { - return '.'; - } - let joined; - let firstPart; - for (let i = 0; i < paths.length; ++i) { - const arg = paths[i]; - validateString(arg, 'path'); - if (arg.length > 0) { - if (joined === undefined) { - joined = firstPart = arg; - } - else { - joined += `\\${arg}`; - } - } - } - if (joined === undefined) { - return '.'; - } - // Make sure that the joined path doesn't start with two slashes, because - // normalize() will mistake it for a UNC path then. - // - // This step is skipped when it is very clear that the user actually - // intended to point at a UNC path. This is assumed when the first - // non-empty string arguments starts with exactly two slashes followed by - // at least one more non-slash character. - // - // Note that for normalize() to treat a path as a UNC path it needs to - // have at least 2 components, so we don't filter for that here. - // This means that the user can use join to construct UNC paths from - // a server name and a share name; for example: - // path.join('//server', 'share') -> '\\\\server\\share\\') - let needsReplace = true; - let slashCount = 0; - if (typeof firstPart === 'string' && isPathSeparator(firstPart.charCodeAt(0))) { - ++slashCount; - const firstLen = firstPart.length; - if (firstLen > 1 && isPathSeparator(firstPart.charCodeAt(1))) { - ++slashCount; - if (firstLen > 2) { - if (isPathSeparator(firstPart.charCodeAt(2))) { - ++slashCount; - } - else { - // We matched a UNC path in the first part - needsReplace = false; - } - } - } - } - if (needsReplace) { - // Find any more consecutive slashes we need to replace - while (slashCount < joined.length && - isPathSeparator(joined.charCodeAt(slashCount))) { - slashCount++; - } - // Replace the slashes if needed - if (slashCount >= 2) { - joined = `\\${joined.slice(slashCount)}`; - } - } - return win32.normalize(joined); - }, - // It will solve the relative path from `from` to `to`, for instance: - // from = 'C:\\orandea\\test\\aaa' - // to = 'C:\\orandea\\impl\\bbb' - // The output of the function should be: '..\\..\\impl\\bbb' - relative(from, to) { - validateString(from, 'from'); - validateString(to, 'to'); - if (from === to) { - return ''; - } - const fromOrig = win32.resolve(from); - const toOrig = win32.resolve(to); - if (fromOrig === toOrig) { - return ''; - } - from = fromOrig.toLowerCase(); - to = toOrig.toLowerCase(); - if (from === to) { - return ''; - } - // Trim any leading backslashes - let fromStart = 0; - while (fromStart < from.length && - from.charCodeAt(fromStart) === CHAR_BACKWARD_SLASH) { - fromStart++; - } - // Trim trailing backslashes (applicable to UNC paths only) - let fromEnd = from.length; - while (fromEnd - 1 > fromStart && - from.charCodeAt(fromEnd - 1) === CHAR_BACKWARD_SLASH) { - fromEnd--; - } - const fromLen = fromEnd - fromStart; - // Trim any leading backslashes - let toStart = 0; - while (toStart < to.length && - to.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) { - toStart++; - } - // Trim trailing backslashes (applicable to UNC paths only) - let toEnd = to.length; - while (toEnd - 1 > toStart && - to.charCodeAt(toEnd - 1) === CHAR_BACKWARD_SLASH) { - toEnd--; - } - const toLen = toEnd - toStart; - // Compare paths to find the longest common path from root - const length = fromLen < toLen ? fromLen : toLen; - let lastCommonSep = -1; - let i = 0; - for (; i < length; i++) { - const fromCode = from.charCodeAt(fromStart + i); - if (fromCode !== to.charCodeAt(toStart + i)) { - break; - } - else if (fromCode === CHAR_BACKWARD_SLASH) { - lastCommonSep = i; - } - } - // We found a mismatch before the first common path separator was seen, so - // return the original `to`. - if (i !== length) { - if (lastCommonSep === -1) { - return toOrig; - } - } - else { - if (toLen > length) { - if (to.charCodeAt(toStart + i) === CHAR_BACKWARD_SLASH) { - // We get here if `from` is the exact base path for `to`. - // For example: from='C:\\foo\\bar'; to='C:\\foo\\bar\\baz' - return toOrig.slice(toStart + i + 1); - } - if (i === 2) { - // We get here if `from` is the device root. - // For example: from='C:\\'; to='C:\\foo' - return toOrig.slice(toStart + i); - } - } - if (fromLen > length) { - if (from.charCodeAt(fromStart + i) === CHAR_BACKWARD_SLASH) { - // We get here if `to` is the exact base path for `from`. - // For example: from='C:\\foo\\bar'; to='C:\\foo' - lastCommonSep = i; - } - else if (i === 2) { - // We get here if `to` is the device root. - // For example: from='C:\\foo\\bar'; to='C:\\' - lastCommonSep = 3; - } - } - if (lastCommonSep === -1) { - lastCommonSep = 0; - } - } - let out = ''; - // Generate the relative path based on the path difference between `to` and - // `from` - for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) { - if (i === fromEnd || from.charCodeAt(i) === CHAR_BACKWARD_SLASH) { - out += out.length === 0 ? '..' : '\\..'; - } - } - toStart += lastCommonSep; - // Lastly, append the rest of the destination (`to`) path that comes after - // the common path parts - if (out.length > 0) { - return `${out}${toOrig.slice(toStart, toEnd)}`; - } - if (toOrig.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) { - ++toStart; - } - return toOrig.slice(toStart, toEnd); - }, - toNamespacedPath(path) { - // Note: this will *probably* throw somewhere. - if (typeof path !== 'string') { - return path; - } - if (path.length === 0) { - return ''; - } - const resolvedPath = win32.resolve(path); - if (resolvedPath.length <= 2) { - return path; - } - if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) { - // Possible UNC root - if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) { - const code = resolvedPath.charCodeAt(2); - if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) { - // Matched non-long UNC root, convert the path to a long UNC path - return `\\\\?\\UNC\\${resolvedPath.slice(2)}`; - } - } - } - else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0)) && - resolvedPath.charCodeAt(1) === CHAR_COLON && - resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH) { - // Matched device root, convert the path to a long UNC path - return `\\\\?\\${resolvedPath}`; - } - return path; - }, - dirname(path) { - validateString(path, 'path'); - const len = path.length; - if (len === 0) { - return '.'; - } - let rootEnd = -1; - let offset = 0; - const code = path.charCodeAt(0); - if (len === 1) { - // `path` contains just a path separator, exit early to avoid - // unnecessary work or a dot. - return isPathSeparator(code) ? path : '.'; - } - // Try to match a root - if (isPathSeparator(code)) { - // Possible UNC root - rootEnd = offset = 1; - if (isPathSeparator(path.charCodeAt(1))) { - // Matched double path separator at beginning - let j = 2; - let last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more path separators - while (j < len && isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j === len) { - // We matched a UNC root only - return path; - } - if (j !== last) { - // We matched a UNC root with leftovers - // Offset by 1 to include the separator after the UNC root to - // treat it as a "normal root" on top of a (UNC) root - rootEnd = offset = j + 1; - } - } - } - } - // Possible device root - } - else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { - rootEnd = len > 2 && isPathSeparator(path.charCodeAt(2)) ? 3 : 2; - offset = rootEnd; - } - let end = -1; - let matchedSlash = true; - for (let i = len - 1; i >= offset; --i) { - if (isPathSeparator(path.charCodeAt(i))) { - if (!matchedSlash) { - end = i; - break; - } - } - else { - // We saw the first non-path separator - matchedSlash = false; - } - } - if (end === -1) { - if (rootEnd === -1) { - return '.'; - } - end = rootEnd; - } - return path.slice(0, end); - }, - basename(path, ext) { - if (ext !== undefined) { - validateString(ext, 'ext'); - } - validateString(path, 'path'); - let start = 0; - let end = -1; - let matchedSlash = true; - let i; - // Check for a drive letter prefix so as not to mistake the following - // path separator as an extra separator at the end of the path that can be - // disregarded - if (path.length >= 2 && - isWindowsDeviceRoot(path.charCodeAt(0)) && - path.charCodeAt(1) === CHAR_COLON) { - start = 2; - } - if (ext !== undefined && ext.length > 0 && ext.length <= path.length) { - if (ext === path) { - return ''; - } - let extIdx = ext.length - 1; - let firstNonSlashEnd = -1; - for (i = path.length - 1; i >= start; --i) { - const code = path.charCodeAt(i); - if (isPathSeparator(code)) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - start = i + 1; - break; - } - } - else { - if (firstNonSlashEnd === -1) { - // We saw the first non-path separator, remember this index in case - // we need it if the extension ends up not matching - matchedSlash = false; - firstNonSlashEnd = i + 1; - } - if (extIdx >= 0) { - // Try to match the explicit extension - if (code === ext.charCodeAt(extIdx)) { - if (--extIdx === -1) { - // We matched the extension, so mark this as the end of our path - // component - end = i; - } - } - else { - // Extension does not match, so our result is the entire path - // component - extIdx = -1; - end = firstNonSlashEnd; - } - } - } - } - if (start === end) { - end = firstNonSlashEnd; - } - else if (end === -1) { - end = path.length; - } - return path.slice(start, end); - } - for (i = path.length - 1; i >= start; --i) { - if (isPathSeparator(path.charCodeAt(i))) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - start = i + 1; - break; - } - } - else if (end === -1) { - // We saw the first non-path separator, mark this as the end of our - // path component - matchedSlash = false; - end = i + 1; - } - } - if (end === -1) { - return ''; - } - return path.slice(start, end); - }, - extname(path) { - validateString(path, 'path'); - let start = 0; - let startDot = -1; - let startPart = 0; - let end = -1; - let matchedSlash = true; - // Track the state of characters (if any) we see before our first dot and - // after any path separator we find - let preDotState = 0; - // Check for a drive letter prefix so as not to mistake the following - // path separator as an extra separator at the end of the path that can be - // disregarded - if (path.length >= 2 && - path.charCodeAt(1) === CHAR_COLON && - isWindowsDeviceRoot(path.charCodeAt(0))) { - start = startPart = 2; - } - for (let i = path.length - 1; i >= start; --i) { - const code = path.charCodeAt(i); - if (isPathSeparator(code)) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - startPart = i + 1; - break; - } - continue; - } - if (end === -1) { - // We saw the first non-path separator, mark this as the end of our - // extension - matchedSlash = false; - end = i + 1; - } - if (code === CHAR_DOT) { - // If this is our first dot, mark it as the start of our extension - if (startDot === -1) { - startDot = i; - } - else if (preDotState !== 1) { - preDotState = 1; - } - } - else if (startDot !== -1) { - // We saw a non-dot and non-path separator before our dot, so we should - // have a good chance at having a non-empty extension - preDotState = -1; - } - } - if (startDot === -1 || - end === -1 || - // We saw a non-dot character immediately before the dot - preDotState === 0 || - // The (right-most) trimmed path component is exactly '..' - (preDotState === 1 && - startDot === end - 1 && - startDot === startPart + 1)) { - return ''; - } - return path.slice(startDot, end); - }, - format: _format.bind(null, '\\'), - parse(path) { - validateString(path, 'path'); - const ret = { root: '', dir: '', base: '', ext: '', name: '' }; - if (path.length === 0) { - return ret; - } - const len = path.length; - let rootEnd = 0; - let code = path.charCodeAt(0); - if (len === 1) { - if (isPathSeparator(code)) { - // `path` contains just a path separator, exit early to avoid - // unnecessary work - ret.root = ret.dir = path; - return ret; - } - ret.base = ret.name = path; - return ret; - } - // Try to match a root - if (isPathSeparator(code)) { - // Possible UNC root - rootEnd = 1; - if (isPathSeparator(path.charCodeAt(1))) { - // Matched double path separator at beginning - let j = 2; - let last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more path separators - while (j < len && isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more non-path separators - while (j < len && !isPathSeparator(path.charCodeAt(j))) { - j++; - } - if (j === len) { - // We matched a UNC root only - rootEnd = j; - } - else if (j !== last) { - // We matched a UNC root with leftovers - rootEnd = j + 1; - } - } - } - } - } - else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { - // Possible device root - if (len <= 2) { - // `path` contains just a drive root, exit early to avoid - // unnecessary work - ret.root = ret.dir = path; - return ret; - } - rootEnd = 2; - if (isPathSeparator(path.charCodeAt(2))) { - if (len === 3) { - // `path` contains just a drive root, exit early to avoid - // unnecessary work - ret.root = ret.dir = path; - return ret; - } - rootEnd = 3; - } - } - if (rootEnd > 0) { - ret.root = path.slice(0, rootEnd); - } - let startDot = -1; - let startPart = rootEnd; - let end = -1; - let matchedSlash = true; - let i = path.length - 1; - // Track the state of characters (if any) we see before our first dot and - // after any path separator we find - let preDotState = 0; - // Get non-dir info - for (; i >= rootEnd; --i) { - code = path.charCodeAt(i); - if (isPathSeparator(code)) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - startPart = i + 1; - break; - } - continue; - } - if (end === -1) { - // We saw the first non-path separator, mark this as the end of our - // extension - matchedSlash = false; - end = i + 1; - } - if (code === CHAR_DOT) { - // If this is our first dot, mark it as the start of our extension - if (startDot === -1) { - startDot = i; - } - else if (preDotState !== 1) { - preDotState = 1; - } - } - else if (startDot !== -1) { - // We saw a non-dot and non-path separator before our dot, so we should - // have a good chance at having a non-empty extension - preDotState = -1; - } - } - if (end !== -1) { - if (startDot === -1 || - // We saw a non-dot character immediately before the dot - preDotState === 0 || - // The (right-most) trimmed path component is exactly '..' - (preDotState === 1 && - startDot === end - 1 && - startDot === startPart + 1)) { - ret.base = ret.name = path.slice(startPart, end); - } - else { - ret.name = path.slice(startPart, startDot); - ret.base = path.slice(startPart, end); - ret.ext = path.slice(startDot, end); - } - } - // If the directory is the root, use the entire root as the `dir` including - // the trailing slash if any (`C:\abc` -> `C:\`). Otherwise, strip out the - // trailing slash (`C:\abc\def` -> `C:\abc`). - if (startPart > 0 && startPart !== rootEnd) { - ret.dir = path.slice(0, startPart - 1); - } - else { - ret.dir = ret.root; - } - return ret; - }, - sep: '\\', - delimiter: ';', - win32: null, - posix: null -}; -const posix = { - // path.resolve([from ...], to) - resolve(...pathSegments) { - let resolvedPath = ''; - let resolvedAbsolute = false; - for (let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - const path = i >= 0 ? pathSegments[i] : _process_js__WEBPACK_IMPORTED_MODULE_0__.cwd(); - validateString(path, 'path'); - // Skip empty entries - if (path.length === 0) { - continue; - } - resolvedPath = `${path}/${resolvedPath}`; - resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; - } - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - // Normalize the path - resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator); - if (resolvedAbsolute) { - return `/${resolvedPath}`; - } - return resolvedPath.length > 0 ? resolvedPath : '.'; - }, - normalize(path) { - validateString(path, 'path'); - if (path.length === 0) { - return '.'; - } - const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; - const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH; - // Normalize the path - path = normalizeString(path, !isAbsolute, '/', isPosixPathSeparator); - if (path.length === 0) { - if (isAbsolute) { - return '/'; - } - return trailingSeparator ? './' : '.'; - } - if (trailingSeparator) { - path += '/'; - } - return isAbsolute ? `/${path}` : path; - }, - isAbsolute(path) { - validateString(path, 'path'); - return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH; - }, - join(...paths) { - if (paths.length === 0) { - return '.'; - } - let joined; - for (let i = 0; i < paths.length; ++i) { - const arg = paths[i]; - validateString(arg, 'path'); - if (arg.length > 0) { - if (joined === undefined) { - joined = arg; - } - else { - joined += `/${arg}`; - } - } - } - if (joined === undefined) { - return '.'; - } - return posix.normalize(joined); - }, - relative(from, to) { - validateString(from, 'from'); - validateString(to, 'to'); - if (from === to) { - return ''; - } - // Trim leading forward slashes. - from = posix.resolve(from); - to = posix.resolve(to); - if (from === to) { - return ''; - } - const fromStart = 1; - const fromEnd = from.length; - const fromLen = fromEnd - fromStart; - const toStart = 1; - const toLen = to.length - toStart; - // Compare paths to find the longest common path from root - const length = (fromLen < toLen ? fromLen : toLen); - let lastCommonSep = -1; - let i = 0; - for (; i < length; i++) { - const fromCode = from.charCodeAt(fromStart + i); - if (fromCode !== to.charCodeAt(toStart + i)) { - break; - } - else if (fromCode === CHAR_FORWARD_SLASH) { - lastCommonSep = i; - } - } - if (i === length) { - if (toLen > length) { - if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) { - // We get here if `from` is the exact base path for `to`. - // For example: from='/foo/bar'; to='/foo/bar/baz' - return to.slice(toStart + i + 1); - } - if (i === 0) { - // We get here if `from` is the root - // For example: from='/'; to='/foo' - return to.slice(toStart + i); - } - } - else if (fromLen > length) { - if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) { - // We get here if `to` is the exact base path for `from`. - // For example: from='/foo/bar/baz'; to='/foo/bar' - lastCommonSep = i; - } - else if (i === 0) { - // We get here if `to` is the root. - // For example: from='/foo/bar'; to='/' - lastCommonSep = 0; - } - } - } - let out = ''; - // Generate the relative path based on the path difference between `to` - // and `from`. - for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) { - if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) { - out += out.length === 0 ? '..' : '/..'; - } - } - // Lastly, append the rest of the destination (`to`) path that comes after - // the common path parts. - return `${out}${to.slice(toStart + lastCommonSep)}`; - }, - toNamespacedPath(path) { - // Non-op on posix systems - return path; - }, - dirname(path) { - validateString(path, 'path'); - if (path.length === 0) { - return '.'; - } - const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH; - let end = -1; - let matchedSlash = true; - for (let i = path.length - 1; i >= 1; --i) { - if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { - if (!matchedSlash) { - end = i; - break; - } - } - else { - // We saw the first non-path separator - matchedSlash = false; - } - } - if (end === -1) { - return hasRoot ? '/' : '.'; - } - if (hasRoot && end === 1) { - return '//'; - } - return path.slice(0, end); - }, - basename(path, ext) { - if (ext !== undefined) { - validateString(ext, 'ext'); - } - validateString(path, 'path'); - let start = 0; - let end = -1; - let matchedSlash = true; - let i; - if (ext !== undefined && ext.length > 0 && ext.length <= path.length) { - if (ext === path) { - return ''; - } - let extIdx = ext.length - 1; - let firstNonSlashEnd = -1; - for (i = path.length - 1; i >= 0; --i) { - const code = path.charCodeAt(i); - if (code === CHAR_FORWARD_SLASH) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - start = i + 1; - break; - } - } - else { - if (firstNonSlashEnd === -1) { - // We saw the first non-path separator, remember this index in case - // we need it if the extension ends up not matching - matchedSlash = false; - firstNonSlashEnd = i + 1; - } - if (extIdx >= 0) { - // Try to match the explicit extension - if (code === ext.charCodeAt(extIdx)) { - if (--extIdx === -1) { - // We matched the extension, so mark this as the end of our path - // component - end = i; - } - } - else { - // Extension does not match, so our result is the entire path - // component - extIdx = -1; - end = firstNonSlashEnd; - } - } - } - } - if (start === end) { - end = firstNonSlashEnd; - } - else if (end === -1) { - end = path.length; - } - return path.slice(start, end); - } - for (i = path.length - 1; i >= 0; --i) { - if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - start = i + 1; - break; - } - } - else if (end === -1) { - // We saw the first non-path separator, mark this as the end of our - // path component - matchedSlash = false; - end = i + 1; - } - } - if (end === -1) { - return ''; - } - return path.slice(start, end); - }, - extname(path) { - validateString(path, 'path'); - let startDot = -1; - let startPart = 0; - let end = -1; - let matchedSlash = true; - // Track the state of characters (if any) we see before our first dot and - // after any path separator we find - let preDotState = 0; - for (let i = path.length - 1; i >= 0; --i) { - const code = path.charCodeAt(i); - if (code === CHAR_FORWARD_SLASH) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - startPart = i + 1; - break; - } - continue; - } - if (end === -1) { - // We saw the first non-path separator, mark this as the end of our - // extension - matchedSlash = false; - end = i + 1; - } - if (code === CHAR_DOT) { - // If this is our first dot, mark it as the start of our extension - if (startDot === -1) { - startDot = i; - } - else if (preDotState !== 1) { - preDotState = 1; - } - } - else if (startDot !== -1) { - // We saw a non-dot and non-path separator before our dot, so we should - // have a good chance at having a non-empty extension - preDotState = -1; - } - } - if (startDot === -1 || - end === -1 || - // We saw a non-dot character immediately before the dot - preDotState === 0 || - // The (right-most) trimmed path component is exactly '..' - (preDotState === 1 && - startDot === end - 1 && - startDot === startPart + 1)) { - return ''; - } - return path.slice(startDot, end); - }, - format: _format.bind(null, '/'), - parse(path) { - validateString(path, 'path'); - const ret = { root: '', dir: '', base: '', ext: '', name: '' }; - if (path.length === 0) { - return ret; - } - const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; - let start; - if (isAbsolute) { - ret.root = '/'; - start = 1; - } - else { - start = 0; - } - let startDot = -1; - let startPart = 0; - let end = -1; - let matchedSlash = true; - let i = path.length - 1; - // Track the state of characters (if any) we see before our first dot and - // after any path separator we find - let preDotState = 0; - // Get non-dir info - for (; i >= start; --i) { - const code = path.charCodeAt(i); - if (code === CHAR_FORWARD_SLASH) { - // If we reached a path separator that was not part of a set of path - // separators at the end of the string, stop now - if (!matchedSlash) { - startPart = i + 1; - break; - } - continue; - } - if (end === -1) { - // We saw the first non-path separator, mark this as the end of our - // extension - matchedSlash = false; - end = i + 1; - } - if (code === CHAR_DOT) { - // If this is our first dot, mark it as the start of our extension - if (startDot === -1) { - startDot = i; - } - else if (preDotState !== 1) { - preDotState = 1; - } - } - else if (startDot !== -1) { - // We saw a non-dot and non-path separator before our dot, so we should - // have a good chance at having a non-empty extension - preDotState = -1; - } - } - if (end !== -1) { - const start = startPart === 0 && isAbsolute ? 1 : startPart; - if (startDot === -1 || - // We saw a non-dot character immediately before the dot - preDotState === 0 || - // The (right-most) trimmed path component is exactly '..' - (preDotState === 1 && - startDot === end - 1 && - startDot === startPart + 1)) { - ret.base = ret.name = path.slice(start, end); - } - else { - ret.name = path.slice(start, startDot); - ret.base = path.slice(start, end); - ret.ext = path.slice(startDot, end); - } - } - if (startPart > 0) { - ret.dir = path.slice(0, startPart - 1); - } - else if (isAbsolute) { - ret.dir = '/'; - } - return ret; - }, - sep: '/', - delimiter: ':', - win32: null, - posix: null -}; -posix.win32 = win32.win32 = win32; -posix.posix = win32.posix = posix; -const normalize = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.normalize : posix.normalize); -const resolve = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.resolve : posix.resolve); -const relative = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.relative : posix.relative); -const dirname = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.dirname : posix.dirname); -const basename = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.basename : posix.basename); -const extname = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.extname : posix.extname); -const sep = (_process_js__WEBPACK_IMPORTED_MODULE_0__.platform === 'win32' ? win32.sep : posix.sep); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/platform.js": -/*!*******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/platform.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ OS: () => (/* binding */ OS), -/* harmony export */ globals: () => (/* binding */ globals), -/* harmony export */ isAndroid: () => (/* binding */ isAndroid), -/* harmony export */ isChrome: () => (/* binding */ isChrome), -/* harmony export */ isEdge: () => (/* binding */ isEdge), -/* harmony export */ isFirefox: () => (/* binding */ isFirefox), -/* harmony export */ isIOS: () => (/* binding */ isIOS), -/* harmony export */ isLinux: () => (/* binding */ isLinux), -/* harmony export */ isLittleEndian: () => (/* binding */ isLittleEndian), -/* harmony export */ isMacintosh: () => (/* binding */ isMacintosh), -/* harmony export */ isNative: () => (/* binding */ isNative), -/* harmony export */ isSafari: () => (/* binding */ isSafari), -/* harmony export */ isWeb: () => (/* binding */ isWeb), -/* harmony export */ isWebWorker: () => (/* binding */ isWebWorker), -/* harmony export */ isWindows: () => (/* binding */ isWindows), -/* harmony export */ language: () => (/* binding */ language), -/* harmony export */ setTimeout0: () => (/* binding */ setTimeout0), -/* harmony export */ setTimeout0IsFaster: () => (/* binding */ setTimeout0IsFaster), -/* harmony export */ userAgent: () => (/* binding */ userAgent) -/* harmony export */ }); -/* harmony import */ var _nls_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../nls.js */ "./node_modules/monaco-editor/esm/vs/nls.js"); -var _a; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const LANGUAGE_DEFAULT = 'en'; -let _isWindows = false; -let _isMacintosh = false; -let _isLinux = false; -let _isLinuxSnap = false; -let _isNative = false; -let _isWeb = false; -let _isElectron = false; -let _isIOS = false; -let _isCI = false; -let _locale = undefined; -let _language = LANGUAGE_DEFAULT; -let _translationsConfigFile = undefined; -let _userAgent = undefined; -const globals = (typeof self === 'object' ? self : typeof __webpack_require__.g === 'object' ? __webpack_require__.g : {}); -let nodeProcess = undefined; -if (typeof globals.vscode !== 'undefined' && typeof globals.vscode.process !== 'undefined') { - // Native environment (sandboxed) - nodeProcess = globals.vscode.process; -} -else if (typeof process !== 'undefined') { - // Native environment (non-sandboxed) - nodeProcess = process; -} -const isElectronProcess = typeof ((_a = nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.versions) === null || _a === void 0 ? void 0 : _a.electron) === 'string'; -const isElectronRenderer = isElectronProcess && (nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.type) === 'renderer'; -// Web environment -if (typeof navigator === 'object' && !isElectronRenderer) { - _userAgent = navigator.userAgent; - _isWindows = _userAgent.indexOf('Windows') >= 0; - _isMacintosh = _userAgent.indexOf('Macintosh') >= 0; - _isIOS = (_userAgent.indexOf('Macintosh') >= 0 || _userAgent.indexOf('iPad') >= 0 || _userAgent.indexOf('iPhone') >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0; - _isLinux = _userAgent.indexOf('Linux') >= 0; - _isWeb = true; - const configuredLocale = _nls_js__WEBPACK_IMPORTED_MODULE_0__.getConfiguredDefaultLocale( - // This call _must_ be done in the file that calls `nls.getConfiguredDefaultLocale` - // to ensure that the NLS AMD Loader plugin has been loaded and configured. - // This is because the loader plugin decides what the default locale is based on - // how it's able to resolve the strings. - _nls_js__WEBPACK_IMPORTED_MODULE_0__.localize({ key: 'ensureLoaderPluginIsLoaded', comment: ['{Locked}'] }, '_')); - _locale = configuredLocale || LANGUAGE_DEFAULT; - _language = _locale; -} -// Native environment -else if (typeof nodeProcess === 'object') { - _isWindows = (nodeProcess.platform === 'win32'); - _isMacintosh = (nodeProcess.platform === 'darwin'); - _isLinux = (nodeProcess.platform === 'linux'); - _isLinuxSnap = _isLinux && !!nodeProcess.env['SNAP'] && !!nodeProcess.env['SNAP_REVISION']; - _isElectron = isElectronProcess; - _isCI = !!nodeProcess.env['CI'] || !!nodeProcess.env['BUILD_ARTIFACTSTAGINGDIRECTORY']; - _locale = LANGUAGE_DEFAULT; - _language = LANGUAGE_DEFAULT; - const rawNlsConfig = nodeProcess.env['VSCODE_NLS_CONFIG']; - if (rawNlsConfig) { - try { - const nlsConfig = JSON.parse(rawNlsConfig); - const resolved = nlsConfig.availableLanguages['*']; - _locale = nlsConfig.locale; - // VSCode's default language is 'en' - _language = resolved ? resolved : LANGUAGE_DEFAULT; - _translationsConfigFile = nlsConfig._translationsConfigFile; - } - catch (e) { - } - } - _isNative = true; -} -// Unknown environment -else { - console.error('Unable to resolve platform.'); -} -let _platform = 0 /* Platform.Web */; -if (_isMacintosh) { - _platform = 1 /* Platform.Mac */; -} -else if (_isWindows) { - _platform = 3 /* Platform.Windows */; -} -else if (_isLinux) { - _platform = 2 /* Platform.Linux */; -} -const isWindows = _isWindows; -const isMacintosh = _isMacintosh; -const isLinux = _isLinux; -const isNative = _isNative; -const isWeb = _isWeb; -const isWebWorker = (_isWeb && typeof globals.importScripts === 'function'); -const isIOS = _isIOS; -const userAgent = _userAgent; -/** - * The language used for the user interface. The format of - * the string is all lower case (e.g. zh-tw for Traditional - * Chinese) - */ -const language = _language; -const setTimeout0IsFaster = (typeof globals.postMessage === 'function' && !globals.importScripts); -/** - * See https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#:~:text=than%204%2C%20then-,set%20timeout%20to%204,-. - * - * Works similarly to `setTimeout(0)` but doesn't suffer from the 4ms artificial delay - * that browsers set when the nesting level is > 5. - */ -const setTimeout0 = (() => { - if (setTimeout0IsFaster) { - const pending = []; - globals.addEventListener('message', (e) => { - if (e.data && e.data.vscodeScheduleAsyncWork) { - for (let i = 0, len = pending.length; i < len; i++) { - const candidate = pending[i]; - if (candidate.id === e.data.vscodeScheduleAsyncWork) { - pending.splice(i, 1); - candidate.callback(); - return; - } - } - } - }); - let lastId = 0; - return (callback) => { - const myId = ++lastId; - pending.push({ - id: myId, - callback: callback - }); - globals.postMessage({ vscodeScheduleAsyncWork: myId }, '*'); - }; - } - return (callback) => setTimeout(callback); -})(); -const OS = (_isMacintosh || _isIOS ? 2 /* OperatingSystem.Macintosh */ : (_isWindows ? 1 /* OperatingSystem.Windows */ : 3 /* OperatingSystem.Linux */)); -let _isLittleEndian = true; -let _isLittleEndianComputed = false; -function isLittleEndian() { - if (!_isLittleEndianComputed) { - _isLittleEndianComputed = true; - const test = new Uint8Array(2); - test[0] = 1; - test[1] = 2; - const view = new Uint16Array(test.buffer); - _isLittleEndian = (view[0] === (2 << 8) + 1); - } - return _isLittleEndian; -} -const isChrome = !!(userAgent && userAgent.indexOf('Chrome') >= 0); -const isFirefox = !!(userAgent && userAgent.indexOf('Firefox') >= 0); -const isSafari = !!(!isChrome && (userAgent && userAgent.indexOf('Safari') >= 0)); -const isEdge = !!(userAgent && userAgent.indexOf('Edg/') >= 0); -const isAndroid = !!(userAgent && userAgent.indexOf('Android') >= 0); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/process.js": -/*!******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/process.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ cwd: () => (/* binding */ cwd), -/* harmony export */ env: () => (/* binding */ env), -/* harmony export */ platform: () => (/* binding */ platform) -/* harmony export */ }); -/* harmony import */ var _platform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./platform.js */ "./node_modules/monaco-editor/esm/vs/base/common/platform.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -let safeProcess; -// Native sandbox environment -if (typeof _platform_js__WEBPACK_IMPORTED_MODULE_0__.globals.vscode !== 'undefined' && typeof _platform_js__WEBPACK_IMPORTED_MODULE_0__.globals.vscode.process !== 'undefined') { - const sandboxProcess = _platform_js__WEBPACK_IMPORTED_MODULE_0__.globals.vscode.process; - safeProcess = { - get platform() { return sandboxProcess.platform; }, - get arch() { return sandboxProcess.arch; }, - get env() { return sandboxProcess.env; }, - cwd() { return sandboxProcess.cwd(); } - }; -} -// Native node.js environment -else if (typeof process !== 'undefined') { - safeProcess = { - get platform() { return process.platform; }, - get arch() { return process.arch; }, - get env() { return process.env; }, - cwd() { return process.env['VSCODE_CWD'] || process.cwd(); } - }; -} -// Web environment -else { - safeProcess = { - // Supported - get platform() { return _platform_js__WEBPACK_IMPORTED_MODULE_0__.isWindows ? 'win32' : _platform_js__WEBPACK_IMPORTED_MODULE_0__.isMacintosh ? 'darwin' : 'linux'; }, - get arch() { return undefined; /* arch is undefined in web */ }, - // Unsupported - get env() { return {}; }, - cwd() { return '/'; } - }; -} -/** - * Provides safe access to the `cwd` property in node.js, sandboxed or web - * environments. - * - * Note: in web, this property is hardcoded to be `/`. - */ -const cwd = safeProcess.cwd; -/** - * Provides safe access to the `env` property in node.js, sandboxed or web - * environments. - * - * Note: in web, this property is hardcoded to be `{}`. - */ -const env = safeProcess.env; -/** - * Provides safe access to the `platform` property in node.js, sandboxed or web - * environments. - */ -const platform = safeProcess.platform; - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/stopwatch.js": -/*!********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/stopwatch.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ StopWatch: () => (/* binding */ StopWatch) -/* harmony export */ }); -/* harmony import */ var _platform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./platform.js */ "./node_modules/monaco-editor/esm/vs/base/common/platform.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const hasPerformanceNow = (_platform_js__WEBPACK_IMPORTED_MODULE_0__.globals.performance && typeof _platform_js__WEBPACK_IMPORTED_MODULE_0__.globals.performance.now === 'function'); -class StopWatch { - constructor(highResolution) { - this._highResolution = hasPerformanceNow && highResolution; - this._startTime = this._now(); - this._stopTime = -1; - } - static create(highResolution = true) { - return new StopWatch(highResolution); - } - stop() { - this._stopTime = this._now(); - } - elapsed() { - if (this._stopTime !== -1) { - return this._stopTime - this._startTime; - } - return this._now() - this._startTime; - } - _now() { - return this._highResolution ? _platform_js__WEBPACK_IMPORTED_MODULE_0__.globals.performance.now() : Date.now(); - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/strings.js": -/*!******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/strings.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AmbiguousCharacters: () => (/* binding */ AmbiguousCharacters), -/* harmony export */ CodePointIterator: () => (/* binding */ CodePointIterator), -/* harmony export */ GraphemeIterator: () => (/* binding */ GraphemeIterator), -/* harmony export */ InvisibleCharacters: () => (/* binding */ InvisibleCharacters), -/* harmony export */ UNUSUAL_LINE_TERMINATORS: () => (/* binding */ UNUSUAL_LINE_TERMINATORS), -/* harmony export */ UTF8_BOM_CHARACTER: () => (/* binding */ UTF8_BOM_CHARACTER), -/* harmony export */ commonPrefixLength: () => (/* binding */ commonPrefixLength), -/* harmony export */ commonSuffixLength: () => (/* binding */ commonSuffixLength), -/* harmony export */ compare: () => (/* binding */ compare), -/* harmony export */ compareIgnoreCase: () => (/* binding */ compareIgnoreCase), -/* harmony export */ compareSubstring: () => (/* binding */ compareSubstring), -/* harmony export */ compareSubstringIgnoreCase: () => (/* binding */ compareSubstringIgnoreCase), -/* harmony export */ computeCodePoint: () => (/* binding */ computeCodePoint), -/* harmony export */ containsRTL: () => (/* binding */ containsRTL), -/* harmony export */ containsUnusualLineTerminators: () => (/* binding */ containsUnusualLineTerminators), -/* harmony export */ containsUppercaseCharacter: () => (/* binding */ containsUppercaseCharacter), -/* harmony export */ convertSimple2RegExpPattern: () => (/* binding */ convertSimple2RegExpPattern), -/* harmony export */ createRegExp: () => (/* binding */ createRegExp), -/* harmony export */ equalsIgnoreCase: () => (/* binding */ equalsIgnoreCase), -/* harmony export */ escape: () => (/* binding */ escape), -/* harmony export */ escapeRegExpCharacters: () => (/* binding */ escapeRegExpCharacters), -/* harmony export */ firstNonWhitespaceIndex: () => (/* binding */ firstNonWhitespaceIndex), -/* harmony export */ format: () => (/* binding */ format), -/* harmony export */ getCharContainingOffset: () => (/* binding */ getCharContainingOffset), -/* harmony export */ getLeadingWhitespace: () => (/* binding */ getLeadingWhitespace), -/* harmony export */ getLeftDeleteOffset: () => (/* binding */ getLeftDeleteOffset), -/* harmony export */ getNextCodePoint: () => (/* binding */ getNextCodePoint), -/* harmony export */ isAsciiDigit: () => (/* binding */ isAsciiDigit), -/* harmony export */ isBasicASCII: () => (/* binding */ isBasicASCII), -/* harmony export */ isEmojiImprecise: () => (/* binding */ isEmojiImprecise), -/* harmony export */ isFalsyOrWhitespace: () => (/* binding */ isFalsyOrWhitespace), -/* harmony export */ isFullWidthCharacter: () => (/* binding */ isFullWidthCharacter), -/* harmony export */ isHighSurrogate: () => (/* binding */ isHighSurrogate), -/* harmony export */ isLowSurrogate: () => (/* binding */ isLowSurrogate), -/* harmony export */ isLowerAsciiLetter: () => (/* binding */ isLowerAsciiLetter), -/* harmony export */ isUpperAsciiLetter: () => (/* binding */ isUpperAsciiLetter), -/* harmony export */ lastNonWhitespaceIndex: () => (/* binding */ lastNonWhitespaceIndex), -/* harmony export */ ltrim: () => (/* binding */ ltrim), -/* harmony export */ nextCharLength: () => (/* binding */ nextCharLength), -/* harmony export */ noBreakWhitespace: () => (/* binding */ noBreakWhitespace), -/* harmony export */ prevCharLength: () => (/* binding */ prevCharLength), -/* harmony export */ regExpFlags: () => (/* binding */ regExpFlags), -/* harmony export */ regExpLeadsToEndlessLoop: () => (/* binding */ regExpLeadsToEndlessLoop), -/* harmony export */ rtrim: () => (/* binding */ rtrim), -/* harmony export */ singleLetterHash: () => (/* binding */ singleLetterHash), -/* harmony export */ splitLines: () => (/* binding */ splitLines), -/* harmony export */ startsWithIgnoreCase: () => (/* binding */ startsWithIgnoreCase), -/* harmony export */ startsWithUTF8BOM: () => (/* binding */ startsWithUTF8BOM), -/* harmony export */ stripWildcards: () => (/* binding */ stripWildcards), -/* harmony export */ trim: () => (/* binding */ trim) -/* harmony export */ }); -/* harmony import */ var _cache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cache.js */ "./node_modules/monaco-editor/esm/vs/base/common/cache.js"); -/* harmony import */ var _lazy_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lazy.js */ "./node_modules/monaco-editor/esm/vs/base/common/lazy.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var _a; - - -function isFalsyOrWhitespace(str) { - if (!str || typeof str !== 'string') { - return true; - } - return str.trim().length === 0; -} -const _formatRegexp = /{(\d+)}/g; -/** - * Helper to produce a string with a variable number of arguments. Insert variable segments - * into the string using the {n} notation where N is the index of the argument following the string. - * @param value string to which formatting is applied - * @param args replacements for {n}-entries - */ -function format(value, ...args) { - if (args.length === 0) { - return value; - } - return value.replace(_formatRegexp, function (match, group) { - const idx = parseInt(group, 10); - return isNaN(idx) || idx < 0 || idx >= args.length ? - match : - args[idx]; - }); -} -/** - * Converts HTML characters inside the string to use entities instead. Makes the string safe from - * being used e.g. in HTMLElement.innerHTML. - */ -function escape(html) { - return html.replace(/[<>&]/g, function (match) { - switch (match) { - case '<': return '<'; - case '>': return '>'; - case '&': return '&'; - default: return match; - } - }); -} -/** - * Escapes regular expression characters in a given string - */ -function escapeRegExpCharacters(value) { - return value.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g, '\\$&'); -} -/** - * Removes all occurrences of needle from the beginning and end of haystack. - * @param haystack string to trim - * @param needle the thing to trim (default is a blank) - */ -function trim(haystack, needle = ' ') { - const trimmed = ltrim(haystack, needle); - return rtrim(trimmed, needle); -} -/** - * Removes all occurrences of needle from the beginning of haystack. - * @param haystack string to trim - * @param needle the thing to trim - */ -function ltrim(haystack, needle) { - if (!haystack || !needle) { - return haystack; - } - const needleLen = needle.length; - if (needleLen === 0 || haystack.length === 0) { - return haystack; - } - let offset = 0; - while (haystack.indexOf(needle, offset) === offset) { - offset = offset + needleLen; - } - return haystack.substring(offset); -} -/** - * Removes all occurrences of needle from the end of haystack. - * @param haystack string to trim - * @param needle the thing to trim - */ -function rtrim(haystack, needle) { - if (!haystack || !needle) { - return haystack; - } - const needleLen = needle.length, haystackLen = haystack.length; - if (needleLen === 0 || haystackLen === 0) { - return haystack; - } - let offset = haystackLen, idx = -1; - while (true) { - idx = haystack.lastIndexOf(needle, offset - 1); - if (idx === -1 || idx + needleLen !== offset) { - break; - } - if (idx === 0) { - return ''; - } - offset = idx; - } - return haystack.substring(0, offset); -} -function convertSimple2RegExpPattern(pattern) { - return pattern.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&').replace(/[\*]/g, '.*'); -} -function stripWildcards(pattern) { - return pattern.replace(/\*/g, ''); -} -function createRegExp(searchString, isRegex, options = {}) { - if (!searchString) { - throw new Error('Cannot create regex from empty string'); - } - if (!isRegex) { - searchString = escapeRegExpCharacters(searchString); - } - if (options.wholeWord) { - if (!/\B/.test(searchString.charAt(0))) { - searchString = '\\b' + searchString; - } - if (!/\B/.test(searchString.charAt(searchString.length - 1))) { - searchString = searchString + '\\b'; - } - } - let modifiers = ''; - if (options.global) { - modifiers += 'g'; - } - if (!options.matchCase) { - modifiers += 'i'; - } - if (options.multiline) { - modifiers += 'm'; - } - if (options.unicode) { - modifiers += 'u'; - } - return new RegExp(searchString, modifiers); -} -function regExpLeadsToEndlessLoop(regexp) { - // Exit early if it's one of these special cases which are meant to match - // against an empty string - if (regexp.source === '^' || regexp.source === '^$' || regexp.source === '$' || regexp.source === '^\\s*$') { - return false; - } - // We check against an empty string. If the regular expression doesn't advance - // (e.g. ends in an endless loop) it will match an empty string. - const match = regexp.exec(''); - return !!(match && regexp.lastIndex === 0); -} -function regExpFlags(regexp) { - return (regexp.global ? 'g' : '') - + (regexp.ignoreCase ? 'i' : '') - + (regexp.multiline ? 'm' : '') - + (regexp /* standalone editor compilation */.unicode ? 'u' : ''); -} -function splitLines(str) { - return str.split(/\r\n|\r|\n/); -} -/** - * Returns first index of the string that is not whitespace. - * If string is empty or contains only whitespaces, returns -1 - */ -function firstNonWhitespaceIndex(str) { - for (let i = 0, len = str.length; i < len; i++) { - const chCode = str.charCodeAt(i); - if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) { - return i; - } - } - return -1; -} -/** - * Returns the leading whitespace of the string. - * If the string contains only whitespaces, returns entire string - */ -function getLeadingWhitespace(str, start = 0, end = str.length) { - for (let i = start; i < end; i++) { - const chCode = str.charCodeAt(i); - if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) { - return str.substring(start, i); - } - } - return str.substring(start, end); -} -/** - * Returns last index of the string that is not whitespace. - * If string is empty or contains only whitespaces, returns -1 - */ -function lastNonWhitespaceIndex(str, startIndex = str.length - 1) { - for (let i = startIndex; i >= 0; i--) { - const chCode = str.charCodeAt(i); - if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) { - return i; - } - } - return -1; -} -function compare(a, b) { - if (a < b) { - return -1; - } - else if (a > b) { - return 1; - } - else { - return 0; - } -} -function compareSubstring(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) { - for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) { - const codeA = a.charCodeAt(aStart); - const codeB = b.charCodeAt(bStart); - if (codeA < codeB) { - return -1; - } - else if (codeA > codeB) { - return 1; - } - } - const aLen = aEnd - aStart; - const bLen = bEnd - bStart; - if (aLen < bLen) { - return -1; - } - else if (aLen > bLen) { - return 1; - } - return 0; -} -function compareIgnoreCase(a, b) { - return compareSubstringIgnoreCase(a, b, 0, a.length, 0, b.length); -} -function compareSubstringIgnoreCase(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) { - for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) { - let codeA = a.charCodeAt(aStart); - let codeB = b.charCodeAt(bStart); - if (codeA === codeB) { - // equal - continue; - } - if (codeA >= 128 || codeB >= 128) { - // not ASCII letters -> fallback to lower-casing strings - return compareSubstring(a.toLowerCase(), b.toLowerCase(), aStart, aEnd, bStart, bEnd); - } - // mapper lower-case ascii letter onto upper-case varinats - // [97-122] (lower ascii) --> [65-90] (upper ascii) - if (isLowerAsciiLetter(codeA)) { - codeA -= 32; - } - if (isLowerAsciiLetter(codeB)) { - codeB -= 32; - } - // compare both code points - const diff = codeA - codeB; - if (diff === 0) { - continue; - } - return diff; - } - const aLen = aEnd - aStart; - const bLen = bEnd - bStart; - if (aLen < bLen) { - return -1; - } - else if (aLen > bLen) { - return 1; - } - return 0; -} -function isAsciiDigit(code) { - return code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */; -} -function isLowerAsciiLetter(code) { - return code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */; -} -function isUpperAsciiLetter(code) { - return code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */; -} -function equalsIgnoreCase(a, b) { - return a.length === b.length && compareSubstringIgnoreCase(a, b) === 0; -} -function startsWithIgnoreCase(str, candidate) { - const candidateLength = candidate.length; - if (candidate.length > str.length) { - return false; - } - return compareSubstringIgnoreCase(str, candidate, 0, candidateLength) === 0; -} -/** - * @returns the length of the common prefix of the two strings. - */ -function commonPrefixLength(a, b) { - const len = Math.min(a.length, b.length); - let i; - for (i = 0; i < len; i++) { - if (a.charCodeAt(i) !== b.charCodeAt(i)) { - return i; - } - } - return len; -} -/** - * @returns the length of the common suffix of the two strings. - */ -function commonSuffixLength(a, b) { - const len = Math.min(a.length, b.length); - let i; - const aLastIndex = a.length - 1; - const bLastIndex = b.length - 1; - for (i = 0; i < len; i++) { - if (a.charCodeAt(aLastIndex - i) !== b.charCodeAt(bLastIndex - i)) { - return i; - } - } - return len; -} -/** - * See http://en.wikipedia.org/wiki/Surrogate_pair - */ -function isHighSurrogate(charCode) { - return (0xD800 <= charCode && charCode <= 0xDBFF); -} -/** - * See http://en.wikipedia.org/wiki/Surrogate_pair - */ -function isLowSurrogate(charCode) { - return (0xDC00 <= charCode && charCode <= 0xDFFF); -} -/** - * See http://en.wikipedia.org/wiki/Surrogate_pair - */ -function computeCodePoint(highSurrogate, lowSurrogate) { - return ((highSurrogate - 0xD800) << 10) + (lowSurrogate - 0xDC00) + 0x10000; -} -/** - * get the code point that begins at offset `offset` - */ -function getNextCodePoint(str, len, offset) { - const charCode = str.charCodeAt(offset); - if (isHighSurrogate(charCode) && offset + 1 < len) { - const nextCharCode = str.charCodeAt(offset + 1); - if (isLowSurrogate(nextCharCode)) { - return computeCodePoint(charCode, nextCharCode); - } - } - return charCode; -} -/** - * get the code point that ends right before offset `offset` - */ -function getPrevCodePoint(str, offset) { - const charCode = str.charCodeAt(offset - 1); - if (isLowSurrogate(charCode) && offset > 1) { - const prevCharCode = str.charCodeAt(offset - 2); - if (isHighSurrogate(prevCharCode)) { - return computeCodePoint(prevCharCode, charCode); - } - } - return charCode; -} -class CodePointIterator { - constructor(str, offset = 0) { - this._str = str; - this._len = str.length; - this._offset = offset; - } - get offset() { - return this._offset; - } - setOffset(offset) { - this._offset = offset; - } - prevCodePoint() { - const codePoint = getPrevCodePoint(this._str, this._offset); - this._offset -= (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1); - return codePoint; - } - nextCodePoint() { - const codePoint = getNextCodePoint(this._str, this._len, this._offset); - this._offset += (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1); - return codePoint; - } - eol() { - return (this._offset >= this._len); - } -} -class GraphemeIterator { - constructor(str, offset = 0) { - this._iterator = new CodePointIterator(str, offset); - } - get offset() { - return this._iterator.offset; - } - nextGraphemeLength() { - const graphemeBreakTree = GraphemeBreakTree.getInstance(); - const iterator = this._iterator; - const initialOffset = iterator.offset; - let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint()); - while (!iterator.eol()) { - const offset = iterator.offset; - const nextGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint()); - if (breakBetweenGraphemeBreakType(graphemeBreakType, nextGraphemeBreakType)) { - // move iterator back - iterator.setOffset(offset); - break; - } - graphemeBreakType = nextGraphemeBreakType; - } - return (iterator.offset - initialOffset); - } - prevGraphemeLength() { - const graphemeBreakTree = GraphemeBreakTree.getInstance(); - const iterator = this._iterator; - const initialOffset = iterator.offset; - let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint()); - while (iterator.offset > 0) { - const offset = iterator.offset; - const prevGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint()); - if (breakBetweenGraphemeBreakType(prevGraphemeBreakType, graphemeBreakType)) { - // move iterator back - iterator.setOffset(offset); - break; - } - graphemeBreakType = prevGraphemeBreakType; - } - return (initialOffset - iterator.offset); - } - eol() { - return this._iterator.eol(); - } -} -function nextCharLength(str, initialOffset) { - const iterator = new GraphemeIterator(str, initialOffset); - return iterator.nextGraphemeLength(); -} -function prevCharLength(str, initialOffset) { - const iterator = new GraphemeIterator(str, initialOffset); - return iterator.prevGraphemeLength(); -} -function getCharContainingOffset(str, offset) { - if (offset > 0 && isLowSurrogate(str.charCodeAt(offset))) { - offset--; - } - const endOffset = offset + nextCharLength(str, offset); - const startOffset = endOffset - prevCharLength(str, endOffset); - return [startOffset, endOffset]; -} -/** - * Generated using https://github.com/alexdima/unicode-utils/blob/main/rtl-test.js - */ -const CONTAINS_RTL = /(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/; -/** - * Returns true if `str` contains any Unicode character that is classified as "R" or "AL". - */ -function containsRTL(str) { - return CONTAINS_RTL.test(str); -} -const IS_BASIC_ASCII = /^[\t\n\r\x20-\x7E]*$/; -/** - * Returns true if `str` contains only basic ASCII characters in the range 32 - 126 (including 32 and 126) or \n, \r, \t - */ -function isBasicASCII(str) { - return IS_BASIC_ASCII.test(str); -} -const UNUSUAL_LINE_TERMINATORS = /[\u2028\u2029]/; // LINE SEPARATOR (LS) or PARAGRAPH SEPARATOR (PS) -/** - * Returns true if `str` contains unusual line terminators, like LS or PS - */ -function containsUnusualLineTerminators(str) { - return UNUSUAL_LINE_TERMINATORS.test(str); -} -function isFullWidthCharacter(charCode) { - // Do a cheap trick to better support wrapping of wide characters, treat them as 2 columns - // http://jrgraphix.net/research/unicode_blocks.php - // 2E80 - 2EFF CJK Radicals Supplement - // 2F00 - 2FDF Kangxi Radicals - // 2FF0 - 2FFF Ideographic Description Characters - // 3000 - 303F CJK Symbols and Punctuation - // 3040 - 309F Hiragana - // 30A0 - 30FF Katakana - // 3100 - 312F Bopomofo - // 3130 - 318F Hangul Compatibility Jamo - // 3190 - 319F Kanbun - // 31A0 - 31BF Bopomofo Extended - // 31F0 - 31FF Katakana Phonetic Extensions - // 3200 - 32FF Enclosed CJK Letters and Months - // 3300 - 33FF CJK Compatibility - // 3400 - 4DBF CJK Unified Ideographs Extension A - // 4DC0 - 4DFF Yijing Hexagram Symbols - // 4E00 - 9FFF CJK Unified Ideographs - // A000 - A48F Yi Syllables - // A490 - A4CF Yi Radicals - // AC00 - D7AF Hangul Syllables - // [IGNORE] D800 - DB7F High Surrogates - // [IGNORE] DB80 - DBFF High Private Use Surrogates - // [IGNORE] DC00 - DFFF Low Surrogates - // [IGNORE] E000 - F8FF Private Use Area - // F900 - FAFF CJK Compatibility Ideographs - // [IGNORE] FB00 - FB4F Alphabetic Presentation Forms - // [IGNORE] FB50 - FDFF Arabic Presentation Forms-A - // [IGNORE] FE00 - FE0F Variation Selectors - // [IGNORE] FE20 - FE2F Combining Half Marks - // [IGNORE] FE30 - FE4F CJK Compatibility Forms - // [IGNORE] FE50 - FE6F Small Form Variants - // [IGNORE] FE70 - FEFF Arabic Presentation Forms-B - // FF00 - FFEF Halfwidth and Fullwidth Forms - // [https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms] - // of which FF01 - FF5E fullwidth ASCII of 21 to 7E - // [IGNORE] and FF65 - FFDC halfwidth of Katakana and Hangul - // [IGNORE] FFF0 - FFFF Specials - return ((charCode >= 0x2E80 && charCode <= 0xD7AF) - || (charCode >= 0xF900 && charCode <= 0xFAFF) - || (charCode >= 0xFF01 && charCode <= 0xFF5E)); -} -/** - * A fast function (therefore imprecise) to check if code points are emojis. - * Generated using https://github.com/alexdima/unicode-utils/blob/main/emoji-test.js - */ -function isEmojiImprecise(x) { - return ((x >= 0x1F1E6 && x <= 0x1F1FF) || (x === 8986) || (x === 8987) || (x === 9200) - || (x === 9203) || (x >= 9728 && x <= 10175) || (x === 11088) || (x === 11093) - || (x >= 127744 && x <= 128591) || (x >= 128640 && x <= 128764) - || (x >= 128992 && x <= 129008) || (x >= 129280 && x <= 129535) - || (x >= 129648 && x <= 129782)); -} -// -- UTF-8 BOM -const UTF8_BOM_CHARACTER = String.fromCharCode(65279 /* CharCode.UTF8_BOM */); -function startsWithUTF8BOM(str) { - return !!(str && str.length > 0 && str.charCodeAt(0) === 65279 /* CharCode.UTF8_BOM */); -} -function containsUppercaseCharacter(target, ignoreEscapedChars = false) { - if (!target) { - return false; - } - if (ignoreEscapedChars) { - target = target.replace(/\\./g, ''); - } - return target.toLowerCase() !== target; -} -/** - * Produces 'a'-'z', followed by 'A'-'Z'... followed by 'a'-'z', etc. - */ -function singleLetterHash(n) { - const LETTERS_CNT = (90 /* CharCode.Z */ - 65 /* CharCode.A */ + 1); - n = n % (2 * LETTERS_CNT); - if (n < LETTERS_CNT) { - return String.fromCharCode(97 /* CharCode.a */ + n); - } - return String.fromCharCode(65 /* CharCode.A */ + n - LETTERS_CNT); -} -function breakBetweenGraphemeBreakType(breakTypeA, breakTypeB) { - // http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules - // !!! Let's make the common case a bit faster - if (breakTypeA === 0 /* GraphemeBreakType.Other */) { - // see https://www.unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakTest-13.0.0d10.html#table - return (breakTypeB !== 5 /* GraphemeBreakType.Extend */ && breakTypeB !== 7 /* GraphemeBreakType.SpacingMark */); - } - // Do not break between a CR and LF. Otherwise, break before and after controls. - // GB3 CR × LF - // GB4 (Control | CR | LF) ÷ - // GB5 ÷ (Control | CR | LF) - if (breakTypeA === 2 /* GraphemeBreakType.CR */) { - if (breakTypeB === 3 /* GraphemeBreakType.LF */) { - return false; // GB3 - } - } - if (breakTypeA === 4 /* GraphemeBreakType.Control */ || breakTypeA === 2 /* GraphemeBreakType.CR */ || breakTypeA === 3 /* GraphemeBreakType.LF */) { - return true; // GB4 - } - if (breakTypeB === 4 /* GraphemeBreakType.Control */ || breakTypeB === 2 /* GraphemeBreakType.CR */ || breakTypeB === 3 /* GraphemeBreakType.LF */) { - return true; // GB5 - } - // Do not break Hangul syllable sequences. - // GB6 L × (L | V | LV | LVT) - // GB7 (LV | V) × (V | T) - // GB8 (LVT | T) × T - if (breakTypeA === 8 /* GraphemeBreakType.L */) { - if (breakTypeB === 8 /* GraphemeBreakType.L */ || breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 11 /* GraphemeBreakType.LV */ || breakTypeB === 12 /* GraphemeBreakType.LVT */) { - return false; // GB6 - } - } - if (breakTypeA === 11 /* GraphemeBreakType.LV */ || breakTypeA === 9 /* GraphemeBreakType.V */) { - if (breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 10 /* GraphemeBreakType.T */) { - return false; // GB7 - } - } - if (breakTypeA === 12 /* GraphemeBreakType.LVT */ || breakTypeA === 10 /* GraphemeBreakType.T */) { - if (breakTypeB === 10 /* GraphemeBreakType.T */) { - return false; // GB8 - } - } - // Do not break before extending characters or ZWJ. - // GB9 × (Extend | ZWJ) - if (breakTypeB === 5 /* GraphemeBreakType.Extend */ || breakTypeB === 13 /* GraphemeBreakType.ZWJ */) { - return false; // GB9 - } - // The GB9a and GB9b rules only apply to extended grapheme clusters: - // Do not break before SpacingMarks, or after Prepend characters. - // GB9a × SpacingMark - // GB9b Prepend × - if (breakTypeB === 7 /* GraphemeBreakType.SpacingMark */) { - return false; // GB9a - } - if (breakTypeA === 1 /* GraphemeBreakType.Prepend */) { - return false; // GB9b - } - // Do not break within emoji modifier sequences or emoji zwj sequences. - // GB11 \p{Extended_Pictographic} Extend* ZWJ × \p{Extended_Pictographic} - if (breakTypeA === 13 /* GraphemeBreakType.ZWJ */ && breakTypeB === 14 /* GraphemeBreakType.Extended_Pictographic */) { - // Note: we are not implementing the rule entirely here to avoid introducing states - return false; // GB11 - } - // GB12 sot (RI RI)* RI × RI - // GB13 [^RI] (RI RI)* RI × RI - if (breakTypeA === 6 /* GraphemeBreakType.Regional_Indicator */ && breakTypeB === 6 /* GraphemeBreakType.Regional_Indicator */) { - // Note: we are not implementing the rule entirely here to avoid introducing states - return false; // GB12 & GB13 - } - // GB999 Any ÷ Any - return true; -} -class GraphemeBreakTree { - constructor() { - this._data = getGraphemeBreakRawData(); - } - static getInstance() { - if (!GraphemeBreakTree._INSTANCE) { - GraphemeBreakTree._INSTANCE = new GraphemeBreakTree(); - } - return GraphemeBreakTree._INSTANCE; - } - getGraphemeBreakType(codePoint) { - // !!! Let's make 7bit ASCII a bit faster: 0..31 - if (codePoint < 32) { - if (codePoint === 10 /* CharCode.LineFeed */) { - return 3 /* GraphemeBreakType.LF */; - } - if (codePoint === 13 /* CharCode.CarriageReturn */) { - return 2 /* GraphemeBreakType.CR */; - } - return 4 /* GraphemeBreakType.Control */; - } - // !!! Let's make 7bit ASCII a bit faster: 32..126 - if (codePoint < 127) { - return 0 /* GraphemeBreakType.Other */; - } - const data = this._data; - const nodeCount = data.length / 3; - let nodeIndex = 1; - while (nodeIndex <= nodeCount) { - if (codePoint < data[3 * nodeIndex]) { - // go left - nodeIndex = 2 * nodeIndex; - } - else if (codePoint > data[3 * nodeIndex + 1]) { - // go right - nodeIndex = 2 * nodeIndex + 1; - } - else { - // hit - return data[3 * nodeIndex + 2]; - } - } - return 0 /* GraphemeBreakType.Other */; - } -} -GraphemeBreakTree._INSTANCE = null; -function getGraphemeBreakRawData() { - // generated using https://github.com/alexdima/unicode-utils/blob/main/grapheme-break.js - return JSON.parse('[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]'); -} -//#endregion -/** - * Computes the offset after performing a left delete on the given string, - * while considering unicode grapheme/emoji rules. -*/ -function getLeftDeleteOffset(offset, str) { - if (offset === 0) { - return 0; - } - // Try to delete emoji part. - const emojiOffset = getOffsetBeforeLastEmojiComponent(offset, str); - if (emojiOffset !== undefined) { - return emojiOffset; - } - // Otherwise, just skip a single code point. - const iterator = new CodePointIterator(str, offset); - iterator.prevCodePoint(); - return iterator.offset; -} -function getOffsetBeforeLastEmojiComponent(initialOffset, str) { - // See https://www.unicode.org/reports/tr51/tr51-14.html#EBNF_and_Regex for the - // structure of emojis. - const iterator = new CodePointIterator(str, initialOffset); - let codePoint = iterator.prevCodePoint(); - // Skip modifiers - while ((isEmojiModifier(codePoint) || codePoint === 65039 /* CodePoint.emojiVariantSelector */ || codePoint === 8419 /* CodePoint.enclosingKeyCap */)) { - if (iterator.offset === 0) { - // Cannot skip modifier, no preceding emoji base. - return undefined; - } - codePoint = iterator.prevCodePoint(); - } - // Expect base emoji - if (!isEmojiImprecise(codePoint)) { - // Unexpected code point, not a valid emoji. - return undefined; - } - let resultOffset = iterator.offset; - if (resultOffset > 0) { - // Skip optional ZWJ code points that combine multiple emojis. - // In theory, we should check if that ZWJ actually combines multiple emojis - // to prevent deleting ZWJs in situations we didn't account for. - const optionalZwjCodePoint = iterator.prevCodePoint(); - if (optionalZwjCodePoint === 8205 /* CodePoint.zwj */) { - resultOffset = iterator.offset; - } - } - return resultOffset; -} -function isEmojiModifier(codePoint) { - return 0x1F3FB <= codePoint && codePoint <= 0x1F3FF; -} -const noBreakWhitespace = '\xa0'; -class AmbiguousCharacters { - constructor(confusableDictionary) { - this.confusableDictionary = confusableDictionary; - } - static getInstance(locales) { - return AmbiguousCharacters.cache.get(Array.from(locales)); - } - static getLocales() { - return AmbiguousCharacters._locales.getValue(); - } - isAmbiguous(codePoint) { - return this.confusableDictionary.has(codePoint); - } - /** - * Returns the non basic ASCII code point that the given code point can be confused, - * or undefined if such code point does note exist. - */ - getPrimaryConfusable(codePoint) { - return this.confusableDictionary.get(codePoint); - } - getConfusableCodePoints() { - return new Set(this.confusableDictionary.keys()); - } -} -_a = AmbiguousCharacters; -AmbiguousCharacters.ambiguousCharacterData = new _lazy_js__WEBPACK_IMPORTED_MODULE_1__.Lazy(() => { - // Generated using https://github.com/hediet/vscode-unicode-data - // Stored as key1, value1, key2, value2, ... - return JSON.parse('{\"_common\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125],\"_default\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"cs\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"de\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"es\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"fr\":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"it\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ja\":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],\"ko\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pl\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pt-BR\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"qps-ploc\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ru\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"tr\":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"zh-hans\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],\"zh-hant\":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}'); -}); -AmbiguousCharacters.cache = new _cache_js__WEBPACK_IMPORTED_MODULE_0__.LRUCachedFunction((locales) => { - function arrayToMap(arr) { - const result = new Map(); - for (let i = 0; i < arr.length; i += 2) { - result.set(arr[i], arr[i + 1]); - } - return result; - } - function mergeMaps(map1, map2) { - const result = new Map(map1); - for (const [key, value] of map2) { - result.set(key, value); - } - return result; - } - function intersectMaps(map1, map2) { - if (!map1) { - return map2; - } - const result = new Map(); - for (const [key, value] of map1) { - if (map2.has(key)) { - result.set(key, value); - } - } - return result; - } - const data = _a.ambiguousCharacterData.getValue(); - let filteredLocales = locales.filter((l) => !l.startsWith('_') && l in data); - if (filteredLocales.length === 0) { - filteredLocales = ['_default']; - } - let languageSpecificMap = undefined; - for (const locale of filteredLocales) { - const map = arrayToMap(data[locale]); - languageSpecificMap = intersectMaps(languageSpecificMap, map); - } - const commonMap = arrayToMap(data['_common']); - const map = mergeMaps(commonMap, languageSpecificMap); - return new AmbiguousCharacters(map); -}); -AmbiguousCharacters._locales = new _lazy_js__WEBPACK_IMPORTED_MODULE_1__.Lazy(() => Object.keys(AmbiguousCharacters.ambiguousCharacterData.getValue()).filter((k) => !k.startsWith('_'))); -class InvisibleCharacters { - static getRawData() { - // Generated using https://github.com/hediet/vscode-unicode-data - return JSON.parse('[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]'); - } - static getData() { - if (!this._data) { - this._data = new Set(InvisibleCharacters.getRawData()); - } - return this._data; - } - static isInvisibleCharacter(codePoint) { - return InvisibleCharacters.getData().has(codePoint); - } - static get codePoints() { - return InvisibleCharacters.getData(); - } -} -InvisibleCharacters._data = undefined; - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/types.js": -/*!****************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/types.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ assertIsDefined: () => (/* binding */ assertIsDefined), -/* harmony export */ assertNever: () => (/* binding */ assertNever), -/* harmony export */ assertType: () => (/* binding */ assertType), -/* harmony export */ createProxyObject: () => (/* binding */ createProxyObject), -/* harmony export */ getAllMethodNames: () => (/* binding */ getAllMethodNames), -/* harmony export */ getAllPropertyNames: () => (/* binding */ getAllPropertyNames), -/* harmony export */ isArray: () => (/* binding */ isArray), -/* harmony export */ isBoolean: () => (/* binding */ isBoolean), -/* harmony export */ isDefined: () => (/* binding */ isDefined), -/* harmony export */ isFunction: () => (/* binding */ isFunction), -/* harmony export */ isIterable: () => (/* binding */ isIterable), -/* harmony export */ isNumber: () => (/* binding */ isNumber), -/* harmony export */ isObject: () => (/* binding */ isObject), -/* harmony export */ isString: () => (/* binding */ isString), -/* harmony export */ isTypedArray: () => (/* binding */ isTypedArray), -/* harmony export */ isUndefined: () => (/* binding */ isUndefined), -/* harmony export */ isUndefinedOrNull: () => (/* binding */ isUndefinedOrNull), -/* harmony export */ validateConstraint: () => (/* binding */ validateConstraint), -/* harmony export */ validateConstraints: () => (/* binding */ validateConstraints), -/* harmony export */ withNullAsUndefined: () => (/* binding */ withNullAsUndefined) -/* harmony export */ }); -/** - * @returns whether the provided parameter is a JavaScript Array or not. - */ -function isArray(array) { - return Array.isArray(array); -} -/** - * @returns whether the provided parameter is a JavaScript String or not. - */ -function isString(str) { - return (typeof str === 'string'); -} -/** - * - * @returns whether the provided parameter is of type `object` but **not** - * `null`, an `array`, a `regexp`, nor a `date`. - */ -function isObject(obj) { - // The method can't do a type cast since there are type (like strings) which - // are subclasses of any put not positvely matched by the function. Hence type - // narrowing results in wrong results. - return typeof obj === 'object' - && obj !== null - && !Array.isArray(obj) - && !(obj instanceof RegExp) - && !(obj instanceof Date); -} -/** - * - * @returns whether the provided parameter is of type `Buffer` or Uint8Array dervived type - */ -function isTypedArray(obj) { - const TypedArray = Object.getPrototypeOf(Uint8Array); - return typeof obj === 'object' - && obj instanceof TypedArray; -} -/** - * In **contrast** to just checking `typeof` this will return `false` for `NaN`. - * @returns whether the provided parameter is a JavaScript Number or not. - */ -function isNumber(obj) { - return (typeof obj === 'number' && !isNaN(obj)); -} -/** - * @returns whether the provided parameter is an Iterable, casting to the given generic - */ -function isIterable(obj) { - return !!obj && typeof obj[Symbol.iterator] === 'function'; -} -/** - * @returns whether the provided parameter is a JavaScript Boolean or not. - */ -function isBoolean(obj) { - return (obj === true || obj === false); -} -/** - * @returns whether the provided parameter is undefined. - */ -function isUndefined(obj) { - return (typeof obj === 'undefined'); -} -/** - * @returns whether the provided parameter is defined. - */ -function isDefined(arg) { - return !isUndefinedOrNull(arg); -} -/** - * @returns whether the provided parameter is undefined or null. - */ -function isUndefinedOrNull(obj) { - return (isUndefined(obj) || obj === null); -} -function assertType(condition, type) { - if (!condition) { - throw new Error(type ? `Unexpected type, expected '${type}'` : 'Unexpected type'); - } -} -/** - * Asserts that the argument passed in is neither undefined nor null. - */ -function assertIsDefined(arg) { - if (isUndefinedOrNull(arg)) { - throw new Error('Assertion Failed: argument is undefined or null'); - } - return arg; -} -/** - * @returns whether the provided parameter is a JavaScript Function or not. - */ -function isFunction(obj) { - return (typeof obj === 'function'); -} -function validateConstraints(args, constraints) { - const len = Math.min(args.length, constraints.length); - for (let i = 0; i < len; i++) { - validateConstraint(args[i], constraints[i]); - } -} -function validateConstraint(arg, constraint) { - if (isString(constraint)) { - if (typeof arg !== constraint) { - throw new Error(`argument does not match constraint: typeof ${constraint}`); - } - } - else if (isFunction(constraint)) { - try { - if (arg instanceof constraint) { - return; - } - } - catch (_a) { - // ignore - } - if (!isUndefinedOrNull(arg) && arg.constructor === constraint) { - return; - } - if (constraint.length === 1 && constraint.call(undefined, arg) === true) { - return; - } - throw new Error(`argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true`); - } -} -function getAllPropertyNames(obj) { - let res = []; - let proto = Object.getPrototypeOf(obj); - while (Object.prototype !== proto) { - res = res.concat(Object.getOwnPropertyNames(proto)); - proto = Object.getPrototypeOf(proto); - } - return res; -} -function getAllMethodNames(obj) { - const methods = []; - for (const prop of getAllPropertyNames(obj)) { - if (typeof obj[prop] === 'function') { - methods.push(prop); - } - } - return methods; -} -function createProxyObject(methodNames, invoke) { - const createProxyMethod = (method) => { - return function () { - const args = Array.prototype.slice.call(arguments, 0); - return invoke(method, args); - }; - }; - const result = {}; - for (const methodName of methodNames) { - result[methodName] = createProxyMethod(methodName); - } - return result; -} -/** - * Converts null to undefined, passes all other values through. - */ -function withNullAsUndefined(x) { - return x === null ? undefined : x; -} -function assertNever(value, message = 'Unreachable') { - throw new Error(message); -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/uint.js": -/*!***************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/uint.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ toUint32: () => (/* binding */ toUint32), -/* harmony export */ toUint8: () => (/* binding */ toUint8) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -function toUint8(v) { - if (v < 0) { - return 0; - } - if (v > 255 /* Constants.MAX_UINT_8 */) { - return 255 /* Constants.MAX_UINT_8 */; - } - return v | 0; -} -function toUint32(v) { - if (v < 0) { - return 0; - } - if (v > 4294967295 /* Constants.MAX_UINT_32 */) { - return 4294967295 /* Constants.MAX_UINT_32 */; - } - return v | 0; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/uri.js": -/*!**************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/uri.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ URI: () => (/* binding */ URI), -/* harmony export */ uriToFsPath: () => (/* binding */ uriToFsPath) -/* harmony export */ }); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./path.js */ "./node_modules/monaco-editor/esm/vs/base/common/path.js"); -/* harmony import */ var _platform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./platform.js */ "./node_modules/monaco-editor/esm/vs/base/common/platform.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -const _schemePattern = /^\w[\w\d+.-]*$/; -const _singleSlashStart = /^\//; -const _doubleSlashStart = /^\/\//; -function _validateUri(ret, _strict) { - // scheme, must be set - if (!ret.scheme && _strict) { - throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${ret.authority}", path: "${ret.path}", query: "${ret.query}", fragment: "${ret.fragment}"}`); - } - // scheme, https://tools.ietf.org/html/rfc3986#section-3.1 - // ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - if (ret.scheme && !_schemePattern.test(ret.scheme)) { - throw new Error('[UriError]: Scheme contains illegal characters.'); - } - // path, http://tools.ietf.org/html/rfc3986#section-3.3 - // If a URI contains an authority component, then the path component - // must either be empty or begin with a slash ("/") character. If a URI - // does not contain an authority component, then the path cannot begin - // with two slash characters ("//"). - if (ret.path) { - if (ret.authority) { - if (!_singleSlashStart.test(ret.path)) { - throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character'); - } - } - else { - if (_doubleSlashStart.test(ret.path)) { - throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")'); - } - } - } -} -// for a while we allowed uris *without* schemes and this is the migration -// for them, e.g. an uri without scheme and without strict-mode warns and falls -// back to the file-scheme. that should cause the least carnage and still be a -// clear warning -function _schemeFix(scheme, _strict) { - if (!scheme && !_strict) { - return 'file'; - } - return scheme; -} -// implements a bit of https://tools.ietf.org/html/rfc3986#section-5 -function _referenceResolution(scheme, path) { - // the slash-character is our 'default base' as we don't - // support constructing URIs relative to other URIs. This - // also means that we alter and potentially break paths. - // see https://tools.ietf.org/html/rfc3986#section-5.1.4 - switch (scheme) { - case 'https': - case 'http': - case 'file': - if (!path) { - path = _slash; - } - else if (path[0] !== _slash) { - path = _slash + path; - } - break; - } - return path; -} -const _empty = ''; -const _slash = '/'; -const _regexp = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; -/** - * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986. - * This class is a simple parser which creates the basic component parts - * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation - * and encoding. - * - * ```txt - * foo://example.com:8042/over/there?name=ferret#nose - * \_/ \______________/\_________/ \_________/ \__/ - * | | | | | - * scheme authority path query fragment - * | _____________________|__ - * / \ / \ - * urn:example:animal:ferret:nose - * ``` - */ -class URI { - /** - * @internal - */ - constructor(schemeOrData, authority, path, query, fragment, _strict = false) { - if (typeof schemeOrData === 'object') { - this.scheme = schemeOrData.scheme || _empty; - this.authority = schemeOrData.authority || _empty; - this.path = schemeOrData.path || _empty; - this.query = schemeOrData.query || _empty; - this.fragment = schemeOrData.fragment || _empty; - // no validation because it's this URI - // that creates uri components. - // _validateUri(this); - } - else { - this.scheme = _schemeFix(schemeOrData, _strict); - this.authority = authority || _empty; - this.path = _referenceResolution(this.scheme, path || _empty); - this.query = query || _empty; - this.fragment = fragment || _empty; - _validateUri(this, _strict); - } - } - static isUri(thing) { - if (thing instanceof URI) { - return true; - } - if (!thing) { - return false; - } - return typeof thing.authority === 'string' - && typeof thing.fragment === 'string' - && typeof thing.path === 'string' - && typeof thing.query === 'string' - && typeof thing.scheme === 'string' - && typeof thing.fsPath === 'string' - && typeof thing.with === 'function' - && typeof thing.toString === 'function'; - } - // ---- filesystem path ----------------------- - /** - * Returns a string representing the corresponding file system path of this URI. - * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the - * platform specific path separator. - * - * * Will *not* validate the path for invalid characters and semantics. - * * Will *not* look at the scheme of this URI. - * * The result shall *not* be used for display purposes but for accessing a file on disk. - * - * - * The *difference* to `URI#path` is the use of the platform specific separator and the handling - * of UNC paths. See the below sample of a file-uri with an authority (UNC path). - * - * ```ts - const u = URI.parse('file://server/c$/folder/file.txt') - u.authority === 'server' - u.path === '/shares/c$/file.txt' - u.fsPath === '\\server\c$\folder\file.txt' - ``` - * - * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path, - * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working - * with URIs that represent files on disk (`file` scheme). - */ - get fsPath() { - // if (this.scheme !== 'file') { - // console.warn(`[UriError] calling fsPath with scheme ${this.scheme}`); - // } - return uriToFsPath(this, false); - } - // ---- modify to new ------------------------- - with(change) { - if (!change) { - return this; - } - let { scheme, authority, path, query, fragment } = change; - if (scheme === undefined) { - scheme = this.scheme; - } - else if (scheme === null) { - scheme = _empty; - } - if (authority === undefined) { - authority = this.authority; - } - else if (authority === null) { - authority = _empty; - } - if (path === undefined) { - path = this.path; - } - else if (path === null) { - path = _empty; - } - if (query === undefined) { - query = this.query; - } - else if (query === null) { - query = _empty; - } - if (fragment === undefined) { - fragment = this.fragment; - } - else if (fragment === null) { - fragment = _empty; - } - if (scheme === this.scheme - && authority === this.authority - && path === this.path - && query === this.query - && fragment === this.fragment) { - return this; - } - return new Uri(scheme, authority, path, query, fragment); - } - // ---- parse & validate ------------------------ - /** - * Creates a new URI from a string, e.g. `http://www.example.com/some/path`, - * `file:///usr/home`, or `scheme:with/path`. - * - * @param value A string which represents an URI (see `URI#toString`). - */ - static parse(value, _strict = false) { - const match = _regexp.exec(value); - if (!match) { - return new Uri(_empty, _empty, _empty, _empty, _empty); - } - return new Uri(match[2] || _empty, percentDecode(match[4] || _empty), percentDecode(match[5] || _empty), percentDecode(match[7] || _empty), percentDecode(match[9] || _empty), _strict); - } - /** - * Creates a new URI from a file system path, e.g. `c:\my\files`, - * `/usr/home`, or `\\server\share\some\path`. - * - * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument - * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as** - * `URI.parse('file://' + path)` because the path might contain characters that are - * interpreted (# and ?). See the following sample: - * ```ts - const good = URI.file('/coding/c#/project1'); - good.scheme === 'file'; - good.path === '/coding/c#/project1'; - good.fragment === ''; - const bad = URI.parse('file://' + '/coding/c#/project1'); - bad.scheme === 'file'; - bad.path === '/coding/c'; // path is now broken - bad.fragment === '/project1'; - ``` - * - * @param path A file system path (see `URI#fsPath`) - */ - static file(path) { - let authority = _empty; - // normalize to fwd-slashes on windows, - // on other systems bwd-slashes are valid - // filename character, eg /f\oo/ba\r.txt - if (_platform_js__WEBPACK_IMPORTED_MODULE_1__.isWindows) { - path = path.replace(/\\/g, _slash); - } - // check for authority as used in UNC shares - // or use the path as given - if (path[0] === _slash && path[1] === _slash) { - const idx = path.indexOf(_slash, 2); - if (idx === -1) { - authority = path.substring(2); - path = _slash; - } - else { - authority = path.substring(2, idx); - path = path.substring(idx) || _slash; - } - } - return new Uri('file', authority, path, _empty, _empty); - } - static from(components) { - const result = new Uri(components.scheme, components.authority, components.path, components.query, components.fragment); - _validateUri(result, true); - return result; - } - /** - * Join a URI path with path fragments and normalizes the resulting path. - * - * @param uri The input URI. - * @param pathFragment The path fragment to add to the URI path. - * @returns The resulting URI. - */ - static joinPath(uri, ...pathFragment) { - if (!uri.path) { - throw new Error(`[UriError]: cannot call joinPath on URI without path`); - } - let newPath; - if (_platform_js__WEBPACK_IMPORTED_MODULE_1__.isWindows && uri.scheme === 'file') { - newPath = URI.file(_path_js__WEBPACK_IMPORTED_MODULE_0__.win32.join(uriToFsPath(uri, true), ...pathFragment)).path; - } - else { - newPath = _path_js__WEBPACK_IMPORTED_MODULE_0__.posix.join(uri.path, ...pathFragment); - } - return uri.with({ path: newPath }); - } - // ---- printing/externalize --------------------------- - /** - * Creates a string representation for this URI. It's guaranteed that calling - * `URI.parse` with the result of this function creates an URI which is equal - * to this URI. - * - * * The result shall *not* be used for display purposes but for externalization or transport. - * * The result will be encoded using the percentage encoding and encoding happens mostly - * ignore the scheme-specific encoding rules. - * - * @param skipEncoding Do not encode the result, default is `false` - */ - toString(skipEncoding = false) { - return _asFormatted(this, skipEncoding); - } - toJSON() { - return this; - } - static revive(data) { - if (!data) { - return data; - } - else if (data instanceof URI) { - return data; - } - else { - const result = new Uri(data); - result._formatted = data.external; - result._fsPath = data._sep === _pathSepMarker ? data.fsPath : null; - return result; - } - } -} -const _pathSepMarker = _platform_js__WEBPACK_IMPORTED_MODULE_1__.isWindows ? 1 : undefined; -// This class exists so that URI is compatible with vscode.Uri (API). -class Uri extends URI { - constructor() { - super(...arguments); - this._formatted = null; - this._fsPath = null; - } - get fsPath() { - if (!this._fsPath) { - this._fsPath = uriToFsPath(this, false); - } - return this._fsPath; - } - toString(skipEncoding = false) { - if (!skipEncoding) { - if (!this._formatted) { - this._formatted = _asFormatted(this, false); - } - return this._formatted; - } - else { - // we don't cache that - return _asFormatted(this, true); - } - } - toJSON() { - const res = { - $mid: 1 /* MarshalledId.Uri */ - }; - // cached state - if (this._fsPath) { - res.fsPath = this._fsPath; - res._sep = _pathSepMarker; - } - if (this._formatted) { - res.external = this._formatted; - } - // uri components - if (this.path) { - res.path = this.path; - } - if (this.scheme) { - res.scheme = this.scheme; - } - if (this.authority) { - res.authority = this.authority; - } - if (this.query) { - res.query = this.query; - } - if (this.fragment) { - res.fragment = this.fragment; - } - return res; - } -} -// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2 -const encodeTable = { - [58 /* CharCode.Colon */]: '%3A', - [47 /* CharCode.Slash */]: '%2F', - [63 /* CharCode.QuestionMark */]: '%3F', - [35 /* CharCode.Hash */]: '%23', - [91 /* CharCode.OpenSquareBracket */]: '%5B', - [93 /* CharCode.CloseSquareBracket */]: '%5D', - [64 /* CharCode.AtSign */]: '%40', - [33 /* CharCode.ExclamationMark */]: '%21', - [36 /* CharCode.DollarSign */]: '%24', - [38 /* CharCode.Ampersand */]: '%26', - [39 /* CharCode.SingleQuote */]: '%27', - [40 /* CharCode.OpenParen */]: '%28', - [41 /* CharCode.CloseParen */]: '%29', - [42 /* CharCode.Asterisk */]: '%2A', - [43 /* CharCode.Plus */]: '%2B', - [44 /* CharCode.Comma */]: '%2C', - [59 /* CharCode.Semicolon */]: '%3B', - [61 /* CharCode.Equals */]: '%3D', - [32 /* CharCode.Space */]: '%20', -}; -function encodeURIComponentFast(uriComponent, allowSlash) { - let res = undefined; - let nativeEncodePos = -1; - for (let pos = 0; pos < uriComponent.length; pos++) { - const code = uriComponent.charCodeAt(pos); - // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3 - if ((code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */) - || (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) - || (code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */) - || code === 45 /* CharCode.Dash */ - || code === 46 /* CharCode.Period */ - || code === 95 /* CharCode.Underline */ - || code === 126 /* CharCode.Tilde */ - || (allowSlash && code === 47 /* CharCode.Slash */)) { - // check if we are delaying native encode - if (nativeEncodePos !== -1) { - res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); - nativeEncodePos = -1; - } - // check if we write into a new string (by default we try to return the param) - if (res !== undefined) { - res += uriComponent.charAt(pos); - } - } - else { - // encoding needed, we need to allocate a new string - if (res === undefined) { - res = uriComponent.substr(0, pos); - } - // check with default table first - const escaped = encodeTable[code]; - if (escaped !== undefined) { - // check if we are delaying native encode - if (nativeEncodePos !== -1) { - res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); - nativeEncodePos = -1; - } - // append escaped variant to result - res += escaped; - } - else if (nativeEncodePos === -1) { - // use native encode only when needed - nativeEncodePos = pos; - } - } - } - if (nativeEncodePos !== -1) { - res += encodeURIComponent(uriComponent.substring(nativeEncodePos)); - } - return res !== undefined ? res : uriComponent; -} -function encodeURIComponentMinimal(path) { - let res = undefined; - for (let pos = 0; pos < path.length; pos++) { - const code = path.charCodeAt(pos); - if (code === 35 /* CharCode.Hash */ || code === 63 /* CharCode.QuestionMark */) { - if (res === undefined) { - res = path.substr(0, pos); - } - res += encodeTable[code]; - } - else { - if (res !== undefined) { - res += path[pos]; - } - } - } - return res !== undefined ? res : path; -} -/** - * Compute `fsPath` for the given uri - */ -function uriToFsPath(uri, keepDriveLetterCasing) { - let value; - if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') { - // unc path: file://shares/c$/far/boo - value = `//${uri.authority}${uri.path}`; - } - else if (uri.path.charCodeAt(0) === 47 /* CharCode.Slash */ - && (uri.path.charCodeAt(1) >= 65 /* CharCode.A */ && uri.path.charCodeAt(1) <= 90 /* CharCode.Z */ || uri.path.charCodeAt(1) >= 97 /* CharCode.a */ && uri.path.charCodeAt(1) <= 122 /* CharCode.z */) - && uri.path.charCodeAt(2) === 58 /* CharCode.Colon */) { - if (!keepDriveLetterCasing) { - // windows drive letter: file:///c:/far/boo - value = uri.path[1].toLowerCase() + uri.path.substr(2); - } - else { - value = uri.path.substr(1); - } - } - else { - // other path - value = uri.path; - } - if (_platform_js__WEBPACK_IMPORTED_MODULE_1__.isWindows) { - value = value.replace(/\//g, '\\'); - } - return value; -} -/** - * Create the external version of a uri - */ -function _asFormatted(uri, skipEncoding) { - const encoder = !skipEncoding - ? encodeURIComponentFast - : encodeURIComponentMinimal; - let res = ''; - let { scheme, authority, path, query, fragment } = uri; - if (scheme) { - res += scheme; - res += ':'; - } - if (authority || scheme === 'file') { - res += _slash; - res += _slash; - } - if (authority) { - let idx = authority.indexOf('@'); - if (idx !== -1) { - // @ - const userinfo = authority.substr(0, idx); - authority = authority.substr(idx + 1); - idx = userinfo.indexOf(':'); - if (idx === -1) { - res += encoder(userinfo, false); - } - else { - // :@ - res += encoder(userinfo.substr(0, idx), false); - res += ':'; - res += encoder(userinfo.substr(idx + 1), false); - } - res += '@'; - } - authority = authority.toLowerCase(); - idx = authority.indexOf(':'); - if (idx === -1) { - res += encoder(authority, false); - } - else { - // : - res += encoder(authority.substr(0, idx), false); - res += authority.substr(idx); - } - } - if (path) { - // lower-case windows drive letters in /C:/fff or C:/fff - if (path.length >= 3 && path.charCodeAt(0) === 47 /* CharCode.Slash */ && path.charCodeAt(2) === 58 /* CharCode.Colon */) { - const code = path.charCodeAt(1); - if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) { - path = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // "/c:".length === 3 - } - } - else if (path.length >= 2 && path.charCodeAt(1) === 58 /* CharCode.Colon */) { - const code = path.charCodeAt(0); - if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) { - path = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // "/c:".length === 3 - } - } - // encode the rest of the path - res += encoder(path, true); - } - if (query) { - res += '?'; - res += encoder(query, false); - } - if (fragment) { - res += '#'; - res += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment; - } - return res; -} -// --- decode -function decodeURIComponentGraceful(str) { - try { - return decodeURIComponent(str); - } - catch (_a) { - if (str.length > 3) { - return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3)); - } - else { - return str; - } - } -} -const _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g; -function percentDecode(str) { - if (!str.match(_rEncodedAsHex)) { - return str; - } - return str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match)); -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js": -/*!******************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js ***! - \******************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ SimpleWorkerClient: () => (/* binding */ SimpleWorkerClient), -/* harmony export */ SimpleWorkerServer: () => (/* binding */ SimpleWorkerServer), -/* harmony export */ create: () => (/* binding */ create), -/* harmony export */ logOnceWebWorkerWarning: () => (/* binding */ logOnceWebWorkerWarning) -/* harmony export */ }); -/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ "./node_modules/monaco-editor/esm/vs/base/common/errors.js"); -/* harmony import */ var _event_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../event.js */ "./node_modules/monaco-editor/esm/vs/base/common/event.js"); -/* harmony import */ var _lifecycle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lifecycle.js */ "./node_modules/monaco-editor/esm/vs/base/common/lifecycle.js"); -/* harmony import */ var _platform_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../platform.js */ "./node_modules/monaco-editor/esm/vs/base/common/platform.js"); -/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../types.js */ "./node_modules/monaco-editor/esm/vs/base/common/types.js"); -/* harmony import */ var _strings_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../strings.js */ "./node_modules/monaco-editor/esm/vs/base/common/strings.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - - - - - -const INITIALIZE = '$initialize'; -let webWorkerWarningLogged = false; -function logOnceWebWorkerWarning(err) { - if (!_platform_js__WEBPACK_IMPORTED_MODULE_3__.isWeb) { - // running tests - return; - } - if (!webWorkerWarningLogged) { - webWorkerWarningLogged = true; - console.warn('Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq'); - } - console.warn(err.message); -} -class RequestMessage { - constructor(vsWorker, req, method, args) { - this.vsWorker = vsWorker; - this.req = req; - this.method = method; - this.args = args; - this.type = 0 /* MessageType.Request */; - } -} -class ReplyMessage { - constructor(vsWorker, seq, res, err) { - this.vsWorker = vsWorker; - this.seq = seq; - this.res = res; - this.err = err; - this.type = 1 /* MessageType.Reply */; - } -} -class SubscribeEventMessage { - constructor(vsWorker, req, eventName, arg) { - this.vsWorker = vsWorker; - this.req = req; - this.eventName = eventName; - this.arg = arg; - this.type = 2 /* MessageType.SubscribeEvent */; - } -} -class EventMessage { - constructor(vsWorker, req, event) { - this.vsWorker = vsWorker; - this.req = req; - this.event = event; - this.type = 3 /* MessageType.Event */; - } -} -class UnsubscribeEventMessage { - constructor(vsWorker, req) { - this.vsWorker = vsWorker; - this.req = req; - this.type = 4 /* MessageType.UnsubscribeEvent */; - } -} -class SimpleWorkerProtocol { - constructor(handler) { - this._workerId = -1; - this._handler = handler; - this._lastSentReq = 0; - this._pendingReplies = Object.create(null); - this._pendingEmitters = new Map(); - this._pendingEvents = new Map(); - } - setWorkerId(workerId) { - this._workerId = workerId; - } - sendMessage(method, args) { - const req = String(++this._lastSentReq); - return new Promise((resolve, reject) => { - this._pendingReplies[req] = { - resolve: resolve, - reject: reject - }; - this._send(new RequestMessage(this._workerId, req, method, args)); - }); - } - listen(eventName, arg) { - let req = null; - const emitter = new _event_js__WEBPACK_IMPORTED_MODULE_1__.Emitter({ - onFirstListenerAdd: () => { - req = String(++this._lastSentReq); - this._pendingEmitters.set(req, emitter); - this._send(new SubscribeEventMessage(this._workerId, req, eventName, arg)); - }, - onLastListenerRemove: () => { - this._pendingEmitters.delete(req); - this._send(new UnsubscribeEventMessage(this._workerId, req)); - req = null; - } - }); - return emitter.event; - } - handleMessage(message) { - if (!message || !message.vsWorker) { - return; - } - if (this._workerId !== -1 && message.vsWorker !== this._workerId) { - return; - } - this._handleMessage(message); - } - _handleMessage(msg) { - switch (msg.type) { - case 1 /* MessageType.Reply */: - return this._handleReplyMessage(msg); - case 0 /* MessageType.Request */: - return this._handleRequestMessage(msg); - case 2 /* MessageType.SubscribeEvent */: - return this._handleSubscribeEventMessage(msg); - case 3 /* MessageType.Event */: - return this._handleEventMessage(msg); - case 4 /* MessageType.UnsubscribeEvent */: - return this._handleUnsubscribeEventMessage(msg); - } - } - _handleReplyMessage(replyMessage) { - if (!this._pendingReplies[replyMessage.seq]) { - console.warn('Got reply to unknown seq'); - return; - } - const reply = this._pendingReplies[replyMessage.seq]; - delete this._pendingReplies[replyMessage.seq]; - if (replyMessage.err) { - let err = replyMessage.err; - if (replyMessage.err.$isError) { - err = new Error(); - err.name = replyMessage.err.name; - err.message = replyMessage.err.message; - err.stack = replyMessage.err.stack; - } - reply.reject(err); - return; - } - reply.resolve(replyMessage.res); - } - _handleRequestMessage(requestMessage) { - const req = requestMessage.req; - const result = this._handler.handleMessage(requestMessage.method, requestMessage.args); - result.then((r) => { - this._send(new ReplyMessage(this._workerId, req, r, undefined)); - }, (e) => { - if (e.detail instanceof Error) { - // Loading errors have a detail property that points to the actual error - e.detail = (0,_errors_js__WEBPACK_IMPORTED_MODULE_0__.transformErrorForSerialization)(e.detail); - } - this._send(new ReplyMessage(this._workerId, req, undefined, (0,_errors_js__WEBPACK_IMPORTED_MODULE_0__.transformErrorForSerialization)(e))); - }); - } - _handleSubscribeEventMessage(msg) { - const req = msg.req; - const disposable = this._handler.handleEvent(msg.eventName, msg.arg)((event) => { - this._send(new EventMessage(this._workerId, req, event)); - }); - this._pendingEvents.set(req, disposable); - } - _handleEventMessage(msg) { - if (!this._pendingEmitters.has(msg.req)) { - console.warn('Got event for unknown req'); - return; - } - this._pendingEmitters.get(msg.req).fire(msg.event); - } - _handleUnsubscribeEventMessage(msg) { - if (!this._pendingEvents.has(msg.req)) { - console.warn('Got unsubscribe for unknown req'); - return; - } - this._pendingEvents.get(msg.req).dispose(); - this._pendingEvents.delete(msg.req); - } - _send(msg) { - const transfer = []; - if (msg.type === 0 /* MessageType.Request */) { - for (let i = 0; i < msg.args.length; i++) { - if (msg.args[i] instanceof ArrayBuffer) { - transfer.push(msg.args[i]); - } - } - } - else if (msg.type === 1 /* MessageType.Reply */) { - if (msg.res instanceof ArrayBuffer) { - transfer.push(msg.res); - } - } - this._handler.sendMessage(msg, transfer); - } -} -/** - * Main thread side - */ -class SimpleWorkerClient extends _lifecycle_js__WEBPACK_IMPORTED_MODULE_2__.Disposable { - constructor(workerFactory, moduleId, host) { - super(); - let lazyProxyReject = null; - this._worker = this._register(workerFactory.create('vs/base/common/worker/simpleWorker', (msg) => { - this._protocol.handleMessage(msg); - }, (err) => { - // in Firefox, web workers fail lazily :( - // we will reject the proxy - lazyProxyReject === null || lazyProxyReject === void 0 ? void 0 : lazyProxyReject(err); - })); - this._protocol = new SimpleWorkerProtocol({ - sendMessage: (msg, transfer) => { - this._worker.postMessage(msg, transfer); - }, - handleMessage: (method, args) => { - if (typeof host[method] !== 'function') { - return Promise.reject(new Error('Missing method ' + method + ' on main thread host.')); - } - try { - return Promise.resolve(host[method].apply(host, args)); - } - catch (e) { - return Promise.reject(e); - } - }, - handleEvent: (eventName, arg) => { - if (propertyIsDynamicEvent(eventName)) { - const event = host[eventName].call(host, arg); - if (typeof event !== 'function') { - throw new Error(`Missing dynamic event ${eventName} on main thread host.`); - } - return event; - } - if (propertyIsEvent(eventName)) { - const event = host[eventName]; - if (typeof event !== 'function') { - throw new Error(`Missing event ${eventName} on main thread host.`); - } - return event; - } - throw new Error(`Malformed event name ${eventName}`); - } - }); - this._protocol.setWorkerId(this._worker.getId()); - // Gather loader configuration - let loaderConfiguration = null; - if (typeof _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.require !== 'undefined' && typeof _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.require.getConfig === 'function') { - // Get the configuration from the Monaco AMD Loader - loaderConfiguration = _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.require.getConfig(); - } - else if (typeof _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.requirejs !== 'undefined') { - // Get the configuration from requirejs - loaderConfiguration = _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.requirejs.s.contexts._.config; - } - const hostMethods = _types_js__WEBPACK_IMPORTED_MODULE_4__.getAllMethodNames(host); - // Send initialize message - this._onModuleLoaded = this._protocol.sendMessage(INITIALIZE, [ - this._worker.getId(), - JSON.parse(JSON.stringify(loaderConfiguration)), - moduleId, - hostMethods, - ]); - // Create proxy to loaded code - const proxyMethodRequest = (method, args) => { - return this._request(method, args); - }; - const proxyListen = (eventName, arg) => { - return this._protocol.listen(eventName, arg); - }; - this._lazyProxy = new Promise((resolve, reject) => { - lazyProxyReject = reject; - this._onModuleLoaded.then((availableMethods) => { - resolve(createProxyObject(availableMethods, proxyMethodRequest, proxyListen)); - }, (e) => { - reject(e); - this._onError('Worker failed to load ' + moduleId, e); - }); - }); - } - getProxyObject() { - return this._lazyProxy; - } - _request(method, args) { - return new Promise((resolve, reject) => { - this._onModuleLoaded.then(() => { - this._protocol.sendMessage(method, args).then(resolve, reject); - }, reject); - }); - } - _onError(message, error) { - console.error(message); - console.info(error); - } -} -function propertyIsEvent(name) { - // Assume a property is an event if it has a form of "onSomething" - return name[0] === 'o' && name[1] === 'n' && _strings_js__WEBPACK_IMPORTED_MODULE_5__.isUpperAsciiLetter(name.charCodeAt(2)); -} -function propertyIsDynamicEvent(name) { - // Assume a property is a dynamic event (a method that returns an event) if it has a form of "onDynamicSomething" - return /^onDynamic/.test(name) && _strings_js__WEBPACK_IMPORTED_MODULE_5__.isUpperAsciiLetter(name.charCodeAt(9)); -} -function createProxyObject(methodNames, invoke, proxyListen) { - const createProxyMethod = (method) => { - return function () { - const args = Array.prototype.slice.call(arguments, 0); - return invoke(method, args); - }; - }; - const createProxyDynamicEvent = (eventName) => { - return function (arg) { - return proxyListen(eventName, arg); - }; - }; - const result = {}; - for (const methodName of methodNames) { - if (propertyIsDynamicEvent(methodName)) { - result[methodName] = createProxyDynamicEvent(methodName); - continue; - } - if (propertyIsEvent(methodName)) { - result[methodName] = proxyListen(methodName, undefined); - continue; - } - result[methodName] = createProxyMethod(methodName); - } - return result; -} -/** - * Worker side - */ -class SimpleWorkerServer { - constructor(postMessage, requestHandlerFactory) { - this._requestHandlerFactory = requestHandlerFactory; - this._requestHandler = null; - this._protocol = new SimpleWorkerProtocol({ - sendMessage: (msg, transfer) => { - postMessage(msg, transfer); - }, - handleMessage: (method, args) => this._handleMessage(method, args), - handleEvent: (eventName, arg) => this._handleEvent(eventName, arg) - }); - } - onmessage(msg) { - this._protocol.handleMessage(msg); - } - _handleMessage(method, args) { - if (method === INITIALIZE) { - return this.initialize(args[0], args[1], args[2], args[3]); - } - if (!this._requestHandler || typeof this._requestHandler[method] !== 'function') { - return Promise.reject(new Error('Missing requestHandler or method: ' + method)); - } - try { - return Promise.resolve(this._requestHandler[method].apply(this._requestHandler, args)); - } - catch (e) { - return Promise.reject(e); - } - } - _handleEvent(eventName, arg) { - if (!this._requestHandler) { - throw new Error(`Missing requestHandler`); - } - if (propertyIsDynamicEvent(eventName)) { - const event = this._requestHandler[eventName].call(this._requestHandler, arg); - if (typeof event !== 'function') { - throw new Error(`Missing dynamic event ${eventName} on request handler.`); - } - return event; - } - if (propertyIsEvent(eventName)) { - const event = this._requestHandler[eventName]; - if (typeof event !== 'function') { - throw new Error(`Missing event ${eventName} on request handler.`); - } - return event; - } - throw new Error(`Malformed event name ${eventName}`); - } - initialize(workerId, loaderConfig, moduleId, hostMethods) { - this._protocol.setWorkerId(workerId); - const proxyMethodRequest = (method, args) => { - return this._protocol.sendMessage(method, args); - }; - const proxyListen = (eventName, arg) => { - return this._protocol.listen(eventName, arg); - }; - const hostProxy = createProxyObject(hostMethods, proxyMethodRequest, proxyListen); - if (this._requestHandlerFactory) { - // static request handler - this._requestHandler = this._requestHandlerFactory(hostProxy); - return Promise.resolve(_types_js__WEBPACK_IMPORTED_MODULE_4__.getAllMethodNames(this._requestHandler)); - } - if (loaderConfig) { - // Remove 'baseUrl', handling it is beyond scope for now - if (typeof loaderConfig.baseUrl !== 'undefined') { - delete loaderConfig['baseUrl']; - } - if (typeof loaderConfig.paths !== 'undefined') { - if (typeof loaderConfig.paths.vs !== 'undefined') { - delete loaderConfig.paths['vs']; - } - } - if (typeof loaderConfig.trustedTypesPolicy !== undefined) { - // don't use, it has been destroyed during serialize - delete loaderConfig['trustedTypesPolicy']; - } - // Since this is in a web worker, enable catching errors - loaderConfig.catchError = true; - _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.require.config(loaderConfig); - } - return new Promise((resolve, reject) => { - // Use the global require to be sure to get the global config - // ESM-comment-begin - // const req = (globals.require || require); - // ESM-comment-end - // ESM-uncomment-begin - const req = _platform_js__WEBPACK_IMPORTED_MODULE_3__.globals.require; - // ESM-uncomment-end - req([moduleId], (module) => { - this._requestHandler = module.create(hostProxy); - if (!this._requestHandler) { - reject(new Error(`No RequestHandler!`)); - return; - } - resolve(_types_js__WEBPACK_IMPORTED_MODULE_4__.getAllMethodNames(this._requestHandler)); - }, reject); - }); - } -} -/** - * Called on the worker side - */ -function create(postMessage) { - return new SimpleWorkerServer(postMessage, null); -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js": -/*!*************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js ***! - \*************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CharacterClassifier: () => (/* binding */ CharacterClassifier), -/* harmony export */ CharacterSet: () => (/* binding */ CharacterSet) -/* harmony export */ }); -/* harmony import */ var _base_common_uint_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/uint.js */ "./node_modules/monaco-editor/esm/vs/base/common/uint.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/** - * A fast character classifier that uses a compact array for ASCII values. - */ -class CharacterClassifier { - constructor(_defaultValue) { - const defaultValue = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)(_defaultValue); - this._defaultValue = defaultValue; - this._asciiMap = CharacterClassifier._createAsciiMap(defaultValue); - this._map = new Map(); - } - static _createAsciiMap(defaultValue) { - const asciiMap = new Uint8Array(256); - for (let i = 0; i < 256; i++) { - asciiMap[i] = defaultValue; - } - return asciiMap; - } - set(charCode, _value) { - const value = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)(_value); - if (charCode >= 0 && charCode < 256) { - this._asciiMap[charCode] = value; - } - else { - this._map.set(charCode, value); - } - } - get(charCode) { - if (charCode >= 0 && charCode < 256) { - return this._asciiMap[charCode]; - } - else { - return (this._map.get(charCode) || this._defaultValue); - } - } -} -class CharacterSet { - constructor() { - this._actual = new CharacterClassifier(0 /* Boolean.False */); - } - add(charCode) { - this._actual.set(charCode, 1 /* Boolean.True */); - } - has(charCode) { - return (this._actual.get(charCode) === 1 /* Boolean.True */); - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js": -/*!**************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/core/position.js ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Position: () => (/* binding */ Position) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/** - * A position in the editor. - */ -class Position { - constructor(lineNumber, column) { - this.lineNumber = lineNumber; - this.column = column; - } - /** - * Create a new position from this position. - * - * @param newLineNumber new line number - * @param newColumn new column - */ - with(newLineNumber = this.lineNumber, newColumn = this.column) { - if (newLineNumber === this.lineNumber && newColumn === this.column) { - return this; - } - else { - return new Position(newLineNumber, newColumn); - } - } - /** - * Derive a new position from this position. - * - * @param deltaLineNumber line number delta - * @param deltaColumn column delta - */ - delta(deltaLineNumber = 0, deltaColumn = 0) { - return this.with(this.lineNumber + deltaLineNumber, this.column + deltaColumn); - } - /** - * Test if this position equals other position - */ - equals(other) { - return Position.equals(this, other); - } - /** - * Test if position `a` equals position `b` - */ - static equals(a, b) { - if (!a && !b) { - return true; - } - return (!!a && - !!b && - a.lineNumber === b.lineNumber && - a.column === b.column); - } - /** - * Test if this position is before other position. - * If the two positions are equal, the result will be false. - */ - isBefore(other) { - return Position.isBefore(this, other); - } - /** - * Test if position `a` is before position `b`. - * If the two positions are equal, the result will be false. - */ - static isBefore(a, b) { - if (a.lineNumber < b.lineNumber) { - return true; - } - if (b.lineNumber < a.lineNumber) { - return false; - } - return a.column < b.column; - } - /** - * Test if this position is before other position. - * If the two positions are equal, the result will be true. - */ - isBeforeOrEqual(other) { - return Position.isBeforeOrEqual(this, other); - } - /** - * Test if position `a` is before position `b`. - * If the two positions are equal, the result will be true. - */ - static isBeforeOrEqual(a, b) { - if (a.lineNumber < b.lineNumber) { - return true; - } - if (b.lineNumber < a.lineNumber) { - return false; - } - return a.column <= b.column; - } - /** - * A function that compares positions, useful for sorting - */ - static compare(a, b) { - const aLineNumber = a.lineNumber | 0; - const bLineNumber = b.lineNumber | 0; - if (aLineNumber === bLineNumber) { - const aColumn = a.column | 0; - const bColumn = b.column | 0; - return aColumn - bColumn; - } - return aLineNumber - bLineNumber; - } - /** - * Clone this position. - */ - clone() { - return new Position(this.lineNumber, this.column); - } - /** - * Convert to a human-readable representation. - */ - toString() { - return '(' + this.lineNumber + ',' + this.column + ')'; - } - // --- - /** - * Create a `Position` from an `IPosition`. - */ - static lift(pos) { - return new Position(pos.lineNumber, pos.column); - } - /** - * Test if `obj` is an `IPosition`. - */ - static isIPosition(obj) { - return (obj - && (typeof obj.lineNumber === 'number') - && (typeof obj.column === 'number')); - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js": -/*!***********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/core/range.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Range: () => (/* binding */ Range) -/* harmony export */ }); -/* harmony import */ var _position_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./position.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/** - * A range in the editor. (startLineNumber,startColumn) is <= (endLineNumber,endColumn) - */ -class Range { - constructor(startLineNumber, startColumn, endLineNumber, endColumn) { - if ((startLineNumber > endLineNumber) || (startLineNumber === endLineNumber && startColumn > endColumn)) { - this.startLineNumber = endLineNumber; - this.startColumn = endColumn; - this.endLineNumber = startLineNumber; - this.endColumn = startColumn; - } - else { - this.startLineNumber = startLineNumber; - this.startColumn = startColumn; - this.endLineNumber = endLineNumber; - this.endColumn = endColumn; - } - } - /** - * Test if this range is empty. - */ - isEmpty() { - return Range.isEmpty(this); - } - /** - * Test if `range` is empty. - */ - static isEmpty(range) { - return (range.startLineNumber === range.endLineNumber && range.startColumn === range.endColumn); - } - /** - * Test if position is in this range. If the position is at the edges, will return true. - */ - containsPosition(position) { - return Range.containsPosition(this, position); - } - /** - * Test if `position` is in `range`. If the position is at the edges, will return true. - */ - static containsPosition(range, position) { - if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) { - return false; - } - if (position.lineNumber === range.startLineNumber && position.column < range.startColumn) { - return false; - } - if (position.lineNumber === range.endLineNumber && position.column > range.endColumn) { - return false; - } - return true; - } - /** - * Test if `position` is in `range`. If the position is at the edges, will return false. - * @internal - */ - static strictContainsPosition(range, position) { - if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) { - return false; - } - if (position.lineNumber === range.startLineNumber && position.column <= range.startColumn) { - return false; - } - if (position.lineNumber === range.endLineNumber && position.column >= range.endColumn) { - return false; - } - return true; - } - /** - * Test if range is in this range. If the range is equal to this range, will return true. - */ - containsRange(range) { - return Range.containsRange(this, range); - } - /** - * Test if `otherRange` is in `range`. If the ranges are equal, will return true. - */ - static containsRange(range, otherRange) { - if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) { - return false; - } - if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) { - return false; - } - if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn < range.startColumn) { - return false; - } - if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn > range.endColumn) { - return false; - } - return true; - } - /** - * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true. - */ - strictContainsRange(range) { - return Range.strictContainsRange(this, range); - } - /** - * Test if `otherRange` is strictly in `range` (must start after, and end before). If the ranges are equal, will return false. - */ - static strictContainsRange(range, otherRange) { - if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) { - return false; - } - if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) { - return false; - } - if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn <= range.startColumn) { - return false; - } - if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn >= range.endColumn) { - return false; - } - return true; - } - /** - * A reunion of the two ranges. - * The smallest position will be used as the start point, and the largest one as the end point. - */ - plusRange(range) { - return Range.plusRange(this, range); - } - /** - * A reunion of the two ranges. - * The smallest position will be used as the start point, and the largest one as the end point. - */ - static plusRange(a, b) { - let startLineNumber; - let startColumn; - let endLineNumber; - let endColumn; - if (b.startLineNumber < a.startLineNumber) { - startLineNumber = b.startLineNumber; - startColumn = b.startColumn; - } - else if (b.startLineNumber === a.startLineNumber) { - startLineNumber = b.startLineNumber; - startColumn = Math.min(b.startColumn, a.startColumn); - } - else { - startLineNumber = a.startLineNumber; - startColumn = a.startColumn; - } - if (b.endLineNumber > a.endLineNumber) { - endLineNumber = b.endLineNumber; - endColumn = b.endColumn; - } - else if (b.endLineNumber === a.endLineNumber) { - endLineNumber = b.endLineNumber; - endColumn = Math.max(b.endColumn, a.endColumn); - } - else { - endLineNumber = a.endLineNumber; - endColumn = a.endColumn; - } - return new Range(startLineNumber, startColumn, endLineNumber, endColumn); - } - /** - * A intersection of the two ranges. - */ - intersectRanges(range) { - return Range.intersectRanges(this, range); - } - /** - * A intersection of the two ranges. - */ - static intersectRanges(a, b) { - let resultStartLineNumber = a.startLineNumber; - let resultStartColumn = a.startColumn; - let resultEndLineNumber = a.endLineNumber; - let resultEndColumn = a.endColumn; - const otherStartLineNumber = b.startLineNumber; - const otherStartColumn = b.startColumn; - const otherEndLineNumber = b.endLineNumber; - const otherEndColumn = b.endColumn; - if (resultStartLineNumber < otherStartLineNumber) { - resultStartLineNumber = otherStartLineNumber; - resultStartColumn = otherStartColumn; - } - else if (resultStartLineNumber === otherStartLineNumber) { - resultStartColumn = Math.max(resultStartColumn, otherStartColumn); - } - if (resultEndLineNumber > otherEndLineNumber) { - resultEndLineNumber = otherEndLineNumber; - resultEndColumn = otherEndColumn; - } - else if (resultEndLineNumber === otherEndLineNumber) { - resultEndColumn = Math.min(resultEndColumn, otherEndColumn); - } - // Check if selection is now empty - if (resultStartLineNumber > resultEndLineNumber) { - return null; - } - if (resultStartLineNumber === resultEndLineNumber && resultStartColumn > resultEndColumn) { - return null; - } - return new Range(resultStartLineNumber, resultStartColumn, resultEndLineNumber, resultEndColumn); - } - /** - * Test if this range equals other. - */ - equalsRange(other) { - return Range.equalsRange(this, other); - } - /** - * Test if range `a` equals `b`. - */ - static equalsRange(a, b) { - return (!!a && - !!b && - a.startLineNumber === b.startLineNumber && - a.startColumn === b.startColumn && - a.endLineNumber === b.endLineNumber && - a.endColumn === b.endColumn); - } - /** - * Return the end position (which will be after or equal to the start position) - */ - getEndPosition() { - return Range.getEndPosition(this); - } - /** - * Return the end position (which will be after or equal to the start position) - */ - static getEndPosition(range) { - return new _position_js__WEBPACK_IMPORTED_MODULE_0__.Position(range.endLineNumber, range.endColumn); - } - /** - * Return the start position (which will be before or equal to the end position) - */ - getStartPosition() { - return Range.getStartPosition(this); - } - /** - * Return the start position (which will be before or equal to the end position) - */ - static getStartPosition(range) { - return new _position_js__WEBPACK_IMPORTED_MODULE_0__.Position(range.startLineNumber, range.startColumn); - } - /** - * Transform to a user presentable string representation. - */ - toString() { - return '[' + this.startLineNumber + ',' + this.startColumn + ' -> ' + this.endLineNumber + ',' + this.endColumn + ']'; - } - /** - * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position. - */ - setEndPosition(endLineNumber, endColumn) { - return new Range(this.startLineNumber, this.startColumn, endLineNumber, endColumn); - } - /** - * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position. - */ - setStartPosition(startLineNumber, startColumn) { - return new Range(startLineNumber, startColumn, this.endLineNumber, this.endColumn); - } - /** - * Create a new empty range using this range's start position. - */ - collapseToStart() { - return Range.collapseToStart(this); - } - /** - * Create a new empty range using this range's start position. - */ - static collapseToStart(range) { - return new Range(range.startLineNumber, range.startColumn, range.startLineNumber, range.startColumn); - } - // --- - static fromPositions(start, end = start) { - return new Range(start.lineNumber, start.column, end.lineNumber, end.column); - } - static lift(range) { - if (!range) { - return null; - } - return new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn); - } - /** - * Test if `obj` is an `IRange`. - */ - static isIRange(obj) { - return (obj - && (typeof obj.startLineNumber === 'number') - && (typeof obj.startColumn === 'number') - && (typeof obj.endLineNumber === 'number') - && (typeof obj.endColumn === 'number')); - } - /** - * Test if the two ranges are touching in any way. - */ - static areIntersectingOrTouching(a, b) { - // Check if `a` is before `b` - if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn < b.startColumn)) { - return false; - } - // Check if `b` is before `a` - if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn < a.startColumn)) { - return false; - } - // These ranges must intersect - return true; - } - /** - * Test if the two ranges are intersecting. If the ranges are touching it returns true. - */ - static areIntersecting(a, b) { - // Check if `a` is before `b` - if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn <= b.startColumn)) { - return false; - } - // Check if `b` is before `a` - if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn <= a.startColumn)) { - return false; - } - // These ranges must intersect - return true; - } - /** - * A function that compares ranges, useful for sorting ranges - * It will first compare ranges on the startPosition and then on the endPosition - */ - static compareRangesUsingStarts(a, b) { - if (a && b) { - const aStartLineNumber = a.startLineNumber | 0; - const bStartLineNumber = b.startLineNumber | 0; - if (aStartLineNumber === bStartLineNumber) { - const aStartColumn = a.startColumn | 0; - const bStartColumn = b.startColumn | 0; - if (aStartColumn === bStartColumn) { - const aEndLineNumber = a.endLineNumber | 0; - const bEndLineNumber = b.endLineNumber | 0; - if (aEndLineNumber === bEndLineNumber) { - const aEndColumn = a.endColumn | 0; - const bEndColumn = b.endColumn | 0; - return aEndColumn - bEndColumn; - } - return aEndLineNumber - bEndLineNumber; - } - return aStartColumn - bStartColumn; - } - return aStartLineNumber - bStartLineNumber; - } - const aExists = (a ? 1 : 0); - const bExists = (b ? 1 : 0); - return aExists - bExists; - } - /** - * A function that compares ranges, useful for sorting ranges - * It will first compare ranges on the endPosition and then on the startPosition - */ - static compareRangesUsingEnds(a, b) { - if (a.endLineNumber === b.endLineNumber) { - if (a.endColumn === b.endColumn) { - if (a.startLineNumber === b.startLineNumber) { - return a.startColumn - b.startColumn; - } - return a.startLineNumber - b.startLineNumber; - } - return a.endColumn - b.endColumn; - } - return a.endLineNumber - b.endLineNumber; - } - /** - * Test if the range spans multiple lines. - */ - static spansMultipleLines(range) { - return range.endLineNumber > range.startLineNumber; - } - toJSON() { - return this; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/core/selection.js": -/*!***************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/core/selection.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Selection: () => (/* binding */ Selection) -/* harmony export */ }); -/* harmony import */ var _position_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./position.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js"); -/* harmony import */ var _range_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./range.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -/** - * A selection in the editor. - * The selection is a range that has an orientation. - */ -class Selection extends _range_js__WEBPACK_IMPORTED_MODULE_1__.Range { - constructor(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn) { - super(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn); - this.selectionStartLineNumber = selectionStartLineNumber; - this.selectionStartColumn = selectionStartColumn; - this.positionLineNumber = positionLineNumber; - this.positionColumn = positionColumn; - } - /** - * Transform to a human-readable representation. - */ - toString() { - return '[' + this.selectionStartLineNumber + ',' + this.selectionStartColumn + ' -> ' + this.positionLineNumber + ',' + this.positionColumn + ']'; - } - /** - * Test if equals other selection. - */ - equalsSelection(other) { - return (Selection.selectionsEqual(this, other)); - } - /** - * Test if the two selections are equal. - */ - static selectionsEqual(a, b) { - return (a.selectionStartLineNumber === b.selectionStartLineNumber && - a.selectionStartColumn === b.selectionStartColumn && - a.positionLineNumber === b.positionLineNumber && - a.positionColumn === b.positionColumn); - } - /** - * Get directions (LTR or RTL). - */ - getDirection() { - if (this.selectionStartLineNumber === this.startLineNumber && this.selectionStartColumn === this.startColumn) { - return 0 /* SelectionDirection.LTR */; - } - return 1 /* SelectionDirection.RTL */; - } - /** - * Create a new selection with a different `positionLineNumber` and `positionColumn`. - */ - setEndPosition(endLineNumber, endColumn) { - if (this.getDirection() === 0 /* SelectionDirection.LTR */) { - return new Selection(this.startLineNumber, this.startColumn, endLineNumber, endColumn); - } - return new Selection(endLineNumber, endColumn, this.startLineNumber, this.startColumn); - } - /** - * Get the position at `positionLineNumber` and `positionColumn`. - */ - getPosition() { - return new _position_js__WEBPACK_IMPORTED_MODULE_0__.Position(this.positionLineNumber, this.positionColumn); - } - /** - * Get the position at the start of the selection. - */ - getSelectionStart() { - return new _position_js__WEBPACK_IMPORTED_MODULE_0__.Position(this.selectionStartLineNumber, this.selectionStartColumn); - } - /** - * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`. - */ - setStartPosition(startLineNumber, startColumn) { - if (this.getDirection() === 0 /* SelectionDirection.LTR */) { - return new Selection(startLineNumber, startColumn, this.endLineNumber, this.endColumn); - } - return new Selection(this.endLineNumber, this.endColumn, startLineNumber, startColumn); - } - // ---- - /** - * Create a `Selection` from one or two positions - */ - static fromPositions(start, end = start) { - return new Selection(start.lineNumber, start.column, end.lineNumber, end.column); - } - /** - * Creates a `Selection` from a range, given a direction. - */ - static fromRange(range, direction) { - if (direction === 0 /* SelectionDirection.LTR */) { - return new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn); - } - else { - return new Selection(range.endLineNumber, range.endColumn, range.startLineNumber, range.startColumn); - } - } - /** - * Create a `Selection` from an `ISelection`. - */ - static liftSelection(sel) { - return new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); - } - /** - * `a` equals `b`. - */ - static selectionsArrEqual(a, b) { - if (a && !b || !a && b) { - return false; - } - if (!a && !b) { - return true; - } - if (a.length !== b.length) { - return false; - } - for (let i = 0, len = a.length; i < len; i++) { - if (!this.selectionsEqual(a[i], b[i])) { - return false; - } - } - return true; - } - /** - * Test if `obj` is an `ISelection`. - */ - static isISelection(obj) { - return (obj - && (typeof obj.selectionStartLineNumber === 'number') - && (typeof obj.selectionStartColumn === 'number') - && (typeof obj.positionLineNumber === 'number') - && (typeof obj.positionColumn === 'number')); - } - /** - * Create with a direction. - */ - static createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, direction) { - if (direction === 0 /* SelectionDirection.LTR */) { - return new Selection(startLineNumber, startColumn, endLineNumber, endColumn); - } - return new Selection(endLineNumber, endColumn, startLineNumber, startColumn); - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js": -/*!*****************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js ***! - \*****************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ WordCharacterClassifier: () => (/* binding */ WordCharacterClassifier), -/* harmony export */ getMapForWordSeparators: () => (/* binding */ getMapForWordSeparators) -/* harmony export */ }); -/* harmony import */ var _characterClassifier_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./characterClassifier.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -class WordCharacterClassifier extends _characterClassifier_js__WEBPACK_IMPORTED_MODULE_0__.CharacterClassifier { - constructor(wordSeparators) { - super(0 /* WordCharacterClass.Regular */); - for (let i = 0, len = wordSeparators.length; i < len; i++) { - this.set(wordSeparators.charCodeAt(i), 2 /* WordCharacterClass.WordSeparator */); - } - this.set(32 /* CharCode.Space */, 1 /* WordCharacterClass.Whitespace */); - this.set(9 /* CharCode.Tab */, 1 /* WordCharacterClass.Whitespace */); - } -} -function once(computeFn) { - const cache = {}; // TODO@Alex unbounded cache - return (input) => { - if (!cache.hasOwnProperty(input)) { - cache[input] = computeFn(input); - } - return cache[input]; - }; -} -const getMapForWordSeparators = once((input) => new WordCharacterClassifier(input)); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js": -/*!****************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DEFAULT_WORD_REGEXP: () => (/* binding */ DEFAULT_WORD_REGEXP), -/* harmony export */ USUAL_WORD_SEPARATORS: () => (/* binding */ USUAL_WORD_SEPARATORS), -/* harmony export */ ensureValidWordDefinition: () => (/* binding */ ensureValidWordDefinition), -/* harmony export */ getWordAtText: () => (/* binding */ getWordAtText) -/* harmony export */ }); -/* harmony import */ var _base_common_iterator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/iterator.js */ "./node_modules/monaco-editor/esm/vs/base/common/iterator.js"); -/* harmony import */ var _base_common_linkedList_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../base/common/linkedList.js */ "./node_modules/monaco-editor/esm/vs/base/common/linkedList.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -const USUAL_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\|;:\'",.<>/?'; -/** - * Create a word definition regular expression based on default word separators. - * Optionally provide allowed separators that should be included in words. - * - * The default would look like this: - * /(-?\d*\.\d\w*)|([^\`\~\!\@\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g - */ -function createWordRegExp(allowInWords = '') { - let source = '(-?\\d*\\.\\d\\w*)|([^'; - for (const sep of USUAL_WORD_SEPARATORS) { - if (allowInWords.indexOf(sep) >= 0) { - continue; - } - source += '\\' + sep; - } - source += '\\s]+)'; - return new RegExp(source, 'g'); -} -// catches numbers (including floating numbers) in the first group, and alphanum in the second -const DEFAULT_WORD_REGEXP = createWordRegExp(); -function ensureValidWordDefinition(wordDefinition) { - let result = DEFAULT_WORD_REGEXP; - if (wordDefinition && (wordDefinition instanceof RegExp)) { - if (!wordDefinition.global) { - let flags = 'g'; - if (wordDefinition.ignoreCase) { - flags += 'i'; - } - if (wordDefinition.multiline) { - flags += 'm'; - } - if (wordDefinition.unicode) { - flags += 'u'; - } - result = new RegExp(wordDefinition.source, flags); - } - else { - result = wordDefinition; - } - } - result.lastIndex = 0; - return result; -} -const _defaultConfig = new _base_common_linkedList_js__WEBPACK_IMPORTED_MODULE_1__.LinkedList(); -_defaultConfig.unshift({ - maxLen: 1000, - windowSize: 15, - timeBudget: 150 -}); -function getWordAtText(column, wordDefinition, text, textOffset, config) { - if (!config) { - config = _base_common_iterator_js__WEBPACK_IMPORTED_MODULE_0__.Iterable.first(_defaultConfig); - } - if (text.length > config.maxLen) { - // don't throw strings that long at the regexp - // but use a sub-string in which a word must occur - let start = column - config.maxLen / 2; - if (start < 0) { - start = 0; - } - else { - textOffset += start; - } - text = text.substring(start, column + config.maxLen / 2); - return getWordAtText(column, wordDefinition, text, textOffset, config); - } - const t1 = Date.now(); - const pos = column - 1 - textOffset; - let prevRegexIndex = -1; - let match = null; - for (let i = 1;; i++) { - // check time budget - if (Date.now() - t1 >= config.timeBudget) { - break; - } - // reset the index at which the regexp should start matching, also know where it - // should stop so that subsequent search don't repeat previous searches - const regexIndex = pos - config.windowSize * i; - wordDefinition.lastIndex = Math.max(0, regexIndex); - const thisMatch = _findRegexMatchEnclosingPosition(wordDefinition, text, pos, prevRegexIndex); - if (!thisMatch && match) { - // stop: we have something - break; - } - match = thisMatch; - // stop: searched at start - if (regexIndex <= 0) { - break; - } - prevRegexIndex = regexIndex; - } - if (match) { - const result = { - word: match[0], - startColumn: textOffset + 1 + match.index, - endColumn: textOffset + 1 + match.index + match[0].length - }; - wordDefinition.lastIndex = 0; - return result; - } - return null; -} -function _findRegexMatchEnclosingPosition(wordDefinition, text, pos, stopPos) { - let match; - while (match = wordDefinition.exec(text)) { - const matchIndex = match.index || 0; - if (matchIndex <= pos && wordDefinition.lastIndex >= pos) { - return match; - } - else if (stopPos > 0 && matchIndex > stopPos) { - return null; - } - } - return null; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/diff/diffComputer.js": -/*!******************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/diff/diffComputer.js ***! - \******************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DiffComputer: () => (/* binding */ DiffComputer) -/* harmony export */ }); -/* harmony import */ var _base_common_diff_diff_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/diff/diff.js */ "./node_modules/monaco-editor/esm/vs/base/common/diff/diff.js"); -/* harmony import */ var _base_common_strings_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../base/common/strings.js */ "./node_modules/monaco-editor/esm/vs/base/common/strings.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -const MINIMUM_MATCHING_CHARACTER_LENGTH = 3; -function computeDiff(originalSequence, modifiedSequence, continueProcessingPredicate, pretty) { - const diffAlgo = new _base_common_diff_diff_js__WEBPACK_IMPORTED_MODULE_0__.LcsDiff(originalSequence, modifiedSequence, continueProcessingPredicate); - return diffAlgo.ComputeDiff(pretty); -} -class LineSequence { - constructor(lines) { - const startColumns = []; - const endColumns = []; - for (let i = 0, length = lines.length; i < length; i++) { - startColumns[i] = getFirstNonBlankColumn(lines[i], 1); - endColumns[i] = getLastNonBlankColumn(lines[i], 1); - } - this.lines = lines; - this._startColumns = startColumns; - this._endColumns = endColumns; - } - getElements() { - const elements = []; - for (let i = 0, len = this.lines.length; i < len; i++) { - elements[i] = this.lines[i].substring(this._startColumns[i] - 1, this._endColumns[i] - 1); - } - return elements; - } - getStrictElement(index) { - return this.lines[index]; - } - getStartLineNumber(i) { - return i + 1; - } - getEndLineNumber(i) { - return i + 1; - } - createCharSequence(shouldIgnoreTrimWhitespace, startIndex, endIndex) { - const charCodes = []; - const lineNumbers = []; - const columns = []; - let len = 0; - for (let index = startIndex; index <= endIndex; index++) { - const lineContent = this.lines[index]; - const startColumn = (shouldIgnoreTrimWhitespace ? this._startColumns[index] : 1); - const endColumn = (shouldIgnoreTrimWhitespace ? this._endColumns[index] : lineContent.length + 1); - for (let col = startColumn; col < endColumn; col++) { - charCodes[len] = lineContent.charCodeAt(col - 1); - lineNumbers[len] = index + 1; - columns[len] = col; - len++; - } - if (!shouldIgnoreTrimWhitespace && index < endIndex) { - // Add \n if trim whitespace is not ignored - charCodes[len] = 10 /* CharCode.LineFeed */; - lineNumbers[len] = index + 1; - columns[len] = lineContent.length + 1; - len++; - } - } - return new CharSequence(charCodes, lineNumbers, columns); - } -} -class CharSequence { - constructor(charCodes, lineNumbers, columns) { - this._charCodes = charCodes; - this._lineNumbers = lineNumbers; - this._columns = columns; - } - toString() { - return ('[' + this._charCodes.map((s, idx) => (s === 10 /* CharCode.LineFeed */ ? '\\n' : String.fromCharCode(s)) + `-(${this._lineNumbers[idx]},${this._columns[idx]})`).join(', ') + ']'); - } - _assertIndex(index, arr) { - if (index < 0 || index >= arr.length) { - throw new Error(`Illegal index`); - } - } - getElements() { - return this._charCodes; - } - getStartLineNumber(i) { - if (i > 0 && i === this._lineNumbers.length) { - // the start line number of the element after the last element - // is the end line number of the last element - return this.getEndLineNumber(i - 1); - } - this._assertIndex(i, this._lineNumbers); - return this._lineNumbers[i]; - } - getEndLineNumber(i) { - if (i === -1) { - // the end line number of the element before the first element - // is the start line number of the first element - return this.getStartLineNumber(i + 1); - } - this._assertIndex(i, this._lineNumbers); - if (this._charCodes[i] === 10 /* CharCode.LineFeed */) { - return this._lineNumbers[i] + 1; - } - return this._lineNumbers[i]; - } - getStartColumn(i) { - if (i > 0 && i === this._columns.length) { - // the start column of the element after the last element - // is the end column of the last element - return this.getEndColumn(i - 1); - } - this._assertIndex(i, this._columns); - return this._columns[i]; - } - getEndColumn(i) { - if (i === -1) { - // the end column of the element before the first element - // is the start column of the first element - return this.getStartColumn(i + 1); - } - this._assertIndex(i, this._columns); - if (this._charCodes[i] === 10 /* CharCode.LineFeed */) { - return 1; - } - return this._columns[i] + 1; - } -} -class CharChange { - constructor(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn) { - this.originalStartLineNumber = originalStartLineNumber; - this.originalStartColumn = originalStartColumn; - this.originalEndLineNumber = originalEndLineNumber; - this.originalEndColumn = originalEndColumn; - this.modifiedStartLineNumber = modifiedStartLineNumber; - this.modifiedStartColumn = modifiedStartColumn; - this.modifiedEndLineNumber = modifiedEndLineNumber; - this.modifiedEndColumn = modifiedEndColumn; - } - static createFromDiffChange(diffChange, originalCharSequence, modifiedCharSequence) { - const originalStartLineNumber = originalCharSequence.getStartLineNumber(diffChange.originalStart); - const originalStartColumn = originalCharSequence.getStartColumn(diffChange.originalStart); - const originalEndLineNumber = originalCharSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1); - const originalEndColumn = originalCharSequence.getEndColumn(diffChange.originalStart + diffChange.originalLength - 1); - const modifiedStartLineNumber = modifiedCharSequence.getStartLineNumber(diffChange.modifiedStart); - const modifiedStartColumn = modifiedCharSequence.getStartColumn(diffChange.modifiedStart); - const modifiedEndLineNumber = modifiedCharSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1); - const modifiedEndColumn = modifiedCharSequence.getEndColumn(diffChange.modifiedStart + diffChange.modifiedLength - 1); - return new CharChange(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn); - } -} -function postProcessCharChanges(rawChanges) { - if (rawChanges.length <= 1) { - return rawChanges; - } - const result = [rawChanges[0]]; - let prevChange = result[0]; - for (let i = 1, len = rawChanges.length; i < len; i++) { - const currChange = rawChanges[i]; - const originalMatchingLength = currChange.originalStart - (prevChange.originalStart + prevChange.originalLength); - const modifiedMatchingLength = currChange.modifiedStart - (prevChange.modifiedStart + prevChange.modifiedLength); - // Both of the above should be equal, but the continueProcessingPredicate may prevent this from being true - const matchingLength = Math.min(originalMatchingLength, modifiedMatchingLength); - if (matchingLength < MINIMUM_MATCHING_CHARACTER_LENGTH) { - // Merge the current change into the previous one - prevChange.originalLength = (currChange.originalStart + currChange.originalLength) - prevChange.originalStart; - prevChange.modifiedLength = (currChange.modifiedStart + currChange.modifiedLength) - prevChange.modifiedStart; - } - else { - // Add the current change - result.push(currChange); - prevChange = currChange; - } - } - return result; -} -class LineChange { - constructor(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges) { - this.originalStartLineNumber = originalStartLineNumber; - this.originalEndLineNumber = originalEndLineNumber; - this.modifiedStartLineNumber = modifiedStartLineNumber; - this.modifiedEndLineNumber = modifiedEndLineNumber; - this.charChanges = charChanges; - } - static createFromDiffResult(shouldIgnoreTrimWhitespace, diffChange, originalLineSequence, modifiedLineSequence, continueCharDiff, shouldComputeCharChanges, shouldPostProcessCharChanges) { - let originalStartLineNumber; - let originalEndLineNumber; - let modifiedStartLineNumber; - let modifiedEndLineNumber; - let charChanges = undefined; - if (diffChange.originalLength === 0) { - originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart) - 1; - originalEndLineNumber = 0; - } - else { - originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart); - originalEndLineNumber = originalLineSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1); - } - if (diffChange.modifiedLength === 0) { - modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart) - 1; - modifiedEndLineNumber = 0; - } - else { - modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart); - modifiedEndLineNumber = modifiedLineSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1); - } - if (shouldComputeCharChanges && diffChange.originalLength > 0 && diffChange.originalLength < 20 && diffChange.modifiedLength > 0 && diffChange.modifiedLength < 20 && continueCharDiff()) { - // Compute character changes for diff chunks of at most 20 lines... - const originalCharSequence = originalLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.originalStart, diffChange.originalStart + diffChange.originalLength - 1); - const modifiedCharSequence = modifiedLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.modifiedStart, diffChange.modifiedStart + diffChange.modifiedLength - 1); - if (originalCharSequence.getElements().length > 0 && modifiedCharSequence.getElements().length > 0) { - let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueCharDiff, true).changes; - if (shouldPostProcessCharChanges) { - rawChanges = postProcessCharChanges(rawChanges); - } - charChanges = []; - for (let i = 0, length = rawChanges.length; i < length; i++) { - charChanges.push(CharChange.createFromDiffChange(rawChanges[i], originalCharSequence, modifiedCharSequence)); - } - } - } - return new LineChange(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges); - } -} -class DiffComputer { - constructor(originalLines, modifiedLines, opts) { - this.shouldComputeCharChanges = opts.shouldComputeCharChanges; - this.shouldPostProcessCharChanges = opts.shouldPostProcessCharChanges; - this.shouldIgnoreTrimWhitespace = opts.shouldIgnoreTrimWhitespace; - this.shouldMakePrettyDiff = opts.shouldMakePrettyDiff; - this.originalLines = originalLines; - this.modifiedLines = modifiedLines; - this.original = new LineSequence(originalLines); - this.modified = new LineSequence(modifiedLines); - this.continueLineDiff = createContinueProcessingPredicate(opts.maxComputationTime); - this.continueCharDiff = createContinueProcessingPredicate(opts.maxComputationTime === 0 ? 0 : Math.min(opts.maxComputationTime, 5000)); // never run after 5s for character changes... - } - computeDiff() { - if (this.original.lines.length === 1 && this.original.lines[0].length === 0) { - // empty original => fast path - if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) { - return { - quitEarly: false, - changes: [] - }; - } - return { - quitEarly: false, - changes: [{ - originalStartLineNumber: 1, - originalEndLineNumber: 1, - modifiedStartLineNumber: 1, - modifiedEndLineNumber: this.modified.lines.length, - charChanges: [{ - modifiedEndColumn: 0, - modifiedEndLineNumber: 0, - modifiedStartColumn: 0, - modifiedStartLineNumber: 0, - originalEndColumn: 0, - originalEndLineNumber: 0, - originalStartColumn: 0, - originalStartLineNumber: 0 - }] - }] - }; - } - if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) { - // empty modified => fast path - return { - quitEarly: false, - changes: [{ - originalStartLineNumber: 1, - originalEndLineNumber: this.original.lines.length, - modifiedStartLineNumber: 1, - modifiedEndLineNumber: 1, - charChanges: [{ - modifiedEndColumn: 0, - modifiedEndLineNumber: 0, - modifiedStartColumn: 0, - modifiedStartLineNumber: 0, - originalEndColumn: 0, - originalEndLineNumber: 0, - originalStartColumn: 0, - originalStartLineNumber: 0 - }] - }] - }; - } - const diffResult = computeDiff(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff); - const rawChanges = diffResult.changes; - const quitEarly = diffResult.quitEarly; - // The diff is always computed with ignoring trim whitespace - // This ensures we get the prettiest diff - if (this.shouldIgnoreTrimWhitespace) { - const lineChanges = []; - for (let i = 0, length = rawChanges.length; i < length; i++) { - lineChanges.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, rawChanges[i], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)); - } - return { - quitEarly: quitEarly, - changes: lineChanges - }; - } - // Need to post-process and introduce changes where the trim whitespace is different - // Note that we are looping starting at -1 to also cover the lines before the first change - const result = []; - let originalLineIndex = 0; - let modifiedLineIndex = 0; - for (let i = -1 /* !!!! */, len = rawChanges.length; i < len; i++) { - const nextChange = (i + 1 < len ? rawChanges[i + 1] : null); - const originalStop = (nextChange ? nextChange.originalStart : this.originalLines.length); - const modifiedStop = (nextChange ? nextChange.modifiedStart : this.modifiedLines.length); - while (originalLineIndex < originalStop && modifiedLineIndex < modifiedStop) { - const originalLine = this.originalLines[originalLineIndex]; - const modifiedLine = this.modifiedLines[modifiedLineIndex]; - if (originalLine !== modifiedLine) { - // These lines differ only in trim whitespace - // Check the leading whitespace - { - let originalStartColumn = getFirstNonBlankColumn(originalLine, 1); - let modifiedStartColumn = getFirstNonBlankColumn(modifiedLine, 1); - while (originalStartColumn > 1 && modifiedStartColumn > 1) { - const originalChar = originalLine.charCodeAt(originalStartColumn - 2); - const modifiedChar = modifiedLine.charCodeAt(modifiedStartColumn - 2); - if (originalChar !== modifiedChar) { - break; - } - originalStartColumn--; - modifiedStartColumn--; - } - if (originalStartColumn > 1 || modifiedStartColumn > 1) { - this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, 1, originalStartColumn, modifiedLineIndex + 1, 1, modifiedStartColumn); - } - } - // Check the trailing whitespace - { - let originalEndColumn = getLastNonBlankColumn(originalLine, 1); - let modifiedEndColumn = getLastNonBlankColumn(modifiedLine, 1); - const originalMaxColumn = originalLine.length + 1; - const modifiedMaxColumn = modifiedLine.length + 1; - while (originalEndColumn < originalMaxColumn && modifiedEndColumn < modifiedMaxColumn) { - const originalChar = originalLine.charCodeAt(originalEndColumn - 1); - const modifiedChar = originalLine.charCodeAt(modifiedEndColumn - 1); - if (originalChar !== modifiedChar) { - break; - } - originalEndColumn++; - modifiedEndColumn++; - } - if (originalEndColumn < originalMaxColumn || modifiedEndColumn < modifiedMaxColumn) { - this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, originalEndColumn, originalMaxColumn, modifiedLineIndex + 1, modifiedEndColumn, modifiedMaxColumn); - } - } - } - originalLineIndex++; - modifiedLineIndex++; - } - if (nextChange) { - // Emit the actual change - result.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, nextChange, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)); - originalLineIndex += nextChange.originalLength; - modifiedLineIndex += nextChange.modifiedLength; - } - } - return { - quitEarly: quitEarly, - changes: result - }; - } - _pushTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) { - if (this._mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn)) { - // Merged into previous - return; - } - let charChanges = undefined; - if (this.shouldComputeCharChanges) { - charChanges = [new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)]; - } - result.push(new LineChange(originalLineNumber, originalLineNumber, modifiedLineNumber, modifiedLineNumber, charChanges)); - } - _mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) { - const len = result.length; - if (len === 0) { - return false; - } - const prevChange = result[len - 1]; - if (prevChange.originalEndLineNumber === 0 || prevChange.modifiedEndLineNumber === 0) { - // Don't merge with inserts/deletes - return false; - } - if (prevChange.originalEndLineNumber + 1 === originalLineNumber && prevChange.modifiedEndLineNumber + 1 === modifiedLineNumber) { - prevChange.originalEndLineNumber = originalLineNumber; - prevChange.modifiedEndLineNumber = modifiedLineNumber; - if (this.shouldComputeCharChanges && prevChange.charChanges) { - prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)); - } - return true; - } - return false; - } -} -function getFirstNonBlankColumn(txt, defaultValue) { - const r = _base_common_strings_js__WEBPACK_IMPORTED_MODULE_1__.firstNonWhitespaceIndex(txt); - if (r === -1) { - return defaultValue; - } - return r + 1; -} -function getLastNonBlankColumn(txt, defaultValue) { - const r = _base_common_strings_js__WEBPACK_IMPORTED_MODULE_1__.lastNonWhitespaceIndex(txt); - if (r === -1) { - return defaultValue; - } - return r + 2; -} -function createContinueProcessingPredicate(maximumRuntime) { - if (maximumRuntime === 0) { - return () => true; - } - const startTime = Date.now(); - return () => { - return Date.now() - startTime < maximumRuntime; - }; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/languages.js": -/*!**********************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/languages.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Command: () => (/* binding */ Command), -/* harmony export */ CompletionItemKinds: () => (/* binding */ CompletionItemKinds), -/* harmony export */ DocumentHighlightKind: () => (/* binding */ DocumentHighlightKind), -/* harmony export */ EncodedTokenizationResult: () => (/* binding */ EncodedTokenizationResult), -/* harmony export */ FoldingRangeKind: () => (/* binding */ FoldingRangeKind), -/* harmony export */ InlayHintKind: () => (/* binding */ InlayHintKind), -/* harmony export */ InlineCompletionTriggerKind: () => (/* binding */ InlineCompletionTriggerKind), -/* harmony export */ SignatureHelpTriggerKind: () => (/* binding */ SignatureHelpTriggerKind), -/* harmony export */ SymbolKinds: () => (/* binding */ SymbolKinds), -/* harmony export */ Token: () => (/* binding */ Token), -/* harmony export */ TokenizationRegistry: () => (/* binding */ TokenizationRegistry), -/* harmony export */ TokenizationResult: () => (/* binding */ TokenizationResult), -/* harmony export */ isLocationLink: () => (/* binding */ isLocationLink) -/* harmony export */ }); -/* harmony import */ var _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base/common/codicons.js */ "./node_modules/monaco-editor/esm/vs/base/common/codicons.js"); -/* harmony import */ var _base_common_uri_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../base/common/uri.js */ "./node_modules/monaco-editor/esm/vs/base/common/uri.js"); -/* harmony import */ var _core_range_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./core/range.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js"); -/* harmony import */ var _tokenizationRegistry_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tokenizationRegistry.js */ "./node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - - - -class Token { - constructor(offset, type, language) { - this._tokenBrand = undefined; - this.offset = offset; - this.type = type; - this.language = language; - } - toString() { - return '(' + this.offset + ', ' + this.type + ')'; - } -} -/** - * @internal - */ -class TokenizationResult { - constructor(tokens, endState) { - this._tokenizationResultBrand = undefined; - this.tokens = tokens; - this.endState = endState; - } -} -/** - * @internal - */ -class EncodedTokenizationResult { - constructor(tokens, endState) { - this._encodedTokenizationResultBrand = undefined; - this.tokens = tokens; - this.endState = endState; - } -} -/** - * @internal - */ -var CompletionItemKinds; -(function (CompletionItemKinds) { - const byKind = new Map(); - byKind.set(0 /* CompletionItemKind.Method */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolMethod); - byKind.set(1 /* CompletionItemKind.Function */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolFunction); - byKind.set(2 /* CompletionItemKind.Constructor */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolConstructor); - byKind.set(3 /* CompletionItemKind.Field */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolField); - byKind.set(4 /* CompletionItemKind.Variable */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolVariable); - byKind.set(5 /* CompletionItemKind.Class */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolClass); - byKind.set(6 /* CompletionItemKind.Struct */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolStruct); - byKind.set(7 /* CompletionItemKind.Interface */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolInterface); - byKind.set(8 /* CompletionItemKind.Module */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolModule); - byKind.set(9 /* CompletionItemKind.Property */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolProperty); - byKind.set(10 /* CompletionItemKind.Event */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEvent); - byKind.set(11 /* CompletionItemKind.Operator */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolOperator); - byKind.set(12 /* CompletionItemKind.Unit */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolUnit); - byKind.set(13 /* CompletionItemKind.Value */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolValue); - byKind.set(15 /* CompletionItemKind.Enum */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEnum); - byKind.set(14 /* CompletionItemKind.Constant */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolConstant); - byKind.set(15 /* CompletionItemKind.Enum */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEnum); - byKind.set(16 /* CompletionItemKind.EnumMember */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEnumMember); - byKind.set(17 /* CompletionItemKind.Keyword */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolKeyword); - byKind.set(27 /* CompletionItemKind.Snippet */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolSnippet); - byKind.set(18 /* CompletionItemKind.Text */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolText); - byKind.set(19 /* CompletionItemKind.Color */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolColor); - byKind.set(20 /* CompletionItemKind.File */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolFile); - byKind.set(21 /* CompletionItemKind.Reference */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolReference); - byKind.set(22 /* CompletionItemKind.Customcolor */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolCustomColor); - byKind.set(23 /* CompletionItemKind.Folder */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolFolder); - byKind.set(24 /* CompletionItemKind.TypeParameter */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolTypeParameter); - byKind.set(25 /* CompletionItemKind.User */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.account); - byKind.set(26 /* CompletionItemKind.Issue */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.issues); - /** - * @internal - */ - function toIcon(kind) { - let codicon = byKind.get(kind); - if (!codicon) { - console.info('No codicon found for CompletionItemKind ' + kind); - codicon = _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolProperty; - } - return codicon; - } - CompletionItemKinds.toIcon = toIcon; - const data = new Map(); - data.set('method', 0 /* CompletionItemKind.Method */); - data.set('function', 1 /* CompletionItemKind.Function */); - data.set('constructor', 2 /* CompletionItemKind.Constructor */); - data.set('field', 3 /* CompletionItemKind.Field */); - data.set('variable', 4 /* CompletionItemKind.Variable */); - data.set('class', 5 /* CompletionItemKind.Class */); - data.set('struct', 6 /* CompletionItemKind.Struct */); - data.set('interface', 7 /* CompletionItemKind.Interface */); - data.set('module', 8 /* CompletionItemKind.Module */); - data.set('property', 9 /* CompletionItemKind.Property */); - data.set('event', 10 /* CompletionItemKind.Event */); - data.set('operator', 11 /* CompletionItemKind.Operator */); - data.set('unit', 12 /* CompletionItemKind.Unit */); - data.set('value', 13 /* CompletionItemKind.Value */); - data.set('constant', 14 /* CompletionItemKind.Constant */); - data.set('enum', 15 /* CompletionItemKind.Enum */); - data.set('enum-member', 16 /* CompletionItemKind.EnumMember */); - data.set('enumMember', 16 /* CompletionItemKind.EnumMember */); - data.set('keyword', 17 /* CompletionItemKind.Keyword */); - data.set('snippet', 27 /* CompletionItemKind.Snippet */); - data.set('text', 18 /* CompletionItemKind.Text */); - data.set('color', 19 /* CompletionItemKind.Color */); - data.set('file', 20 /* CompletionItemKind.File */); - data.set('reference', 21 /* CompletionItemKind.Reference */); - data.set('customcolor', 22 /* CompletionItemKind.Customcolor */); - data.set('folder', 23 /* CompletionItemKind.Folder */); - data.set('type-parameter', 24 /* CompletionItemKind.TypeParameter */); - data.set('typeParameter', 24 /* CompletionItemKind.TypeParameter */); - data.set('account', 25 /* CompletionItemKind.User */); - data.set('issue', 26 /* CompletionItemKind.Issue */); - /** - * @internal - */ - function fromString(value, strict) { - let res = data.get(value); - if (typeof res === 'undefined' && !strict) { - res = 9 /* CompletionItemKind.Property */; - } - return res; - } - CompletionItemKinds.fromString = fromString; -})(CompletionItemKinds || (CompletionItemKinds = {})); -/** - * How an {@link InlineCompletionsProvider inline completion provider} was triggered. - */ -var InlineCompletionTriggerKind; -(function (InlineCompletionTriggerKind) { - /** - * Completion was triggered automatically while editing. - * It is sufficient to return a single completion item in this case. - */ - InlineCompletionTriggerKind[InlineCompletionTriggerKind["Automatic"] = 0] = "Automatic"; - /** - * Completion was triggered explicitly by a user gesture. - * Return multiple completion items to enable cycling through them. - */ - InlineCompletionTriggerKind[InlineCompletionTriggerKind["Explicit"] = 1] = "Explicit"; -})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {})); -var SignatureHelpTriggerKind; -(function (SignatureHelpTriggerKind) { - SignatureHelpTriggerKind[SignatureHelpTriggerKind["Invoke"] = 1] = "Invoke"; - SignatureHelpTriggerKind[SignatureHelpTriggerKind["TriggerCharacter"] = 2] = "TriggerCharacter"; - SignatureHelpTriggerKind[SignatureHelpTriggerKind["ContentChange"] = 3] = "ContentChange"; -})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {})); -/** - * A document highlight kind. - */ -var DocumentHighlightKind; -(function (DocumentHighlightKind) { - /** - * A textual occurrence. - */ - DocumentHighlightKind[DocumentHighlightKind["Text"] = 0] = "Text"; - /** - * Read-access of a symbol, like reading a variable. - */ - DocumentHighlightKind[DocumentHighlightKind["Read"] = 1] = "Read"; - /** - * Write-access of a symbol, like writing to a variable. - */ - DocumentHighlightKind[DocumentHighlightKind["Write"] = 2] = "Write"; -})(DocumentHighlightKind || (DocumentHighlightKind = {})); -/** - * @internal - */ -function isLocationLink(thing) { - return thing - && _base_common_uri_js__WEBPACK_IMPORTED_MODULE_1__.URI.isUri(thing.uri) - && _core_range_js__WEBPACK_IMPORTED_MODULE_2__.Range.isIRange(thing.range) - && (_core_range_js__WEBPACK_IMPORTED_MODULE_2__.Range.isIRange(thing.originSelectionRange) || _core_range_js__WEBPACK_IMPORTED_MODULE_2__.Range.isIRange(thing.targetSelectionRange)); -} -/** - * @internal - */ -var SymbolKinds; -(function (SymbolKinds) { - const byKind = new Map(); - byKind.set(0 /* SymbolKind.File */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolFile); - byKind.set(1 /* SymbolKind.Module */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolModule); - byKind.set(2 /* SymbolKind.Namespace */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolNamespace); - byKind.set(3 /* SymbolKind.Package */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolPackage); - byKind.set(4 /* SymbolKind.Class */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolClass); - byKind.set(5 /* SymbolKind.Method */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolMethod); - byKind.set(6 /* SymbolKind.Property */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolProperty); - byKind.set(7 /* SymbolKind.Field */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolField); - byKind.set(8 /* SymbolKind.Constructor */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolConstructor); - byKind.set(9 /* SymbolKind.Enum */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEnum); - byKind.set(10 /* SymbolKind.Interface */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolInterface); - byKind.set(11 /* SymbolKind.Function */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolFunction); - byKind.set(12 /* SymbolKind.Variable */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolVariable); - byKind.set(13 /* SymbolKind.Constant */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolConstant); - byKind.set(14 /* SymbolKind.String */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolString); - byKind.set(15 /* SymbolKind.Number */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolNumber); - byKind.set(16 /* SymbolKind.Boolean */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolBoolean); - byKind.set(17 /* SymbolKind.Array */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolArray); - byKind.set(18 /* SymbolKind.Object */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolObject); - byKind.set(19 /* SymbolKind.Key */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolKey); - byKind.set(20 /* SymbolKind.Null */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolNull); - byKind.set(21 /* SymbolKind.EnumMember */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEnumMember); - byKind.set(22 /* SymbolKind.Struct */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolStruct); - byKind.set(23 /* SymbolKind.Event */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolEvent); - byKind.set(24 /* SymbolKind.Operator */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolOperator); - byKind.set(25 /* SymbolKind.TypeParameter */, _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolTypeParameter); - /** - * @internal - */ - function toIcon(kind) { - let icon = byKind.get(kind); - if (!icon) { - console.info('No codicon found for SymbolKind ' + kind); - icon = _base_common_codicons_js__WEBPACK_IMPORTED_MODULE_0__.Codicon.symbolProperty; - } - return icon; - } - SymbolKinds.toIcon = toIcon; -})(SymbolKinds || (SymbolKinds = {})); -class FoldingRangeKind { - /** - * Creates a new {@link FoldingRangeKind}. - * - * @param value of the kind. - */ - constructor(value) { - this.value = value; - } -} -/** - * Kind for folding range representing a comment. The value of the kind is 'comment'. - */ -FoldingRangeKind.Comment = new FoldingRangeKind('comment'); -/** - * Kind for folding range representing a import. The value of the kind is 'imports'. - */ -FoldingRangeKind.Imports = new FoldingRangeKind('imports'); -/** - * Kind for folding range representing regions (for example marked by `#region`, `#endregion`). - * The value of the kind is 'region'. - */ -FoldingRangeKind.Region = new FoldingRangeKind('region'); -/** - * @internal - */ -var Command; -(function (Command) { - /** - * @internal - */ - function is(obj) { - if (!obj || typeof obj !== 'object') { - return false; - } - return typeof obj.id === 'string' && - typeof obj.title === 'string'; - } - Command.is = is; -})(Command || (Command = {})); -var InlayHintKind; -(function (InlayHintKind) { - InlayHintKind[InlayHintKind["Type"] = 1] = "Type"; - InlayHintKind[InlayHintKind["Parameter"] = 2] = "Parameter"; -})(InlayHintKind || (InlayHintKind = {})); -/** - * @internal - */ -const TokenizationRegistry = new _tokenizationRegistry_js__WEBPACK_IMPORTED_MODULE_3__.TokenizationRegistry(); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js ***! - \***********************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LinkComputer: () => (/* binding */ LinkComputer), -/* harmony export */ StateMachine: () => (/* binding */ StateMachine), -/* harmony export */ Uint8Matrix: () => (/* binding */ Uint8Matrix), -/* harmony export */ computeLinks: () => (/* binding */ computeLinks) -/* harmony export */ }); -/* harmony import */ var _core_characterClassifier_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/characterClassifier.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -class Uint8Matrix { - constructor(rows, cols, defaultValue) { - const data = new Uint8Array(rows * cols); - for (let i = 0, len = rows * cols; i < len; i++) { - data[i] = defaultValue; - } - this._data = data; - this.rows = rows; - this.cols = cols; - } - get(row, col) { - return this._data[row * this.cols + col]; - } - set(row, col, value) { - this._data[row * this.cols + col] = value; - } -} -class StateMachine { - constructor(edges) { - let maxCharCode = 0; - let maxState = 0 /* State.Invalid */; - for (let i = 0, len = edges.length; i < len; i++) { - const [from, chCode, to] = edges[i]; - if (chCode > maxCharCode) { - maxCharCode = chCode; - } - if (from > maxState) { - maxState = from; - } - if (to > maxState) { - maxState = to; - } - } - maxCharCode++; - maxState++; - const states = new Uint8Matrix(maxState, maxCharCode, 0 /* State.Invalid */); - for (let i = 0, len = edges.length; i < len; i++) { - const [from, chCode, to] = edges[i]; - states.set(from, chCode, to); - } - this._states = states; - this._maxCharCode = maxCharCode; - } - nextState(currentState, chCode) { - if (chCode < 0 || chCode >= this._maxCharCode) { - return 0 /* State.Invalid */; - } - return this._states.get(currentState, chCode); - } -} -// State machine for http:// or https:// or file:// -let _stateMachine = null; -function getStateMachine() { - if (_stateMachine === null) { - _stateMachine = new StateMachine([ - [1 /* State.Start */, 104 /* CharCode.h */, 2 /* State.H */], - [1 /* State.Start */, 72 /* CharCode.H */, 2 /* State.H */], - [1 /* State.Start */, 102 /* CharCode.f */, 6 /* State.F */], - [1 /* State.Start */, 70 /* CharCode.F */, 6 /* State.F */], - [2 /* State.H */, 116 /* CharCode.t */, 3 /* State.HT */], - [2 /* State.H */, 84 /* CharCode.T */, 3 /* State.HT */], - [3 /* State.HT */, 116 /* CharCode.t */, 4 /* State.HTT */], - [3 /* State.HT */, 84 /* CharCode.T */, 4 /* State.HTT */], - [4 /* State.HTT */, 112 /* CharCode.p */, 5 /* State.HTTP */], - [4 /* State.HTT */, 80 /* CharCode.P */, 5 /* State.HTTP */], - [5 /* State.HTTP */, 115 /* CharCode.s */, 9 /* State.BeforeColon */], - [5 /* State.HTTP */, 83 /* CharCode.S */, 9 /* State.BeforeColon */], - [5 /* State.HTTP */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */], - [6 /* State.F */, 105 /* CharCode.i */, 7 /* State.FI */], - [6 /* State.F */, 73 /* CharCode.I */, 7 /* State.FI */], - [7 /* State.FI */, 108 /* CharCode.l */, 8 /* State.FIL */], - [7 /* State.FI */, 76 /* CharCode.L */, 8 /* State.FIL */], - [8 /* State.FIL */, 101 /* CharCode.e */, 9 /* State.BeforeColon */], - [8 /* State.FIL */, 69 /* CharCode.E */, 9 /* State.BeforeColon */], - [9 /* State.BeforeColon */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */], - [10 /* State.AfterColon */, 47 /* CharCode.Slash */, 11 /* State.AlmostThere */], - [11 /* State.AlmostThere */, 47 /* CharCode.Slash */, 12 /* State.End */], - ]); - } - return _stateMachine; -} -let _classifier = null; -function getClassifier() { - if (_classifier === null) { - _classifier = new _core_characterClassifier_js__WEBPACK_IMPORTED_MODULE_0__.CharacterClassifier(0 /* CharacterClass.None */); - // allow-any-unicode-next-line - const FORCE_TERMINATION_CHARACTERS = ' \t<>\'\"、。。、,.:;‘〈「『〔([{「」}])〕』」〉’`~…'; - for (let i = 0; i < FORCE_TERMINATION_CHARACTERS.length; i++) { - _classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), 1 /* CharacterClass.ForceTermination */); - } - const CANNOT_END_WITH_CHARACTERS = '.,;:'; - for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) { - _classifier.set(CANNOT_END_WITH_CHARACTERS.charCodeAt(i), 2 /* CharacterClass.CannotEndIn */); - } - } - return _classifier; -} -class LinkComputer { - static _createLink(classifier, line, lineNumber, linkBeginIndex, linkEndIndex) { - // Do not allow to end link in certain characters... - let lastIncludedCharIndex = linkEndIndex - 1; - do { - const chCode = line.charCodeAt(lastIncludedCharIndex); - const chClass = classifier.get(chCode); - if (chClass !== 2 /* CharacterClass.CannotEndIn */) { - break; - } - lastIncludedCharIndex--; - } while (lastIncludedCharIndex > linkBeginIndex); - // Handle links enclosed in parens, square brackets and curlys. - if (linkBeginIndex > 0) { - const charCodeBeforeLink = line.charCodeAt(linkBeginIndex - 1); - const lastCharCodeInLink = line.charCodeAt(lastIncludedCharIndex); - if ((charCodeBeforeLink === 40 /* CharCode.OpenParen */ && lastCharCodeInLink === 41 /* CharCode.CloseParen */) - || (charCodeBeforeLink === 91 /* CharCode.OpenSquareBracket */ && lastCharCodeInLink === 93 /* CharCode.CloseSquareBracket */) - || (charCodeBeforeLink === 123 /* CharCode.OpenCurlyBrace */ && lastCharCodeInLink === 125 /* CharCode.CloseCurlyBrace */)) { - // Do not end in ) if ( is before the link start - // Do not end in ] if [ is before the link start - // Do not end in } if { is before the link start - lastIncludedCharIndex--; - } - } - return { - range: { - startLineNumber: lineNumber, - startColumn: linkBeginIndex + 1, - endLineNumber: lineNumber, - endColumn: lastIncludedCharIndex + 2 - }, - url: line.substring(linkBeginIndex, lastIncludedCharIndex + 1) - }; - } - static computeLinks(model, stateMachine = getStateMachine()) { - const classifier = getClassifier(); - const result = []; - for (let i = 1, lineCount = model.getLineCount(); i <= lineCount; i++) { - const line = model.getLineContent(i); - const len = line.length; - let j = 0; - let linkBeginIndex = 0; - let linkBeginChCode = 0; - let state = 1 /* State.Start */; - let hasOpenParens = false; - let hasOpenSquareBracket = false; - let inSquareBrackets = false; - let hasOpenCurlyBracket = false; - while (j < len) { - let resetStateMachine = false; - const chCode = line.charCodeAt(j); - if (state === 13 /* State.Accept */) { - let chClass; - switch (chCode) { - case 40 /* CharCode.OpenParen */: - hasOpenParens = true; - chClass = 0 /* CharacterClass.None */; - break; - case 41 /* CharCode.CloseParen */: - chClass = (hasOpenParens ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */); - break; - case 91 /* CharCode.OpenSquareBracket */: - inSquareBrackets = true; - hasOpenSquareBracket = true; - chClass = 0 /* CharacterClass.None */; - break; - case 93 /* CharCode.CloseSquareBracket */: - inSquareBrackets = false; - chClass = (hasOpenSquareBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */); - break; - case 123 /* CharCode.OpenCurlyBrace */: - hasOpenCurlyBracket = true; - chClass = 0 /* CharacterClass.None */; - break; - case 125 /* CharCode.CloseCurlyBrace */: - chClass = (hasOpenCurlyBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */); - break; - /* The following three rules make it that ' or " or ` are allowed inside links if the link didn't begin with them */ - case 39 /* CharCode.SingleQuote */: - chClass = (linkBeginChCode === 39 /* CharCode.SingleQuote */ ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */); - break; - case 34 /* CharCode.DoubleQuote */: - chClass = (linkBeginChCode === 34 /* CharCode.DoubleQuote */ ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */); - break; - case 96 /* CharCode.BackTick */: - chClass = (linkBeginChCode === 96 /* CharCode.BackTick */ ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */); - break; - case 42 /* CharCode.Asterisk */: - // `*` terminates a link if the link began with `*` - chClass = (linkBeginChCode === 42 /* CharCode.Asterisk */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */; - break; - case 124 /* CharCode.Pipe */: - // `|` terminates a link if the link began with `|` - chClass = (linkBeginChCode === 124 /* CharCode.Pipe */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */; - break; - case 32 /* CharCode.Space */: - // ` ` allow space in between [ and ] - chClass = (inSquareBrackets ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */); - break; - default: - chClass = classifier.get(chCode); - } - // Check if character terminates link - if (chClass === 1 /* CharacterClass.ForceTermination */) { - result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, j)); - resetStateMachine = true; - } - } - else if (state === 12 /* State.End */) { - let chClass; - if (chCode === 91 /* CharCode.OpenSquareBracket */) { - // Allow for the authority part to contain ipv6 addresses which contain [ and ] - hasOpenSquareBracket = true; - chClass = 0 /* CharacterClass.None */; - } - else { - chClass = classifier.get(chCode); - } - // Check if character terminates link - if (chClass === 1 /* CharacterClass.ForceTermination */) { - resetStateMachine = true; - } - else { - state = 13 /* State.Accept */; - } - } - else { - state = stateMachine.nextState(state, chCode); - if (state === 0 /* State.Invalid */) { - resetStateMachine = true; - } - } - if (resetStateMachine) { - state = 1 /* State.Start */; - hasOpenParens = false; - hasOpenSquareBracket = false; - hasOpenCurlyBracket = false; - // Record where the link started - linkBeginIndex = j + 1; - linkBeginChCode = chCode; - } - j++; - } - if (state === 13 /* State.Accept */) { - result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, len)); - } - } - return result; - } -} -/** - * Returns an array of all links contains in the provided - * document. *Note* that this operation is computational - * expensive and should not run in the UI thread. - */ -function computeLinks(model) { - if (!model || typeof model.getLineCount !== 'function' || typeof model.getLineContent !== 'function') { - // Unknown caller! - return []; - } - return LinkComputer.computeLinks(model); -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js": -/*!*****************************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js ***! - \*****************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BasicInplaceReplace: () => (/* binding */ BasicInplaceReplace) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -class BasicInplaceReplace { - constructor() { - this._defaultValueSet = [ - ['true', 'false'], - ['True', 'False'], - ['Private', 'Public', 'Friend', 'ReadOnly', 'Partial', 'Protected', 'WriteOnly'], - ['public', 'protected', 'private'], - ]; - } - navigateValueSet(range1, text1, range2, text2, up) { - if (range1 && text1) { - const result = this.doNavigateValueSet(text1, up); - if (result) { - return { - range: range1, - value: result - }; - } - } - if (range2 && text2) { - const result = this.doNavigateValueSet(text2, up); - if (result) { - return { - range: range2, - value: result - }; - } - } - return null; - } - doNavigateValueSet(text, up) { - const numberResult = this.numberReplace(text, up); - if (numberResult !== null) { - return numberResult; - } - return this.textReplace(text, up); - } - numberReplace(value, up) { - const precision = Math.pow(10, value.length - (value.lastIndexOf('.') + 1)); - let n1 = Number(value); - const n2 = parseFloat(value); - if (!isNaN(n1) && !isNaN(n2) && n1 === n2) { - if (n1 === 0 && !up) { - return null; // don't do negative - // } else if(n1 === 9 && up) { - // return null; // don't insert 10 into a number - } - else { - n1 = Math.floor(n1 * precision); - n1 += up ? precision : -precision; - return String(n1 / precision); - } - } - return null; - } - textReplace(value, up) { - return this.valueSetsReplace(this._defaultValueSet, value, up); - } - valueSetsReplace(valueSets, value, up) { - let result = null; - for (let i = 0, len = valueSets.length; result === null && i < len; i++) { - result = this.valueSetReplace(valueSets[i], value, up); - } - return result; - } - valueSetReplace(valueSet, value, up) { - let idx = valueSet.indexOf(value); - if (idx >= 0) { - idx += up ? +1 : -1; - if (idx < 0) { - idx = valueSet.length - 1; - } - else { - idx %= valueSet.length; - } - return valueSet[idx]; - } - return null; - } -} -BasicInplaceReplace.INSTANCE = new BasicInplaceReplace(); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/model.js": -/*!******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/model.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ApplyEditsResult: () => (/* binding */ ApplyEditsResult), -/* harmony export */ FindMatch: () => (/* binding */ FindMatch), -/* harmony export */ InjectedTextCursorStops: () => (/* binding */ InjectedTextCursorStops), -/* harmony export */ MinimapPosition: () => (/* binding */ MinimapPosition), -/* harmony export */ OverviewRulerLane: () => (/* binding */ OverviewRulerLane), -/* harmony export */ SearchData: () => (/* binding */ SearchData), -/* harmony export */ TextModelResolvedOptions: () => (/* binding */ TextModelResolvedOptions), -/* harmony export */ ValidAnnotatedEditOperation: () => (/* binding */ ValidAnnotatedEditOperation), -/* harmony export */ isITextSnapshot: () => (/* binding */ isITextSnapshot), -/* harmony export */ shouldSynchronizeModel: () => (/* binding */ shouldSynchronizeModel) -/* harmony export */ }); -/* harmony import */ var _base_common_objects_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base/common/objects.js */ "./node_modules/monaco-editor/esm/vs/base/common/objects.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/** - * Vertical Lane in the overview ruler of the editor. - */ -var OverviewRulerLane; -(function (OverviewRulerLane) { - OverviewRulerLane[OverviewRulerLane["Left"] = 1] = "Left"; - OverviewRulerLane[OverviewRulerLane["Center"] = 2] = "Center"; - OverviewRulerLane[OverviewRulerLane["Right"] = 4] = "Right"; - OverviewRulerLane[OverviewRulerLane["Full"] = 7] = "Full"; -})(OverviewRulerLane || (OverviewRulerLane = {})); -/** - * Position in the minimap to render the decoration. - */ -var MinimapPosition; -(function (MinimapPosition) { - MinimapPosition[MinimapPosition["Inline"] = 1] = "Inline"; - MinimapPosition[MinimapPosition["Gutter"] = 2] = "Gutter"; -})(MinimapPosition || (MinimapPosition = {})); -var InjectedTextCursorStops; -(function (InjectedTextCursorStops) { - InjectedTextCursorStops[InjectedTextCursorStops["Both"] = 0] = "Both"; - InjectedTextCursorStops[InjectedTextCursorStops["Right"] = 1] = "Right"; - InjectedTextCursorStops[InjectedTextCursorStops["Left"] = 2] = "Left"; - InjectedTextCursorStops[InjectedTextCursorStops["None"] = 3] = "None"; -})(InjectedTextCursorStops || (InjectedTextCursorStops = {})); -class TextModelResolvedOptions { - /** - * @internal - */ - constructor(src) { - this._textModelResolvedOptionsBrand = undefined; - this.tabSize = Math.max(1, src.tabSize | 0); - this.indentSize = src.tabSize | 0; - this.insertSpaces = Boolean(src.insertSpaces); - this.defaultEOL = src.defaultEOL | 0; - this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace); - this.bracketPairColorizationOptions = src.bracketPairColorizationOptions; - } - /** - * @internal - */ - equals(other) { - return (this.tabSize === other.tabSize - && this.indentSize === other.indentSize - && this.insertSpaces === other.insertSpaces - && this.defaultEOL === other.defaultEOL - && this.trimAutoWhitespace === other.trimAutoWhitespace - && (0,_base_common_objects_js__WEBPACK_IMPORTED_MODULE_0__.equals)(this.bracketPairColorizationOptions, other.bracketPairColorizationOptions)); - } - /** - * @internal - */ - createChangeEvent(newOpts) { - return { - tabSize: this.tabSize !== newOpts.tabSize, - indentSize: this.indentSize !== newOpts.indentSize, - insertSpaces: this.insertSpaces !== newOpts.insertSpaces, - trimAutoWhitespace: this.trimAutoWhitespace !== newOpts.trimAutoWhitespace, - }; - } -} -class FindMatch { - /** - * @internal - */ - constructor(range, matches) { - this._findMatchBrand = undefined; - this.range = range; - this.matches = matches; - } -} -/** - * @internal - */ -function isITextSnapshot(obj) { - return (obj && typeof obj.read === 'function'); -} -/** - * @internal - */ -class ValidAnnotatedEditOperation { - constructor(identifier, range, text, forceMoveMarkers, isAutoWhitespaceEdit, _isTracked) { - this.identifier = identifier; - this.range = range; - this.text = text; - this.forceMoveMarkers = forceMoveMarkers; - this.isAutoWhitespaceEdit = isAutoWhitespaceEdit; - this._isTracked = _isTracked; - } -} -/** - * @internal - */ -class SearchData { - constructor(regex, wordSeparators, simpleSearch) { - this.regex = regex; - this.wordSeparators = wordSeparators; - this.simpleSearch = simpleSearch; - } -} -/** - * @internal - */ -class ApplyEditsResult { - constructor(reverseEdits, changes, trimAutoWhitespaceLineNumbers) { - this.reverseEdits = reverseEdits; - this.changes = changes; - this.trimAutoWhitespaceLineNumbers = trimAutoWhitespaceLineNumbers; - } -} -/** - * @internal - */ -function shouldSynchronizeModel(model) { - return (!model.isTooLargeForSyncing() && !model.isForSimpleWidget); -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ MirrorTextModel: () => (/* binding */ MirrorTextModel) -/* harmony export */ }); -/* harmony import */ var _base_common_strings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/strings.js */ "./node_modules/monaco-editor/esm/vs/base/common/strings.js"); -/* harmony import */ var _core_position_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/position.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js"); -/* harmony import */ var _prefixSumComputer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prefixSumComputer.js */ "./node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - - -class MirrorTextModel { - constructor(uri, lines, eol, versionId) { - this._uri = uri; - this._lines = lines; - this._eol = eol; - this._versionId = versionId; - this._lineStarts = null; - this._cachedTextValue = null; - } - dispose() { - this._lines.length = 0; - } - get version() { - return this._versionId; - } - getText() { - if (this._cachedTextValue === null) { - this._cachedTextValue = this._lines.join(this._eol); - } - return this._cachedTextValue; - } - onEvents(e) { - if (e.eol && e.eol !== this._eol) { - this._eol = e.eol; - this._lineStarts = null; - } - // Update my lines - const changes = e.changes; - for (const change of changes) { - this._acceptDeleteRange(change.range); - this._acceptInsertText(new _core_position_js__WEBPACK_IMPORTED_MODULE_1__.Position(change.range.startLineNumber, change.range.startColumn), change.text); - } - this._versionId = e.versionId; - this._cachedTextValue = null; - } - _ensureLineStarts() { - if (!this._lineStarts) { - const eolLength = this._eol.length; - const linesLength = this._lines.length; - const lineStartValues = new Uint32Array(linesLength); - for (let i = 0; i < linesLength; i++) { - lineStartValues[i] = this._lines[i].length + eolLength; - } - this._lineStarts = new _prefixSumComputer_js__WEBPACK_IMPORTED_MODULE_2__.PrefixSumComputer(lineStartValues); - } - } - /** - * All changes to a line's text go through this method - */ - _setLineText(lineIndex, newValue) { - this._lines[lineIndex] = newValue; - if (this._lineStarts) { - // update prefix sum - this._lineStarts.setValue(lineIndex, this._lines[lineIndex].length + this._eol.length); - } - } - _acceptDeleteRange(range) { - if (range.startLineNumber === range.endLineNumber) { - if (range.startColumn === range.endColumn) { - // Nothing to delete - return; - } - // Delete text on the affected line - this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1) - + this._lines[range.startLineNumber - 1].substring(range.endColumn - 1)); - return; - } - // Take remaining text on last line and append it to remaining text on first line - this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1) - + this._lines[range.endLineNumber - 1].substring(range.endColumn - 1)); - // Delete middle lines - this._lines.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber); - if (this._lineStarts) { - // update prefix sum - this._lineStarts.removeValues(range.startLineNumber, range.endLineNumber - range.startLineNumber); - } - } - _acceptInsertText(position, insertText) { - if (insertText.length === 0) { - // Nothing to insert - return; - } - const insertLines = (0,_base_common_strings_js__WEBPACK_IMPORTED_MODULE_0__.splitLines)(insertText); - if (insertLines.length === 1) { - // Inserting text on one line - this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1) - + insertLines[0] - + this._lines[position.lineNumber - 1].substring(position.column - 1)); - return; - } - // Append overflowing text from first line to the end of text to insert - insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1); - // Delete overflowing text from first line and insert text on first line - this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1) - + insertLines[0]); - // Insert new lines & store lengths - const newLengths = new Uint32Array(insertLines.length - 1); - for (let i = 1; i < insertLines.length; i++) { - this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]); - newLengths[i - 1] = insertLines[i].length + this._eol.length; - } - if (this._lineStarts) { - // update prefix sum - this._lineStarts.insertValues(position.lineNumber, newLengths); - } - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js": -/*!************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js ***! - \************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ConstantTimePrefixSumComputer: () => (/* binding */ ConstantTimePrefixSumComputer), -/* harmony export */ PrefixSumComputer: () => (/* binding */ PrefixSumComputer), -/* harmony export */ PrefixSumIndexOfResult: () => (/* binding */ PrefixSumIndexOfResult) -/* harmony export */ }); -/* harmony import */ var _base_common_arrays_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/arrays.js */ "./node_modules/monaco-editor/esm/vs/base/common/arrays.js"); -/* harmony import */ var _base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../base/common/uint.js */ "./node_modules/monaco-editor/esm/vs/base/common/uint.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -class PrefixSumComputer { - constructor(values) { - this.values = values; - this.prefixSum = new Uint32Array(values.length); - this.prefixSumValidIndex = new Int32Array(1); - this.prefixSumValidIndex[0] = -1; - } - insertValues(insertIndex, insertValues) { - insertIndex = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__.toUint32)(insertIndex); - const oldValues = this.values; - const oldPrefixSum = this.prefixSum; - const insertValuesLen = insertValues.length; - if (insertValuesLen === 0) { - return false; - } - this.values = new Uint32Array(oldValues.length + insertValuesLen); - this.values.set(oldValues.subarray(0, insertIndex), 0); - this.values.set(oldValues.subarray(insertIndex), insertIndex + insertValuesLen); - this.values.set(insertValues, insertIndex); - if (insertIndex - 1 < this.prefixSumValidIndex[0]) { - this.prefixSumValidIndex[0] = insertIndex - 1; - } - this.prefixSum = new Uint32Array(this.values.length); - if (this.prefixSumValidIndex[0] >= 0) { - this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1)); - } - return true; - } - setValue(index, value) { - index = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__.toUint32)(index); - value = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__.toUint32)(value); - if (this.values[index] === value) { - return false; - } - this.values[index] = value; - if (index - 1 < this.prefixSumValidIndex[0]) { - this.prefixSumValidIndex[0] = index - 1; - } - return true; - } - removeValues(startIndex, count) { - startIndex = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__.toUint32)(startIndex); - count = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__.toUint32)(count); - const oldValues = this.values; - const oldPrefixSum = this.prefixSum; - if (startIndex >= oldValues.length) { - return false; - } - const maxCount = oldValues.length - startIndex; - if (count >= maxCount) { - count = maxCount; - } - if (count === 0) { - return false; - } - this.values = new Uint32Array(oldValues.length - count); - this.values.set(oldValues.subarray(0, startIndex), 0); - this.values.set(oldValues.subarray(startIndex + count), startIndex); - this.prefixSum = new Uint32Array(this.values.length); - if (startIndex - 1 < this.prefixSumValidIndex[0]) { - this.prefixSumValidIndex[0] = startIndex - 1; - } - if (this.prefixSumValidIndex[0] >= 0) { - this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1)); - } - return true; - } - getTotalSum() { - if (this.values.length === 0) { - return 0; - } - return this._getPrefixSum(this.values.length - 1); - } - /** - * Returns the sum of the first `index + 1` many items. - * @returns `SUM(0 <= j <= index, values[j])`. - */ - getPrefixSum(index) { - if (index < 0) { - return 0; - } - index = (0,_base_common_uint_js__WEBPACK_IMPORTED_MODULE_1__.toUint32)(index); - return this._getPrefixSum(index); - } - _getPrefixSum(index) { - if (index <= this.prefixSumValidIndex[0]) { - return this.prefixSum[index]; - } - let startIndex = this.prefixSumValidIndex[0] + 1; - if (startIndex === 0) { - this.prefixSum[0] = this.values[0]; - startIndex++; - } - if (index >= this.values.length) { - index = this.values.length - 1; - } - for (let i = startIndex; i <= index; i++) { - this.prefixSum[i] = this.prefixSum[i - 1] + this.values[i]; - } - this.prefixSumValidIndex[0] = Math.max(this.prefixSumValidIndex[0], index); - return this.prefixSum[index]; - } - getIndexOf(sum) { - sum = Math.floor(sum); - // Compute all sums (to get a fully valid prefixSum) - this.getTotalSum(); - let low = 0; - let high = this.values.length - 1; - let mid = 0; - let midStop = 0; - let midStart = 0; - while (low <= high) { - mid = low + ((high - low) / 2) | 0; - midStop = this.prefixSum[mid]; - midStart = midStop - this.values[mid]; - if (sum < midStart) { - high = mid - 1; - } - else if (sum >= midStop) { - low = mid + 1; - } - else { - break; - } - } - return new PrefixSumIndexOfResult(mid, sum - midStart); - } -} -/** - * {@link getIndexOf} has an amortized runtime complexity of O(1). - * - * ({@link PrefixSumComputer.getIndexOf} is just O(log n)) -*/ -class ConstantTimePrefixSumComputer { - constructor(values) { - this._values = values; - this._isValid = false; - this._validEndIndex = -1; - this._prefixSum = []; - this._indexBySum = []; - } - /** - * @returns SUM(0 <= j < values.length, values[j]) - */ - getTotalSum() { - this._ensureValid(); - return this._indexBySum.length; - } - /** - * Returns the sum of the first `count` many items. - * @returns `SUM(0 <= j < count, values[j])`. - */ - getPrefixSum(count) { - this._ensureValid(); - if (count === 0) { - return 0; - } - return this._prefixSum[count - 1]; - } - /** - * @returns `result`, such that `getPrefixSum(result.index) + result.remainder = sum` - */ - getIndexOf(sum) { - this._ensureValid(); - const idx = this._indexBySum[sum]; - const viewLinesAbove = idx > 0 ? this._prefixSum[idx - 1] : 0; - return new PrefixSumIndexOfResult(idx, sum - viewLinesAbove); - } - removeValues(start, deleteCount) { - this._values.splice(start, deleteCount); - this._invalidate(start); - } - insertValues(insertIndex, insertArr) { - this._values = (0,_base_common_arrays_js__WEBPACK_IMPORTED_MODULE_0__.arrayInsert)(this._values, insertIndex, insertArr); - this._invalidate(insertIndex); - } - _invalidate(index) { - this._isValid = false; - this._validEndIndex = Math.min(this._validEndIndex, index - 1); - } - _ensureValid() { - if (this._isValid) { - return; - } - for (let i = this._validEndIndex + 1, len = this._values.length; i < len; i++) { - const value = this._values[i]; - const sumAbove = i > 0 ? this._prefixSum[i - 1] : 0; - this._prefixSum[i] = sumAbove + value; - for (let j = 0; j < value; j++) { - this._indexBySum[sumAbove + j] = i; - } - } - // trim things - this._prefixSum.length = this._values.length; - this._indexBySum.length = this._prefixSum[this._prefixSum.length - 1]; - // mark as valid - this._isValid = true; - this._validEndIndex = this._values.length - 1; - } - setValue(index, value) { - if (this._values[index] === value) { - // no change - return; - } - this._values[index] = value; - this._invalidate(index); - } -} -class PrefixSumIndexOfResult { - constructor(index, remainder) { - this.index = index; - this.remainder = remainder; - this._prefixSumIndexOfResultBrand = undefined; - this.index = index; - this.remainder = remainder; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ SearchParams: () => (/* binding */ SearchParams), -/* harmony export */ Searcher: () => (/* binding */ Searcher), -/* harmony export */ TextModelSearch: () => (/* binding */ TextModelSearch), -/* harmony export */ createFindMatch: () => (/* binding */ createFindMatch), -/* harmony export */ isMultilineRegexSource: () => (/* binding */ isMultilineRegexSource), -/* harmony export */ isValidMatch: () => (/* binding */ isValidMatch) -/* harmony export */ }); -/* harmony import */ var _base_common_strings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/strings.js */ "./node_modules/monaco-editor/esm/vs/base/common/strings.js"); -/* harmony import */ var _core_wordCharacterClassifier_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/wordCharacterClassifier.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js"); -/* harmony import */ var _core_position_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/position.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js"); -/* harmony import */ var _core_range_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/range.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js"); -/* harmony import */ var _model_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../model.js */ "./node_modules/monaco-editor/esm/vs/editor/common/model.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - - - - -const LIMIT_FIND_COUNT = 999; -class SearchParams { - constructor(searchString, isRegex, matchCase, wordSeparators) { - this.searchString = searchString; - this.isRegex = isRegex; - this.matchCase = matchCase; - this.wordSeparators = wordSeparators; - } - parseSearchRequest() { - if (this.searchString === '') { - return null; - } - // Try to create a RegExp out of the params - let multiline; - if (this.isRegex) { - multiline = isMultilineRegexSource(this.searchString); - } - else { - multiline = (this.searchString.indexOf('\n') >= 0); - } - let regex = null; - try { - regex = _base_common_strings_js__WEBPACK_IMPORTED_MODULE_0__.createRegExp(this.searchString, this.isRegex, { - matchCase: this.matchCase, - wholeWord: false, - multiline: multiline, - global: true, - unicode: true - }); - } - catch (err) { - return null; - } - if (!regex) { - return null; - } - let canUseSimpleSearch = (!this.isRegex && !multiline); - if (canUseSimpleSearch && this.searchString.toLowerCase() !== this.searchString.toUpperCase()) { - // casing might make a difference - canUseSimpleSearch = this.matchCase; - } - return new _model_js__WEBPACK_IMPORTED_MODULE_4__.SearchData(regex, this.wordSeparators ? (0,_core_wordCharacterClassifier_js__WEBPACK_IMPORTED_MODULE_1__.getMapForWordSeparators)(this.wordSeparators) : null, canUseSimpleSearch ? this.searchString : null); - } -} -function isMultilineRegexSource(searchString) { - if (!searchString || searchString.length === 0) { - return false; - } - for (let i = 0, len = searchString.length; i < len; i++) { - const chCode = searchString.charCodeAt(i); - if (chCode === 10 /* CharCode.LineFeed */) { - return true; - } - if (chCode === 92 /* CharCode.Backslash */) { - // move to next char - i++; - if (i >= len) { - // string ends with a \ - break; - } - const nextChCode = searchString.charCodeAt(i); - if (nextChCode === 110 /* CharCode.n */ || nextChCode === 114 /* CharCode.r */ || nextChCode === 87 /* CharCode.W */) { - return true; - } - } - } - return false; -} -function createFindMatch(range, rawMatches, captureMatches) { - if (!captureMatches) { - return new _model_js__WEBPACK_IMPORTED_MODULE_4__.FindMatch(range, null); - } - const matches = []; - for (let i = 0, len = rawMatches.length; i < len; i++) { - matches[i] = rawMatches[i]; - } - return new _model_js__WEBPACK_IMPORTED_MODULE_4__.FindMatch(range, matches); -} -class LineFeedCounter { - constructor(text) { - const lineFeedsOffsets = []; - let lineFeedsOffsetsLen = 0; - for (let i = 0, textLen = text.length; i < textLen; i++) { - if (text.charCodeAt(i) === 10 /* CharCode.LineFeed */) { - lineFeedsOffsets[lineFeedsOffsetsLen++] = i; - } - } - this._lineFeedsOffsets = lineFeedsOffsets; - } - findLineFeedCountBeforeOffset(offset) { - const lineFeedsOffsets = this._lineFeedsOffsets; - let min = 0; - let max = lineFeedsOffsets.length - 1; - if (max === -1) { - // no line feeds - return 0; - } - if (offset <= lineFeedsOffsets[0]) { - // before first line feed - return 0; - } - while (min < max) { - const mid = min + ((max - min) / 2 >> 0); - if (lineFeedsOffsets[mid] >= offset) { - max = mid - 1; - } - else { - if (lineFeedsOffsets[mid + 1] >= offset) { - // bingo! - min = mid; - max = mid; - } - else { - min = mid + 1; - } - } - } - return min + 1; - } -} -class TextModelSearch { - static findMatches(model, searchParams, searchRange, captureMatches, limitResultCount) { - const searchData = searchParams.parseSearchRequest(); - if (!searchData) { - return []; - } - if (searchData.regex.multiline) { - return this._doFindMatchesMultiline(model, searchRange, new Searcher(searchData.wordSeparators, searchData.regex), captureMatches, limitResultCount); - } - return this._doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount); - } - /** - * Multiline search always executes on the lines concatenated with \n. - * We must therefore compensate for the count of \n in case the model is CRLF - */ - static _getMultilineMatchRange(model, deltaOffset, text, lfCounter, matchIndex, match0) { - let startOffset; - let lineFeedCountBeforeMatch = 0; - if (lfCounter) { - lineFeedCountBeforeMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex); - startOffset = deltaOffset + matchIndex + lineFeedCountBeforeMatch /* add as many \r as there were \n */; - } - else { - startOffset = deltaOffset + matchIndex; - } - let endOffset; - if (lfCounter) { - const lineFeedCountBeforeEndOfMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex + match0.length); - const lineFeedCountInMatch = lineFeedCountBeforeEndOfMatch - lineFeedCountBeforeMatch; - endOffset = startOffset + match0.length + lineFeedCountInMatch /* add as many \r as there were \n */; - } - else { - endOffset = startOffset + match0.length; - } - const startPosition = model.getPositionAt(startOffset); - const endPosition = model.getPositionAt(endOffset); - return new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column); - } - static _doFindMatchesMultiline(model, searchRange, searcher, captureMatches, limitResultCount) { - const deltaOffset = model.getOffsetAt(searchRange.getStartPosition()); - // We always execute multiline search over the lines joined with \n - // This makes it that \n will match the EOL for both CRLF and LF models - // We compensate for offset errors in `_getMultilineMatchRange` - const text = model.getValueInRange(searchRange, 1 /* EndOfLinePreference.LF */); - const lfCounter = (model.getEOL() === '\r\n' ? new LineFeedCounter(text) : null); - const result = []; - let counter = 0; - let m; - searcher.reset(0); - while ((m = searcher.next(text))) { - result[counter++] = createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches); - if (counter >= limitResultCount) { - return result; - } - } - return result; - } - static _doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount) { - const result = []; - let resultLen = 0; - // Early case for a search range that starts & stops on the same line number - if (searchRange.startLineNumber === searchRange.endLineNumber) { - const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1, searchRange.endColumn - 1); - resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount); - return result; - } - // Collect results from first line - const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1); - resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount); - // Collect results from middle lines - for (let lineNumber = searchRange.startLineNumber + 1; lineNumber < searchRange.endLineNumber && resultLen < limitResultCount; lineNumber++) { - resultLen = this._findMatchesInLine(searchData, model.getLineContent(lineNumber), lineNumber, 0, resultLen, result, captureMatches, limitResultCount); - } - // Collect results from last line - if (resultLen < limitResultCount) { - const text = model.getLineContent(searchRange.endLineNumber).substring(0, searchRange.endColumn - 1); - resultLen = this._findMatchesInLine(searchData, text, searchRange.endLineNumber, 0, resultLen, result, captureMatches, limitResultCount); - } - return result; - } - static _findMatchesInLine(searchData, text, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) { - const wordSeparators = searchData.wordSeparators; - if (!captureMatches && searchData.simpleSearch) { - const searchString = searchData.simpleSearch; - const searchStringLen = searchString.length; - const textLength = text.length; - let lastMatchIndex = -searchStringLen; - while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) { - if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) { - result[resultLen++] = new _model_js__WEBPACK_IMPORTED_MODULE_4__.FindMatch(new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null); - if (resultLen >= limitResultCount) { - return resultLen; - } - } - } - return resultLen; - } - const searcher = new Searcher(searchData.wordSeparators, searchData.regex); - let m; - // Reset regex to search from the beginning - searcher.reset(0); - do { - m = searcher.next(text); - if (m) { - result[resultLen++] = createFindMatch(new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches); - if (resultLen >= limitResultCount) { - return resultLen; - } - } - } while (m); - return resultLen; - } - static findNextMatch(model, searchParams, searchStart, captureMatches) { - const searchData = searchParams.parseSearchRequest(); - if (!searchData) { - return null; - } - const searcher = new Searcher(searchData.wordSeparators, searchData.regex); - if (searchData.regex.multiline) { - return this._doFindNextMatchMultiline(model, searchStart, searcher, captureMatches); - } - return this._doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches); - } - static _doFindNextMatchMultiline(model, searchStart, searcher, captureMatches) { - const searchTextStart = new _core_position_js__WEBPACK_IMPORTED_MODULE_2__.Position(searchStart.lineNumber, 1); - const deltaOffset = model.getOffsetAt(searchTextStart); - const lineCount = model.getLineCount(); - // We always execute multiline search over the lines joined with \n - // This makes it that \n will match the EOL for both CRLF and LF models - // We compensate for offset errors in `_getMultilineMatchRange` - const text = model.getValueInRange(new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(searchTextStart.lineNumber, searchTextStart.column, lineCount, model.getLineMaxColumn(lineCount)), 1 /* EndOfLinePreference.LF */); - const lfCounter = (model.getEOL() === '\r\n' ? new LineFeedCounter(text) : null); - searcher.reset(searchStart.column - 1); - const m = searcher.next(text); - if (m) { - return createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches); - } - if (searchStart.lineNumber !== 1 || searchStart.column !== 1) { - // Try again from the top - return this._doFindNextMatchMultiline(model, new _core_position_js__WEBPACK_IMPORTED_MODULE_2__.Position(1, 1), searcher, captureMatches); - } - return null; - } - static _doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches) { - const lineCount = model.getLineCount(); - const startLineNumber = searchStart.lineNumber; - // Look in first line - const text = model.getLineContent(startLineNumber); - const r = this._findFirstMatchInLine(searcher, text, startLineNumber, searchStart.column, captureMatches); - if (r) { - return r; - } - for (let i = 1; i <= lineCount; i++) { - const lineIndex = (startLineNumber + i - 1) % lineCount; - const text = model.getLineContent(lineIndex + 1); - const r = this._findFirstMatchInLine(searcher, text, lineIndex + 1, 1, captureMatches); - if (r) { - return r; - } - } - return null; - } - static _findFirstMatchInLine(searcher, text, lineNumber, fromColumn, captureMatches) { - // Set regex to search from column - searcher.reset(fromColumn - 1); - const m = searcher.next(text); - if (m) { - return createFindMatch(new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches); - } - return null; - } - static findPreviousMatch(model, searchParams, searchStart, captureMatches) { - const searchData = searchParams.parseSearchRequest(); - if (!searchData) { - return null; - } - const searcher = new Searcher(searchData.wordSeparators, searchData.regex); - if (searchData.regex.multiline) { - return this._doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches); - } - return this._doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches); - } - static _doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches) { - const matches = this._doFindMatchesMultiline(model, new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(1, 1, searchStart.lineNumber, searchStart.column), searcher, captureMatches, 10 * LIMIT_FIND_COUNT); - if (matches.length > 0) { - return matches[matches.length - 1]; - } - const lineCount = model.getLineCount(); - if (searchStart.lineNumber !== lineCount || searchStart.column !== model.getLineMaxColumn(lineCount)) { - // Try again with all content - return this._doFindPreviousMatchMultiline(model, new _core_position_js__WEBPACK_IMPORTED_MODULE_2__.Position(lineCount, model.getLineMaxColumn(lineCount)), searcher, captureMatches); - } - return null; - } - static _doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches) { - const lineCount = model.getLineCount(); - const startLineNumber = searchStart.lineNumber; - // Look in first line - const text = model.getLineContent(startLineNumber).substring(0, searchStart.column - 1); - const r = this._findLastMatchInLine(searcher, text, startLineNumber, captureMatches); - if (r) { - return r; - } - for (let i = 1; i <= lineCount; i++) { - const lineIndex = (lineCount + startLineNumber - i - 1) % lineCount; - const text = model.getLineContent(lineIndex + 1); - const r = this._findLastMatchInLine(searcher, text, lineIndex + 1, captureMatches); - if (r) { - return r; - } - } - return null; - } - static _findLastMatchInLine(searcher, text, lineNumber, captureMatches) { - let bestResult = null; - let m; - searcher.reset(0); - while ((m = searcher.next(text))) { - bestResult = createFindMatch(new _core_range_js__WEBPACK_IMPORTED_MODULE_3__.Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches); - } - return bestResult; - } -} -function leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) { - if (matchStartIndex === 0) { - // Match starts at start of string - return true; - } - const charBefore = text.charCodeAt(matchStartIndex - 1); - if (wordSeparators.get(charBefore) !== 0 /* WordCharacterClass.Regular */) { - // The character before the match is a word separator - return true; - } - if (charBefore === 13 /* CharCode.CarriageReturn */ || charBefore === 10 /* CharCode.LineFeed */) { - // The character before the match is line break or carriage return. - return true; - } - if (matchLength > 0) { - const firstCharInMatch = text.charCodeAt(matchStartIndex); - if (wordSeparators.get(firstCharInMatch) !== 0 /* WordCharacterClass.Regular */) { - // The first character inside the match is a word separator - return true; - } - } - return false; -} -function rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) { - if (matchStartIndex + matchLength === textLength) { - // Match ends at end of string - return true; - } - const charAfter = text.charCodeAt(matchStartIndex + matchLength); - if (wordSeparators.get(charAfter) !== 0 /* WordCharacterClass.Regular */) { - // The character after the match is a word separator - return true; - } - if (charAfter === 13 /* CharCode.CarriageReturn */ || charAfter === 10 /* CharCode.LineFeed */) { - // The character after the match is line break or carriage return. - return true; - } - if (matchLength > 0) { - const lastCharInMatch = text.charCodeAt(matchStartIndex + matchLength - 1); - if (wordSeparators.get(lastCharInMatch) !== 0 /* WordCharacterClass.Regular */) { - // The last character in the match is a word separator - return true; - } - } - return false; -} -function isValidMatch(wordSeparators, text, textLength, matchStartIndex, matchLength) { - return (leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) - && rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength)); -} -class Searcher { - constructor(wordSeparators, searchRegex) { - this._wordSeparators = wordSeparators; - this._searchRegex = searchRegex; - this._prevMatchStartIndex = -1; - this._prevMatchLength = 0; - } - reset(lastIndex) { - this._searchRegex.lastIndex = lastIndex; - this._prevMatchStartIndex = -1; - this._prevMatchLength = 0; - } - next(text) { - const textLength = text.length; - let m; - do { - if (this._prevMatchStartIndex + this._prevMatchLength === textLength) { - // Reached the end of the line - return null; - } - m = this._searchRegex.exec(text); - if (!m) { - return null; - } - const matchStartIndex = m.index; - const matchLength = m[0].length; - if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) { - if (matchLength === 0) { - // the search result is an empty string and won't advance `regex.lastIndex`, so `regex.exec` will stuck here - // we attempt to recover from that by advancing by two if surrogate pair found and by one otherwise - if (_base_common_strings_js__WEBPACK_IMPORTED_MODULE_0__.getNextCodePoint(text, textLength, this._searchRegex.lastIndex) > 0xFFFF) { - this._searchRegex.lastIndex += 2; - } - else { - this._searchRegex.lastIndex += 1; - } - continue; - } - // Exit early if the regex matches the same range twice - return null; - } - this._prevMatchStartIndex = matchStartIndex; - this._prevMatchLength = matchLength; - if (!this._wordSeparators || isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) { - return m; - } - } while (m); - return null; - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js ***! - \***********************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ KeyMod: () => (/* binding */ KeyMod), -/* harmony export */ createMonacoBaseAPI: () => (/* binding */ createMonacoBaseAPI) -/* harmony export */ }); -/* harmony import */ var _base_common_cancellation_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/cancellation.js */ "./node_modules/monaco-editor/esm/vs/base/common/cancellation.js"); -/* harmony import */ var _base_common_event_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../base/common/event.js */ "./node_modules/monaco-editor/esm/vs/base/common/event.js"); -/* harmony import */ var _base_common_keyCodes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../base/common/keyCodes.js */ "./node_modules/monaco-editor/esm/vs/base/common/keyCodes.js"); -/* harmony import */ var _base_common_uri_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../base/common/uri.js */ "./node_modules/monaco-editor/esm/vs/base/common/uri.js"); -/* harmony import */ var _core_position_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/position.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js"); -/* harmony import */ var _core_range_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/range.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js"); -/* harmony import */ var _core_selection_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../core/selection.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/selection.js"); -/* harmony import */ var _languages_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../languages.js */ "./node_modules/monaco-editor/esm/vs/editor/common/languages.js"); -/* harmony import */ var _standalone_standaloneEnums_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../standalone/standaloneEnums.js */ "./node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - - - - - - - - -class KeyMod { - static chord(firstPart, secondPart) { - return (0,_base_common_keyCodes_js__WEBPACK_IMPORTED_MODULE_2__.KeyChord)(firstPart, secondPart); - } -} -KeyMod.CtrlCmd = 2048 /* ConstKeyMod.CtrlCmd */; -KeyMod.Shift = 1024 /* ConstKeyMod.Shift */; -KeyMod.Alt = 512 /* ConstKeyMod.Alt */; -KeyMod.WinCtrl = 256 /* ConstKeyMod.WinCtrl */; -function createMonacoBaseAPI() { - return { - editor: undefined, - languages: undefined, - CancellationTokenSource: _base_common_cancellation_js__WEBPACK_IMPORTED_MODULE_0__.CancellationTokenSource, - Emitter: _base_common_event_js__WEBPACK_IMPORTED_MODULE_1__.Emitter, - KeyCode: _standalone_standaloneEnums_js__WEBPACK_IMPORTED_MODULE_8__.KeyCode, - KeyMod: KeyMod, - Position: _core_position_js__WEBPACK_IMPORTED_MODULE_4__.Position, - Range: _core_range_js__WEBPACK_IMPORTED_MODULE_5__.Range, - Selection: _core_selection_js__WEBPACK_IMPORTED_MODULE_6__.Selection, - SelectionDirection: _standalone_standaloneEnums_js__WEBPACK_IMPORTED_MODULE_8__.SelectionDirection, - MarkerSeverity: _standalone_standaloneEnums_js__WEBPACK_IMPORTED_MODULE_8__.MarkerSeverity, - MarkerTag: _standalone_standaloneEnums_js__WEBPACK_IMPORTED_MODULE_8__.MarkerTag, - Uri: _base_common_uri_js__WEBPACK_IMPORTED_MODULE_3__.URI, - Token: _languages_js__WEBPACK_IMPORTED_MODULE_7__.Token - }; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js ***! - \****************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EditorSimpleWorker: () => (/* binding */ EditorSimpleWorker), -/* harmony export */ MirrorModel: () => (/* binding */ MirrorModel), -/* harmony export */ create: () => (/* binding */ create) -/* harmony export */ }); -/* harmony import */ var _base_common_diff_diff_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../base/common/diff/diff.js */ "./node_modules/monaco-editor/esm/vs/base/common/diff/diff.js"); -/* harmony import */ var _base_common_platform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../base/common/platform.js */ "./node_modules/monaco-editor/esm/vs/base/common/platform.js"); -/* harmony import */ var _base_common_uri_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../base/common/uri.js */ "./node_modules/monaco-editor/esm/vs/base/common/uri.js"); -/* harmony import */ var _core_position_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/position.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/position.js"); -/* harmony import */ var _core_range_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/range.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js"); -/* harmony import */ var _diff_diffComputer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../diff/diffComputer.js */ "./node_modules/monaco-editor/esm/vs/editor/common/diff/diffComputer.js"); -/* harmony import */ var _model_mirrorTextModel_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../model/mirrorTextModel.js */ "./node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js"); -/* harmony import */ var _core_wordHelper_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../core/wordHelper.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js"); -/* harmony import */ var _languages_linkComputer_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../languages/linkComputer.js */ "./node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js"); -/* harmony import */ var _languages_supports_inplaceReplaceSupport_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../languages/supports/inplaceReplaceSupport.js */ "./node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js"); -/* harmony import */ var _editorBaseApi_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./editorBaseApi.js */ "./node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js"); -/* harmony import */ var _base_common_types_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../base/common/types.js */ "./node_modules/monaco-editor/esm/vs/base/common/types.js"); -/* harmony import */ var _base_common_stopwatch_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../base/common/stopwatch.js */ "./node_modules/monaco-editor/esm/vs/base/common/stopwatch.js"); -/* harmony import */ var _unicodeTextModelHighlighter_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./unicodeTextModelHighlighter.js */ "./node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - - - - - - - - - - - - - - -/** - * @internal - */ -class MirrorModel extends _model_mirrorTextModel_js__WEBPACK_IMPORTED_MODULE_6__.MirrorTextModel { - get uri() { - return this._uri; - } - get eol() { - return this._eol; - } - getValue() { - return this.getText(); - } - getLinesContent() { - return this._lines.slice(0); - } - getLineCount() { - return this._lines.length; - } - getLineContent(lineNumber) { - return this._lines[lineNumber - 1]; - } - getWordAtPosition(position, wordDefinition) { - const wordAtText = (0,_core_wordHelper_js__WEBPACK_IMPORTED_MODULE_7__.getWordAtText)(position.column, (0,_core_wordHelper_js__WEBPACK_IMPORTED_MODULE_7__.ensureValidWordDefinition)(wordDefinition), this._lines[position.lineNumber - 1], 0); - if (wordAtText) { - return new _core_range_js__WEBPACK_IMPORTED_MODULE_4__.Range(position.lineNumber, wordAtText.startColumn, position.lineNumber, wordAtText.endColumn); - } - return null; - } - words(wordDefinition) { - const lines = this._lines; - const wordenize = this._wordenize.bind(this); - let lineNumber = 0; - let lineText = ''; - let wordRangesIdx = 0; - let wordRanges = []; - return { - *[Symbol.iterator]() { - while (true) { - if (wordRangesIdx < wordRanges.length) { - const value = lineText.substring(wordRanges[wordRangesIdx].start, wordRanges[wordRangesIdx].end); - wordRangesIdx += 1; - yield value; - } - else { - if (lineNumber < lines.length) { - lineText = lines[lineNumber]; - wordRanges = wordenize(lineText, wordDefinition); - wordRangesIdx = 0; - lineNumber += 1; - } - else { - break; - } - } - } - } - }; - } - getLineWords(lineNumber, wordDefinition) { - const content = this._lines[lineNumber - 1]; - const ranges = this._wordenize(content, wordDefinition); - const words = []; - for (const range of ranges) { - words.push({ - word: content.substring(range.start, range.end), - startColumn: range.start + 1, - endColumn: range.end + 1 - }); - } - return words; - } - _wordenize(content, wordDefinition) { - const result = []; - let match; - wordDefinition.lastIndex = 0; // reset lastIndex just to be sure - while (match = wordDefinition.exec(content)) { - if (match[0].length === 0) { - // it did match the empty string - break; - } - result.push({ start: match.index, end: match.index + match[0].length }); - } - return result; - } - getValueInRange(range) { - range = this._validateRange(range); - if (range.startLineNumber === range.endLineNumber) { - return this._lines[range.startLineNumber - 1].substring(range.startColumn - 1, range.endColumn - 1); - } - const lineEnding = this._eol; - const startLineIndex = range.startLineNumber - 1; - const endLineIndex = range.endLineNumber - 1; - const resultLines = []; - resultLines.push(this._lines[startLineIndex].substring(range.startColumn - 1)); - for (let i = startLineIndex + 1; i < endLineIndex; i++) { - resultLines.push(this._lines[i]); - } - resultLines.push(this._lines[endLineIndex].substring(0, range.endColumn - 1)); - return resultLines.join(lineEnding); - } - offsetAt(position) { - position = this._validatePosition(position); - this._ensureLineStarts(); - return this._lineStarts.getPrefixSum(position.lineNumber - 2) + (position.column - 1); - } - positionAt(offset) { - offset = Math.floor(offset); - offset = Math.max(0, offset); - this._ensureLineStarts(); - const out = this._lineStarts.getIndexOf(offset); - const lineLength = this._lines[out.index].length; - // Ensure we return a valid position - return { - lineNumber: 1 + out.index, - column: 1 + Math.min(out.remainder, lineLength) - }; - } - _validateRange(range) { - const start = this._validatePosition({ lineNumber: range.startLineNumber, column: range.startColumn }); - const end = this._validatePosition({ lineNumber: range.endLineNumber, column: range.endColumn }); - if (start.lineNumber !== range.startLineNumber - || start.column !== range.startColumn - || end.lineNumber !== range.endLineNumber - || end.column !== range.endColumn) { - return { - startLineNumber: start.lineNumber, - startColumn: start.column, - endLineNumber: end.lineNumber, - endColumn: end.column - }; - } - return range; - } - _validatePosition(position) { - if (!_core_position_js__WEBPACK_IMPORTED_MODULE_3__.Position.isIPosition(position)) { - throw new Error('bad position'); - } - let { lineNumber, column } = position; - let hasChanged = false; - if (lineNumber < 1) { - lineNumber = 1; - column = 1; - hasChanged = true; - } - else if (lineNumber > this._lines.length) { - lineNumber = this._lines.length; - column = this._lines[lineNumber - 1].length + 1; - hasChanged = true; - } - else { - const maxCharacter = this._lines[lineNumber - 1].length + 1; - if (column < 1) { - column = 1; - hasChanged = true; - } - else if (column > maxCharacter) { - column = maxCharacter; - hasChanged = true; - } - } - if (!hasChanged) { - return position; - } - else { - return { lineNumber, column }; - } - } -} -/** - * @internal - */ -class EditorSimpleWorker { - constructor(host, foreignModuleFactory) { - this._host = host; - this._models = Object.create(null); - this._foreignModuleFactory = foreignModuleFactory; - this._foreignModule = null; - } - dispose() { - this._models = Object.create(null); - } - _getModel(uri) { - return this._models[uri]; - } - _getModels() { - const all = []; - Object.keys(this._models).forEach((key) => all.push(this._models[key])); - return all; - } - acceptNewModel(data) { - this._models[data.url] = new MirrorModel(_base_common_uri_js__WEBPACK_IMPORTED_MODULE_2__.URI.parse(data.url), data.lines, data.EOL, data.versionId); - } - acceptModelChanged(strURL, e) { - if (!this._models[strURL]) { - return; - } - const model = this._models[strURL]; - model.onEvents(e); - } - acceptRemovedModel(strURL) { - if (!this._models[strURL]) { - return; - } - delete this._models[strURL]; - } - computeUnicodeHighlights(url, options, range) { - return __awaiter(this, void 0, void 0, function* () { - const model = this._getModel(url); - if (!model) { - return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 }; - } - return _unicodeTextModelHighlighter_js__WEBPACK_IMPORTED_MODULE_13__.UnicodeTextModelHighlighter.computeUnicodeHighlights(model, options, range); - }); - } - // ---- BEGIN diff -------------------------------------------------------------------------- - computeDiff(originalUrl, modifiedUrl, ignoreTrimWhitespace, maxComputationTime) { - return __awaiter(this, void 0, void 0, function* () { - const original = this._getModel(originalUrl); - const modified = this._getModel(modifiedUrl); - if (!original || !modified) { - return null; - } - return EditorSimpleWorker.computeDiff(original, modified, ignoreTrimWhitespace, maxComputationTime); - }); - } - static computeDiff(originalTextModel, modifiedTextModel, ignoreTrimWhitespace, maxComputationTime) { - const originalLines = originalTextModel.getLinesContent(); - const modifiedLines = modifiedTextModel.getLinesContent(); - const diffComputer = new _diff_diffComputer_js__WEBPACK_IMPORTED_MODULE_5__.DiffComputer(originalLines, modifiedLines, { - shouldComputeCharChanges: true, - shouldPostProcessCharChanges: true, - shouldIgnoreTrimWhitespace: ignoreTrimWhitespace, - shouldMakePrettyDiff: true, - maxComputationTime: maxComputationTime - }); - const diffResult = diffComputer.computeDiff(); - const identical = (diffResult.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel)); - return { - quitEarly: diffResult.quitEarly, - identical: identical, - changes: diffResult.changes - }; - } - static _modelsAreIdentical(original, modified) { - const originalLineCount = original.getLineCount(); - const modifiedLineCount = modified.getLineCount(); - if (originalLineCount !== modifiedLineCount) { - return false; - } - for (let line = 1; line <= originalLineCount; line++) { - const originalLine = original.getLineContent(line); - const modifiedLine = modified.getLineContent(line); - if (originalLine !== modifiedLine) { - return false; - } - } - return true; - } - computeMoreMinimalEdits(modelUrl, edits) { - return __awaiter(this, void 0, void 0, function* () { - const model = this._getModel(modelUrl); - if (!model) { - return edits; - } - const result = []; - let lastEol = undefined; - edits = edits.slice(0).sort((a, b) => { - if (a.range && b.range) { - return _core_range_js__WEBPACK_IMPORTED_MODULE_4__.Range.compareRangesUsingStarts(a.range, b.range); - } - // eol only changes should go to the end - const aRng = a.range ? 0 : 1; - const bRng = b.range ? 0 : 1; - return aRng - bRng; - }); - for (let { range, text, eol } of edits) { - if (typeof eol === 'number') { - lastEol = eol; - } - if (_core_range_js__WEBPACK_IMPORTED_MODULE_4__.Range.isEmpty(range) && !text) { - // empty change - continue; - } - const original = model.getValueInRange(range); - text = text.replace(/\r\n|\n|\r/g, model.eol); - if (original === text) { - // noop - continue; - } - // make sure diff won't take too long - if (Math.max(text.length, original.length) > EditorSimpleWorker._diffLimit) { - result.push({ range, text }); - continue; - } - // compute diff between original and edit.text - const changes = (0,_base_common_diff_diff_js__WEBPACK_IMPORTED_MODULE_0__.stringDiff)(original, text, false); - const editOffset = model.offsetAt(_core_range_js__WEBPACK_IMPORTED_MODULE_4__.Range.lift(range).getStartPosition()); - for (const change of changes) { - const start = model.positionAt(editOffset + change.originalStart); - const end = model.positionAt(editOffset + change.originalStart + change.originalLength); - const newEdit = { - text: text.substr(change.modifiedStart, change.modifiedLength), - range: { startLineNumber: start.lineNumber, startColumn: start.column, endLineNumber: end.lineNumber, endColumn: end.column } - }; - if (model.getValueInRange(newEdit.range) !== newEdit.text) { - result.push(newEdit); - } - } - } - if (typeof lastEol === 'number') { - result.push({ eol: lastEol, text: '', range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } }); - } - return result; - }); - } - // ---- END minimal edits --------------------------------------------------------------- - computeLinks(modelUrl) { - return __awaiter(this, void 0, void 0, function* () { - const model = this._getModel(modelUrl); - if (!model) { - return null; - } - return (0,_languages_linkComputer_js__WEBPACK_IMPORTED_MODULE_8__.computeLinks)(model); - }); - } - textualSuggest(modelUrls, leadingWord, wordDef, wordDefFlags) { - return __awaiter(this, void 0, void 0, function* () { - const sw = new _base_common_stopwatch_js__WEBPACK_IMPORTED_MODULE_12__.StopWatch(true); - const wordDefRegExp = new RegExp(wordDef, wordDefFlags); - const seen = new Set(); - outer: for (const url of modelUrls) { - const model = this._getModel(url); - if (!model) { - continue; - } - for (const word of model.words(wordDefRegExp)) { - if (word === leadingWord || !isNaN(Number(word))) { - continue; - } - seen.add(word); - if (seen.size > EditorSimpleWorker._suggestionsLimit) { - break outer; - } - } - } - return { words: Array.from(seen), duration: sw.elapsed() }; - }); - } - // ---- END suggest -------------------------------------------------------------------------- - //#region -- word ranges -- - computeWordRanges(modelUrl, range, wordDef, wordDefFlags) { - return __awaiter(this, void 0, void 0, function* () { - const model = this._getModel(modelUrl); - if (!model) { - return Object.create(null); - } - const wordDefRegExp = new RegExp(wordDef, wordDefFlags); - const result = Object.create(null); - for (let line = range.startLineNumber; line < range.endLineNumber; line++) { - const words = model.getLineWords(line, wordDefRegExp); - for (const word of words) { - if (!isNaN(Number(word.word))) { - continue; - } - let array = result[word.word]; - if (!array) { - array = []; - result[word.word] = array; - } - array.push({ - startLineNumber: line, - startColumn: word.startColumn, - endLineNumber: line, - endColumn: word.endColumn - }); - } - } - return result; - }); - } - //#endregion - navigateValueSet(modelUrl, range, up, wordDef, wordDefFlags) { - return __awaiter(this, void 0, void 0, function* () { - const model = this._getModel(modelUrl); - if (!model) { - return null; - } - const wordDefRegExp = new RegExp(wordDef, wordDefFlags); - if (range.startColumn === range.endColumn) { - range = { - startLineNumber: range.startLineNumber, - startColumn: range.startColumn, - endLineNumber: range.endLineNumber, - endColumn: range.endColumn + 1 - }; - } - const selectionText = model.getValueInRange(range); - const wordRange = model.getWordAtPosition({ lineNumber: range.startLineNumber, column: range.startColumn }, wordDefRegExp); - if (!wordRange) { - return null; - } - const word = model.getValueInRange(wordRange); - const result = _languages_supports_inplaceReplaceSupport_js__WEBPACK_IMPORTED_MODULE_9__.BasicInplaceReplace.INSTANCE.navigateValueSet(range, selectionText, wordRange, word, up); - return result; - }); - } - // ---- BEGIN foreign module support -------------------------------------------------------------------------- - loadForeignModule(moduleId, createData, foreignHostMethods) { - const proxyMethodRequest = (method, args) => { - return this._host.fhr(method, args); - }; - const foreignHost = _base_common_types_js__WEBPACK_IMPORTED_MODULE_11__.createProxyObject(foreignHostMethods, proxyMethodRequest); - const ctx = { - host: foreignHost, - getMirrorModels: () => { - return this._getModels(); - } - }; - if (this._foreignModuleFactory) { - this._foreignModule = this._foreignModuleFactory(ctx, createData); - // static foreing module - return Promise.resolve(_base_common_types_js__WEBPACK_IMPORTED_MODULE_11__.getAllMethodNames(this._foreignModule)); - } - // ESM-comment-begin - // return new Promise((resolve, reject) => { - // require([moduleId], (foreignModule: { create: IForeignModuleFactory }) => { - // this._foreignModule = foreignModule.create(ctx, createData); - // - // resolve(types.getAllMethodNames(this._foreignModule)); - // - // }, reject); - // }); - // ESM-comment-end - // ESM-uncomment-begin - return Promise.reject(new Error(`Unexpected usage`)); - // ESM-uncomment-end - } - // foreign method request - fmr(method, args) { - if (!this._foreignModule || typeof this._foreignModule[method] !== 'function') { - return Promise.reject(new Error('Missing requestHandler or method: ' + method)); - } - try { - return Promise.resolve(this._foreignModule[method].apply(this._foreignModule, args)); - } - catch (e) { - return Promise.reject(e); - } - } -} -// ---- END diff -------------------------------------------------------------------------- -// ---- BEGIN minimal edits --------------------------------------------------------------- -EditorSimpleWorker._diffLimit = 100000; -// ---- BEGIN suggest -------------------------------------------------------------------------- -EditorSimpleWorker._suggestionsLimit = 10000; -/** - * Called on the worker side - * @internal - */ -function create(host) { - return new EditorSimpleWorker(host, null); -} -if (typeof importScripts === 'function') { - // Running in a web worker - _base_common_platform_js__WEBPACK_IMPORTED_MODULE_1__.globals.monaco = (0,_editorBaseApi_js__WEBPACK_IMPORTED_MODULE_10__.createMonacoBaseAPI)(); -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js": -/*!*************************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js ***! - \*************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ UnicodeTextModelHighlighter: () => (/* binding */ UnicodeTextModelHighlighter) -/* harmony export */ }); -/* harmony import */ var _core_range_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/range.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/range.js"); -/* harmony import */ var _model_textModelSearch_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../model/textModelSearch.js */ "./node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js"); -/* harmony import */ var _base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../base/common/strings.js */ "./node_modules/monaco-editor/esm/vs/base/common/strings.js"); -/* harmony import */ var _base_common_types_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../base/common/types.js */ "./node_modules/monaco-editor/esm/vs/base/common/types.js"); -/* harmony import */ var _core_wordHelper_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/wordHelper.js */ "./node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - - - - -class UnicodeTextModelHighlighter { - static computeUnicodeHighlights(model, options, range) { - const startLine = range ? range.startLineNumber : 1; - const endLine = range ? range.endLineNumber : model.getLineCount(); - const codePointHighlighter = new CodePointHighlighter(options); - const candidates = codePointHighlighter.getCandidateCodePoints(); - let regex; - if (candidates === 'allNonBasicAscii') { - regex = new RegExp('[^\\t\\n\\r\\x20-\\x7E]', 'g'); - } - else { - regex = new RegExp(`${buildRegExpCharClassExpr(Array.from(candidates))}`, 'g'); - } - const searcher = new _model_textModelSearch_js__WEBPACK_IMPORTED_MODULE_1__.Searcher(null, regex); - const ranges = []; - let hasMore = false; - let m; - let ambiguousCharacterCount = 0; - let invisibleCharacterCount = 0; - let nonBasicAsciiCharacterCount = 0; - forLoop: for (let lineNumber = startLine, lineCount = endLine; lineNumber <= lineCount; lineNumber++) { - const lineContent = model.getLineContent(lineNumber); - const lineLength = lineContent.length; - // Reset regex to search from the beginning - searcher.reset(0); - do { - m = searcher.next(lineContent); - if (m) { - let startIndex = m.index; - let endIndex = m.index + m[0].length; - // Extend range to entire code point - if (startIndex > 0) { - const charCodeBefore = lineContent.charCodeAt(startIndex - 1); - if (_base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.isHighSurrogate(charCodeBefore)) { - startIndex--; - } - } - if (endIndex + 1 < lineLength) { - const charCodeBefore = lineContent.charCodeAt(endIndex - 1); - if (_base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.isHighSurrogate(charCodeBefore)) { - endIndex++; - } - } - const str = lineContent.substring(startIndex, endIndex); - const word = (0,_core_wordHelper_js__WEBPACK_IMPORTED_MODULE_4__.getWordAtText)(startIndex + 1, _core_wordHelper_js__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_WORD_REGEXP, lineContent, 0); - const highlightReason = codePointHighlighter.shouldHighlightNonBasicASCII(str, word ? word.word : null); - if (highlightReason !== 0 /* SimpleHighlightReason.None */) { - if (highlightReason === 3 /* SimpleHighlightReason.Ambiguous */) { - ambiguousCharacterCount++; - } - else if (highlightReason === 2 /* SimpleHighlightReason.Invisible */) { - invisibleCharacterCount++; - } - else if (highlightReason === 1 /* SimpleHighlightReason.NonBasicASCII */) { - nonBasicAsciiCharacterCount++; - } - else { - (0,_base_common_types_js__WEBPACK_IMPORTED_MODULE_3__.assertNever)(highlightReason); - } - const MAX_RESULT_LENGTH = 1000; - if (ranges.length >= MAX_RESULT_LENGTH) { - hasMore = true; - break forLoop; - } - ranges.push(new _core_range_js__WEBPACK_IMPORTED_MODULE_0__.Range(lineNumber, startIndex + 1, lineNumber, endIndex + 1)); - } - } - } while (m); - } - return { - ranges, - hasMore, - ambiguousCharacterCount, - invisibleCharacterCount, - nonBasicAsciiCharacterCount - }; - } - static computeUnicodeHighlightReason(char, options) { - const codePointHighlighter = new CodePointHighlighter(options); - const reason = codePointHighlighter.shouldHighlightNonBasicASCII(char, null); - switch (reason) { - case 0 /* SimpleHighlightReason.None */: - return null; - case 2 /* SimpleHighlightReason.Invisible */: - return { kind: 1 /* UnicodeHighlighterReasonKind.Invisible */ }; - case 3 /* SimpleHighlightReason.Ambiguous */: { - const codePoint = char.codePointAt(0); - const primaryConfusable = codePointHighlighter.ambiguousCharacters.getPrimaryConfusable(codePoint); - const notAmbiguousInLocales = _base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.AmbiguousCharacters.getLocales().filter((l) => !_base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.AmbiguousCharacters.getInstance(new Set([...options.allowedLocales, l])).isAmbiguous(codePoint)); - return { kind: 0 /* UnicodeHighlighterReasonKind.Ambiguous */, confusableWith: String.fromCodePoint(primaryConfusable), notAmbiguousInLocales }; - } - case 1 /* SimpleHighlightReason.NonBasicASCII */: - return { kind: 2 /* UnicodeHighlighterReasonKind.NonBasicAscii */ }; - } - } -} -function buildRegExpCharClassExpr(codePoints, flags) { - const src = `[${_base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.escapeRegExpCharacters(codePoints.map((i) => String.fromCodePoint(i)).join(''))}]`; - return src; -} -class CodePointHighlighter { - constructor(options) { - this.options = options; - this.allowedCodePoints = new Set(options.allowedCodePoints); - this.ambiguousCharacters = _base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.AmbiguousCharacters.getInstance(new Set(options.allowedLocales)); - } - getCandidateCodePoints() { - if (this.options.nonBasicASCII) { - return 'allNonBasicAscii'; - } - const set = new Set(); - if (this.options.invisibleCharacters) { - for (const cp of _base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.InvisibleCharacters.codePoints) { - if (!isAllowedInvisibleCharacter(String.fromCodePoint(cp))) { - set.add(cp); - } - } - } - if (this.options.ambiguousCharacters) { - for (const cp of this.ambiguousCharacters.getConfusableCodePoints()) { - set.add(cp); - } - } - for (const cp of this.allowedCodePoints) { - set.delete(cp); - } - return set; - } - shouldHighlightNonBasicASCII(character, wordContext) { - const codePoint = character.codePointAt(0); - if (this.allowedCodePoints.has(codePoint)) { - return 0 /* SimpleHighlightReason.None */; - } - if (this.options.nonBasicASCII) { - return 1 /* SimpleHighlightReason.NonBasicASCII */; - } - let hasBasicASCIICharacters = false; - let hasNonConfusableNonBasicAsciiCharacter = false; - if (wordContext) { - for (const char of wordContext) { - const codePoint = char.codePointAt(0); - const isBasicASCII = _base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.isBasicASCII(char); - hasBasicASCIICharacters = hasBasicASCIICharacters || isBasicASCII; - if (!isBasicASCII && - !this.ambiguousCharacters.isAmbiguous(codePoint) && - !_base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.InvisibleCharacters.isInvisibleCharacter(codePoint)) { - hasNonConfusableNonBasicAsciiCharacter = true; - } - } - } - if ( - /* Don't allow mixing weird looking characters with ASCII */ !hasBasicASCIICharacters && - /* Is there an obviously weird looking character? */ hasNonConfusableNonBasicAsciiCharacter) { - return 0 /* SimpleHighlightReason.None */; - } - if (this.options.invisibleCharacters) { - // TODO check for emojis - if (!isAllowedInvisibleCharacter(character) && _base_common_strings_js__WEBPACK_IMPORTED_MODULE_2__.InvisibleCharacters.isInvisibleCharacter(codePoint)) { - return 2 /* SimpleHighlightReason.Invisible */; - } - } - if (this.options.ambiguousCharacters) { - if (this.ambiguousCharacters.isAmbiguous(codePoint)) { - return 3 /* SimpleHighlightReason.Ambiguous */; - } - } - return 0 /* SimpleHighlightReason.None */; - } -} -function isAllowedInvisibleCharacter(character) { - return character === ' ' || character === '\n' || character === '\t'; -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js": -/*!***************************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js ***! - \***************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AccessibilitySupport: () => (/* binding */ AccessibilitySupport), -/* harmony export */ CodeActionTriggerType: () => (/* binding */ CodeActionTriggerType), -/* harmony export */ CompletionItemInsertTextRule: () => (/* binding */ CompletionItemInsertTextRule), -/* harmony export */ CompletionItemKind: () => (/* binding */ CompletionItemKind), -/* harmony export */ CompletionItemTag: () => (/* binding */ CompletionItemTag), -/* harmony export */ CompletionTriggerKind: () => (/* binding */ CompletionTriggerKind), -/* harmony export */ ContentWidgetPositionPreference: () => (/* binding */ ContentWidgetPositionPreference), -/* harmony export */ CursorChangeReason: () => (/* binding */ CursorChangeReason), -/* harmony export */ DefaultEndOfLine: () => (/* binding */ DefaultEndOfLine), -/* harmony export */ DocumentHighlightKind: () => (/* binding */ DocumentHighlightKind), -/* harmony export */ EditorAutoIndentStrategy: () => (/* binding */ EditorAutoIndentStrategy), -/* harmony export */ EditorOption: () => (/* binding */ EditorOption), -/* harmony export */ EndOfLinePreference: () => (/* binding */ EndOfLinePreference), -/* harmony export */ EndOfLineSequence: () => (/* binding */ EndOfLineSequence), -/* harmony export */ IndentAction: () => (/* binding */ IndentAction), -/* harmony export */ InjectedTextCursorStops: () => (/* binding */ InjectedTextCursorStops), -/* harmony export */ InlayHintKind: () => (/* binding */ InlayHintKind), -/* harmony export */ InlineCompletionTriggerKind: () => (/* binding */ InlineCompletionTriggerKind), -/* harmony export */ KeyCode: () => (/* binding */ KeyCode), -/* harmony export */ MarkerSeverity: () => (/* binding */ MarkerSeverity), -/* harmony export */ MarkerTag: () => (/* binding */ MarkerTag), -/* harmony export */ MinimapPosition: () => (/* binding */ MinimapPosition), -/* harmony export */ MouseTargetType: () => (/* binding */ MouseTargetType), -/* harmony export */ OverlayWidgetPositionPreference: () => (/* binding */ OverlayWidgetPositionPreference), -/* harmony export */ OverviewRulerLane: () => (/* binding */ OverviewRulerLane), -/* harmony export */ PositionAffinity: () => (/* binding */ PositionAffinity), -/* harmony export */ RenderLineNumbersType: () => (/* binding */ RenderLineNumbersType), -/* harmony export */ RenderMinimap: () => (/* binding */ RenderMinimap), -/* harmony export */ ScrollType: () => (/* binding */ ScrollType), -/* harmony export */ ScrollbarVisibility: () => (/* binding */ ScrollbarVisibility), -/* harmony export */ SelectionDirection: () => (/* binding */ SelectionDirection), -/* harmony export */ SignatureHelpTriggerKind: () => (/* binding */ SignatureHelpTriggerKind), -/* harmony export */ SymbolKind: () => (/* binding */ SymbolKind), -/* harmony export */ SymbolTag: () => (/* binding */ SymbolTag), -/* harmony export */ TextEditorCursorBlinkingStyle: () => (/* binding */ TextEditorCursorBlinkingStyle), -/* harmony export */ TextEditorCursorStyle: () => (/* binding */ TextEditorCursorStyle), -/* harmony export */ TrackedRangeStickiness: () => (/* binding */ TrackedRangeStickiness), -/* harmony export */ WrappingIndent: () => (/* binding */ WrappingIndent) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. -var AccessibilitySupport; -(function (AccessibilitySupport) { - /** - * This should be the browser case where it is not known if a screen reader is attached or no. - */ - AccessibilitySupport[AccessibilitySupport["Unknown"] = 0] = "Unknown"; - AccessibilitySupport[AccessibilitySupport["Disabled"] = 1] = "Disabled"; - AccessibilitySupport[AccessibilitySupport["Enabled"] = 2] = "Enabled"; -})(AccessibilitySupport || (AccessibilitySupport = {})); -var CodeActionTriggerType; -(function (CodeActionTriggerType) { - CodeActionTriggerType[CodeActionTriggerType["Invoke"] = 1] = "Invoke"; - CodeActionTriggerType[CodeActionTriggerType["Auto"] = 2] = "Auto"; -})(CodeActionTriggerType || (CodeActionTriggerType = {})); -var CompletionItemInsertTextRule; -(function (CompletionItemInsertTextRule) { - /** - * Adjust whitespace/indentation of multiline insert texts to - * match the current line indentation. - */ - CompletionItemInsertTextRule[CompletionItemInsertTextRule["KeepWhitespace"] = 1] = "KeepWhitespace"; - /** - * `insertText` is a snippet. - */ - CompletionItemInsertTextRule[CompletionItemInsertTextRule["InsertAsSnippet"] = 4] = "InsertAsSnippet"; -})(CompletionItemInsertTextRule || (CompletionItemInsertTextRule = {})); -var CompletionItemKind; -(function (CompletionItemKind) { - CompletionItemKind[CompletionItemKind["Method"] = 0] = "Method"; - CompletionItemKind[CompletionItemKind["Function"] = 1] = "Function"; - CompletionItemKind[CompletionItemKind["Constructor"] = 2] = "Constructor"; - CompletionItemKind[CompletionItemKind["Field"] = 3] = "Field"; - CompletionItemKind[CompletionItemKind["Variable"] = 4] = "Variable"; - CompletionItemKind[CompletionItemKind["Class"] = 5] = "Class"; - CompletionItemKind[CompletionItemKind["Struct"] = 6] = "Struct"; - CompletionItemKind[CompletionItemKind["Interface"] = 7] = "Interface"; - CompletionItemKind[CompletionItemKind["Module"] = 8] = "Module"; - CompletionItemKind[CompletionItemKind["Property"] = 9] = "Property"; - CompletionItemKind[CompletionItemKind["Event"] = 10] = "Event"; - CompletionItemKind[CompletionItemKind["Operator"] = 11] = "Operator"; - CompletionItemKind[CompletionItemKind["Unit"] = 12] = "Unit"; - CompletionItemKind[CompletionItemKind["Value"] = 13] = "Value"; - CompletionItemKind[CompletionItemKind["Constant"] = 14] = "Constant"; - CompletionItemKind[CompletionItemKind["Enum"] = 15] = "Enum"; - CompletionItemKind[CompletionItemKind["EnumMember"] = 16] = "EnumMember"; - CompletionItemKind[CompletionItemKind["Keyword"] = 17] = "Keyword"; - CompletionItemKind[CompletionItemKind["Text"] = 18] = "Text"; - CompletionItemKind[CompletionItemKind["Color"] = 19] = "Color"; - CompletionItemKind[CompletionItemKind["File"] = 20] = "File"; - CompletionItemKind[CompletionItemKind["Reference"] = 21] = "Reference"; - CompletionItemKind[CompletionItemKind["Customcolor"] = 22] = "Customcolor"; - CompletionItemKind[CompletionItemKind["Folder"] = 23] = "Folder"; - CompletionItemKind[CompletionItemKind["TypeParameter"] = 24] = "TypeParameter"; - CompletionItemKind[CompletionItemKind["User"] = 25] = "User"; - CompletionItemKind[CompletionItemKind["Issue"] = 26] = "Issue"; - CompletionItemKind[CompletionItemKind["Snippet"] = 27] = "Snippet"; -})(CompletionItemKind || (CompletionItemKind = {})); -var CompletionItemTag; -(function (CompletionItemTag) { - CompletionItemTag[CompletionItemTag["Deprecated"] = 1] = "Deprecated"; -})(CompletionItemTag || (CompletionItemTag = {})); -/** - * How a suggest provider was triggered. - */ -var CompletionTriggerKind; -(function (CompletionTriggerKind) { - CompletionTriggerKind[CompletionTriggerKind["Invoke"] = 0] = "Invoke"; - CompletionTriggerKind[CompletionTriggerKind["TriggerCharacter"] = 1] = "TriggerCharacter"; - CompletionTriggerKind[CompletionTriggerKind["TriggerForIncompleteCompletions"] = 2] = "TriggerForIncompleteCompletions"; -})(CompletionTriggerKind || (CompletionTriggerKind = {})); -/** - * A positioning preference for rendering content widgets. - */ -var ContentWidgetPositionPreference; -(function (ContentWidgetPositionPreference) { - /** - * Place the content widget exactly at a position - */ - ContentWidgetPositionPreference[ContentWidgetPositionPreference["EXACT"] = 0] = "EXACT"; - /** - * Place the content widget above a position - */ - ContentWidgetPositionPreference[ContentWidgetPositionPreference["ABOVE"] = 1] = "ABOVE"; - /** - * Place the content widget below a position - */ - ContentWidgetPositionPreference[ContentWidgetPositionPreference["BELOW"] = 2] = "BELOW"; -})(ContentWidgetPositionPreference || (ContentWidgetPositionPreference = {})); -/** - * Describes the reason the cursor has changed its position. - */ -var CursorChangeReason; -(function (CursorChangeReason) { - /** - * Unknown or not set. - */ - CursorChangeReason[CursorChangeReason["NotSet"] = 0] = "NotSet"; - /** - * A `model.setValue()` was called. - */ - CursorChangeReason[CursorChangeReason["ContentFlush"] = 1] = "ContentFlush"; - /** - * The `model` has been changed outside of this cursor and the cursor recovers its position from associated markers. - */ - CursorChangeReason[CursorChangeReason["RecoverFromMarkers"] = 2] = "RecoverFromMarkers"; - /** - * There was an explicit user gesture. - */ - CursorChangeReason[CursorChangeReason["Explicit"] = 3] = "Explicit"; - /** - * There was a Paste. - */ - CursorChangeReason[CursorChangeReason["Paste"] = 4] = "Paste"; - /** - * There was an Undo. - */ - CursorChangeReason[CursorChangeReason["Undo"] = 5] = "Undo"; - /** - * There was a Redo. - */ - CursorChangeReason[CursorChangeReason["Redo"] = 6] = "Redo"; -})(CursorChangeReason || (CursorChangeReason = {})); -/** - * The default end of line to use when instantiating models. - */ -var DefaultEndOfLine; -(function (DefaultEndOfLine) { - /** - * Use line feed (\n) as the end of line character. - */ - DefaultEndOfLine[DefaultEndOfLine["LF"] = 1] = "LF"; - /** - * Use carriage return and line feed (\r\n) as the end of line character. - */ - DefaultEndOfLine[DefaultEndOfLine["CRLF"] = 2] = "CRLF"; -})(DefaultEndOfLine || (DefaultEndOfLine = {})); -/** - * A document highlight kind. - */ -var DocumentHighlightKind; -(function (DocumentHighlightKind) { - /** - * A textual occurrence. - */ - DocumentHighlightKind[DocumentHighlightKind["Text"] = 0] = "Text"; - /** - * Read-access of a symbol, like reading a variable. - */ - DocumentHighlightKind[DocumentHighlightKind["Read"] = 1] = "Read"; - /** - * Write-access of a symbol, like writing to a variable. - */ - DocumentHighlightKind[DocumentHighlightKind["Write"] = 2] = "Write"; -})(DocumentHighlightKind || (DocumentHighlightKind = {})); -/** - * Configuration options for auto indentation in the editor - */ -var EditorAutoIndentStrategy; -(function (EditorAutoIndentStrategy) { - EditorAutoIndentStrategy[EditorAutoIndentStrategy["None"] = 0] = "None"; - EditorAutoIndentStrategy[EditorAutoIndentStrategy["Keep"] = 1] = "Keep"; - EditorAutoIndentStrategy[EditorAutoIndentStrategy["Brackets"] = 2] = "Brackets"; - EditorAutoIndentStrategy[EditorAutoIndentStrategy["Advanced"] = 3] = "Advanced"; - EditorAutoIndentStrategy[EditorAutoIndentStrategy["Full"] = 4] = "Full"; -})(EditorAutoIndentStrategy || (EditorAutoIndentStrategy = {})); -var EditorOption; -(function (EditorOption) { - EditorOption[EditorOption["acceptSuggestionOnCommitCharacter"] = 0] = "acceptSuggestionOnCommitCharacter"; - EditorOption[EditorOption["acceptSuggestionOnEnter"] = 1] = "acceptSuggestionOnEnter"; - EditorOption[EditorOption["accessibilitySupport"] = 2] = "accessibilitySupport"; - EditorOption[EditorOption["accessibilityPageSize"] = 3] = "accessibilityPageSize"; - EditorOption[EditorOption["ariaLabel"] = 4] = "ariaLabel"; - EditorOption[EditorOption["autoClosingBrackets"] = 5] = "autoClosingBrackets"; - EditorOption[EditorOption["autoClosingDelete"] = 6] = "autoClosingDelete"; - EditorOption[EditorOption["autoClosingOvertype"] = 7] = "autoClosingOvertype"; - EditorOption[EditorOption["autoClosingQuotes"] = 8] = "autoClosingQuotes"; - EditorOption[EditorOption["autoIndent"] = 9] = "autoIndent"; - EditorOption[EditorOption["automaticLayout"] = 10] = "automaticLayout"; - EditorOption[EditorOption["autoSurround"] = 11] = "autoSurround"; - EditorOption[EditorOption["bracketPairColorization"] = 12] = "bracketPairColorization"; - EditorOption[EditorOption["guides"] = 13] = "guides"; - EditorOption[EditorOption["codeLens"] = 14] = "codeLens"; - EditorOption[EditorOption["codeLensFontFamily"] = 15] = "codeLensFontFamily"; - EditorOption[EditorOption["codeLensFontSize"] = 16] = "codeLensFontSize"; - EditorOption[EditorOption["colorDecorators"] = 17] = "colorDecorators"; - EditorOption[EditorOption["columnSelection"] = 18] = "columnSelection"; - EditorOption[EditorOption["comments"] = 19] = "comments"; - EditorOption[EditorOption["contextmenu"] = 20] = "contextmenu"; - EditorOption[EditorOption["copyWithSyntaxHighlighting"] = 21] = "copyWithSyntaxHighlighting"; - EditorOption[EditorOption["cursorBlinking"] = 22] = "cursorBlinking"; - EditorOption[EditorOption["cursorSmoothCaretAnimation"] = 23] = "cursorSmoothCaretAnimation"; - EditorOption[EditorOption["cursorStyle"] = 24] = "cursorStyle"; - EditorOption[EditorOption["cursorSurroundingLines"] = 25] = "cursorSurroundingLines"; - EditorOption[EditorOption["cursorSurroundingLinesStyle"] = 26] = "cursorSurroundingLinesStyle"; - EditorOption[EditorOption["cursorWidth"] = 27] = "cursorWidth"; - EditorOption[EditorOption["disableLayerHinting"] = 28] = "disableLayerHinting"; - EditorOption[EditorOption["disableMonospaceOptimizations"] = 29] = "disableMonospaceOptimizations"; - EditorOption[EditorOption["domReadOnly"] = 30] = "domReadOnly"; - EditorOption[EditorOption["dragAndDrop"] = 31] = "dragAndDrop"; - EditorOption[EditorOption["dropIntoEditor"] = 32] = "dropIntoEditor"; - EditorOption[EditorOption["emptySelectionClipboard"] = 33] = "emptySelectionClipboard"; - EditorOption[EditorOption["experimental"] = 34] = "experimental"; - EditorOption[EditorOption["extraEditorClassName"] = 35] = "extraEditorClassName"; - EditorOption[EditorOption["fastScrollSensitivity"] = 36] = "fastScrollSensitivity"; - EditorOption[EditorOption["find"] = 37] = "find"; - EditorOption[EditorOption["fixedOverflowWidgets"] = 38] = "fixedOverflowWidgets"; - EditorOption[EditorOption["folding"] = 39] = "folding"; - EditorOption[EditorOption["foldingStrategy"] = 40] = "foldingStrategy"; - EditorOption[EditorOption["foldingHighlight"] = 41] = "foldingHighlight"; - EditorOption[EditorOption["foldingImportsByDefault"] = 42] = "foldingImportsByDefault"; - EditorOption[EditorOption["foldingMaximumRegions"] = 43] = "foldingMaximumRegions"; - EditorOption[EditorOption["unfoldOnClickAfterEndOfLine"] = 44] = "unfoldOnClickAfterEndOfLine"; - EditorOption[EditorOption["fontFamily"] = 45] = "fontFamily"; - EditorOption[EditorOption["fontInfo"] = 46] = "fontInfo"; - EditorOption[EditorOption["fontLigatures"] = 47] = "fontLigatures"; - EditorOption[EditorOption["fontSize"] = 48] = "fontSize"; - EditorOption[EditorOption["fontWeight"] = 49] = "fontWeight"; - EditorOption[EditorOption["formatOnPaste"] = 50] = "formatOnPaste"; - EditorOption[EditorOption["formatOnType"] = 51] = "formatOnType"; - EditorOption[EditorOption["glyphMargin"] = 52] = "glyphMargin"; - EditorOption[EditorOption["gotoLocation"] = 53] = "gotoLocation"; - EditorOption[EditorOption["hideCursorInOverviewRuler"] = 54] = "hideCursorInOverviewRuler"; - EditorOption[EditorOption["hover"] = 55] = "hover"; - EditorOption[EditorOption["inDiffEditor"] = 56] = "inDiffEditor"; - EditorOption[EditorOption["inlineSuggest"] = 57] = "inlineSuggest"; - EditorOption[EditorOption["letterSpacing"] = 58] = "letterSpacing"; - EditorOption[EditorOption["lightbulb"] = 59] = "lightbulb"; - EditorOption[EditorOption["lineDecorationsWidth"] = 60] = "lineDecorationsWidth"; - EditorOption[EditorOption["lineHeight"] = 61] = "lineHeight"; - EditorOption[EditorOption["lineNumbers"] = 62] = "lineNumbers"; - EditorOption[EditorOption["lineNumbersMinChars"] = 63] = "lineNumbersMinChars"; - EditorOption[EditorOption["linkedEditing"] = 64] = "linkedEditing"; - EditorOption[EditorOption["links"] = 65] = "links"; - EditorOption[EditorOption["matchBrackets"] = 66] = "matchBrackets"; - EditorOption[EditorOption["minimap"] = 67] = "minimap"; - EditorOption[EditorOption["mouseStyle"] = 68] = "mouseStyle"; - EditorOption[EditorOption["mouseWheelScrollSensitivity"] = 69] = "mouseWheelScrollSensitivity"; - EditorOption[EditorOption["mouseWheelZoom"] = 70] = "mouseWheelZoom"; - EditorOption[EditorOption["multiCursorMergeOverlapping"] = 71] = "multiCursorMergeOverlapping"; - EditorOption[EditorOption["multiCursorModifier"] = 72] = "multiCursorModifier"; - EditorOption[EditorOption["multiCursorPaste"] = 73] = "multiCursorPaste"; - EditorOption[EditorOption["occurrencesHighlight"] = 74] = "occurrencesHighlight"; - EditorOption[EditorOption["overviewRulerBorder"] = 75] = "overviewRulerBorder"; - EditorOption[EditorOption["overviewRulerLanes"] = 76] = "overviewRulerLanes"; - EditorOption[EditorOption["padding"] = 77] = "padding"; - EditorOption[EditorOption["parameterHints"] = 78] = "parameterHints"; - EditorOption[EditorOption["peekWidgetDefaultFocus"] = 79] = "peekWidgetDefaultFocus"; - EditorOption[EditorOption["definitionLinkOpensInPeek"] = 80] = "definitionLinkOpensInPeek"; - EditorOption[EditorOption["quickSuggestions"] = 81] = "quickSuggestions"; - EditorOption[EditorOption["quickSuggestionsDelay"] = 82] = "quickSuggestionsDelay"; - EditorOption[EditorOption["readOnly"] = 83] = "readOnly"; - EditorOption[EditorOption["renameOnType"] = 84] = "renameOnType"; - EditorOption[EditorOption["renderControlCharacters"] = 85] = "renderControlCharacters"; - EditorOption[EditorOption["renderFinalNewline"] = 86] = "renderFinalNewline"; - EditorOption[EditorOption["renderLineHighlight"] = 87] = "renderLineHighlight"; - EditorOption[EditorOption["renderLineHighlightOnlyWhenFocus"] = 88] = "renderLineHighlightOnlyWhenFocus"; - EditorOption[EditorOption["renderValidationDecorations"] = 89] = "renderValidationDecorations"; - EditorOption[EditorOption["renderWhitespace"] = 90] = "renderWhitespace"; - EditorOption[EditorOption["revealHorizontalRightPadding"] = 91] = "revealHorizontalRightPadding"; - EditorOption[EditorOption["roundedSelection"] = 92] = "roundedSelection"; - EditorOption[EditorOption["rulers"] = 93] = "rulers"; - EditorOption[EditorOption["scrollbar"] = 94] = "scrollbar"; - EditorOption[EditorOption["scrollBeyondLastColumn"] = 95] = "scrollBeyondLastColumn"; - EditorOption[EditorOption["scrollBeyondLastLine"] = 96] = "scrollBeyondLastLine"; - EditorOption[EditorOption["scrollPredominantAxis"] = 97] = "scrollPredominantAxis"; - EditorOption[EditorOption["selectionClipboard"] = 98] = "selectionClipboard"; - EditorOption[EditorOption["selectionHighlight"] = 99] = "selectionHighlight"; - EditorOption[EditorOption["selectOnLineNumbers"] = 100] = "selectOnLineNumbers"; - EditorOption[EditorOption["showFoldingControls"] = 101] = "showFoldingControls"; - EditorOption[EditorOption["showUnused"] = 102] = "showUnused"; - EditorOption[EditorOption["snippetSuggestions"] = 103] = "snippetSuggestions"; - EditorOption[EditorOption["smartSelect"] = 104] = "smartSelect"; - EditorOption[EditorOption["smoothScrolling"] = 105] = "smoothScrolling"; - EditorOption[EditorOption["stickyTabStops"] = 106] = "stickyTabStops"; - EditorOption[EditorOption["stopRenderingLineAfter"] = 107] = "stopRenderingLineAfter"; - EditorOption[EditorOption["suggest"] = 108] = "suggest"; - EditorOption[EditorOption["suggestFontSize"] = 109] = "suggestFontSize"; - EditorOption[EditorOption["suggestLineHeight"] = 110] = "suggestLineHeight"; - EditorOption[EditorOption["suggestOnTriggerCharacters"] = 111] = "suggestOnTriggerCharacters"; - EditorOption[EditorOption["suggestSelection"] = 112] = "suggestSelection"; - EditorOption[EditorOption["tabCompletion"] = 113] = "tabCompletion"; - EditorOption[EditorOption["tabIndex"] = 114] = "tabIndex"; - EditorOption[EditorOption["unicodeHighlighting"] = 115] = "unicodeHighlighting"; - EditorOption[EditorOption["unusualLineTerminators"] = 116] = "unusualLineTerminators"; - EditorOption[EditorOption["useShadowDOM"] = 117] = "useShadowDOM"; - EditorOption[EditorOption["useTabStops"] = 118] = "useTabStops"; - EditorOption[EditorOption["wordSeparators"] = 119] = "wordSeparators"; - EditorOption[EditorOption["wordWrap"] = 120] = "wordWrap"; - EditorOption[EditorOption["wordWrapBreakAfterCharacters"] = 121] = "wordWrapBreakAfterCharacters"; - EditorOption[EditorOption["wordWrapBreakBeforeCharacters"] = 122] = "wordWrapBreakBeforeCharacters"; - EditorOption[EditorOption["wordWrapColumn"] = 123] = "wordWrapColumn"; - EditorOption[EditorOption["wordWrapOverride1"] = 124] = "wordWrapOverride1"; - EditorOption[EditorOption["wordWrapOverride2"] = 125] = "wordWrapOverride2"; - EditorOption[EditorOption["wrappingIndent"] = 126] = "wrappingIndent"; - EditorOption[EditorOption["wrappingStrategy"] = 127] = "wrappingStrategy"; - EditorOption[EditorOption["showDeprecated"] = 128] = "showDeprecated"; - EditorOption[EditorOption["inlayHints"] = 129] = "inlayHints"; - EditorOption[EditorOption["editorClassName"] = 130] = "editorClassName"; - EditorOption[EditorOption["pixelRatio"] = 131] = "pixelRatio"; - EditorOption[EditorOption["tabFocusMode"] = 132] = "tabFocusMode"; - EditorOption[EditorOption["layoutInfo"] = 133] = "layoutInfo"; - EditorOption[EditorOption["wrappingInfo"] = 134] = "wrappingInfo"; -})(EditorOption || (EditorOption = {})); -/** - * End of line character preference. - */ -var EndOfLinePreference; -(function (EndOfLinePreference) { - /** - * Use the end of line character identified in the text buffer. - */ - EndOfLinePreference[EndOfLinePreference["TextDefined"] = 0] = "TextDefined"; - /** - * Use line feed (\n) as the end of line character. - */ - EndOfLinePreference[EndOfLinePreference["LF"] = 1] = "LF"; - /** - * Use carriage return and line feed (\r\n) as the end of line character. - */ - EndOfLinePreference[EndOfLinePreference["CRLF"] = 2] = "CRLF"; -})(EndOfLinePreference || (EndOfLinePreference = {})); -/** - * End of line character preference. - */ -var EndOfLineSequence; -(function (EndOfLineSequence) { - /** - * Use line feed (\n) as the end of line character. - */ - EndOfLineSequence[EndOfLineSequence["LF"] = 0] = "LF"; - /** - * Use carriage return and line feed (\r\n) as the end of line character. - */ - EndOfLineSequence[EndOfLineSequence["CRLF"] = 1] = "CRLF"; -})(EndOfLineSequence || (EndOfLineSequence = {})); -/** - * Describes what to do with the indentation when pressing Enter. - */ -var IndentAction; -(function (IndentAction) { - /** - * Insert new line and copy the previous line's indentation. - */ - IndentAction[IndentAction["None"] = 0] = "None"; - /** - * Insert new line and indent once (relative to the previous line's indentation). - */ - IndentAction[IndentAction["Indent"] = 1] = "Indent"; - /** - * Insert two new lines: - * - the first one indented which will hold the cursor - * - the second one at the same indentation level - */ - IndentAction[IndentAction["IndentOutdent"] = 2] = "IndentOutdent"; - /** - * Insert new line and outdent once (relative to the previous line's indentation). - */ - IndentAction[IndentAction["Outdent"] = 3] = "Outdent"; -})(IndentAction || (IndentAction = {})); -var InjectedTextCursorStops; -(function (InjectedTextCursorStops) { - InjectedTextCursorStops[InjectedTextCursorStops["Both"] = 0] = "Both"; - InjectedTextCursorStops[InjectedTextCursorStops["Right"] = 1] = "Right"; - InjectedTextCursorStops[InjectedTextCursorStops["Left"] = 2] = "Left"; - InjectedTextCursorStops[InjectedTextCursorStops["None"] = 3] = "None"; -})(InjectedTextCursorStops || (InjectedTextCursorStops = {})); -var InlayHintKind; -(function (InlayHintKind) { - InlayHintKind[InlayHintKind["Type"] = 1] = "Type"; - InlayHintKind[InlayHintKind["Parameter"] = 2] = "Parameter"; -})(InlayHintKind || (InlayHintKind = {})); -/** - * How an {@link InlineCompletionsProvider inline completion provider} was triggered. - */ -var InlineCompletionTriggerKind; -(function (InlineCompletionTriggerKind) { - /** - * Completion was triggered automatically while editing. - * It is sufficient to return a single completion item in this case. - */ - InlineCompletionTriggerKind[InlineCompletionTriggerKind["Automatic"] = 0] = "Automatic"; - /** - * Completion was triggered explicitly by a user gesture. - * Return multiple completion items to enable cycling through them. - */ - InlineCompletionTriggerKind[InlineCompletionTriggerKind["Explicit"] = 1] = "Explicit"; -})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {})); -/** - * Virtual Key Codes, the value does not hold any inherent meaning. - * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx - * But these are "more general", as they should work across browsers & OS`s. - */ -var KeyCode; -(function (KeyCode) { - KeyCode[KeyCode["DependsOnKbLayout"] = -1] = "DependsOnKbLayout"; - /** - * Placed first to cover the 0 value of the enum. - */ - KeyCode[KeyCode["Unknown"] = 0] = "Unknown"; - KeyCode[KeyCode["Backspace"] = 1] = "Backspace"; - KeyCode[KeyCode["Tab"] = 2] = "Tab"; - KeyCode[KeyCode["Enter"] = 3] = "Enter"; - KeyCode[KeyCode["Shift"] = 4] = "Shift"; - KeyCode[KeyCode["Ctrl"] = 5] = "Ctrl"; - KeyCode[KeyCode["Alt"] = 6] = "Alt"; - KeyCode[KeyCode["PauseBreak"] = 7] = "PauseBreak"; - KeyCode[KeyCode["CapsLock"] = 8] = "CapsLock"; - KeyCode[KeyCode["Escape"] = 9] = "Escape"; - KeyCode[KeyCode["Space"] = 10] = "Space"; - KeyCode[KeyCode["PageUp"] = 11] = "PageUp"; - KeyCode[KeyCode["PageDown"] = 12] = "PageDown"; - KeyCode[KeyCode["End"] = 13] = "End"; - KeyCode[KeyCode["Home"] = 14] = "Home"; - KeyCode[KeyCode["LeftArrow"] = 15] = "LeftArrow"; - KeyCode[KeyCode["UpArrow"] = 16] = "UpArrow"; - KeyCode[KeyCode["RightArrow"] = 17] = "RightArrow"; - KeyCode[KeyCode["DownArrow"] = 18] = "DownArrow"; - KeyCode[KeyCode["Insert"] = 19] = "Insert"; - KeyCode[KeyCode["Delete"] = 20] = "Delete"; - KeyCode[KeyCode["Digit0"] = 21] = "Digit0"; - KeyCode[KeyCode["Digit1"] = 22] = "Digit1"; - KeyCode[KeyCode["Digit2"] = 23] = "Digit2"; - KeyCode[KeyCode["Digit3"] = 24] = "Digit3"; - KeyCode[KeyCode["Digit4"] = 25] = "Digit4"; - KeyCode[KeyCode["Digit5"] = 26] = "Digit5"; - KeyCode[KeyCode["Digit6"] = 27] = "Digit6"; - KeyCode[KeyCode["Digit7"] = 28] = "Digit7"; - KeyCode[KeyCode["Digit8"] = 29] = "Digit8"; - KeyCode[KeyCode["Digit9"] = 30] = "Digit9"; - KeyCode[KeyCode["KeyA"] = 31] = "KeyA"; - KeyCode[KeyCode["KeyB"] = 32] = "KeyB"; - KeyCode[KeyCode["KeyC"] = 33] = "KeyC"; - KeyCode[KeyCode["KeyD"] = 34] = "KeyD"; - KeyCode[KeyCode["KeyE"] = 35] = "KeyE"; - KeyCode[KeyCode["KeyF"] = 36] = "KeyF"; - KeyCode[KeyCode["KeyG"] = 37] = "KeyG"; - KeyCode[KeyCode["KeyH"] = 38] = "KeyH"; - KeyCode[KeyCode["KeyI"] = 39] = "KeyI"; - KeyCode[KeyCode["KeyJ"] = 40] = "KeyJ"; - KeyCode[KeyCode["KeyK"] = 41] = "KeyK"; - KeyCode[KeyCode["KeyL"] = 42] = "KeyL"; - KeyCode[KeyCode["KeyM"] = 43] = "KeyM"; - KeyCode[KeyCode["KeyN"] = 44] = "KeyN"; - KeyCode[KeyCode["KeyO"] = 45] = "KeyO"; - KeyCode[KeyCode["KeyP"] = 46] = "KeyP"; - KeyCode[KeyCode["KeyQ"] = 47] = "KeyQ"; - KeyCode[KeyCode["KeyR"] = 48] = "KeyR"; - KeyCode[KeyCode["KeyS"] = 49] = "KeyS"; - KeyCode[KeyCode["KeyT"] = 50] = "KeyT"; - KeyCode[KeyCode["KeyU"] = 51] = "KeyU"; - KeyCode[KeyCode["KeyV"] = 52] = "KeyV"; - KeyCode[KeyCode["KeyW"] = 53] = "KeyW"; - KeyCode[KeyCode["KeyX"] = 54] = "KeyX"; - KeyCode[KeyCode["KeyY"] = 55] = "KeyY"; - KeyCode[KeyCode["KeyZ"] = 56] = "KeyZ"; - KeyCode[KeyCode["Meta"] = 57] = "Meta"; - KeyCode[KeyCode["ContextMenu"] = 58] = "ContextMenu"; - KeyCode[KeyCode["F1"] = 59] = "F1"; - KeyCode[KeyCode["F2"] = 60] = "F2"; - KeyCode[KeyCode["F3"] = 61] = "F3"; - KeyCode[KeyCode["F4"] = 62] = "F4"; - KeyCode[KeyCode["F5"] = 63] = "F5"; - KeyCode[KeyCode["F6"] = 64] = "F6"; - KeyCode[KeyCode["F7"] = 65] = "F7"; - KeyCode[KeyCode["F8"] = 66] = "F8"; - KeyCode[KeyCode["F9"] = 67] = "F9"; - KeyCode[KeyCode["F10"] = 68] = "F10"; - KeyCode[KeyCode["F11"] = 69] = "F11"; - KeyCode[KeyCode["F12"] = 70] = "F12"; - KeyCode[KeyCode["F13"] = 71] = "F13"; - KeyCode[KeyCode["F14"] = 72] = "F14"; - KeyCode[KeyCode["F15"] = 73] = "F15"; - KeyCode[KeyCode["F16"] = 74] = "F16"; - KeyCode[KeyCode["F17"] = 75] = "F17"; - KeyCode[KeyCode["F18"] = 76] = "F18"; - KeyCode[KeyCode["F19"] = 77] = "F19"; - KeyCode[KeyCode["NumLock"] = 78] = "NumLock"; - KeyCode[KeyCode["ScrollLock"] = 79] = "ScrollLock"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the ';:' key - */ - KeyCode[KeyCode["Semicolon"] = 80] = "Semicolon"; - /** - * For any country/region, the '+' key - * For the US standard keyboard, the '=+' key - */ - KeyCode[KeyCode["Equal"] = 81] = "Equal"; - /** - * For any country/region, the ',' key - * For the US standard keyboard, the ',<' key - */ - KeyCode[KeyCode["Comma"] = 82] = "Comma"; - /** - * For any country/region, the '-' key - * For the US standard keyboard, the '-_' key - */ - KeyCode[KeyCode["Minus"] = 83] = "Minus"; - /** - * For any country/region, the '.' key - * For the US standard keyboard, the '.>' key - */ - KeyCode[KeyCode["Period"] = 84] = "Period"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the '/?' key - */ - KeyCode[KeyCode["Slash"] = 85] = "Slash"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the '`~' key - */ - KeyCode[KeyCode["Backquote"] = 86] = "Backquote"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the '[{' key - */ - KeyCode[KeyCode["BracketLeft"] = 87] = "BracketLeft"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the '\|' key - */ - KeyCode[KeyCode["Backslash"] = 88] = "Backslash"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the ']}' key - */ - KeyCode[KeyCode["BracketRight"] = 89] = "BracketRight"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - * For the US standard keyboard, the ''"' key - */ - KeyCode[KeyCode["Quote"] = 90] = "Quote"; - /** - * Used for miscellaneous characters; it can vary by keyboard. - */ - KeyCode[KeyCode["OEM_8"] = 91] = "OEM_8"; - /** - * Either the angle bracket key or the backslash key on the RT 102-key keyboard. - */ - KeyCode[KeyCode["IntlBackslash"] = 92] = "IntlBackslash"; - KeyCode[KeyCode["Numpad0"] = 93] = "Numpad0"; - KeyCode[KeyCode["Numpad1"] = 94] = "Numpad1"; - KeyCode[KeyCode["Numpad2"] = 95] = "Numpad2"; - KeyCode[KeyCode["Numpad3"] = 96] = "Numpad3"; - KeyCode[KeyCode["Numpad4"] = 97] = "Numpad4"; - KeyCode[KeyCode["Numpad5"] = 98] = "Numpad5"; - KeyCode[KeyCode["Numpad6"] = 99] = "Numpad6"; - KeyCode[KeyCode["Numpad7"] = 100] = "Numpad7"; - KeyCode[KeyCode["Numpad8"] = 101] = "Numpad8"; - KeyCode[KeyCode["Numpad9"] = 102] = "Numpad9"; - KeyCode[KeyCode["NumpadMultiply"] = 103] = "NumpadMultiply"; - KeyCode[KeyCode["NumpadAdd"] = 104] = "NumpadAdd"; - KeyCode[KeyCode["NUMPAD_SEPARATOR"] = 105] = "NUMPAD_SEPARATOR"; - KeyCode[KeyCode["NumpadSubtract"] = 106] = "NumpadSubtract"; - KeyCode[KeyCode["NumpadDecimal"] = 107] = "NumpadDecimal"; - KeyCode[KeyCode["NumpadDivide"] = 108] = "NumpadDivide"; - /** - * Cover all key codes when IME is processing input. - */ - KeyCode[KeyCode["KEY_IN_COMPOSITION"] = 109] = "KEY_IN_COMPOSITION"; - KeyCode[KeyCode["ABNT_C1"] = 110] = "ABNT_C1"; - KeyCode[KeyCode["ABNT_C2"] = 111] = "ABNT_C2"; - KeyCode[KeyCode["AudioVolumeMute"] = 112] = "AudioVolumeMute"; - KeyCode[KeyCode["AudioVolumeUp"] = 113] = "AudioVolumeUp"; - KeyCode[KeyCode["AudioVolumeDown"] = 114] = "AudioVolumeDown"; - KeyCode[KeyCode["BrowserSearch"] = 115] = "BrowserSearch"; - KeyCode[KeyCode["BrowserHome"] = 116] = "BrowserHome"; - KeyCode[KeyCode["BrowserBack"] = 117] = "BrowserBack"; - KeyCode[KeyCode["BrowserForward"] = 118] = "BrowserForward"; - KeyCode[KeyCode["MediaTrackNext"] = 119] = "MediaTrackNext"; - KeyCode[KeyCode["MediaTrackPrevious"] = 120] = "MediaTrackPrevious"; - KeyCode[KeyCode["MediaStop"] = 121] = "MediaStop"; - KeyCode[KeyCode["MediaPlayPause"] = 122] = "MediaPlayPause"; - KeyCode[KeyCode["LaunchMediaPlayer"] = 123] = "LaunchMediaPlayer"; - KeyCode[KeyCode["LaunchMail"] = 124] = "LaunchMail"; - KeyCode[KeyCode["LaunchApp2"] = 125] = "LaunchApp2"; - /** - * VK_CLEAR, 0x0C, CLEAR key - */ - KeyCode[KeyCode["Clear"] = 126] = "Clear"; - /** - * Placed last to cover the length of the enum. - * Please do not depend on this value! - */ - KeyCode[KeyCode["MAX_VALUE"] = 127] = "MAX_VALUE"; -})(KeyCode || (KeyCode = {})); -var MarkerSeverity; -(function (MarkerSeverity) { - MarkerSeverity[MarkerSeverity["Hint"] = 1] = "Hint"; - MarkerSeverity[MarkerSeverity["Info"] = 2] = "Info"; - MarkerSeverity[MarkerSeverity["Warning"] = 4] = "Warning"; - MarkerSeverity[MarkerSeverity["Error"] = 8] = "Error"; -})(MarkerSeverity || (MarkerSeverity = {})); -var MarkerTag; -(function (MarkerTag) { - MarkerTag[MarkerTag["Unnecessary"] = 1] = "Unnecessary"; - MarkerTag[MarkerTag["Deprecated"] = 2] = "Deprecated"; -})(MarkerTag || (MarkerTag = {})); -/** - * Position in the minimap to render the decoration. - */ -var MinimapPosition; -(function (MinimapPosition) { - MinimapPosition[MinimapPosition["Inline"] = 1] = "Inline"; - MinimapPosition[MinimapPosition["Gutter"] = 2] = "Gutter"; -})(MinimapPosition || (MinimapPosition = {})); -/** - * Type of hit element with the mouse in the editor. - */ -var MouseTargetType; -(function (MouseTargetType) { - /** - * Mouse is on top of an unknown element. - */ - MouseTargetType[MouseTargetType["UNKNOWN"] = 0] = "UNKNOWN"; - /** - * Mouse is on top of the textarea used for input. - */ - MouseTargetType[MouseTargetType["TEXTAREA"] = 1] = "TEXTAREA"; - /** - * Mouse is on top of the glyph margin - */ - MouseTargetType[MouseTargetType["GUTTER_GLYPH_MARGIN"] = 2] = "GUTTER_GLYPH_MARGIN"; - /** - * Mouse is on top of the line numbers - */ - MouseTargetType[MouseTargetType["GUTTER_LINE_NUMBERS"] = 3] = "GUTTER_LINE_NUMBERS"; - /** - * Mouse is on top of the line decorations - */ - MouseTargetType[MouseTargetType["GUTTER_LINE_DECORATIONS"] = 4] = "GUTTER_LINE_DECORATIONS"; - /** - * Mouse is on top of the whitespace left in the gutter by a view zone. - */ - MouseTargetType[MouseTargetType["GUTTER_VIEW_ZONE"] = 5] = "GUTTER_VIEW_ZONE"; - /** - * Mouse is on top of text in the content. - */ - MouseTargetType[MouseTargetType["CONTENT_TEXT"] = 6] = "CONTENT_TEXT"; - /** - * Mouse is on top of empty space in the content (e.g. after line text or below last line) - */ - MouseTargetType[MouseTargetType["CONTENT_EMPTY"] = 7] = "CONTENT_EMPTY"; - /** - * Mouse is on top of a view zone in the content. - */ - MouseTargetType[MouseTargetType["CONTENT_VIEW_ZONE"] = 8] = "CONTENT_VIEW_ZONE"; - /** - * Mouse is on top of a content widget. - */ - MouseTargetType[MouseTargetType["CONTENT_WIDGET"] = 9] = "CONTENT_WIDGET"; - /** - * Mouse is on top of the decorations overview ruler. - */ - MouseTargetType[MouseTargetType["OVERVIEW_RULER"] = 10] = "OVERVIEW_RULER"; - /** - * Mouse is on top of a scrollbar. - */ - MouseTargetType[MouseTargetType["SCROLLBAR"] = 11] = "SCROLLBAR"; - /** - * Mouse is on top of an overlay widget. - */ - MouseTargetType[MouseTargetType["OVERLAY_WIDGET"] = 12] = "OVERLAY_WIDGET"; - /** - * Mouse is outside of the editor. - */ - MouseTargetType[MouseTargetType["OUTSIDE_EDITOR"] = 13] = "OUTSIDE_EDITOR"; -})(MouseTargetType || (MouseTargetType = {})); -/** - * A positioning preference for rendering overlay widgets. - */ -var OverlayWidgetPositionPreference; -(function (OverlayWidgetPositionPreference) { - /** - * Position the overlay widget in the top right corner - */ - OverlayWidgetPositionPreference[OverlayWidgetPositionPreference["TOP_RIGHT_CORNER"] = 0] = "TOP_RIGHT_CORNER"; - /** - * Position the overlay widget in the bottom right corner - */ - OverlayWidgetPositionPreference[OverlayWidgetPositionPreference["BOTTOM_RIGHT_CORNER"] = 1] = "BOTTOM_RIGHT_CORNER"; - /** - * Position the overlay widget in the top center - */ - OverlayWidgetPositionPreference[OverlayWidgetPositionPreference["TOP_CENTER"] = 2] = "TOP_CENTER"; -})(OverlayWidgetPositionPreference || (OverlayWidgetPositionPreference = {})); -/** - * Vertical Lane in the overview ruler of the editor. - */ -var OverviewRulerLane; -(function (OverviewRulerLane) { - OverviewRulerLane[OverviewRulerLane["Left"] = 1] = "Left"; - OverviewRulerLane[OverviewRulerLane["Center"] = 2] = "Center"; - OverviewRulerLane[OverviewRulerLane["Right"] = 4] = "Right"; - OverviewRulerLane[OverviewRulerLane["Full"] = 7] = "Full"; -})(OverviewRulerLane || (OverviewRulerLane = {})); -var PositionAffinity; -(function (PositionAffinity) { - /** - * Prefers the left most position. - */ - PositionAffinity[PositionAffinity["Left"] = 0] = "Left"; - /** - * Prefers the right most position. - */ - PositionAffinity[PositionAffinity["Right"] = 1] = "Right"; - /** - * No preference. - */ - PositionAffinity[PositionAffinity["None"] = 2] = "None"; - /** - * If the given position is on injected text, prefers the position left of it. - */ - PositionAffinity[PositionAffinity["LeftOfInjectedText"] = 3] = "LeftOfInjectedText"; - /** - * If the given position is on injected text, prefers the position right of it. - */ - PositionAffinity[PositionAffinity["RightOfInjectedText"] = 4] = "RightOfInjectedText"; -})(PositionAffinity || (PositionAffinity = {})); -var RenderLineNumbersType; -(function (RenderLineNumbersType) { - RenderLineNumbersType[RenderLineNumbersType["Off"] = 0] = "Off"; - RenderLineNumbersType[RenderLineNumbersType["On"] = 1] = "On"; - RenderLineNumbersType[RenderLineNumbersType["Relative"] = 2] = "Relative"; - RenderLineNumbersType[RenderLineNumbersType["Interval"] = 3] = "Interval"; - RenderLineNumbersType[RenderLineNumbersType["Custom"] = 4] = "Custom"; -})(RenderLineNumbersType || (RenderLineNumbersType = {})); -var RenderMinimap; -(function (RenderMinimap) { - RenderMinimap[RenderMinimap["None"] = 0] = "None"; - RenderMinimap[RenderMinimap["Text"] = 1] = "Text"; - RenderMinimap[RenderMinimap["Blocks"] = 2] = "Blocks"; -})(RenderMinimap || (RenderMinimap = {})); -var ScrollType; -(function (ScrollType) { - ScrollType[ScrollType["Smooth"] = 0] = "Smooth"; - ScrollType[ScrollType["Immediate"] = 1] = "Immediate"; -})(ScrollType || (ScrollType = {})); -var ScrollbarVisibility; -(function (ScrollbarVisibility) { - ScrollbarVisibility[ScrollbarVisibility["Auto"] = 1] = "Auto"; - ScrollbarVisibility[ScrollbarVisibility["Hidden"] = 2] = "Hidden"; - ScrollbarVisibility[ScrollbarVisibility["Visible"] = 3] = "Visible"; -})(ScrollbarVisibility || (ScrollbarVisibility = {})); -/** - * The direction of a selection. - */ -var SelectionDirection; -(function (SelectionDirection) { - /** - * The selection starts above where it ends. - */ - SelectionDirection[SelectionDirection["LTR"] = 0] = "LTR"; - /** - * The selection starts below where it ends. - */ - SelectionDirection[SelectionDirection["RTL"] = 1] = "RTL"; -})(SelectionDirection || (SelectionDirection = {})); -var SignatureHelpTriggerKind; -(function (SignatureHelpTriggerKind) { - SignatureHelpTriggerKind[SignatureHelpTriggerKind["Invoke"] = 1] = "Invoke"; - SignatureHelpTriggerKind[SignatureHelpTriggerKind["TriggerCharacter"] = 2] = "TriggerCharacter"; - SignatureHelpTriggerKind[SignatureHelpTriggerKind["ContentChange"] = 3] = "ContentChange"; -})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {})); -/** - * A symbol kind. - */ -var SymbolKind; -(function (SymbolKind) { - SymbolKind[SymbolKind["File"] = 0] = "File"; - SymbolKind[SymbolKind["Module"] = 1] = "Module"; - SymbolKind[SymbolKind["Namespace"] = 2] = "Namespace"; - SymbolKind[SymbolKind["Package"] = 3] = "Package"; - SymbolKind[SymbolKind["Class"] = 4] = "Class"; - SymbolKind[SymbolKind["Method"] = 5] = "Method"; - SymbolKind[SymbolKind["Property"] = 6] = "Property"; - SymbolKind[SymbolKind["Field"] = 7] = "Field"; - SymbolKind[SymbolKind["Constructor"] = 8] = "Constructor"; - SymbolKind[SymbolKind["Enum"] = 9] = "Enum"; - SymbolKind[SymbolKind["Interface"] = 10] = "Interface"; - SymbolKind[SymbolKind["Function"] = 11] = "Function"; - SymbolKind[SymbolKind["Variable"] = 12] = "Variable"; - SymbolKind[SymbolKind["Constant"] = 13] = "Constant"; - SymbolKind[SymbolKind["String"] = 14] = "String"; - SymbolKind[SymbolKind["Number"] = 15] = "Number"; - SymbolKind[SymbolKind["Boolean"] = 16] = "Boolean"; - SymbolKind[SymbolKind["Array"] = 17] = "Array"; - SymbolKind[SymbolKind["Object"] = 18] = "Object"; - SymbolKind[SymbolKind["Key"] = 19] = "Key"; - SymbolKind[SymbolKind["Null"] = 20] = "Null"; - SymbolKind[SymbolKind["EnumMember"] = 21] = "EnumMember"; - SymbolKind[SymbolKind["Struct"] = 22] = "Struct"; - SymbolKind[SymbolKind["Event"] = 23] = "Event"; - SymbolKind[SymbolKind["Operator"] = 24] = "Operator"; - SymbolKind[SymbolKind["TypeParameter"] = 25] = "TypeParameter"; -})(SymbolKind || (SymbolKind = {})); -var SymbolTag; -(function (SymbolTag) { - SymbolTag[SymbolTag["Deprecated"] = 1] = "Deprecated"; -})(SymbolTag || (SymbolTag = {})); -/** - * The kind of animation in which the editor's cursor should be rendered. - */ -var TextEditorCursorBlinkingStyle; -(function (TextEditorCursorBlinkingStyle) { - /** - * Hidden - */ - TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle["Hidden"] = 0] = "Hidden"; - /** - * Blinking - */ - TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle["Blink"] = 1] = "Blink"; - /** - * Blinking with smooth fading - */ - TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle["Smooth"] = 2] = "Smooth"; - /** - * Blinking with prolonged filled state and smooth fading - */ - TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle["Phase"] = 3] = "Phase"; - /** - * Expand collapse animation on the y axis - */ - TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle["Expand"] = 4] = "Expand"; - /** - * No-Blinking - */ - TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle["Solid"] = 5] = "Solid"; -})(TextEditorCursorBlinkingStyle || (TextEditorCursorBlinkingStyle = {})); -/** - * The style in which the editor's cursor should be rendered. - */ -var TextEditorCursorStyle; -(function (TextEditorCursorStyle) { - /** - * As a vertical line (sitting between two characters). - */ - TextEditorCursorStyle[TextEditorCursorStyle["Line"] = 1] = "Line"; - /** - * As a block (sitting on top of a character). - */ - TextEditorCursorStyle[TextEditorCursorStyle["Block"] = 2] = "Block"; - /** - * As a horizontal line (sitting under a character). - */ - TextEditorCursorStyle[TextEditorCursorStyle["Underline"] = 3] = "Underline"; - /** - * As a thin vertical line (sitting between two characters). - */ - TextEditorCursorStyle[TextEditorCursorStyle["LineThin"] = 4] = "LineThin"; - /** - * As an outlined block (sitting on top of a character). - */ - TextEditorCursorStyle[TextEditorCursorStyle["BlockOutline"] = 5] = "BlockOutline"; - /** - * As a thin horizontal line (sitting under a character). - */ - TextEditorCursorStyle[TextEditorCursorStyle["UnderlineThin"] = 6] = "UnderlineThin"; -})(TextEditorCursorStyle || (TextEditorCursorStyle = {})); -/** - * Describes the behavior of decorations when typing/editing near their edges. - * Note: Please do not edit the values, as they very carefully match `DecorationRangeBehavior` - */ -var TrackedRangeStickiness; -(function (TrackedRangeStickiness) { - TrackedRangeStickiness[TrackedRangeStickiness["AlwaysGrowsWhenTypingAtEdges"] = 0] = "AlwaysGrowsWhenTypingAtEdges"; - TrackedRangeStickiness[TrackedRangeStickiness["NeverGrowsWhenTypingAtEdges"] = 1] = "NeverGrowsWhenTypingAtEdges"; - TrackedRangeStickiness[TrackedRangeStickiness["GrowsOnlyWhenTypingBefore"] = 2] = "GrowsOnlyWhenTypingBefore"; - TrackedRangeStickiness[TrackedRangeStickiness["GrowsOnlyWhenTypingAfter"] = 3] = "GrowsOnlyWhenTypingAfter"; -})(TrackedRangeStickiness || (TrackedRangeStickiness = {})); -/** - * Describes how to indent wrapped lines. - */ -var WrappingIndent; -(function (WrappingIndent) { - /** - * No indentation => wrapped lines begin at column 1. - */ - WrappingIndent[WrappingIndent["None"] = 0] = "None"; - /** - * Same => wrapped lines get the same indentation as the parent. - */ - WrappingIndent[WrappingIndent["Same"] = 1] = "Same"; - /** - * Indent => wrapped lines get +1 indentation toward the parent. - */ - WrappingIndent[WrappingIndent["Indent"] = 2] = "Indent"; - /** - * DeepIndent => wrapped lines get +2 indentation toward the parent. - */ - WrappingIndent[WrappingIndent["DeepIndent"] = 3] = "DeepIndent"; -})(WrappingIndent || (WrappingIndent = {})); - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js ***! - \*********************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TokenizationRegistry: () => (/* binding */ TokenizationRegistry) -/* harmony export */ }); -/* harmony import */ var _base_common_event_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base/common/event.js */ "./node_modules/monaco-editor/esm/vs/base/common/event.js"); -/* harmony import */ var _base_common_lifecycle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../base/common/lifecycle.js */ "./node_modules/monaco-editor/esm/vs/base/common/lifecycle.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - - -class TokenizationRegistry { - constructor() { - this._map = new Map(); - this._factories = new Map(); - this._onDidChange = new _base_common_event_js__WEBPACK_IMPORTED_MODULE_0__.Emitter(); - this.onDidChange = this._onDidChange.event; - this._colorMap = null; - } - fire(languages) { - this._onDidChange.fire({ - changedLanguages: languages, - changedColorMap: false - }); - } - register(language, support) { - this._map.set(language, support); - this.fire([language]); - return (0,_base_common_lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.toDisposable)(() => { - if (this._map.get(language) !== support) { - return; - } - this._map.delete(language); - this.fire([language]); - }); - } - registerFactory(languageId, factory) { - var _a; - (_a = this._factories.get(languageId)) === null || _a === void 0 ? void 0 : _a.dispose(); - const myData = new TokenizationSupportFactoryData(this, languageId, factory); - this._factories.set(languageId, myData); - return (0,_base_common_lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.toDisposable)(() => { - const v = this._factories.get(languageId); - if (!v || v !== myData) { - return; - } - this._factories.delete(languageId); - v.dispose(); - }); - } - getOrCreate(languageId) { - return __awaiter(this, void 0, void 0, function* () { - // check first if the support is already set - const tokenizationSupport = this.get(languageId); - if (tokenizationSupport) { - return tokenizationSupport; - } - const factory = this._factories.get(languageId); - if (!factory || factory.isResolved) { - // no factory or factory.resolve already finished - return null; - } - yield factory.resolve(); - return this.get(languageId); - }); - } - get(language) { - return (this._map.get(language) || null); - } - isResolved(languageId) { - const tokenizationSupport = this.get(languageId); - if (tokenizationSupport) { - return true; - } - const factory = this._factories.get(languageId); - if (!factory || factory.isResolved) { - return true; - } - return false; - } - setColorMap(colorMap) { - this._colorMap = colorMap; - this._onDidChange.fire({ - changedLanguages: Array.from(this._map.keys()), - changedColorMap: true - }); - } - getColorMap() { - return this._colorMap; - } - getDefaultBackground() { - if (this._colorMap && this._colorMap.length > 2 /* ColorId.DefaultBackground */) { - return this._colorMap[2 /* ColorId.DefaultBackground */]; - } - return null; - } -} -class TokenizationSupportFactoryData extends _base_common_lifecycle_js__WEBPACK_IMPORTED_MODULE_1__.Disposable { - constructor(_registry, _languageId, _factory) { - super(); - this._registry = _registry; - this._languageId = _languageId; - this._factory = _factory; - this._isDisposed = false; - this._resolvePromise = null; - this._isResolved = false; - } - get isResolved() { - return this._isResolved; - } - dispose() { - this._isDisposed = true; - super.dispose(); - } - resolve() { - return __awaiter(this, void 0, void 0, function* () { - if (!this._resolvePromise) { - this._resolvePromise = this._create(); - } - return this._resolvePromise; - }); - } - _create() { - return __awaiter(this, void 0, void 0, function* () { - const value = yield Promise.resolve(this._factory.createTokenizationSupport()); - this._isResolved = true; - if (value && !this._isDisposed) { - this._register(this._registry.register(this._languageId, value)); - } - }); - } -} - - -/***/ }), - -/***/ "./node_modules/monaco-editor/esm/vs/nls.js": -/*!**************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/nls.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ create: () => (/* binding */ create), -/* harmony export */ getConfiguredDefaultLocale: () => (/* binding */ getConfiguredDefaultLocale), -/* harmony export */ load: () => (/* binding */ load), -/* harmony export */ localize: () => (/* binding */ localize), -/* harmony export */ setPseudoTranslation: () => (/* binding */ setPseudoTranslation) -/* harmony export */ }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -let isPseudo = (typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0); -const DEFAULT_TAG = 'i-default'; -function _format(message, args) { - let result; - if (args.length === 0) { - result = message; - } - else { - result = message.replace(/\{(\d+)\}/g, (match, rest) => { - const index = rest[0]; - const arg = args[index]; - let result = match; - if (typeof arg === 'string') { - result = arg; - } - else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) { - result = String(arg); - } - return result; - }); - } - if (isPseudo) { - // FF3B and FF3D is the Unicode zenkaku representation for [ and ] - result = '\uFF3B' + result.replace(/[aouei]/g, '$&$&') + '\uFF3D'; - } - return result; -} -function findLanguageForModule(config, name) { - let result = config[name]; - if (result) { - return result; - } - result = config['*']; - if (result) { - return result; - } - return null; -} -function endWithSlash(path) { - if (path.charAt(path.length - 1) === '/') { - return path; - } - return path + '/'; -} -function getMessagesFromTranslationsService(translationServiceUrl, language, name) { - return __awaiter(this, void 0, void 0, function* () { - const url = endWithSlash(translationServiceUrl) + endWithSlash(language) + 'vscode/' + endWithSlash(name); - const res = yield fetch(url); - if (res.ok) { - const messages = yield res.json(); - return messages; - } - throw new Error(`${res.status} - ${res.statusText}`); - }); -} -function createScopedLocalize(scope) { - return function (idx, defaultValue) { - const restArgs = Array.prototype.slice.call(arguments, 2); - return _format(scope[idx], restArgs); - }; -} -function localize(data, message, ...args) { - return _format(message, args); -} -function getConfiguredDefaultLocale(_) { - // This returns undefined because this implementation isn't used and is overwritten by the loader - // when loaded. - return undefined; -} -function setPseudoTranslation(value) { - isPseudo = value; -} -/** - * Invoked in a built product at run-time - */ -function create(key, data) { - var _a; - return { - localize: createScopedLocalize(data[key]), - getConfiguredDefaultLocale: (_a = data.getConfiguredDefaultLocale) !== null && _a !== void 0 ? _a : ((_) => undefined) - }; -} -/** - * Invoked by the loader at run-time - */ -function load(name, req, load, config) { - var _a; - const pluginConfig = (_a = config['vs/nls']) !== null && _a !== void 0 ? _a : {}; - if (!name || name.length === 0) { - return load({ - localize: localize, - getConfiguredDefaultLocale: () => { var _a; return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']; } - }); - } - const language = pluginConfig.availableLanguages ? findLanguageForModule(pluginConfig.availableLanguages, name) : null; - const useDefaultLanguage = language === null || language === DEFAULT_TAG; - let suffix = '.nls'; - if (!useDefaultLanguage) { - suffix = suffix + '.' + language; - } - const messagesLoaded = (messages) => { - if (Array.isArray(messages)) { - messages.localize = createScopedLocalize(messages); - } - else { - messages.localize = createScopedLocalize(messages[name]); - } - messages.getConfiguredDefaultLocale = () => { var _a; return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']; }; - load(messages); - }; - if (typeof pluginConfig.loadBundle === 'function') { - pluginConfig.loadBundle(name, language, (err, messages) => { - // We have an error. Load the English default strings to not fail - if (err) { - req([name + '.nls'], messagesLoaded); - } - else { - messagesLoaded(messages); - } - }); - } - else if (pluginConfig.translationServiceUrl && !useDefaultLanguage) { - (() => __awaiter(this, void 0, void 0, function* () { - var _b; - try { - const messages = yield getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, language, name); - return messagesLoaded(messages); - } - catch (err) { - // Language is already as generic as it gets, so require default messages - if (!language.includes('-')) { - console.error(err); - return req([name + '.nls'], messagesLoaded); - } - try { - // Since there is a dash, the language configured is a specific sub-language of the same generic language. - // Since we were unable to load the specific language, try to load the generic language. Ex. we failed to find a - // Swiss German (de-CH), so try to load the generic German (de) messages instead. - const genericLanguage = language.split('-')[0]; - const messages = yield getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, genericLanguage, name); - // We got some messages, so we configure the configuration to use the generic language for this session. - (_b = pluginConfig.availableLanguages) !== null && _b !== void 0 ? _b : (pluginConfig.availableLanguages = {}); - pluginConfig.availableLanguages['*'] = genericLanguage; - return messagesLoaded(messages); - } - catch (err) { - console.error(err); - return req([name + '.nls'], messagesLoaded); - } - } - }))(); - } - else { - req([name + suffix], messagesLoaded, (err) => { - if (suffix === '.nls') { - console.error('Failed trying to load default language strings', err); - return; - } - console.error(`Failed to load message bundle for language ${language}. Falling back to the default language:`, err); - req([name + '.nls'], messagesLoaded); - }); - } -} - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!*******************************************************************!*\ - !*** ./node_modules/monaco-editor/esm/vs/editor/editor.worker.js ***! - \*******************************************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ initialize: () => (/* binding */ initialize) -/* harmony export */ }); -/* harmony import */ var _base_common_worker_simpleWorker_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../base/common/worker/simpleWorker.js */ "./node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js"); -/* harmony import */ var _common_services_editorSimpleWorker_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common/services/editorSimpleWorker.js */ "./node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js"); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - -let initialized = false; -function initialize(foreignModule) { - if (initialized) { - return; - } - initialized = true; - const simpleWorker = new _base_common_worker_simpleWorker_js__WEBPACK_IMPORTED_MODULE_0__.SimpleWorkerServer((msg) => { - self.postMessage(msg); - }, (host) => new _common_services_editorSimpleWorker_js__WEBPACK_IMPORTED_MODULE_1__.EditorSimpleWorker(host, foreignModule)); - self.onmessage = (e) => { - simpleWorker.onmessage(e.data); - }; -} -self.onmessage = (e) => { - // Ignore first message in this case and initialize if not yet initialized - if (!initialized) { - initialize(null); - } -}; - -})(); - -/******/ })() -; -//# sourceMappingURL=editor.worker.js.map \ No newline at end of file diff --git a/dist/editor.worker.js.map b/dist/editor.worker.js.map deleted file mode 100644 index 21723298..00000000 --- a/dist/editor.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"editor.worker.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,qCAAqC,eAAe;AACpD;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AAChC;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kCAAkC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iCAAiC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC3aA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACvCA;AACA;AACA;AACA;AAC4C;AAC5C;AACA;AACA,aAAa,YAAY;AACzB,CAAC;AACM;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,4CAAK;AACtC,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,8CAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC7GA;AACA;AACO;AACP;AACA;AACA;AACA,qEAAqE,aAAa;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,4BAA4B;AAC5B,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yBAAyB;AAC5D;AACA;AACA;AACA,+CAA+C,yBAAyB;AACxE,gDAAgD,yBAAyB;AACzE,qCAAqC,yBAAyB;AAC9D,kDAAkD,yBAAyB;AAC3E,8CAA8C,yBAAyB;AACvE,kDAAkD,yBAAyB;AAC3E,2DAA2D,yBAAyB;AACpF,8EAA8E,yBAAyB;AACvG,kDAAkD,yBAAyB;AAC3E,6CAA6C,yBAAyB;AACtE,mCAAmC,yBAAyB;AAC5D,0CAA0C,yBAAyB;AACnE,gDAAgD,yBAAyB;AACzE,yCAAyC,yBAAyB;AAClE,sDAAsD,yBAAyB;AAC/E,wDAAwD,yBAAyB;AACjF,sDAAsD,yBAAyB;AAC/E,gDAAgD,yBAAyB;AACzE,6DAA6D,yBAAyB;AACtF,6DAA6D,yBAAyB;AACtF,wDAAwD,yBAAyB;AACjF,yCAAyC,yBAAyB;AAClE,sDAAsD,yBAAyB;AAC/E,qCAAqC,yBAAyB;AAC9D,4CAA4C,yBAAyB;AACrE,kDAAkD,yBAAyB;AAC3E,gDAAgD,yBAAyB;AACzE,2CAA2C,yBAAyB;AACpE,kDAAkD,yBAAyB;AAC3E,uCAAuC,yBAAyB;AAChE,2CAA2C,yBAAyB;AACpE,yCAAyC,yBAAyB;AAClE,kDAAkD,yBAAyB;AAC3E,0CAA0C,yBAAyB;AACnE,4CAA4C,yBAAyB;AACrE,wCAAwC,yBAAyB;AACjE,0CAA0C,yBAAyB;AACnE,mCAAmC,yBAAyB;AAC5D,kDAAkD,yBAAyB;AAC3E,8CAA8C,yBAAyB;AACvE,sDAAsD,yBAAyB;AAC/E,sDAAsD,yBAAyB;AAC/E,kDAAkD,yBAAyB;AAC3E,4DAA4D,yBAAyB;AACrF,6EAA6E,yBAAyB;AACtG,gDAAgD,yBAAyB;AACzE,4DAA4D,yBAAyB;AACrF,qCAAqC,yBAAyB;AAC9D,yCAAyC,yBAAyB;AAClE,qCAAqC,yBAAyB;AAC9D,oDAAoD,yBAAyB;AAC7E,oDAAoD,yBAAyB;AAC7E,2DAA2D,yBAAyB;AACpF,qCAAqC,yBAAyB;AAC9D,wDAAwD,yBAAyB;AACjF,uCAAuC,yBAAyB;AAChE,oDAAoD,yBAAyB;AAC7E,+BAA+B,yBAAyB;AACxD,8CAA8C,yBAAyB;AACvE,qCAAqC,yBAAyB;AAC9D,uCAAuC,yBAAyB;AAChE,4DAA4D,yBAAyB;AACrF,yCAAyC,yBAAyB;AAClE,iDAAiD,yBAAyB;AAC1E,iCAAiC,yBAAyB;AAC1D,wDAAwD,yBAAyB;AACjF,qCAAqC,yBAAyB;AAC9D,8CAA8C,yBAAyB;AACvE,qCAAqC,yBAAyB;AAC9D,6CAA6C,yBAAyB;AACtE,4DAA4D,yBAAyB;AACrF,gDAAgD,yBAAyB;AACzE,uCAAuC,yBAAyB;AAChE,qDAAqD,yBAAyB;AAC9E,kEAAkE,yBAAyB;AAC3F,oEAAoE,yBAAyB;AAC7F,4CAA4C,yBAAyB;AACrE,4CAA4C,yBAAyB;AACrE,gDAAgD,yBAAyB;AACzE,qEAAqE,yBAAyB;AAC9F,uCAAuC,yBAAyB;AAChE,6CAA6C,yBAAyB;AACtE,2CAA2C,yBAAyB;AACpE,uCAAuC,yBAAyB;AAChE,yCAAyC,yBAAyB;AAClE,wDAAwD,yBAAyB;AACjF,sDAAsD,yBAAyB;AAC/E,kDAAkD,yBAAyB;AAC3E,kDAAkD,yBAAyB;AAC3E,yCAAyC,yBAAyB;AAClE,6CAA6C,yBAAyB;AACtE,2CAA2C,yBAAyB;AACpE,qCAAqC,yBAAyB;AAC9D,mCAAmC,yBAAyB;AAC5D,oDAAoD,yBAAyB;AAC7E,uCAAuC,yBAAyB;AAChE,qCAAqC,yBAAyB;AAC9D,6CAA6C,yBAAyB;AACtE,0DAA0D,yBAAyB;AACnF,uCAAuC,yBAAyB;AAChE,oDAAoD,yBAAyB;AAC7E,sDAAsD,yBAAyB;AAC/E,wDAAwD,yBAAyB;AACjF,4DAA4D,yBAAyB;AACrF,sDAAsD,yBAAyB;AAC/E,sDAAsD,yBAAyB;AAC/E,0DAA0D,yBAAyB;AACnF,gEAAgE,yBAAyB;AACzF,wDAAwD,yBAAyB;AACjF,kDAAkD,yBAAyB;AAC3E,wDAAwD,yBAAyB;AACjF,sDAAsD,yBAAyB;AAC/E,4DAA4D,yBAAyB;AACrF,sDAAsD,yBAAyB;AAC/E,4DAA4D,yBAAyB;AACrF,qEAAqE,yBAAyB;AAC9F,gDAAgD,yBAAyB;AACzE,kDAAkD,yBAAyB;AAC3E,4DAA4D,yBAAyB;AACrF,+CAA+C,yBAAyB;AACxE,kDAAkD,yBAAyB;AAC3E,oDAAoD,yBAAyB;AAC7E,oDAAoD,yBAAyB;AAC7E,kDAAkD,yBAAyB;AAC3E,oEAAoE,yBAAyB;AAC7F,2CAA2C,yBAAyB;AACpE,gDAAgD,yBAAyB;AACzE,gDAAgD,yBAAyB;AACzE,gDAAgD,yBAAyB;AACzE,kDAAkD,yBAAyB;AAC3E,2DAA2D,yBAAyB;AACpF,2DAA2D,yBAAyB;AACpF,6DAA6D,yBAAyB;AACtF,uDAAuD,yBAAyB;AAChF,4CAA4C,yBAAyB;AACrE,qCAAqC,yBAAyB;AAC9D,qCAAqC,yBAAyB;AAC9D,qCAAqC,yBAAyB;AAC9D,6CAA6C,yBAAyB;AACtE,wGAAwG,yBAAyB;AACjI,mFAAmF,yBAAyB;AAC5G,oGAAoG,yBAAyB;AAC7H,0FAA0F,yBAAyB;AACnH,qEAAqE,yBAAyB;AAC9F,sFAAsF,yBAAyB;AAC/G,wFAAwF,yBAAyB;AACjH,mEAAmE,yBAAyB;AAC5F,oFAAoF,yBAAyB;AAC7G,+CAA+C,yBAAyB;AACxE,+CAA+C,yBAAyB;AACxE,2CAA2C,yBAAyB;AACpE,mCAAmC,yBAAyB;AAC5D,6CAA6C,yBAAyB;AACtE,wDAAwD,yBAAyB;AACjF,uCAAuC,yBAAyB;AAChE,+CAA+C,yBAAyB;AACxE,oDAAoD,yBAAyB;AAC7E;AACA,oDAAoD,yBAAyB;AAC7E,sDAAsD,yBAAyB;AAC/E,gDAAgD,yBAAyB;AACzE,oDAAoD,yBAAyB;AAC7E,0DAA0D,yBAAyB;AACnF,0DAA0D,yBAAyB;AACnF,wDAAwD,yBAAyB;AACjF,wDAAwD,yBAAyB;AACjF,iFAAiF,yBAAyB;AAC1G,oDAAoD,yBAAyB;AAC7E,sDAAsD,yBAAyB;AAC/E,8CAA8C,yBAAyB;AACvE,yCAAyC,yBAAyB;AAClE,8CAA8C,yBAAyB;AACvE,wDAAwD,yBAAyB;AACjF,oDAAoD,yBAAyB;AAC7E,qCAAqC,yBAAyB;AAC9D,oDAAoD,yBAAyB;AAC7E,gDAAgD,yBAAyB;AACzE,gEAAgE,yBAAyB;AACzF,0DAA0D,yBAAyB;AACnF,kDAAkD,yBAAyB;AAC3E,qCAAqC,yBAAyB;AAC9D,+CAA+C,yBAAyB;AACxE,6CAA6C,yBAAyB;AACtE,wDAAwD,yBAAyB;AACjF,4DAA4D,yBAAyB;AACrF,kDAAkD,yBAAyB;AAC3E,sDAAsD,yBAAyB;AAC/E,kDAAkD,yBAAyB;AAC3E,yDAAyD,yBAAyB;AAClF,uDAAuD,yBAAyB;AAChF,yDAAyD,yBAAyB;AAClF,gDAAgD,yBAAyB;AACzE,uCAAuC,yBAAyB;AAChE,iEAAiE,yBAAyB;AAC1F,sDAAsD,yBAAyB;AAC/E,sDAAsD,yBAAyB;AAC/E,gDAAgD,yBAAyB;AACzE,oDAAoD,yBAAyB;AAC7E,sDAAsD,yBAAyB;AAC/E,oDAAoD,yBAAyB;AAC7E,oDAAoD,yBAAyB;AAC7E,qCAAqC,yBAAyB;AAC9D,2CAA2C,yBAAyB;AACpE,sDAAsD,yBAAyB;AAC/E,oDAAoD,yBAAyB;AAC7E,2CAA2C,yBAAyB;AACpE,iDAAiD,yBAAyB;AAC1E,gDAAgD,yBAAyB;AACzE,kDAAkD,yBAAyB;AAC3E,8CAA8C,yBAAyB;AACvE,gDAAgD,yBAAyB;AACzE,4CAA4C,yBAAyB;AACrE,wDAAwD,yBAAyB;AACjF,uEAAuE,yBAAyB;AAChG,6DAA6D,yBAAyB;AACtF,4CAA4C,yBAAyB;AACrE,uCAAuC,yBAAyB;AAChE,yCAAyC,yBAAyB;AAClE,uCAAuC,yBAAyB;AAChE,8CAA8C,yBAAyB;AACvE,0CAA0C,yBAAyB;AACnE,qCAAqC,yBAAyB;AAC9D,sDAAsD,yBAAyB;AAC/E,sDAAsD,yBAAyB;AAC/E,qCAAqC,yBAAyB;AAC9D,qCAAqC,yBAAyB;AAC9D,kDAAkD,yBAAyB;AAC3E,qCAAqC,yBAAyB;AAC9D,gDAAgD,yBAAyB;AACzE,kDAAkD,yBAAyB;AAC3E,8CAA8C,yBAAyB;AACvE,sDAAsD,yBAAyB;AAC/E,gDAAgD,yBAAyB;AACzE,uCAAuC,yBAAyB;AAChE,2CAA2C,yBAAyB;AACpE,uCAAuC,yBAAyB;AAChE,2CAA2C,yBAAyB;AACpE,uCAAuC,yBAAyB;AAChE,qCAAqC,yBAAyB;AAC9D,0DAA0D,yBAAyB;AACnF,uCAAuC,yBAAyB;AAChE,uCAAuC,yBAAyB;AAChE,oDAAoD,yBAAyB;AAC7E,wDAAwD,yBAAyB;AACjF,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,qCAAqC,yBAAyB;AAC9D,wDAAwD,yBAAyB;AACjF,mCAAmC,yBAAyB;AAC5D,mCAAmC,yBAAyB;AAC5D,8DAA8D,yBAAyB;AACvF,sDAAsD,yBAAyB;AAC/E,qCAAqC,yBAAyB;AAC9D,oDAAoD,yBAAyB;AAC7E,wDAAwD,yBAAyB;AACjF,gDAAgD,yBAAyB;AACzE,2CAA2C,yBAAyB;AACpE,6CAA6C,yBAAyB;AACtE,8CAA8C,yBAAyB;AACvE,qCAAqC,yBAAyB;AAC9D,6CAA6C,yBAAyB;AACtE,+CAA+C,yBAAyB;AACxE,2CAA2C,yBAAyB;AACpE,+CAA+C,yBAAyB;AACxE,oDAAoD,yBAAyB;AAC7E,qCAAqC,yBAAyB;AAC9D,4DAA4D,yBAAyB;AACrF,qCAAqC,yBAAyB;AAC9D,gDAAgD,yBAAyB;AACzE,qCAAqC,yBAAyB;AAC9D,6CAA6C,yBAAyB;AACtE,oDAAoD,yBAAyB;AAC7E,4CAA4C,yBAAyB;AACrE,6CAA6C,yBAAyB;AACtE,mCAAmC,yBAAyB;AAC5D,qCAAqC,yBAAyB;AAC9D,mCAAmC,yBAAyB;AAC5D,qCAAqC,yBAAyB;AAC9D,sDAAsD,yBAAyB;AAC/E,2CAA2C,yBAAyB;AACpE,2CAA2C,yBAAyB;AACpE,uCAAuC,yBAAyB;AAChE,6CAA6C,yBAAyB;AACtE,uCAAuC,yBAAyB;AAChE,kDAAkD,yBAAyB;AAC3E,+CAA+C,yBAAyB;AACxE,iDAAiD,yBAAyB;AAC1E,2CAA2C,yBAAyB;AACpE,uCAAuC,yBAAyB;AAChE,0DAA0D,yBAAyB;AACnF,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,kDAAkD,yBAAyB;AAC3E,2CAA2C,yBAAyB;AACpE,gDAAgD,yBAAyB;AACzE,yDAAyD,yBAAyB;AAClF,8CAA8C,yBAAyB;AACvE,8CAA8C,yBAAyB;AACvE,yCAAyC,yBAAyB;AAClE,0DAA0D,yBAAyB;AACnF,yCAAyC,yBAAyB;AAClE,+DAA+D,yBAAyB;AACxF,kDAAkD,yBAAyB;AAC3E,mCAAmC,yBAAyB;AAC5D,qCAAqC,yBAAyB;AAC9D,4CAA4C,yBAAyB;AACrE,0CAA0C,yBAAyB;AACnE,qCAAqC,yBAAyB;AAC9D,kDAAkD,yBAAyB;AAC3E,sDAAsD,yBAAyB;AAC/E,kDAAkD,yBAAyB;AAC3E,yCAAyC,yBAAyB;AAClE,sDAAsD,yBAAyB;AAC/E,6CAA6C,yBAAyB;AACtE,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,0DAA0D,yBAAyB;AACnF,4DAA4D,yBAAyB;AACrF,wDAAwD,yBAAyB;AACjF,6CAA6C,yBAAyB;AACtE,8CAA8C,yBAAyB;AACvE,8CAA8C,yBAAyB;AACvE,oDAAoD,yBAAyB;AAC7E,oDAAoD,yBAAyB;AAC7E,gEAAgE,yBAAyB;AACzF,0DAA0D,yBAAyB;AACnF,+DAA+D,yBAAyB;AACxF,oDAAoD,yBAAyB;AAC7E,kDAAkD,yBAAyB;AAC3E,4DAA4D,yBAAyB;AACrF,wDAAwD,yBAAyB;AACjF,kDAAkD,yBAAyB;AAC3E,0DAA0D,yBAAyB;AACnF,0DAA0D,yBAAyB;AACnF,yCAAyC,yBAAyB;AAClE,4DAA4D,yBAAyB;AACrF,wDAAwD,yBAAyB;AACjF,6CAA6C,yBAAyB;AACtE,+CAA+C,yBAAyB;AACxE,8CAA8C,yBAAyB;AACvE,gDAAgD,yBAAyB;AACzE,iDAAiD,yBAAyB;AAC1E,6CAA6C,yBAAyB;AACtE,uCAAuC,yBAAyB;AAChE,sDAAsD,yBAAyB;AAC/E,sDAAsD,yBAAyB;AAC/E,wDAAwD,yBAAyB;AACjF,kDAAkD,yBAAyB;AAC3E,2CAA2C,yBAAyB;AACpE,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,iDAAiD,yBAAyB;AAC1E,6CAA6C,yBAAyB;AACtE,6CAA6C,yBAAyB;AACtE,8CAA8C,yBAAyB;AACvE,gDAAgD,yBAAyB;AACzE,gDAAgD,yBAAyB;AACzE,uCAAuC,yBAAyB;AAChE,iDAAiD,yBAAyB;AAC1E,gDAAgD,yBAAyB;AACzE,yCAAyC,yBAAyB;AAClE,8CAA8C,yBAAyB;AACvE,0CAA0C,yBAAyB;AACnE,4CAA4C,yBAAyB;AACrE,kDAAkD,yBAAyB;AAC3E,8CAA8C,yBAAyB;AACvE,wDAAwD,yBAAyB;AACjF,+CAA+C,yBAAyB;AACxE,8CAA8C,yBAAyB;AACvE,kGAAkG,yBAAyB;AAC3H,6EAA6E,yBAAyB;AACtG,8FAA8F,yBAAyB;AACvH,yEAAyE,yBAAyB;AAClG,iEAAiE,yBAAyB;AAC1F;AACA,4DAA4D,yBAAyB;AACrF,2EAA2E,yBAAyB;AACpG,mFAAmF,yBAAyB;AAC5G,sDAAsD,yBAAyB;AAC/E,uEAAuE,yBAAyB;AAChG,yDAAyD,yBAAyB;AAClF,iEAAiE,yBAAyB;AAC1F,sDAAsD,yBAAyB;AAC/E,sDAAsD,yBAAyB;AAC/E,qCAAqC,yBAAyB;AAC9D,gDAAgD,yBAAyB;AACzE,6CAA6C,yBAAyB;AACtE,4DAA4D,yBAAyB;AACrF,gEAAgE,yBAAyB;AACzF,2CAA2C,yBAAyB;AACpE,4CAA4C,yBAAyB;AACrE,sDAAsD,yBAAyB;AAC/E,2CAA2C,yBAAyB;AACpE,yCAAyC,yBAAyB;AAClE,0CAA0C,yBAAyB;AACnE,oDAAoD,yBAAyB;AAC7E,yCAAyC,yBAAyB;AAClE,0DAA0D,yBAAyB;AACnF,8CAA8C,yBAAyB;AACvE,wDAAwD,yBAAyB;AACjF,gEAAgE,yBAAyB;AACzF,qCAAqC,yBAAyB;AAC9D,kDAAkD,yBAAyB;AAC3E,kDAAkD,yBAAyB;AAC3E,yCAAyC,yBAAyB;AAClE,yDAAyD,yBAAyB;AAClF,gDAAgD,yBAAyB;AACzE,uCAAuC,yBAAyB;AAChE,uCAAuC,yBAAyB;AAChE,6CAA6C,yBAAyB;AACtE,gDAAgD,yBAAyB;AACzE,yCAAyC,yBAAyB;AAClE,6CAA6C,yBAAyB;AACtE,qCAAqC,yBAAyB;AAC9D,8CAA8C,yBAAyB;AACvE,oDAAoD,yBAAyB;AAC7E,kDAAkD,yBAAyB;AAC3E,iEAAiE,yBAAyB;AAC1F,mEAAmE,yBAAyB;AAC5F,2CAA2C,yBAAyB;AACpE,yCAAyC,yBAAyB;AAClE,uCAAuC,yBAAyB;AAChE,wDAAwD,yBAAyB;AACjF,wDAAwD,yBAAyB;AACjF,+DAA+D,yBAAyB;AACxF,mEAAmE,yBAAyB;AAC5F,wEAAwE,yBAAyB;AACjG,8CAA8C,yBAAyB;AACvE,8CAA8C,yBAAyB;AACvE,8DAA8D,yBAAyB;AACvF,kDAAkD,yBAAyB;AAC3E,8DAA8D,yBAAyB;AACvF,kEAAkE,yBAAyB;AAC3F,sEAAsE,yBAAyB;AAC/F,oDAAoD,yBAAyB;AAC7E,0DAA0D,yBAAyB;AACnF,wDAAwD,yBAAyB;AACjF,kEAAkE,yBAAyB;AAC3F,sDAAsD,yBAAyB;AAC/E,0DAA0D,yBAAyB;AACnF,sDAAsD,yBAAyB;AAC/E,gDAAgD,yBAAyB;AACzE,qCAAqC,yBAAyB;AAC9D,gDAAgD,yBAAyB;AACzE,sDAAsD,yBAAyB;AAC/E,qCAAqC,yBAAyB;AAC9D,8DAA8D,yBAAyB;AACvF,2CAA2C,yBAAyB;AACpE,yCAAyC,yBAAyB;AAClE,gDAAgD,yBAAyB;AACzE,sDAAsD,yBAAyB;AAC/E,2CAA2C,yBAAyB;AACpE,kDAAkD,yBAAyB;AAC3E,wDAAwD,yBAAyB;AACjF,uCAAuC,yBAAyB;AAChE,kDAAkD,yBAAyB;AAC3E,wEAAwE,yBAAyB;AACjG,sEAAsE,yBAAyB;AAC/F,8CAA8C,yBAAyB;AACvE,wDAAwD,yBAAyB;AACjF,gDAAgD,yBAAyB;AACzE,wDAAwD,yBAAyB;AACjF,mEAAmE,yBAAyB;AAC5F,kDAAkD,yBAAyB;AAC3E,gDAAgD,yBAAyB;AACzE,sDAAsD,yBAAyB;AAC/E,8CAA8C,yBAAyB;AACvE;AACA,kDAAkD,yBAAyB;AAC3E,sDAAsD,yBAAyB;AAC/E,gDAAgD,yBAAyB;AACzE,oDAAoD,yBAAyB;AAC7E,0DAA0D,yBAAyB;AACnF,2CAA2C,yBAAyB;AACpE,yCAAyC,yBAAyB;AAClE,yEAAyE,yBAAyB;AAClG,2EAA2E,yBAAyB;AACpG,6DAA6D,yBAAyB;AACtF,iEAAiE,yBAAyB;AAC1F,mEAAmE,yBAAyB;AAC5F,+DAA+D,yBAAyB;AACxF,oDAAoD,yBAAyB;AAC7E,iEAAiE,yBAAyB;AAC1F,mEAAmE,yBAAyB;AAC5F,4DAA4D,yBAAyB;AACrF,wDAAwD,yBAAyB;AACjF,0DAA0D,yBAAyB;AACnF,0EAA0E,yBAAyB;AACnG,2DAA2D,yBAAyB;AACpF,wEAAwE,yBAAyB;AACjG,yCAAyC,yBAAyB;AAClE,yCAAyC,yBAAyB;AAClE,oDAAoD,yBAAyB;AAC7E,kDAAkD,yBAAyB;AAC3E,6DAA6D,yBAAyB;AACtF,6DAA6D,yBAAyB;AACtF,+DAA+D,yBAAyB;AACxF,yDAAyD,yBAAyB;AAClF,oDAAoD,yBAAyB;AAC7E,mCAAmC,yBAAyB;AAC5D,gDAAgD,yBAAyB;AACzE,oDAAoD,yBAAyB;AAC7E,gDAAgD,yBAAyB;AACzE,uDAAuD,yBAAyB;AAChF,gEAAgE,yBAAyB;AACzF,oFAAoF,yBAAyB;AAC7G,iFAAiF,yBAAyB;AAC1G;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,2CAA2C,2BAA2B,IAAI,+BAA+B;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;;;;;;;;;;;;;;;;;;;;;ACvlB3B;AACA;AACA;AACA;AAC6C;AACL;AACjC;AACP;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,sDAAU;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,SAAS;AAC5D,4BAA4B,oDAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sDAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sDAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sDAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sDAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sDAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,4CAA4C;AACjF;AACA;AACA;AACA;AACA;AACA,sDAAsD,gCAAgC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sDAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,gCAAgC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD,wCAAwC,iBAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,sDAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACl4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mDAAmD;AACvE;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA,8CAA8C,KAAK;AACnD;AACA;AACA;AACA;AACA;AACO;AACP;AACA,2CAA2C,KAAK;AAChD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;ACrJgD;AAC+D;AAClE;AACF;AAC3C;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACO;AACP;AACA,uBAAuB,qDAAU;AACjC;AACA;AACA,oBAAoB,uCAAuC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF,SAAS,6BAA6B;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,iEAAkB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0DAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0CAA0C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0CAA0C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0DAAe;AACvC;AACA;AACA;AACA;AACA,eAAe,2DAAY;AAC3B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sBAAsB;AACvB;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK,GAAG,yBAAyB;AACzD;AACA;AACA,8BAA8B,oDAAS;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,WAAW,gBAAgB,mBAAmB,cAAc,qBAAqB,oBAAoB,gCAAgC,iBAAiB,sBAAsB;AACjN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,UAAU,6CAA6C,eAAe,6CAA6C,SAAS;AACzJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yDAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E,mEAAmE,KAAK,GAAG;AAC3E;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,sDAAU;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,2CAA2C,0DAAe;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,0BAA0B,sDAAU;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,sDAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,+BAA+B,sDAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,IAAI;AACJ;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,kCAAkC,qDAAU;AAC5C;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACpwBA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,iEAAiE;AACjE;AACA;AACA;AACA;AACO;AACP;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wDAAuB;AACvC;AACA;AACA,wBAAwB,uDAAsB;AAC9C;AACA,oCAAoC,yDAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uDAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;;;;;;;;;;;;;;;ACjQ7D;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,WAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB,oBAAoB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;;;;;;;;;;;;;;;;;;;;ACnK7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP,gBAAgB,mCAAmC;AACnD;AACA;AACA,gBAAgB,kCAAkC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,sBAAsB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,SAAS,mBAAmB,YAAY;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACM;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;AAC9B;AACP;AACA;AACA;;;;;;;;;;;;;;;ACnXA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxCA;AACA;AACA;AACA;AACuC;AACE;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA,uEAAuE,kBAAkB;AACzF;AACA;AACA;AACO;AACP;AACA;AACO;AACP,QAAQ,kDAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA,iBAAiB,oDAAI;AACrB;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,eAAe;AACjD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC3HA;AACA;AACA;AACA;AACgF;AACzE;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,uDAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,QAAQ,4DAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kDAAO;AACf;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mDAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,SAAS,mDAAQ;AACjB;AACA;AACA,QAAQ,mDAAQ;AAChB;AACA;AACA;AACA,wBAAwB,mDAAQ,sBAAsB,mDAAQ;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACxC,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,8BAA8B;AAC9B,qBAAqB;AACrB,+BAA+B;AAC/B,gCAAgC;AAChC,uBAAuB;AACvB,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK,IAAI,MAAM,EAAE,YAAY,UAAU,SAAS;AAC1E,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,UAAU;AACzD;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU,EAAE,6BAA6B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,sBAAsB,EAAE,qBAAqB;AACxD;AACA;AACA;AACA,wCAAwC,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE,KAAK;AAC3E;AACO;AACP;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4CAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4CAAW,KAAK,eAAe,MAAM,4CAAW;AACvE;AACA;AACA;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,UAAU,IAAI,oBAAoB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oBAAoB,IAAI,aAAa;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,eAAe,IAAI,aAAa;AAC/C,eAAe,eAAe,EAAE,aAAa;AAC7C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,UAAU,IAAI,iBAAiB;AACzE;AACA;AACA;AACA,4CAA4C,UAAU,IAAI,oBAAoB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,KAAK;AAC1C;AACA,+BAA+B,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE,KAAK;AACpE,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,IAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,yBAAyB;AACvD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,IAAI,EAAE,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,sBAAsB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAa;AAC1C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,aAAa;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,YAAY;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,YAAY;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iBAAiB;AACjB;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,8CAA8C,8BAA8B;AAC5E,oDAAoD,4CAAW;AAC/D;AACA;AACA;AACA;AACA;AACA,8BAA8B,KAAK,GAAG,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,KAAK;AACrC,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,IAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,IAAI,EAAE,kCAAkC;AAC1D,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,iDAAgB;AACnC,iBAAiB,iDAAgB;AACjC,kBAAkB,iDAAgB;AAClC,iBAAiB,iDAAgB;AACjC,kBAAkB,iDAAgB;AAClC,iBAAiB,iDAAgB;AACjC,aAAa,iDAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACl2CpC;AACA;AACA;AACA;AACA;AACoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,0DAA0D,qBAAM,gBAAgB,qBAAM,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+DAA8B;AAC3D;AACA;AACA;AACA;AACA,IAAI,6CAAY,GAAG,+CAA+C,OAAO,IAAI;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACP;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,sDAAsD,SAAS;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,kCAAkC,+BAA+B;AACjE;AACA;AACA;AACA,CAAC;AACM;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC1JP;AACA;AACA;AACA;AACgE;AAChE;AACA;AACA,WAAW,iDAAO,kCAAkC,iDAAO;AAC3D,2BAA2B,iDAAO;AAClC;AACA,yBAAyB,iCAAiC;AAC1D,qBAAqB,6BAA6B;AAClD,oBAAoB,4BAA4B;AAChD,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD,qBAAqB,sBAAsB;AAC3C,oBAAoB,qBAAqB;AACzC,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,OAAO,mDAAS,aAAa,qDAAW,wBAAwB;AACzF,qBAAqB,kBAAkB,gCAAgC;AACvE;AACA,oBAAoB,YAAY;AAChC,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACO;AACP;AACA;AACA;AACA;AACO;;;;;;;;;;;;;;;;ACtDP;AACA;AACA;AACA;AACwC;AACxC,2BAA2B,iDAAO,uBAAuB,iDAAO;AACzD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAO;AAC7C;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AAC+C;AACd;AAC1B;AACP;AACA;AACA;AACA;AACA;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA,8BAA8B,GAAG;AACjC;AACA,iCAAiC,EAAE;AACnC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC,mCAAmC;AACnC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACO;AACP,+BAA+B,EAAE;AACjC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,mCAAmC,EAAE;AACrC;AACO;AACP;AACA;AACO,yDAAyD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,sCAAsC,SAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,WAAW,gCAAgC;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP,WAAW,gCAAgC;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO,mDAAmD;AAC1D;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,kBAAkB,uBAAuB,iBAAiB;AAC1D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,0CAAI;AACrD;AACA;AACA,wBAAwB,0wmBAA0wmB;AAClymB,CAAC;AACD,gCAAgC,wDAAiB;AACjD;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,mCAAmC,0CAAI;AAChC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjzBA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA,6DAA6D,KAAK;AAClE;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACO;AACP;AACA;AACA,0EAA0E,WAAW;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;;;;;;;;;;;;;;;;AClKA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACmC;AACO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B,cAAc,YAAY,SAAS,aAAa,UAAU,gBAAgB,aAAa,EAAE;AAC5K;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,YAAY;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2CAA2C;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mDAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mDAAS;AACrB,+BAA+B,2CAAW;AAC1C;AACA;AACA,sBAAsB,2CAAW;AACjC;AACA,0BAA0B,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mDAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,qBAAqB,cAAc,EAAE,SAAS;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2CAA2C;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,+BAA+B,GAAG,eAAe,GAAG;AAC/E;AACA;AACA;AACA;AACA;AACA,0BAA0B,+BAA+B,GAAG,eAAe,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC5kBA;AACA;AACA;AACA;AAC8D;AACxB;AACO;AACG;AACX;AACI;AACzC;AACA;AACO;AACP,SAAS,+CAAK;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,4BAA4B,8CAAO;AACnC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,2BAA2B,0EAA8B;AACzD;AACA,wEAAwE,0EAA8B;AACtG,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,iCAAiC,qDAAU;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iEAAiE,WAAW;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,WAAW;AACpE;AACA;AACA;AACA,wDAAwD,UAAU;AAClE;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,iDAAO,mCAAmC,iDAAO;AACpE;AACA,kCAAkC,iDAAO;AACzC;AACA,wBAAwB,iDAAO;AAC/B;AACA,kCAAkC,iDAAO;AACzC;AACA,4BAA4B,wDAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,2DAA0B;AAC3E;AACA;AACA;AACA,sCAAsC,2DAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,WAAW;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,WAAW;AAC5D;AACA;AACA;AACA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,wDAAuB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iDAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iDAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wDAAuB;AAC/C,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACO;AACP;AACA;;;;;;;;;;;;;;;;;ACtbA;AACA;AACA;AACA;AACuD;AACvD;AACA;AACA;AACO;AACP;AACA,6BAA6B,6DAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA,sBAAsB,6DAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACrIA;AACA;AACA;AACA;AACyC;AACzC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC1XA;AACA;AACA;AACA;AACyC;AACN;AACnC;AACA;AACA;AACA;AACO,wBAAwB,4CAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC7IA;AACA;AACA;AACA;AAC+D;AACxD,sCAAsC,wEAAmB;AAChE;AACA;AACA,qDAAqD,SAAS;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;;;;;;;;;;;;;;;;;;;;ACxBP;AACA;AACA;AACA;AAC4D;AACI;AACzD,gDAAgD,EAAE,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA,wDAAwD,IAAI,MAAM;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kEAAU;AACrC;AACA;AACA;AACA;AACA,CAAC;AACM;AACP;AACA,iBAAiB,8DAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACzHA;AACA;AACA;AACA;AAC4D;AACD;AAC3D;AACA;AACA,yBAAyB,8DAAO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,YAAY;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,SAAS;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,mBAAmB;AACxD;AACA;AACA;AACA,wCAAwC,iBAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iIAAiI,uBAAuB,GAAG,mBAAmB;AAC9K;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,YAAY;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gJAAgJ;AAChJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,YAAY;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,4EAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAA8B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpaA;AACA;AACA;AACA;AACwD;AACT;AACP;AACqD;AACtF;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,kDAAkD,6DAAO;AACzD,oDAAoD,6DAAO;AAC3D,uDAAuD,6DAAO;AAC9D,iDAAiD,6DAAO;AACxD,oDAAoD,6DAAO;AAC3D,iDAAiD,6DAAO;AACxD,kDAAkD,6DAAO;AACzD,qDAAqD,6DAAO;AAC5D,kDAAkD,6DAAO;AACzD,oDAAoD,6DAAO;AAC3D,kDAAkD,6DAAO;AACzD,qDAAqD,6DAAO;AAC5D,iDAAiD,6DAAO;AACxD,kDAAkD,6DAAO;AACzD,iDAAiD,6DAAO;AACxD,qDAAqD,6DAAO;AAC5D,iDAAiD,6DAAO;AACxD,uDAAuD,6DAAO;AAC9D,oDAAoD,6DAAO;AAC3D,oDAAoD,6DAAO;AAC3D,iDAAiD,6DAAO;AACxD,kDAAkD,6DAAO;AACzD,iDAAiD,6DAAO;AACxD,sDAAsD,6DAAO;AAC7D,wDAAwD,6DAAO;AAC/D,mDAAmD,6DAAO;AAC1D,0DAA0D,6DAAO;AACjE,iDAAiD,6DAAO;AACxD,kDAAkD,6DAAO;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6DAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA,WAAW,4DAA4D;AACvE;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kEAAkE;AAC5D;AACP;AACA;AACA;AACA;AACA,CAAC,4DAA4D;AAC7D;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACO;AACP;AACA,WAAW,oDAAG;AACd,WAAW,iDAAK;AAChB,YAAY,iDAAK,yCAAyC,iDAAK;AAC/D;AACA;AACA;AACA;AACO;AACP;AACA;AACA,wCAAwC,6DAAO;AAC/C,0CAA0C,6DAAO;AACjD,6CAA6C,6DAAO;AACpD,2CAA2C,6DAAO;AAClD,yCAAyC,6DAAO;AAChD,0CAA0C,6DAAO;AACjD,4CAA4C,6DAAO;AACnD,yCAAyC,6DAAO;AAChD,+CAA+C,6DAAO;AACtD,wCAAwC,6DAAO;AAC/C,8CAA8C,6DAAO;AACrD,6CAA6C,6DAAO;AACpD,6CAA6C,6DAAO;AACpD,6CAA6C,6DAAO;AACpD,2CAA2C,6DAAO;AAClD,2CAA2C,6DAAO;AAClD,4CAA4C,6DAAO;AACnD,0CAA0C,6DAAO;AACjD,2CAA2C,6DAAO;AAClD,wCAAwC,6DAAO;AAC/C,yCAAyC,6DAAO;AAChD,+CAA+C,6DAAO;AACtD,2CAA2C,6DAAO;AAClD,0CAA0C,6DAAO;AACjD,6CAA6C,6DAAO;AACpD,kDAAkD,6DAAO;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6DAAO;AAC1B;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AAC5B;AACP;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AACpB;AACP;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACO,iCAAiC,0EAAwB;;;;;;;;;;;;;;;;;;;AC/QhE;AACA;AACA;AACA;AACqE;AAC9D;AACP;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6EAAmB;AAC7C;AACA;AACA,wBAAwB,yCAAyC;AACjE;AACA;AACA,+CAA+C;AAC/C,wBAAwB,uCAAuC;AAC/D;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,KAAK;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,gBAAgB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACxQA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,uBAAuB;AACvB,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,4BAA4B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;ACpFA;AACA;AACA;AACA;AACsD;AACtD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACO;AACP;AACA;AACA;AACA,CAAC,0CAA0C;AACpC;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,0DAA0D;AACpD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;;;;;;;;;;;;;;;;;;ACxHA;AACA;AACA;AACA;AAC6D;AACd;AACY;AACpD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,uDAAQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA,mCAAmC,oEAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mEAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACjHA;AACA;AACA;AACA;AAC6D;AACL;AACjD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8DAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAAQ;AACxB,gBAAgB,8DAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,8DAAQ;AAC7B,gBAAgB,8DAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kBAAkB;AACtB;AACA,KAAK,oCAAoC;AACzC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mEAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,SAAS;AAClF;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AC9NA;AACA;AACA;AACA;AAC2D;AACkB;AAC9B;AACN;AACW;AACpD;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iEAAoB;AACxC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iDAAU,8BAA8B,yFAAuB;AAClF;AACA;AACO;AACP;AACA;AACA;AACA,+CAA+C,SAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,mBAAmB,gDAAS;AAC5B;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA,eAAe,gDAAS;AACxB;AACA;AACA;AACA;AACA;AACA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iDAAK;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,wEAAwE;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gDAAS,KAAK,iDAAK;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,iDAAK;AAC/D;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,uDAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA,+CAA+C,iDAAK;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,uDAAQ;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,iDAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,iDAAK;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,uDAAQ;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,iDAAK;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qEAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;ACncA;AACA;AACA;AACA;AAC+E;AACvB;AACI;AACV;AACH;AACN;AACQ;AACT;AAC4B;AAC7D;AACP;AACA,eAAe,kEAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,iCAAiC,iFAAuB;AACxD,iBAAiB,0DAAO;AACxB,iBAAiB,mEAAuB;AACxC;AACA,kBAAkB,uDAAQ;AAC1B,eAAe,iDAAK;AACpB,mBAAmB,yDAAS;AAC5B,4BAA4B,8EAAkC;AAC9D,wBAAwB,0EAA8B;AACtD,mBAAmB,qEAAyB;AAC5C,aAAa,oDAAG;AAChB,eAAe,gDAAK;AACpB;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA,iBAAiB,SAAI,IAAI,SAAI;AAC7B,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AAC+D;AACJ;AACT;AACH;AACN;AACc;AAC0B;AACA;AACrB;AACyB;AAC5B;AACF;AACO;AACiB;AAC/E;AACA;AACA;AACO,0BAA0B,sEAAe;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kEAAa,kBAAkB,8EAAyB;AACnF;AACA,uBAAuB,iDAAK;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,0BAA0B,wDAAwD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,kBAAkB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,8DAA8D;AAC7G,6CAA6C,0DAA0D;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,uDAAQ;AACrB;AACA;AACA,cAAc,qBAAqB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,oDAAG;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB,yFAA2B;AAC9C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iCAAiC,+DAAY;AAC7C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,2BAA2B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iDAAK;AAChC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,oBAAoB,iDAAK;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,aAAa;AAC/C;AACA;AACA;AACA,gCAAgC,qEAAU;AAC1C,kDAAkD,iDAAK;AACvD;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,iCAAiC,sEAAsE;AACrI;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wEAAY;AAC/B,SAAS;AACT;AACA;AACA;AACA,2BAA2B,iEAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,4BAA4B;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8DAA8D;AACtH;AACA;AACA;AACA;AACA,2BAA2B,6FAAmB;AAC9C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qEAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qEAAuB;AAC1D;AACA;AACA;AACA,oDAAoD,+BAA+B;AACnF;AACA;AACA;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,6DAAO,UAAU,uEAAmB;AACxC;;;;;;;;;;;;;;;;;;;;AC7eA;AACA;AACA;AACA;AACyC;AACc;AACI;AACC;AACe;AACpE;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iDAAiD;AACnF;AACA,6BAA6B,+DAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,yBAAyB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oEAAuB;AACnD;AACA;AACA;AACA;AACA;AACA,4BAA4B,oEAAuB;AACnD;AACA;AACA;AACA;AACA,iCAAiC,kEAAa,iBAAiB,oEAAmB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kEAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,iDAAK;AAC7C;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,8CAA8C,wEAA2B,6BAA6B,wEAA2B;AACjI,yBAAyB;AACzB;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,oBAAoB,2EAA8B,0DAA0D;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,wEAA2B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wEAA2B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iEAAoB;AACzD;AACA;AACA;AACA,qBAAqB,wEAA2B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,wEAA2B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpLA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AAC9C;AACP;AACA;AACA;AACA,CAAC,sDAAsD;AAChD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oEAAoE;AAC9D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AAC1C;AACP;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0EAA0E;AAC3E;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;AACtD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;AACrC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;AAC9B;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,0DAA0D;AACpD;AACP;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA,WAAW,4DAA4D;AACvE;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kEAAkE;AACnE;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AACpB;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AAClC;AACP;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACO;AACP;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0EAA0E;AAC3E;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AACxC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AACtC;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AAChD;AACP;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AAChC;AACP;AACA;AACA;AACA,CAAC,gCAAgC;AAC1B;AACP;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AAC1C;AACP;AACA;AACA;AACA;AACA,CAAC,4DAA4D;AAC7D;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AAC1B;AACP;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sEAAsE;AACvE;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,wDAAwD;AACzD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;;;;;;;;;;;;;;;ACl4BzC;AACA;AACA;AACA;AACA,iBAAiB,SAAI,IAAI,SAAI;AAC7B,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACqD;AACqB;AACnE;AACP;AACA;AACA;AACA,gCAAgC,0DAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe,uEAAY;AAC3B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uEAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,iEAAU;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;;;ACvIA;AACA;AACA;AACA;AACA,iBAAiB,SAAI,IAAI,SAAI;AAC7B,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,YAAY,IAAI,eAAe;AAC1D,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,gDAAgD,QAAQ;AACxD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,QAAQ;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iIAAiI;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,SAAS;AACjF;AACA,SAAS;AACT;AACA;;;;;;;UC/KA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AAC2E;AACE;AAC7E;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,mFAAkB;AAC/C;AACA,KAAK,gBAAgB,sFAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/arrays.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/cache.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/cancellation.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/codicons.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/diff/diff.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/errors.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/event.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/functional.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/hash.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/iterator.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/keyCodes.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/lazy.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/lifecycle.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/linkedList.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/objects.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/path.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/platform.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/process.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/stopwatch.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/strings.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/types.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/uint.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/uri.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/core/position.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/core/range.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/core/selection.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/diff/diffComputer.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/languages.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/model.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/nls.js","webpack://fausteditorweb/webpack/bootstrap","webpack://fausteditorweb/webpack/runtime/define property getters","webpack://fausteditorweb/webpack/runtime/global","webpack://fausteditorweb/webpack/runtime/hasOwnProperty shorthand","webpack://fausteditorweb/webpack/runtime/make namespace object","webpack://fausteditorweb/./node_modules/monaco-editor/esm/vs/editor/editor.worker.js"],"sourcesContent":["/**\n * Returns the last element of an array.\n * @param array The array.\n * @param n Which element from the end (default is zero).\n */\nexport function tail(array, n = 0) {\n return array[array.length - (1 + n)];\n}\nexport function tail2(arr) {\n if (arr.length === 0) {\n throw new Error('Invalid tail call');\n }\n return [arr.slice(0, arr.length - 1), arr[arr.length - 1]];\n}\nexport function equals(one, other, itemEquals = (a, b) => a === b) {\n if (one === other) {\n return true;\n }\n if (!one || !other) {\n return false;\n }\n if (one.length !== other.length) {\n return false;\n }\n for (let i = 0, len = one.length; i < len; i++) {\n if (!itemEquals(one[i], other[i])) {\n return false;\n }\n }\n return true;\n}\n/**\n * Remove the element at `index` by replacing it with the last element. This is faster than `splice`\n * but changes the order of the array\n */\nexport function removeFastWithoutKeepingOrder(array, index) {\n const last = array.length - 1;\n if (index < last) {\n array[index] = array[last];\n }\n array.pop();\n}\n/**\n * Performs a binary search algorithm over a sorted array.\n *\n * @param array The array being searched.\n * @param key The value we search for.\n * @param comparator A function that takes two array elements and returns zero\n * if they are equal, a negative number if the first element precedes the\n * second one in the sorting order, or a positive number if the second element\n * precedes the first one.\n * @return See {@link binarySearch2}\n */\nexport function binarySearch(array, key, comparator) {\n return binarySearch2(array.length, i => comparator(array[i], key));\n}\n/**\n * Performs a binary search algorithm over a sorted collection. Useful for cases\n * when we need to perform a binary search over something that isn't actually an\n * array, and converting data to an array would defeat the use of binary search\n * in the first place.\n *\n * @param length The collection length.\n * @param compareToKey A function that takes an index of an element in the\n * collection and returns zero if the value at this index is equal to the\n * search key, a negative number if the value precedes the search key in the\n * sorting order, or a positive number if the search key precedes the value.\n * @return A non-negative index of an element, if found. If not found, the\n * result is -(n+1) (or ~n, using bitwise notation), where n is the index\n * where the key should be inserted to maintain the sorting order.\n */\nexport function binarySearch2(length, compareToKey) {\n let low = 0, high = length - 1;\n while (low <= high) {\n const mid = ((low + high) / 2) | 0;\n const comp = compareToKey(mid);\n if (comp < 0) {\n low = mid + 1;\n }\n else if (comp > 0) {\n high = mid - 1;\n }\n else {\n return mid;\n }\n }\n return -(low + 1);\n}\n/**\n * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false\n * are located before all elements where p(x) is true.\n * @returns the least x for which p(x) is true or array.length if no element fullfills the given function.\n */\nexport function findFirstInSorted(array, p) {\n let low = 0, high = array.length;\n if (high === 0) {\n return 0; // no children\n }\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (p(array[mid])) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n return low;\n}\nexport function quickSelect(nth, data, compare) {\n nth = nth | 0;\n if (nth >= data.length) {\n throw new TypeError('invalid index');\n }\n const pivotValue = data[Math.floor(data.length * Math.random())];\n const lower = [];\n const higher = [];\n const pivots = [];\n for (const value of data) {\n const val = compare(value, pivotValue);\n if (val < 0) {\n lower.push(value);\n }\n else if (val > 0) {\n higher.push(value);\n }\n else {\n pivots.push(value);\n }\n }\n if (nth < lower.length) {\n return quickSelect(nth, lower, compare);\n }\n else if (nth < lower.length + pivots.length) {\n return pivots[0];\n }\n else {\n return quickSelect(nth - (lower.length + pivots.length), higher, compare);\n }\n}\nexport function groupBy(data, compare) {\n const result = [];\n let currentGroup = undefined;\n for (const element of data.slice(0).sort(compare)) {\n if (!currentGroup || compare(currentGroup[0], element) !== 0) {\n currentGroup = [element];\n result.push(currentGroup);\n }\n else {\n currentGroup.push(element);\n }\n }\n return result;\n}\n/**\n * @returns New array with all falsy values removed. The original array IS NOT modified.\n */\nexport function coalesce(array) {\n return array.filter(e => !!e);\n}\n/**\n * @returns false if the provided object is an array and not empty.\n */\nexport function isFalsyOrEmpty(obj) {\n return !Array.isArray(obj) || obj.length === 0;\n}\nexport function isNonEmptyArray(obj) {\n return Array.isArray(obj) && obj.length > 0;\n}\n/**\n * Removes duplicates from the given array. The optional keyFn allows to specify\n * how elements are checked for equality by returning an alternate value for each.\n */\nexport function distinct(array, keyFn = value => value) {\n const seen = new Set();\n return array.filter(element => {\n const key = keyFn(element);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\nexport function findLast(arr, predicate) {\n const idx = lastIndex(arr, predicate);\n if (idx === -1) {\n return undefined;\n }\n return arr[idx];\n}\nexport function lastIndex(array, fn) {\n for (let i = array.length - 1; i >= 0; i--) {\n const element = array[i];\n if (fn(element)) {\n return i;\n }\n }\n return -1;\n}\nexport function firstOrDefault(array, notFoundValue) {\n return array.length > 0 ? array[0] : notFoundValue;\n}\nexport function range(arg, to) {\n let from = typeof to === 'number' ? arg : 0;\n if (typeof to === 'number') {\n from = arg;\n }\n else {\n from = 0;\n to = arg;\n }\n const result = [];\n if (from <= to) {\n for (let i = from; i < to; i++) {\n result.push(i);\n }\n }\n else {\n for (let i = from; i > to; i--) {\n result.push(i);\n }\n }\n return result;\n}\n/**\n * Insert `insertArr` inside `target` at `insertIndex`.\n * Please don't touch unless you understand https://jsperf.com/inserting-an-array-within-an-array\n */\nexport function arrayInsert(target, insertIndex, insertArr) {\n const before = target.slice(0, insertIndex);\n const after = target.slice(insertIndex);\n return before.concat(insertArr, after);\n}\n/**\n * Pushes an element to the start of the array, if found.\n */\nexport function pushToStart(arr, value) {\n const index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n arr.unshift(value);\n }\n}\n/**\n * Pushes an element to the end of the array, if found.\n */\nexport function pushToEnd(arr, value) {\n const index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n arr.push(value);\n }\n}\nexport function pushMany(arr, items) {\n for (const item of items) {\n arr.push(item);\n }\n}\nexport function asArray(x) {\n return Array.isArray(x) ? x : [x];\n}\n/**\n * Insert the new items in the array.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start inserting elements.\n * @param newItems The items to be inserted\n */\nexport function insertInto(array, start, newItems) {\n const startIdx = getActualStartIndex(array, start);\n const originalLength = array.length;\n const newItemsLength = newItems.length;\n array.length = originalLength + newItemsLength;\n // Move the items after the start index, start from the end so that we don't overwrite any value.\n for (let i = originalLength - 1; i >= startIdx; i--) {\n array[i + newItemsLength] = array[i];\n }\n for (let i = 0; i < newItemsLength; i++) {\n array[i + startIdx] = newItems[i];\n }\n}\n/**\n * Removes elements from an array and inserts new elements in their place, returning the deleted elements. Alternative to the native Array.splice method, it\n * can only support limited number of items due to the maximum call stack size limit.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start removing elements.\n * @param deleteCount The number of elements to remove.\n * @returns An array containing the elements that were deleted.\n */\nexport function splice(array, start, deleteCount, newItems) {\n const index = getActualStartIndex(array, start);\n const result = array.splice(index, deleteCount);\n insertInto(array, index, newItems);\n return result;\n}\n/**\n * Determine the actual start index (same logic as the native splice() or slice())\n * If greater than the length of the array, start will be set to the length of the array. In this case, no element will be deleted but the method will behave as an adding function, adding as many element as item[n*] provided.\n * If negative, it will begin that many elements from the end of the array. (In this case, the origin -1, meaning -n is the index of the nth last element, and is therefore equivalent to the index of array.length - n.) If array.length + start is less than 0, it will begin from index 0.\n * @param array The target array.\n * @param start The operation index.\n */\nfunction getActualStartIndex(array, start) {\n return start < 0 ? Math.max(start + array.length, 0) : Math.min(start, array.length);\n}\nexport var CompareResult;\n(function (CompareResult) {\n function isLessThan(result) {\n return result < 0;\n }\n CompareResult.isLessThan = isLessThan;\n function isGreaterThan(result) {\n return result > 0;\n }\n CompareResult.isGreaterThan = isGreaterThan;\n function isNeitherLessOrGreaterThan(result) {\n return result === 0;\n }\n CompareResult.isNeitherLessOrGreaterThan = isNeitherLessOrGreaterThan;\n CompareResult.greaterThan = 1;\n CompareResult.lessThan = -1;\n CompareResult.neitherLessOrGreaterThan = 0;\n})(CompareResult || (CompareResult = {}));\nexport function compareBy(selector, comparator) {\n return (a, b) => comparator(selector(a), selector(b));\n}\n/**\n * The natural order on numbers.\n*/\nexport const numberComparator = (a, b) => a - b;\n/**\n * Returns the first item that is equal to or greater than every other item.\n*/\nexport function findMaxBy(items, comparator) {\n if (items.length === 0) {\n return undefined;\n }\n let max = items[0];\n for (let i = 1; i < items.length; i++) {\n const item = items[i];\n if (comparator(item, max) > 0) {\n max = item;\n }\n }\n return max;\n}\n/**\n * Returns the last item that is equal to or greater than every other item.\n*/\nexport function findLastMaxBy(items, comparator) {\n if (items.length === 0) {\n return undefined;\n }\n let max = items[0];\n for (let i = 1; i < items.length; i++) {\n const item = items[i];\n if (comparator(item, max) >= 0) {\n max = item;\n }\n }\n return max;\n}\n/**\n * Returns the first item that is equal to or less than every other item.\n*/\nexport function findMinBy(items, comparator) {\n return findMaxBy(items, (a, b) => -comparator(a, b));\n}\nexport class ArrayQueue {\n /**\n * Constructs a queue that is backed by the given array. Runtime is O(1).\n */\n constructor(items) {\n this.items = items;\n this.firstIdx = 0;\n this.lastIdx = this.items.length - 1;\n }\n get length() {\n return this.lastIdx - this.firstIdx + 1;\n }\n /**\n * Consumes elements from the beginning of the queue as long as the predicate returns true.\n * If no elements were consumed, `null` is returned. Has a runtime of O(result.length).\n */\n takeWhile(predicate) {\n // P(k) := k <= this.lastIdx && predicate(this.items[k])\n // Find s := min { k | k >= this.firstIdx && !P(k) } and return this.data[this.firstIdx...s)\n let startIdx = this.firstIdx;\n while (startIdx < this.items.length && predicate(this.items[startIdx])) {\n startIdx++;\n }\n const result = startIdx === this.firstIdx ? null : this.items.slice(this.firstIdx, startIdx);\n this.firstIdx = startIdx;\n return result;\n }\n /**\n * Consumes elements from the end of the queue as long as the predicate returns true.\n * If no elements were consumed, `null` is returned.\n * The result has the same order as the underlying array!\n */\n takeFromEndWhile(predicate) {\n // P(k) := this.firstIdx >= k && predicate(this.items[k])\n // Find s := max { k | k <= this.lastIdx && !P(k) } and return this.data(s...this.lastIdx]\n let endIdx = this.lastIdx;\n while (endIdx >= 0 && predicate(this.items[endIdx])) {\n endIdx--;\n }\n const result = endIdx === this.lastIdx ? null : this.items.slice(endIdx + 1, this.lastIdx + 1);\n this.lastIdx = endIdx;\n return result;\n }\n peek() {\n if (this.length === 0) {\n return undefined;\n }\n return this.items[this.firstIdx];\n }\n dequeue() {\n const result = this.items[this.firstIdx];\n this.firstIdx++;\n return result;\n }\n takeCount(count) {\n const result = this.items.slice(this.firstIdx, this.firstIdx + count);\n this.firstIdx += count;\n return result;\n }\n}\n","/**\n * Uses a LRU cache to make a given parametrized function cached.\n * Caches just the last value.\n * The key must be JSON serializable.\n*/\nexport class LRUCachedFunction {\n constructor(fn) {\n this.fn = fn;\n this.lastCache = undefined;\n this.lastArgKey = undefined;\n }\n get(arg) {\n const key = JSON.stringify(arg);\n if (this.lastArgKey !== key) {\n this.lastArgKey = key;\n this.lastCache = this.fn(arg);\n }\n return this.lastCache;\n }\n}\n/**\n * Uses an unbounded cache (referential equality) to memoize the results of the given function.\n*/\nexport class CachedFunction {\n constructor(fn) {\n this.fn = fn;\n this._map = new Map();\n }\n get cachedValues() {\n return this._map;\n }\n get(arg) {\n if (this._map.has(arg)) {\n return this._map.get(arg);\n }\n const value = this.fn(arg);\n this._map.set(arg, value);\n return value;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Emitter, Event } from './event.js';\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = setTimeout(callback.bind(context), 0);\n return { dispose() { clearTimeout(handle); } };\n});\nexport var CancellationToken;\n(function (CancellationToken) {\n function isCancellationToken(thing) {\n if (thing === CancellationToken.None || thing === CancellationToken.Cancelled) {\n return true;\n }\n if (thing instanceof MutableToken) {\n return true;\n }\n if (!thing || typeof thing !== 'object') {\n return false;\n }\n return typeof thing.isCancellationRequested === 'boolean'\n && typeof thing.onCancellationRequested === 'function';\n }\n CancellationToken.isCancellationToken = isCancellationToken;\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent\n });\n})(CancellationToken || (CancellationToken = {}));\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n this._emitter = null;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = null;\n }\n }\n}\nexport class CancellationTokenSource {\n constructor(parent) {\n this._token = undefined;\n this._parentListener = undefined;\n this._parentListener = parent && parent.onCancellationRequested(this.cancel, this);\n }\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else if (this._token instanceof MutableToken) {\n // actually cancel\n this._token.cancel();\n }\n }\n dispose(cancel = false) {\n if (cancel) {\n this.cancel();\n }\n if (this._parentListener) {\n this._parentListener.dispose();\n }\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\n","// Selects all codicon names encapsulated in the `$()` syntax and wraps the\n// results with spaces so that screen readers can read the text better.\nexport function getCodiconAriaLabel(text) {\n if (!text) {\n return '';\n }\n return text.replace(/\\$\\((.*?)\\)/g, (_match, codiconName) => ` ${codiconName} `).trim();\n}\n/**\n * The Codicon library is a set of default icons that are built-in in VS Code.\n *\n * In the product (outside of base) Codicons should only be used as defaults. In order to have all icons in VS Code\n * themeable, component should define new, UI component specific icons using `iconRegistry.registerIcon`.\n * In that call a Codicon can be named as default.\n */\nexport class Codicon {\n constructor(id, definition, description) {\n this.id = id;\n this.definition = definition;\n this.description = description;\n Codicon._allCodicons.push(this);\n }\n get classNames() { return 'codicon codicon-' + this.id; }\n // classNamesArray is useful for migrating to ES6 classlist\n get classNamesArray() { return ['codicon', 'codicon-' + this.id]; }\n get cssSelector() { return '.codicon.codicon-' + this.id; }\n /**\n * @returns Returns all default icons covered by the codicon font. Only to be used by the icon registry in platform.\n */\n static getAll() {\n return Codicon._allCodicons;\n }\n}\n// registry\nCodicon._allCodicons = [];\n// built-in icons, with image name\nCodicon.add = new Codicon('add', { fontCharacter: '\\\\ea60' });\nCodicon.plus = new Codicon('plus', Codicon.add.definition);\nCodicon.gistNew = new Codicon('gist-new', Codicon.add.definition);\nCodicon.repoCreate = new Codicon('repo-create', Codicon.add.definition);\nCodicon.lightbulb = new Codicon('lightbulb', { fontCharacter: '\\\\ea61' });\nCodicon.lightBulb = new Codicon('light-bulb', { fontCharacter: '\\\\ea61' });\nCodicon.repo = new Codicon('repo', { fontCharacter: '\\\\ea62' });\nCodicon.repoDelete = new Codicon('repo-delete', { fontCharacter: '\\\\ea62' });\nCodicon.gistFork = new Codicon('gist-fork', { fontCharacter: '\\\\ea63' });\nCodicon.repoForked = new Codicon('repo-forked', { fontCharacter: '\\\\ea63' });\nCodicon.gitPullRequest = new Codicon('git-pull-request', { fontCharacter: '\\\\ea64' });\nCodicon.gitPullRequestAbandoned = new Codicon('git-pull-request-abandoned', { fontCharacter: '\\\\ea64' });\nCodicon.recordKeys = new Codicon('record-keys', { fontCharacter: '\\\\ea65' });\nCodicon.keyboard = new Codicon('keyboard', { fontCharacter: '\\\\ea65' });\nCodicon.tag = new Codicon('tag', { fontCharacter: '\\\\ea66' });\nCodicon.tagAdd = new Codicon('tag-add', { fontCharacter: '\\\\ea66' });\nCodicon.tagRemove = new Codicon('tag-remove', { fontCharacter: '\\\\ea66' });\nCodicon.person = new Codicon('person', { fontCharacter: '\\\\ea67' });\nCodicon.personFollow = new Codicon('person-follow', { fontCharacter: '\\\\ea67' });\nCodicon.personOutline = new Codicon('person-outline', { fontCharacter: '\\\\ea67' });\nCodicon.personFilled = new Codicon('person-filled', { fontCharacter: '\\\\ea67' });\nCodicon.gitBranch = new Codicon('git-branch', { fontCharacter: '\\\\ea68' });\nCodicon.gitBranchCreate = new Codicon('git-branch-create', { fontCharacter: '\\\\ea68' });\nCodicon.gitBranchDelete = new Codicon('git-branch-delete', { fontCharacter: '\\\\ea68' });\nCodicon.sourceControl = new Codicon('source-control', { fontCharacter: '\\\\ea68' });\nCodicon.mirror = new Codicon('mirror', { fontCharacter: '\\\\ea69' });\nCodicon.mirrorPublic = new Codicon('mirror-public', { fontCharacter: '\\\\ea69' });\nCodicon.star = new Codicon('star', { fontCharacter: '\\\\ea6a' });\nCodicon.starAdd = new Codicon('star-add', { fontCharacter: '\\\\ea6a' });\nCodicon.starDelete = new Codicon('star-delete', { fontCharacter: '\\\\ea6a' });\nCodicon.starEmpty = new Codicon('star-empty', { fontCharacter: '\\\\ea6a' });\nCodicon.comment = new Codicon('comment', { fontCharacter: '\\\\ea6b' });\nCodicon.commentAdd = new Codicon('comment-add', { fontCharacter: '\\\\ea6b' });\nCodicon.alert = new Codicon('alert', { fontCharacter: '\\\\ea6c' });\nCodicon.warning = new Codicon('warning', { fontCharacter: '\\\\ea6c' });\nCodicon.search = new Codicon('search', { fontCharacter: '\\\\ea6d' });\nCodicon.searchSave = new Codicon('search-save', { fontCharacter: '\\\\ea6d' });\nCodicon.logOut = new Codicon('log-out', { fontCharacter: '\\\\ea6e' });\nCodicon.signOut = new Codicon('sign-out', { fontCharacter: '\\\\ea6e' });\nCodicon.logIn = new Codicon('log-in', { fontCharacter: '\\\\ea6f' });\nCodicon.signIn = new Codicon('sign-in', { fontCharacter: '\\\\ea6f' });\nCodicon.eye = new Codicon('eye', { fontCharacter: '\\\\ea70' });\nCodicon.eyeUnwatch = new Codicon('eye-unwatch', { fontCharacter: '\\\\ea70' });\nCodicon.eyeWatch = new Codicon('eye-watch', { fontCharacter: '\\\\ea70' });\nCodicon.circleFilled = new Codicon('circle-filled', { fontCharacter: '\\\\ea71' });\nCodicon.primitiveDot = new Codicon('primitive-dot', { fontCharacter: '\\\\ea71' });\nCodicon.closeDirty = new Codicon('close-dirty', { fontCharacter: '\\\\ea71' });\nCodicon.debugBreakpoint = new Codicon('debug-breakpoint', { fontCharacter: '\\\\ea71' });\nCodicon.debugBreakpointDisabled = new Codicon('debug-breakpoint-disabled', { fontCharacter: '\\\\ea71' });\nCodicon.debugHint = new Codicon('debug-hint', { fontCharacter: '\\\\ea71' });\nCodicon.primitiveSquare = new Codicon('primitive-square', { fontCharacter: '\\\\ea72' });\nCodicon.edit = new Codicon('edit', { fontCharacter: '\\\\ea73' });\nCodicon.pencil = new Codicon('pencil', { fontCharacter: '\\\\ea73' });\nCodicon.info = new Codicon('info', { fontCharacter: '\\\\ea74' });\nCodicon.issueOpened = new Codicon('issue-opened', { fontCharacter: '\\\\ea74' });\nCodicon.gistPrivate = new Codicon('gist-private', { fontCharacter: '\\\\ea75' });\nCodicon.gitForkPrivate = new Codicon('git-fork-private', { fontCharacter: '\\\\ea75' });\nCodicon.lock = new Codicon('lock', { fontCharacter: '\\\\ea75' });\nCodicon.mirrorPrivate = new Codicon('mirror-private', { fontCharacter: '\\\\ea75' });\nCodicon.close = new Codicon('close', { fontCharacter: '\\\\ea76' });\nCodicon.removeClose = new Codicon('remove-close', { fontCharacter: '\\\\ea76' });\nCodicon.x = new Codicon('x', { fontCharacter: '\\\\ea76' });\nCodicon.repoSync = new Codicon('repo-sync', { fontCharacter: '\\\\ea77' });\nCodicon.sync = new Codicon('sync', { fontCharacter: '\\\\ea77' });\nCodicon.clone = new Codicon('clone', { fontCharacter: '\\\\ea78' });\nCodicon.desktopDownload = new Codicon('desktop-download', { fontCharacter: '\\\\ea78' });\nCodicon.beaker = new Codicon('beaker', { fontCharacter: '\\\\ea79' });\nCodicon.microscope = new Codicon('microscope', { fontCharacter: '\\\\ea79' });\nCodicon.vm = new Codicon('vm', { fontCharacter: '\\\\ea7a' });\nCodicon.deviceDesktop = new Codicon('device-desktop', { fontCharacter: '\\\\ea7a' });\nCodicon.file = new Codicon('file', { fontCharacter: '\\\\ea7b' });\nCodicon.fileText = new Codicon('file-text', { fontCharacter: '\\\\ea7b' });\nCodicon.more = new Codicon('more', { fontCharacter: '\\\\ea7c' });\nCodicon.ellipsis = new Codicon('ellipsis', { fontCharacter: '\\\\ea7c' });\nCodicon.kebabHorizontal = new Codicon('kebab-horizontal', { fontCharacter: '\\\\ea7c' });\nCodicon.mailReply = new Codicon('mail-reply', { fontCharacter: '\\\\ea7d' });\nCodicon.reply = new Codicon('reply', { fontCharacter: '\\\\ea7d' });\nCodicon.organization = new Codicon('organization', { fontCharacter: '\\\\ea7e' });\nCodicon.organizationFilled = new Codicon('organization-filled', { fontCharacter: '\\\\ea7e' });\nCodicon.organizationOutline = new Codicon('organization-outline', { fontCharacter: '\\\\ea7e' });\nCodicon.newFile = new Codicon('new-file', { fontCharacter: '\\\\ea7f' });\nCodicon.fileAdd = new Codicon('file-add', { fontCharacter: '\\\\ea7f' });\nCodicon.newFolder = new Codicon('new-folder', { fontCharacter: '\\\\ea80' });\nCodicon.fileDirectoryCreate = new Codicon('file-directory-create', { fontCharacter: '\\\\ea80' });\nCodicon.trash = new Codicon('trash', { fontCharacter: '\\\\ea81' });\nCodicon.trashcan = new Codicon('trashcan', { fontCharacter: '\\\\ea81' });\nCodicon.history = new Codicon('history', { fontCharacter: '\\\\ea82' });\nCodicon.clock = new Codicon('clock', { fontCharacter: '\\\\ea82' });\nCodicon.folder = new Codicon('folder', { fontCharacter: '\\\\ea83' });\nCodicon.fileDirectory = new Codicon('file-directory', { fontCharacter: '\\\\ea83' });\nCodicon.symbolFolder = new Codicon('symbol-folder', { fontCharacter: '\\\\ea83' });\nCodicon.logoGithub = new Codicon('logo-github', { fontCharacter: '\\\\ea84' });\nCodicon.markGithub = new Codicon('mark-github', { fontCharacter: '\\\\ea84' });\nCodicon.github = new Codicon('github', { fontCharacter: '\\\\ea84' });\nCodicon.terminal = new Codicon('terminal', { fontCharacter: '\\\\ea85' });\nCodicon.console = new Codicon('console', { fontCharacter: '\\\\ea85' });\nCodicon.repl = new Codicon('repl', { fontCharacter: '\\\\ea85' });\nCodicon.zap = new Codicon('zap', { fontCharacter: '\\\\ea86' });\nCodicon.symbolEvent = new Codicon('symbol-event', { fontCharacter: '\\\\ea86' });\nCodicon.error = new Codicon('error', { fontCharacter: '\\\\ea87' });\nCodicon.stop = new Codicon('stop', { fontCharacter: '\\\\ea87' });\nCodicon.variable = new Codicon('variable', { fontCharacter: '\\\\ea88' });\nCodicon.symbolVariable = new Codicon('symbol-variable', { fontCharacter: '\\\\ea88' });\nCodicon.array = new Codicon('array', { fontCharacter: '\\\\ea8a' });\nCodicon.symbolArray = new Codicon('symbol-array', { fontCharacter: '\\\\ea8a' });\nCodicon.symbolModule = new Codicon('symbol-module', { fontCharacter: '\\\\ea8b' });\nCodicon.symbolPackage = new Codicon('symbol-package', { fontCharacter: '\\\\ea8b' });\nCodicon.symbolNamespace = new Codicon('symbol-namespace', { fontCharacter: '\\\\ea8b' });\nCodicon.symbolObject = new Codicon('symbol-object', { fontCharacter: '\\\\ea8b' });\nCodicon.symbolMethod = new Codicon('symbol-method', { fontCharacter: '\\\\ea8c' });\nCodicon.symbolFunction = new Codicon('symbol-function', { fontCharacter: '\\\\ea8c' });\nCodicon.symbolConstructor = new Codicon('symbol-constructor', { fontCharacter: '\\\\ea8c' });\nCodicon.symbolBoolean = new Codicon('symbol-boolean', { fontCharacter: '\\\\ea8f' });\nCodicon.symbolNull = new Codicon('symbol-null', { fontCharacter: '\\\\ea8f' });\nCodicon.symbolNumeric = new Codicon('symbol-numeric', { fontCharacter: '\\\\ea90' });\nCodicon.symbolNumber = new Codicon('symbol-number', { fontCharacter: '\\\\ea90' });\nCodicon.symbolStructure = new Codicon('symbol-structure', { fontCharacter: '\\\\ea91' });\nCodicon.symbolStruct = new Codicon('symbol-struct', { fontCharacter: '\\\\ea91' });\nCodicon.symbolParameter = new Codicon('symbol-parameter', { fontCharacter: '\\\\ea92' });\nCodicon.symbolTypeParameter = new Codicon('symbol-type-parameter', { fontCharacter: '\\\\ea92' });\nCodicon.symbolKey = new Codicon('symbol-key', { fontCharacter: '\\\\ea93' });\nCodicon.symbolText = new Codicon('symbol-text', { fontCharacter: '\\\\ea93' });\nCodicon.symbolReference = new Codicon('symbol-reference', { fontCharacter: '\\\\ea94' });\nCodicon.goToFile = new Codicon('go-to-file', { fontCharacter: '\\\\ea94' });\nCodicon.symbolEnum = new Codicon('symbol-enum', { fontCharacter: '\\\\ea95' });\nCodicon.symbolValue = new Codicon('symbol-value', { fontCharacter: '\\\\ea95' });\nCodicon.symbolRuler = new Codicon('symbol-ruler', { fontCharacter: '\\\\ea96' });\nCodicon.symbolUnit = new Codicon('symbol-unit', { fontCharacter: '\\\\ea96' });\nCodicon.activateBreakpoints = new Codicon('activate-breakpoints', { fontCharacter: '\\\\ea97' });\nCodicon.archive = new Codicon('archive', { fontCharacter: '\\\\ea98' });\nCodicon.arrowBoth = new Codicon('arrow-both', { fontCharacter: '\\\\ea99' });\nCodicon.arrowDown = new Codicon('arrow-down', { fontCharacter: '\\\\ea9a' });\nCodicon.arrowLeft = new Codicon('arrow-left', { fontCharacter: '\\\\ea9b' });\nCodicon.arrowRight = new Codicon('arrow-right', { fontCharacter: '\\\\ea9c' });\nCodicon.arrowSmallDown = new Codicon('arrow-small-down', { fontCharacter: '\\\\ea9d' });\nCodicon.arrowSmallLeft = new Codicon('arrow-small-left', { fontCharacter: '\\\\ea9e' });\nCodicon.arrowSmallRight = new Codicon('arrow-small-right', { fontCharacter: '\\\\ea9f' });\nCodicon.arrowSmallUp = new Codicon('arrow-small-up', { fontCharacter: '\\\\eaa0' });\nCodicon.arrowUp = new Codicon('arrow-up', { fontCharacter: '\\\\eaa1' });\nCodicon.bell = new Codicon('bell', { fontCharacter: '\\\\eaa2' });\nCodicon.bold = new Codicon('bold', { fontCharacter: '\\\\eaa3' });\nCodicon.book = new Codicon('book', { fontCharacter: '\\\\eaa4' });\nCodicon.bookmark = new Codicon('bookmark', { fontCharacter: '\\\\eaa5' });\nCodicon.debugBreakpointConditionalUnverified = new Codicon('debug-breakpoint-conditional-unverified', { fontCharacter: '\\\\eaa6' });\nCodicon.debugBreakpointConditional = new Codicon('debug-breakpoint-conditional', { fontCharacter: '\\\\eaa7' });\nCodicon.debugBreakpointConditionalDisabled = new Codicon('debug-breakpoint-conditional-disabled', { fontCharacter: '\\\\eaa7' });\nCodicon.debugBreakpointDataUnverified = new Codicon('debug-breakpoint-data-unverified', { fontCharacter: '\\\\eaa8' });\nCodicon.debugBreakpointData = new Codicon('debug-breakpoint-data', { fontCharacter: '\\\\eaa9' });\nCodicon.debugBreakpointDataDisabled = new Codicon('debug-breakpoint-data-disabled', { fontCharacter: '\\\\eaa9' });\nCodicon.debugBreakpointLogUnverified = new Codicon('debug-breakpoint-log-unverified', { fontCharacter: '\\\\eaaa' });\nCodicon.debugBreakpointLog = new Codicon('debug-breakpoint-log', { fontCharacter: '\\\\eaab' });\nCodicon.debugBreakpointLogDisabled = new Codicon('debug-breakpoint-log-disabled', { fontCharacter: '\\\\eaab' });\nCodicon.briefcase = new Codicon('briefcase', { fontCharacter: '\\\\eaac' });\nCodicon.broadcast = new Codicon('broadcast', { fontCharacter: '\\\\eaad' });\nCodicon.browser = new Codicon('browser', { fontCharacter: '\\\\eaae' });\nCodicon.bug = new Codicon('bug', { fontCharacter: '\\\\eaaf' });\nCodicon.calendar = new Codicon('calendar', { fontCharacter: '\\\\eab0' });\nCodicon.caseSensitive = new Codicon('case-sensitive', { fontCharacter: '\\\\eab1' });\nCodicon.check = new Codicon('check', { fontCharacter: '\\\\eab2' });\nCodicon.checklist = new Codicon('checklist', { fontCharacter: '\\\\eab3' });\nCodicon.chevronDown = new Codicon('chevron-down', { fontCharacter: '\\\\eab4' });\nCodicon.dropDownButton = new Codicon('drop-down-button', Codicon.chevronDown.definition);\nCodicon.chevronLeft = new Codicon('chevron-left', { fontCharacter: '\\\\eab5' });\nCodicon.chevronRight = new Codicon('chevron-right', { fontCharacter: '\\\\eab6' });\nCodicon.chevronUp = new Codicon('chevron-up', { fontCharacter: '\\\\eab7' });\nCodicon.chromeClose = new Codicon('chrome-close', { fontCharacter: '\\\\eab8' });\nCodicon.chromeMaximize = new Codicon('chrome-maximize', { fontCharacter: '\\\\eab9' });\nCodicon.chromeMinimize = new Codicon('chrome-minimize', { fontCharacter: '\\\\eaba' });\nCodicon.chromeRestore = new Codicon('chrome-restore', { fontCharacter: '\\\\eabb' });\nCodicon.circleOutline = new Codicon('circle-outline', { fontCharacter: '\\\\eabc' });\nCodicon.debugBreakpointUnverified = new Codicon('debug-breakpoint-unverified', { fontCharacter: '\\\\eabc' });\nCodicon.circleSlash = new Codicon('circle-slash', { fontCharacter: '\\\\eabd' });\nCodicon.circuitBoard = new Codicon('circuit-board', { fontCharacter: '\\\\eabe' });\nCodicon.clearAll = new Codicon('clear-all', { fontCharacter: '\\\\eabf' });\nCodicon.clippy = new Codicon('clippy', { fontCharacter: '\\\\eac0' });\nCodicon.closeAll = new Codicon('close-all', { fontCharacter: '\\\\eac1' });\nCodicon.cloudDownload = new Codicon('cloud-download', { fontCharacter: '\\\\eac2' });\nCodicon.cloudUpload = new Codicon('cloud-upload', { fontCharacter: '\\\\eac3' });\nCodicon.code = new Codicon('code', { fontCharacter: '\\\\eac4' });\nCodicon.collapseAll = new Codicon('collapse-all', { fontCharacter: '\\\\eac5' });\nCodicon.colorMode = new Codicon('color-mode', { fontCharacter: '\\\\eac6' });\nCodicon.commentDiscussion = new Codicon('comment-discussion', { fontCharacter: '\\\\eac7' });\nCodicon.compareChanges = new Codicon('compare-changes', { fontCharacter: '\\\\eafd' });\nCodicon.creditCard = new Codicon('credit-card', { fontCharacter: '\\\\eac9' });\nCodicon.dash = new Codicon('dash', { fontCharacter: '\\\\eacc' });\nCodicon.dashboard = new Codicon('dashboard', { fontCharacter: '\\\\eacd' });\nCodicon.database = new Codicon('database', { fontCharacter: '\\\\eace' });\nCodicon.debugContinue = new Codicon('debug-continue', { fontCharacter: '\\\\eacf' });\nCodicon.debugDisconnect = new Codicon('debug-disconnect', { fontCharacter: '\\\\ead0' });\nCodicon.debugPause = new Codicon('debug-pause', { fontCharacter: '\\\\ead1' });\nCodicon.debugRestart = new Codicon('debug-restart', { fontCharacter: '\\\\ead2' });\nCodicon.debugStart = new Codicon('debug-start', { fontCharacter: '\\\\ead3' });\nCodicon.debugStepInto = new Codicon('debug-step-into', { fontCharacter: '\\\\ead4' });\nCodicon.debugStepOut = new Codicon('debug-step-out', { fontCharacter: '\\\\ead5' });\nCodicon.debugStepOver = new Codicon('debug-step-over', { fontCharacter: '\\\\ead6' });\nCodicon.debugStop = new Codicon('debug-stop', { fontCharacter: '\\\\ead7' });\nCodicon.debug = new Codicon('debug', { fontCharacter: '\\\\ead8' });\nCodicon.deviceCameraVideo = new Codicon('device-camera-video', { fontCharacter: '\\\\ead9' });\nCodicon.deviceCamera = new Codicon('device-camera', { fontCharacter: '\\\\eada' });\nCodicon.deviceMobile = new Codicon('device-mobile', { fontCharacter: '\\\\eadb' });\nCodicon.diffAdded = new Codicon('diff-added', { fontCharacter: '\\\\eadc' });\nCodicon.diffIgnored = new Codicon('diff-ignored', { fontCharacter: '\\\\eadd' });\nCodicon.diffModified = new Codicon('diff-modified', { fontCharacter: '\\\\eade' });\nCodicon.diffRemoved = new Codicon('diff-removed', { fontCharacter: '\\\\eadf' });\nCodicon.diffRenamed = new Codicon('diff-renamed', { fontCharacter: '\\\\eae0' });\nCodicon.diff = new Codicon('diff', { fontCharacter: '\\\\eae1' });\nCodicon.discard = new Codicon('discard', { fontCharacter: '\\\\eae2' });\nCodicon.editorLayout = new Codicon('editor-layout', { fontCharacter: '\\\\eae3' });\nCodicon.emptyWindow = new Codicon('empty-window', { fontCharacter: '\\\\eae4' });\nCodicon.exclude = new Codicon('exclude', { fontCharacter: '\\\\eae5' });\nCodicon.extensions = new Codicon('extensions', { fontCharacter: '\\\\eae6' });\nCodicon.eyeClosed = new Codicon('eye-closed', { fontCharacter: '\\\\eae7' });\nCodicon.fileBinary = new Codicon('file-binary', { fontCharacter: '\\\\eae8' });\nCodicon.fileCode = new Codicon('file-code', { fontCharacter: '\\\\eae9' });\nCodicon.fileMedia = new Codicon('file-media', { fontCharacter: '\\\\eaea' });\nCodicon.filePdf = new Codicon('file-pdf', { fontCharacter: '\\\\eaeb' });\nCodicon.fileSubmodule = new Codicon('file-submodule', { fontCharacter: '\\\\eaec' });\nCodicon.fileSymlinkDirectory = new Codicon('file-symlink-directory', { fontCharacter: '\\\\eaed' });\nCodicon.fileSymlinkFile = new Codicon('file-symlink-file', { fontCharacter: '\\\\eaee' });\nCodicon.fileZip = new Codicon('file-zip', { fontCharacter: '\\\\eaef' });\nCodicon.files = new Codicon('files', { fontCharacter: '\\\\eaf0' });\nCodicon.filter = new Codicon('filter', { fontCharacter: '\\\\eaf1' });\nCodicon.flame = new Codicon('flame', { fontCharacter: '\\\\eaf2' });\nCodicon.foldDown = new Codicon('fold-down', { fontCharacter: '\\\\eaf3' });\nCodicon.foldUp = new Codicon('fold-up', { fontCharacter: '\\\\eaf4' });\nCodicon.fold = new Codicon('fold', { fontCharacter: '\\\\eaf5' });\nCodicon.folderActive = new Codicon('folder-active', { fontCharacter: '\\\\eaf6' });\nCodicon.folderOpened = new Codicon('folder-opened', { fontCharacter: '\\\\eaf7' });\nCodicon.gear = new Codicon('gear', { fontCharacter: '\\\\eaf8' });\nCodicon.gift = new Codicon('gift', { fontCharacter: '\\\\eaf9' });\nCodicon.gistSecret = new Codicon('gist-secret', { fontCharacter: '\\\\eafa' });\nCodicon.gist = new Codicon('gist', { fontCharacter: '\\\\eafb' });\nCodicon.gitCommit = new Codicon('git-commit', { fontCharacter: '\\\\eafc' });\nCodicon.gitCompare = new Codicon('git-compare', { fontCharacter: '\\\\eafd' });\nCodicon.gitMerge = new Codicon('git-merge', { fontCharacter: '\\\\eafe' });\nCodicon.githubAction = new Codicon('github-action', { fontCharacter: '\\\\eaff' });\nCodicon.githubAlt = new Codicon('github-alt', { fontCharacter: '\\\\eb00' });\nCodicon.globe = new Codicon('globe', { fontCharacter: '\\\\eb01' });\nCodicon.grabber = new Codicon('grabber', { fontCharacter: '\\\\eb02' });\nCodicon.graph = new Codicon('graph', { fontCharacter: '\\\\eb03' });\nCodicon.gripper = new Codicon('gripper', { fontCharacter: '\\\\eb04' });\nCodicon.heart = new Codicon('heart', { fontCharacter: '\\\\eb05' });\nCodicon.home = new Codicon('home', { fontCharacter: '\\\\eb06' });\nCodicon.horizontalRule = new Codicon('horizontal-rule', { fontCharacter: '\\\\eb07' });\nCodicon.hubot = new Codicon('hubot', { fontCharacter: '\\\\eb08' });\nCodicon.inbox = new Codicon('inbox', { fontCharacter: '\\\\eb09' });\nCodicon.issueClosed = new Codicon('issue-closed', { fontCharacter: '\\\\eba4' });\nCodicon.issueReopened = new Codicon('issue-reopened', { fontCharacter: '\\\\eb0b' });\nCodicon.issues = new Codicon('issues', { fontCharacter: '\\\\eb0c' });\nCodicon.italic = new Codicon('italic', { fontCharacter: '\\\\eb0d' });\nCodicon.jersey = new Codicon('jersey', { fontCharacter: '\\\\eb0e' });\nCodicon.json = new Codicon('json', { fontCharacter: '\\\\eb0f' });\nCodicon.kebabVertical = new Codicon('kebab-vertical', { fontCharacter: '\\\\eb10' });\nCodicon.key = new Codicon('key', { fontCharacter: '\\\\eb11' });\nCodicon.law = new Codicon('law', { fontCharacter: '\\\\eb12' });\nCodicon.lightbulbAutofix = new Codicon('lightbulb-autofix', { fontCharacter: '\\\\eb13' });\nCodicon.linkExternal = new Codicon('link-external', { fontCharacter: '\\\\eb14' });\nCodicon.link = new Codicon('link', { fontCharacter: '\\\\eb15' });\nCodicon.listOrdered = new Codicon('list-ordered', { fontCharacter: '\\\\eb16' });\nCodicon.listUnordered = new Codicon('list-unordered', { fontCharacter: '\\\\eb17' });\nCodicon.liveShare = new Codicon('live-share', { fontCharacter: '\\\\eb18' });\nCodicon.loading = new Codicon('loading', { fontCharacter: '\\\\eb19' });\nCodicon.location = new Codicon('location', { fontCharacter: '\\\\eb1a' });\nCodicon.mailRead = new Codicon('mail-read', { fontCharacter: '\\\\eb1b' });\nCodicon.mail = new Codicon('mail', { fontCharacter: '\\\\eb1c' });\nCodicon.markdown = new Codicon('markdown', { fontCharacter: '\\\\eb1d' });\nCodicon.megaphone = new Codicon('megaphone', { fontCharacter: '\\\\eb1e' });\nCodicon.mention = new Codicon('mention', { fontCharacter: '\\\\eb1f' });\nCodicon.milestone = new Codicon('milestone', { fontCharacter: '\\\\eb20' });\nCodicon.mortarBoard = new Codicon('mortar-board', { fontCharacter: '\\\\eb21' });\nCodicon.move = new Codicon('move', { fontCharacter: '\\\\eb22' });\nCodicon.multipleWindows = new Codicon('multiple-windows', { fontCharacter: '\\\\eb23' });\nCodicon.mute = new Codicon('mute', { fontCharacter: '\\\\eb24' });\nCodicon.noNewline = new Codicon('no-newline', { fontCharacter: '\\\\eb25' });\nCodicon.note = new Codicon('note', { fontCharacter: '\\\\eb26' });\nCodicon.octoface = new Codicon('octoface', { fontCharacter: '\\\\eb27' });\nCodicon.openPreview = new Codicon('open-preview', { fontCharacter: '\\\\eb28' });\nCodicon.package_ = new Codicon('package', { fontCharacter: '\\\\eb29' });\nCodicon.paintcan = new Codicon('paintcan', { fontCharacter: '\\\\eb2a' });\nCodicon.pin = new Codicon('pin', { fontCharacter: '\\\\eb2b' });\nCodicon.play = new Codicon('play', { fontCharacter: '\\\\eb2c' });\nCodicon.run = new Codicon('run', { fontCharacter: '\\\\eb2c' });\nCodicon.plug = new Codicon('plug', { fontCharacter: '\\\\eb2d' });\nCodicon.preserveCase = new Codicon('preserve-case', { fontCharacter: '\\\\eb2e' });\nCodicon.preview = new Codicon('preview', { fontCharacter: '\\\\eb2f' });\nCodicon.project = new Codicon('project', { fontCharacter: '\\\\eb30' });\nCodicon.pulse = new Codicon('pulse', { fontCharacter: '\\\\eb31' });\nCodicon.question = new Codicon('question', { fontCharacter: '\\\\eb32' });\nCodicon.quote = new Codicon('quote', { fontCharacter: '\\\\eb33' });\nCodicon.radioTower = new Codicon('radio-tower', { fontCharacter: '\\\\eb34' });\nCodicon.reactions = new Codicon('reactions', { fontCharacter: '\\\\eb35' });\nCodicon.references = new Codicon('references', { fontCharacter: '\\\\eb36' });\nCodicon.refresh = new Codicon('refresh', { fontCharacter: '\\\\eb37' });\nCodicon.regex = new Codicon('regex', { fontCharacter: '\\\\eb38' });\nCodicon.remoteExplorer = new Codicon('remote-explorer', { fontCharacter: '\\\\eb39' });\nCodicon.remote = new Codicon('remote', { fontCharacter: '\\\\eb3a' });\nCodicon.remove = new Codicon('remove', { fontCharacter: '\\\\eb3b' });\nCodicon.replaceAll = new Codicon('replace-all', { fontCharacter: '\\\\eb3c' });\nCodicon.replace = new Codicon('replace', { fontCharacter: '\\\\eb3d' });\nCodicon.repoClone = new Codicon('repo-clone', { fontCharacter: '\\\\eb3e' });\nCodicon.repoForcePush = new Codicon('repo-force-push', { fontCharacter: '\\\\eb3f' });\nCodicon.repoPull = new Codicon('repo-pull', { fontCharacter: '\\\\eb40' });\nCodicon.repoPush = new Codicon('repo-push', { fontCharacter: '\\\\eb41' });\nCodicon.report = new Codicon('report', { fontCharacter: '\\\\eb42' });\nCodicon.requestChanges = new Codicon('request-changes', { fontCharacter: '\\\\eb43' });\nCodicon.rocket = new Codicon('rocket', { fontCharacter: '\\\\eb44' });\nCodicon.rootFolderOpened = new Codicon('root-folder-opened', { fontCharacter: '\\\\eb45' });\nCodicon.rootFolder = new Codicon('root-folder', { fontCharacter: '\\\\eb46' });\nCodicon.rss = new Codicon('rss', { fontCharacter: '\\\\eb47' });\nCodicon.ruby = new Codicon('ruby', { fontCharacter: '\\\\eb48' });\nCodicon.saveAll = new Codicon('save-all', { fontCharacter: '\\\\eb49' });\nCodicon.saveAs = new Codicon('save-as', { fontCharacter: '\\\\eb4a' });\nCodicon.save = new Codicon('save', { fontCharacter: '\\\\eb4b' });\nCodicon.screenFull = new Codicon('screen-full', { fontCharacter: '\\\\eb4c' });\nCodicon.screenNormal = new Codicon('screen-normal', { fontCharacter: '\\\\eb4d' });\nCodicon.searchStop = new Codicon('search-stop', { fontCharacter: '\\\\eb4e' });\nCodicon.server = new Codicon('server', { fontCharacter: '\\\\eb50' });\nCodicon.settingsGear = new Codicon('settings-gear', { fontCharacter: '\\\\eb51' });\nCodicon.settings = new Codicon('settings', { fontCharacter: '\\\\eb52' });\nCodicon.shield = new Codicon('shield', { fontCharacter: '\\\\eb53' });\nCodicon.smiley = new Codicon('smiley', { fontCharacter: '\\\\eb54' });\nCodicon.sortPrecedence = new Codicon('sort-precedence', { fontCharacter: '\\\\eb55' });\nCodicon.splitHorizontal = new Codicon('split-horizontal', { fontCharacter: '\\\\eb56' });\nCodicon.splitVertical = new Codicon('split-vertical', { fontCharacter: '\\\\eb57' });\nCodicon.squirrel = new Codicon('squirrel', { fontCharacter: '\\\\eb58' });\nCodicon.starFull = new Codicon('star-full', { fontCharacter: '\\\\eb59' });\nCodicon.starHalf = new Codicon('star-half', { fontCharacter: '\\\\eb5a' });\nCodicon.symbolClass = new Codicon('symbol-class', { fontCharacter: '\\\\eb5b' });\nCodicon.symbolColor = new Codicon('symbol-color', { fontCharacter: '\\\\eb5c' });\nCodicon.symbolCustomColor = new Codicon('symbol-customcolor', { fontCharacter: '\\\\eb5c' });\nCodicon.symbolConstant = new Codicon('symbol-constant', { fontCharacter: '\\\\eb5d' });\nCodicon.symbolEnumMember = new Codicon('symbol-enum-member', { fontCharacter: '\\\\eb5e' });\nCodicon.symbolField = new Codicon('symbol-field', { fontCharacter: '\\\\eb5f' });\nCodicon.symbolFile = new Codicon('symbol-file', { fontCharacter: '\\\\eb60' });\nCodicon.symbolInterface = new Codicon('symbol-interface', { fontCharacter: '\\\\eb61' });\nCodicon.symbolKeyword = new Codicon('symbol-keyword', { fontCharacter: '\\\\eb62' });\nCodicon.symbolMisc = new Codicon('symbol-misc', { fontCharacter: '\\\\eb63' });\nCodicon.symbolOperator = new Codicon('symbol-operator', { fontCharacter: '\\\\eb64' });\nCodicon.symbolProperty = new Codicon('symbol-property', { fontCharacter: '\\\\eb65' });\nCodicon.wrench = new Codicon('wrench', { fontCharacter: '\\\\eb65' });\nCodicon.wrenchSubaction = new Codicon('wrench-subaction', { fontCharacter: '\\\\eb65' });\nCodicon.symbolSnippet = new Codicon('symbol-snippet', { fontCharacter: '\\\\eb66' });\nCodicon.tasklist = new Codicon('tasklist', { fontCharacter: '\\\\eb67' });\nCodicon.telescope = new Codicon('telescope', { fontCharacter: '\\\\eb68' });\nCodicon.textSize = new Codicon('text-size', { fontCharacter: '\\\\eb69' });\nCodicon.threeBars = new Codicon('three-bars', { fontCharacter: '\\\\eb6a' });\nCodicon.thumbsdown = new Codicon('thumbsdown', { fontCharacter: '\\\\eb6b' });\nCodicon.thumbsup = new Codicon('thumbsup', { fontCharacter: '\\\\eb6c' });\nCodicon.tools = new Codicon('tools', { fontCharacter: '\\\\eb6d' });\nCodicon.triangleDown = new Codicon('triangle-down', { fontCharacter: '\\\\eb6e' });\nCodicon.triangleLeft = new Codicon('triangle-left', { fontCharacter: '\\\\eb6f' });\nCodicon.triangleRight = new Codicon('triangle-right', { fontCharacter: '\\\\eb70' });\nCodicon.triangleUp = new Codicon('triangle-up', { fontCharacter: '\\\\eb71' });\nCodicon.twitter = new Codicon('twitter', { fontCharacter: '\\\\eb72' });\nCodicon.unfold = new Codicon('unfold', { fontCharacter: '\\\\eb73' });\nCodicon.unlock = new Codicon('unlock', { fontCharacter: '\\\\eb74' });\nCodicon.unmute = new Codicon('unmute', { fontCharacter: '\\\\eb75' });\nCodicon.unverified = new Codicon('unverified', { fontCharacter: '\\\\eb76' });\nCodicon.verified = new Codicon('verified', { fontCharacter: '\\\\eb77' });\nCodicon.versions = new Codicon('versions', { fontCharacter: '\\\\eb78' });\nCodicon.vmActive = new Codicon('vm-active', { fontCharacter: '\\\\eb79' });\nCodicon.vmOutline = new Codicon('vm-outline', { fontCharacter: '\\\\eb7a' });\nCodicon.vmRunning = new Codicon('vm-running', { fontCharacter: '\\\\eb7b' });\nCodicon.watch = new Codicon('watch', { fontCharacter: '\\\\eb7c' });\nCodicon.whitespace = new Codicon('whitespace', { fontCharacter: '\\\\eb7d' });\nCodicon.wholeWord = new Codicon('whole-word', { fontCharacter: '\\\\eb7e' });\nCodicon.window = new Codicon('window', { fontCharacter: '\\\\eb7f' });\nCodicon.wordWrap = new Codicon('word-wrap', { fontCharacter: '\\\\eb80' });\nCodicon.zoomIn = new Codicon('zoom-in', { fontCharacter: '\\\\eb81' });\nCodicon.zoomOut = new Codicon('zoom-out', { fontCharacter: '\\\\eb82' });\nCodicon.listFilter = new Codicon('list-filter', { fontCharacter: '\\\\eb83' });\nCodicon.listFlat = new Codicon('list-flat', { fontCharacter: '\\\\eb84' });\nCodicon.listSelection = new Codicon('list-selection', { fontCharacter: '\\\\eb85' });\nCodicon.selection = new Codicon('selection', { fontCharacter: '\\\\eb85' });\nCodicon.listTree = new Codicon('list-tree', { fontCharacter: '\\\\eb86' });\nCodicon.debugBreakpointFunctionUnverified = new Codicon('debug-breakpoint-function-unverified', { fontCharacter: '\\\\eb87' });\nCodicon.debugBreakpointFunction = new Codicon('debug-breakpoint-function', { fontCharacter: '\\\\eb88' });\nCodicon.debugBreakpointFunctionDisabled = new Codicon('debug-breakpoint-function-disabled', { fontCharacter: '\\\\eb88' });\nCodicon.debugStackframeActive = new Codicon('debug-stackframe-active', { fontCharacter: '\\\\eb89' });\nCodicon.circleSmallFilled = new Codicon('circle-small-filled', { fontCharacter: '\\\\eb8a' });\nCodicon.debugStackframeDot = new Codicon('debug-stackframe-dot', Codicon.circleSmallFilled.definition);\nCodicon.debugStackframe = new Codicon('debug-stackframe', { fontCharacter: '\\\\eb8b' });\nCodicon.debugStackframeFocused = new Codicon('debug-stackframe-focused', { fontCharacter: '\\\\eb8b' });\nCodicon.debugBreakpointUnsupported = new Codicon('debug-breakpoint-unsupported', { fontCharacter: '\\\\eb8c' });\nCodicon.symbolString = new Codicon('symbol-string', { fontCharacter: '\\\\eb8d' });\nCodicon.debugReverseContinue = new Codicon('debug-reverse-continue', { fontCharacter: '\\\\eb8e' });\nCodicon.debugStepBack = new Codicon('debug-step-back', { fontCharacter: '\\\\eb8f' });\nCodicon.debugRestartFrame = new Codicon('debug-restart-frame', { fontCharacter: '\\\\eb90' });\nCodicon.callIncoming = new Codicon('call-incoming', { fontCharacter: '\\\\eb92' });\nCodicon.callOutgoing = new Codicon('call-outgoing', { fontCharacter: '\\\\eb93' });\nCodicon.menu = new Codicon('menu', { fontCharacter: '\\\\eb94' });\nCodicon.expandAll = new Codicon('expand-all', { fontCharacter: '\\\\eb95' });\nCodicon.feedback = new Codicon('feedback', { fontCharacter: '\\\\eb96' });\nCodicon.groupByRefType = new Codicon('group-by-ref-type', { fontCharacter: '\\\\eb97' });\nCodicon.ungroupByRefType = new Codicon('ungroup-by-ref-type', { fontCharacter: '\\\\eb98' });\nCodicon.account = new Codicon('account', { fontCharacter: '\\\\eb99' });\nCodicon.bellDot = new Codicon('bell-dot', { fontCharacter: '\\\\eb9a' });\nCodicon.debugConsole = new Codicon('debug-console', { fontCharacter: '\\\\eb9b' });\nCodicon.library = new Codicon('library', { fontCharacter: '\\\\eb9c' });\nCodicon.output = new Codicon('output', { fontCharacter: '\\\\eb9d' });\nCodicon.runAll = new Codicon('run-all', { fontCharacter: '\\\\eb9e' });\nCodicon.syncIgnored = new Codicon('sync-ignored', { fontCharacter: '\\\\eb9f' });\nCodicon.pinned = new Codicon('pinned', { fontCharacter: '\\\\eba0' });\nCodicon.githubInverted = new Codicon('github-inverted', { fontCharacter: '\\\\eba1' });\nCodicon.debugAlt = new Codicon('debug-alt', { fontCharacter: '\\\\eb91' });\nCodicon.serverProcess = new Codicon('server-process', { fontCharacter: '\\\\eba2' });\nCodicon.serverEnvironment = new Codicon('server-environment', { fontCharacter: '\\\\eba3' });\nCodicon.pass = new Codicon('pass', { fontCharacter: '\\\\eba4' });\nCodicon.stopCircle = new Codicon('stop-circle', { fontCharacter: '\\\\eba5' });\nCodicon.playCircle = new Codicon('play-circle', { fontCharacter: '\\\\eba6' });\nCodicon.record = new Codicon('record', { fontCharacter: '\\\\eba7' });\nCodicon.debugAltSmall = new Codicon('debug-alt-small', { fontCharacter: '\\\\eba8' });\nCodicon.vmConnect = new Codicon('vm-connect', { fontCharacter: '\\\\eba9' });\nCodicon.cloud = new Codicon('cloud', { fontCharacter: '\\\\ebaa' });\nCodicon.merge = new Codicon('merge', { fontCharacter: '\\\\ebab' });\nCodicon.exportIcon = new Codicon('export', { fontCharacter: '\\\\ebac' });\nCodicon.graphLeft = new Codicon('graph-left', { fontCharacter: '\\\\ebad' });\nCodicon.magnet = new Codicon('magnet', { fontCharacter: '\\\\ebae' });\nCodicon.notebook = new Codicon('notebook', { fontCharacter: '\\\\ebaf' });\nCodicon.redo = new Codicon('redo', { fontCharacter: '\\\\ebb0' });\nCodicon.checkAll = new Codicon('check-all', { fontCharacter: '\\\\ebb1' });\nCodicon.pinnedDirty = new Codicon('pinned-dirty', { fontCharacter: '\\\\ebb2' });\nCodicon.passFilled = new Codicon('pass-filled', { fontCharacter: '\\\\ebb3' });\nCodicon.circleLargeFilled = new Codicon('circle-large-filled', { fontCharacter: '\\\\ebb4' });\nCodicon.circleLargeOutline = new Codicon('circle-large-outline', { fontCharacter: '\\\\ebb5' });\nCodicon.combine = new Codicon('combine', { fontCharacter: '\\\\ebb6' });\nCodicon.gather = new Codicon('gather', { fontCharacter: '\\\\ebb6' });\nCodicon.table = new Codicon('table', { fontCharacter: '\\\\ebb7' });\nCodicon.variableGroup = new Codicon('variable-group', { fontCharacter: '\\\\ebb8' });\nCodicon.typeHierarchy = new Codicon('type-hierarchy', { fontCharacter: '\\\\ebb9' });\nCodicon.typeHierarchySub = new Codicon('type-hierarchy-sub', { fontCharacter: '\\\\ebba' });\nCodicon.typeHierarchySuper = new Codicon('type-hierarchy-super', { fontCharacter: '\\\\ebbb' });\nCodicon.gitPullRequestCreate = new Codicon('git-pull-request-create', { fontCharacter: '\\\\ebbc' });\nCodicon.runAbove = new Codicon('run-above', { fontCharacter: '\\\\ebbd' });\nCodicon.runBelow = new Codicon('run-below', { fontCharacter: '\\\\ebbe' });\nCodicon.notebookTemplate = new Codicon('notebook-template', { fontCharacter: '\\\\ebbf' });\nCodicon.debugRerun = new Codicon('debug-rerun', { fontCharacter: '\\\\ebc0' });\nCodicon.workspaceTrusted = new Codicon('workspace-trusted', { fontCharacter: '\\\\ebc1' });\nCodicon.workspaceUntrusted = new Codicon('workspace-untrusted', { fontCharacter: '\\\\ebc2' });\nCodicon.workspaceUnspecified = new Codicon('workspace-unspecified', { fontCharacter: '\\\\ebc3' });\nCodicon.terminalCmd = new Codicon('terminal-cmd', { fontCharacter: '\\\\ebc4' });\nCodicon.terminalDebian = new Codicon('terminal-debian', { fontCharacter: '\\\\ebc5' });\nCodicon.terminalLinux = new Codicon('terminal-linux', { fontCharacter: '\\\\ebc6' });\nCodicon.terminalPowershell = new Codicon('terminal-powershell', { fontCharacter: '\\\\ebc7' });\nCodicon.terminalTmux = new Codicon('terminal-tmux', { fontCharacter: '\\\\ebc8' });\nCodicon.terminalUbuntu = new Codicon('terminal-ubuntu', { fontCharacter: '\\\\ebc9' });\nCodicon.terminalBash = new Codicon('terminal-bash', { fontCharacter: '\\\\ebca' });\nCodicon.arrowSwap = new Codicon('arrow-swap', { fontCharacter: '\\\\ebcb' });\nCodicon.copy = new Codicon('copy', { fontCharacter: '\\\\ebcc' });\nCodicon.personAdd = new Codicon('person-add', { fontCharacter: '\\\\ebcd' });\nCodicon.filterFilled = new Codicon('filter-filled', { fontCharacter: '\\\\ebce' });\nCodicon.wand = new Codicon('wand', { fontCharacter: '\\\\ebcf' });\nCodicon.debugLineByLine = new Codicon('debug-line-by-line', { fontCharacter: '\\\\ebd0' });\nCodicon.inspect = new Codicon('inspect', { fontCharacter: '\\\\ebd1' });\nCodicon.layers = new Codicon('layers', { fontCharacter: '\\\\ebd2' });\nCodicon.layersDot = new Codicon('layers-dot', { fontCharacter: '\\\\ebd3' });\nCodicon.layersActive = new Codicon('layers-active', { fontCharacter: '\\\\ebd4' });\nCodicon.compass = new Codicon('compass', { fontCharacter: '\\\\ebd5' });\nCodicon.compassDot = new Codicon('compass-dot', { fontCharacter: '\\\\ebd6' });\nCodicon.compassActive = new Codicon('compass-active', { fontCharacter: '\\\\ebd7' });\nCodicon.azure = new Codicon('azure', { fontCharacter: '\\\\ebd8' });\nCodicon.issueDraft = new Codicon('issue-draft', { fontCharacter: '\\\\ebd9' });\nCodicon.gitPullRequestClosed = new Codicon('git-pull-request-closed', { fontCharacter: '\\\\ebda' });\nCodicon.gitPullRequestDraft = new Codicon('git-pull-request-draft', { fontCharacter: '\\\\ebdb' });\nCodicon.debugAll = new Codicon('debug-all', { fontCharacter: '\\\\ebdc' });\nCodicon.debugCoverage = new Codicon('debug-coverage', { fontCharacter: '\\\\ebdd' });\nCodicon.runErrors = new Codicon('run-errors', { fontCharacter: '\\\\ebde' });\nCodicon.folderLibrary = new Codicon('folder-library', { fontCharacter: '\\\\ebdf' });\nCodicon.debugContinueSmall = new Codicon('debug-continue-small', { fontCharacter: '\\\\ebe0' });\nCodicon.beakerStop = new Codicon('beaker-stop', { fontCharacter: '\\\\ebe1' });\nCodicon.graphLine = new Codicon('graph-line', { fontCharacter: '\\\\ebe2' });\nCodicon.graphScatter = new Codicon('graph-scatter', { fontCharacter: '\\\\ebe3' });\nCodicon.pieChart = new Codicon('pie-chart', { fontCharacter: '\\\\ebe4' });\nCodicon.bracket = new Codicon('bracket', Codicon.json.definition);\nCodicon.bracketDot = new Codicon('bracket-dot', { fontCharacter: '\\\\ebe5' });\nCodicon.bracketError = new Codicon('bracket-error', { fontCharacter: '\\\\ebe6' });\nCodicon.lockSmall = new Codicon('lock-small', { fontCharacter: '\\\\ebe7' });\nCodicon.azureDevops = new Codicon('azure-devops', { fontCharacter: '\\\\ebe8' });\nCodicon.verifiedFilled = new Codicon('verified-filled', { fontCharacter: '\\\\ebe9' });\nCodicon.newLine = new Codicon('newline', { fontCharacter: '\\\\ebea' });\nCodicon.layout = new Codicon('layout', { fontCharacter: '\\\\ebeb' });\nCodicon.layoutActivitybarLeft = new Codicon('layout-activitybar-left', { fontCharacter: '\\\\ebec' });\nCodicon.layoutActivitybarRight = new Codicon('layout-activitybar-right', { fontCharacter: '\\\\ebed' });\nCodicon.layoutPanelLeft = new Codicon('layout-panel-left', { fontCharacter: '\\\\ebee' });\nCodicon.layoutPanelCenter = new Codicon('layout-panel-center', { fontCharacter: '\\\\ebef' });\nCodicon.layoutPanelJustify = new Codicon('layout-panel-justify', { fontCharacter: '\\\\ebf0' });\nCodicon.layoutPanelRight = new Codicon('layout-panel-right', { fontCharacter: '\\\\ebf1' });\nCodicon.layoutPanel = new Codicon('layout-panel', { fontCharacter: '\\\\ebf2' });\nCodicon.layoutSidebarLeft = new Codicon('layout-sidebar-left', { fontCharacter: '\\\\ebf3' });\nCodicon.layoutSidebarRight = new Codicon('layout-sidebar-right', { fontCharacter: '\\\\ebf4' });\nCodicon.layoutStatusbar = new Codicon('layout-statusbar', { fontCharacter: '\\\\ebf5' });\nCodicon.layoutMenubar = new Codicon('layout-menubar', { fontCharacter: '\\\\ebf6' });\nCodicon.layoutCentered = new Codicon('layout-centered', { fontCharacter: '\\\\ebf7' });\nCodicon.layoutSidebarRightOff = new Codicon('layout-sidebar-right-off', { fontCharacter: '\\\\ec00' });\nCodicon.layoutPanelOff = new Codicon('layout-panel-off', { fontCharacter: '\\\\ec01' });\nCodicon.layoutSidebarLeftOff = new Codicon('layout-sidebar-left-off', { fontCharacter: '\\\\ec02' });\nCodicon.target = new Codicon('target', { fontCharacter: '\\\\ebf8' });\nCodicon.indent = new Codicon('indent', { fontCharacter: '\\\\ebf9' });\nCodicon.recordSmall = new Codicon('record-small', { fontCharacter: '\\\\ebfa' });\nCodicon.errorSmall = new Codicon('error-small', { fontCharacter: '\\\\ebfb' });\nCodicon.arrowCircleDown = new Codicon('arrow-circle-down', { fontCharacter: '\\\\ebfc' });\nCodicon.arrowCircleLeft = new Codicon('arrow-circle-left', { fontCharacter: '\\\\ebfd' });\nCodicon.arrowCircleRight = new Codicon('arrow-circle-right', { fontCharacter: '\\\\ebfe' });\nCodicon.arrowCircleUp = new Codicon('arrow-circle-up', { fontCharacter: '\\\\ebff' });\nCodicon.heartFilled = new Codicon('heart-filled', { fontCharacter: '\\\\ec04' });\nCodicon.map = new Codicon('map', { fontCharacter: '\\\\ec05' });\nCodicon.mapFilled = new Codicon('map-filled', { fontCharacter: '\\\\ec06' });\nCodicon.circleSmall = new Codicon('circle-small', { fontCharacter: '\\\\ec07' });\nCodicon.bellSlash = new Codicon('bell-slash', { fontCharacter: '\\\\ec08' });\nCodicon.bellSlashDot = new Codicon('bell-slash-dot', { fontCharacter: '\\\\ec09' });\nCodicon.commentUnresolved = new Codicon('comment-unresolved', { fontCharacter: '\\\\ec0a' });\nCodicon.gitPullRequestGoToChanges = new Codicon('git-pull-request-go-to-changes', { fontCharacter: '\\\\ec0b' });\nCodicon.gitPullRequestNewChanges = new Codicon('git-pull-request-new-changes', { fontCharacter: '\\\\ec0c' });\n// derived icons, that could become separate icons\nCodicon.dialogError = new Codicon('dialog-error', Codicon.error.definition);\nCodicon.dialogWarning = new Codicon('dialog-warning', Codicon.warning.definition);\nCodicon.dialogInfo = new Codicon('dialog-info', Codicon.info.definition);\nCodicon.dialogClose = new Codicon('dialog-close', Codicon.close.definition);\nCodicon.treeItemExpanded = new Codicon('tree-item-expanded', Codicon.chevronDown.definition); // collapsed is done with rotation\nCodicon.treeFilterOnTypeOn = new Codicon('tree-filter-on-type-on', Codicon.listFilter.definition);\nCodicon.treeFilterOnTypeOff = new Codicon('tree-filter-on-type-off', Codicon.listSelection.definition);\nCodicon.treeFilterClear = new Codicon('tree-filter-clear', Codicon.close.definition);\nCodicon.treeItemLoading = new Codicon('tree-item-loading', Codicon.loading.definition);\nCodicon.menuSelection = new Codicon('menu-selection', Codicon.check.definition);\nCodicon.menuSubmenu = new Codicon('menu-submenu', Codicon.chevronRight.definition);\nCodicon.menuBarMore = new Codicon('menubar-more', Codicon.more.definition);\nCodicon.scrollbarButtonLeft = new Codicon('scrollbar-button-left', Codicon.triangleLeft.definition);\nCodicon.scrollbarButtonRight = new Codicon('scrollbar-button-right', Codicon.triangleRight.definition);\nCodicon.scrollbarButtonUp = new Codicon('scrollbar-button-up', Codicon.triangleUp.definition);\nCodicon.scrollbarButtonDown = new Codicon('scrollbar-button-down', Codicon.triangleDown.definition);\nCodicon.toolBarMore = new Codicon('toolbar-more', Codicon.more.definition);\nCodicon.quickInputBack = new Codicon('quick-input-back', Codicon.arrowLeft.definition);\nexport var CSSIcon;\n(function (CSSIcon) {\n CSSIcon.iconNameSegment = '[A-Za-z0-9]+';\n CSSIcon.iconNameExpression = '[A-Za-z0-9-]+';\n CSSIcon.iconModifierExpression = '~[A-Za-z]+';\n CSSIcon.iconNameCharacter = '[A-Za-z0-9~-]';\n const cssIconIdRegex = new RegExp(`^(${CSSIcon.iconNameExpression})(${CSSIcon.iconModifierExpression})?$`);\n function asClassNameArray(icon) {\n if (icon instanceof Codicon) {\n return ['codicon', 'codicon-' + icon.id];\n }\n const match = cssIconIdRegex.exec(icon.id);\n if (!match) {\n return asClassNameArray(Codicon.error);\n }\n const [, id, modifier] = match;\n const classNames = ['codicon', 'codicon-' + id];\n if (modifier) {\n classNames.push('codicon-modifier-' + modifier.substr(1));\n }\n return classNames;\n }\n CSSIcon.asClassNameArray = asClassNameArray;\n function asClassName(icon) {\n return asClassNameArray(icon).join(' ');\n }\n CSSIcon.asClassName = asClassName;\n function asCSSSelector(icon) {\n return '.' + asClassNameArray(icon).join('.');\n }\n CSSIcon.asCSSSelector = asCSSSelector;\n})(CSSIcon || (CSSIcon = {}));\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { DiffChange } from './diffChange.js';\nimport { stringHash } from '../hash.js';\nexport class StringDiffSequence {\n constructor(source) {\n this.source = source;\n }\n getElements() {\n const source = this.source;\n const characters = new Int32Array(source.length);\n for (let i = 0, len = source.length; i < len; i++) {\n characters[i] = source.charCodeAt(i);\n }\n return characters;\n }\n}\nexport function stringDiff(original, modified, pretty) {\n return new LcsDiff(new StringDiffSequence(original), new StringDiffSequence(modified)).ComputeDiff(pretty).changes;\n}\n//\n// The code below has been ported from a C# implementation in VS\n//\nexport class Debug {\n static Assert(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n }\n}\nexport class MyArray {\n /**\n * Copies a range of elements from an Array starting at the specified source index and pastes\n * them to another Array starting at the specified destination index. The length and the indexes\n * are specified as 64-bit integers.\n * sourceArray:\n *\t\tThe Array that contains the data to copy.\n * sourceIndex:\n *\t\tA 64-bit integer that represents the index in the sourceArray at which copying begins.\n * destinationArray:\n *\t\tThe Array that receives the data.\n * destinationIndex:\n *\t\tA 64-bit integer that represents the index in the destinationArray at which storing begins.\n * length:\n *\t\tA 64-bit integer that represents the number of elements to copy.\n */\n static Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length) {\n for (let i = 0; i < length; i++) {\n destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];\n }\n }\n static Copy2(sourceArray, sourceIndex, destinationArray, destinationIndex, length) {\n for (let i = 0; i < length; i++) {\n destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];\n }\n }\n}\n/**\n * A utility class which helps to create the set of DiffChanges from\n * a difference operation. This class accepts original DiffElements and\n * modified DiffElements that are involved in a particular change. The\n * MarkNextChange() method can be called to mark the separation between\n * distinct changes. At the end, the Changes property can be called to retrieve\n * the constructed changes.\n */\nclass DiffChangeHelper {\n /**\n * Constructs a new DiffChangeHelper for the given DiffSequences.\n */\n constructor() {\n this.m_changes = [];\n this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n this.m_originalCount = 0;\n this.m_modifiedCount = 0;\n }\n /**\n * Marks the beginning of the next change in the set of differences.\n */\n MarkNextChange() {\n // Only add to the list if there is something to add\n if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n // Add the new change to our list\n this.m_changes.push(new DiffChange(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount));\n }\n // Reset for the next change\n this.m_originalCount = 0;\n this.m_modifiedCount = 0;\n this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n }\n /**\n * Adds the original element at the given position to the elements\n * affected by the current change. The modified index gives context\n * to the change position with respect to the original sequence.\n * @param originalIndex The index of the original element to add.\n * @param modifiedIndex The index of the modified element that provides corresponding position in the modified sequence.\n */\n AddOriginalElement(originalIndex, modifiedIndex) {\n // The 'true' start index is the smallest of the ones we've seen\n this.m_originalStart = Math.min(this.m_originalStart, originalIndex);\n this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex);\n this.m_originalCount++;\n }\n /**\n * Adds the modified element at the given position to the elements\n * affected by the current change. The original index gives context\n * to the change position with respect to the modified sequence.\n * @param originalIndex The index of the original element that provides corresponding position in the original sequence.\n * @param modifiedIndex The index of the modified element to add.\n */\n AddModifiedElement(originalIndex, modifiedIndex) {\n // The 'true' start index is the smallest of the ones we've seen\n this.m_originalStart = Math.min(this.m_originalStart, originalIndex);\n this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex);\n this.m_modifiedCount++;\n }\n /**\n * Retrieves all of the changes marked by the class.\n */\n getChanges() {\n if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n // Finish up on whatever is left\n this.MarkNextChange();\n }\n return this.m_changes;\n }\n /**\n * Retrieves all of the changes marked by the class in the reverse order\n */\n getReverseChanges() {\n if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n // Finish up on whatever is left\n this.MarkNextChange();\n }\n this.m_changes.reverse();\n return this.m_changes;\n }\n}\n/**\n * An implementation of the difference algorithm described in\n * \"An O(ND) Difference Algorithm and its variations\" by Eugene W. Myers\n */\nexport class LcsDiff {\n /**\n * Constructs the DiffFinder\n */\n constructor(originalSequence, modifiedSequence, continueProcessingPredicate = null) {\n this.ContinueProcessingPredicate = continueProcessingPredicate;\n this._originalSequence = originalSequence;\n this._modifiedSequence = modifiedSequence;\n const [originalStringElements, originalElementsOrHash, originalHasStrings] = LcsDiff._getElements(originalSequence);\n const [modifiedStringElements, modifiedElementsOrHash, modifiedHasStrings] = LcsDiff._getElements(modifiedSequence);\n this._hasStrings = (originalHasStrings && modifiedHasStrings);\n this._originalStringElements = originalStringElements;\n this._originalElementsOrHash = originalElementsOrHash;\n this._modifiedStringElements = modifiedStringElements;\n this._modifiedElementsOrHash = modifiedElementsOrHash;\n this.m_forwardHistory = [];\n this.m_reverseHistory = [];\n }\n static _isStringArray(arr) {\n return (arr.length > 0 && typeof arr[0] === 'string');\n }\n static _getElements(sequence) {\n const elements = sequence.getElements();\n if (LcsDiff._isStringArray(elements)) {\n const hashes = new Int32Array(elements.length);\n for (let i = 0, len = elements.length; i < len; i++) {\n hashes[i] = stringHash(elements[i], 0);\n }\n return [elements, hashes, true];\n }\n if (elements instanceof Int32Array) {\n return [[], elements, false];\n }\n return [[], new Int32Array(elements), false];\n }\n ElementsAreEqual(originalIndex, newIndex) {\n if (this._originalElementsOrHash[originalIndex] !== this._modifiedElementsOrHash[newIndex]) {\n return false;\n }\n return (this._hasStrings ? this._originalStringElements[originalIndex] === this._modifiedStringElements[newIndex] : true);\n }\n ElementsAreStrictEqual(originalIndex, newIndex) {\n if (!this.ElementsAreEqual(originalIndex, newIndex)) {\n return false;\n }\n const originalElement = LcsDiff._getStrictElement(this._originalSequence, originalIndex);\n const modifiedElement = LcsDiff._getStrictElement(this._modifiedSequence, newIndex);\n return (originalElement === modifiedElement);\n }\n static _getStrictElement(sequence, index) {\n if (typeof sequence.getStrictElement === 'function') {\n return sequence.getStrictElement(index);\n }\n return null;\n }\n OriginalElementsAreEqual(index1, index2) {\n if (this._originalElementsOrHash[index1] !== this._originalElementsOrHash[index2]) {\n return false;\n }\n return (this._hasStrings ? this._originalStringElements[index1] === this._originalStringElements[index2] : true);\n }\n ModifiedElementsAreEqual(index1, index2) {\n if (this._modifiedElementsOrHash[index1] !== this._modifiedElementsOrHash[index2]) {\n return false;\n }\n return (this._hasStrings ? this._modifiedStringElements[index1] === this._modifiedStringElements[index2] : true);\n }\n ComputeDiff(pretty) {\n return this._ComputeDiff(0, this._originalElementsOrHash.length - 1, 0, this._modifiedElementsOrHash.length - 1, pretty);\n }\n /**\n * Computes the differences between the original and modified input\n * sequences on the bounded range.\n * @returns An array of the differences between the two input sequences.\n */\n _ComputeDiff(originalStart, originalEnd, modifiedStart, modifiedEnd, pretty) {\n const quitEarlyArr = [false];\n let changes = this.ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr);\n if (pretty) {\n // We have to clean up the computed diff to be more intuitive\n // but it turns out this cannot be done correctly until the entire set\n // of diffs have been computed\n changes = this.PrettifyChanges(changes);\n }\n return {\n quitEarly: quitEarlyArr[0],\n changes: changes\n };\n }\n /**\n * Private helper method which computes the differences on the bounded range\n * recursively.\n * @returns An array of the differences between the two input sequences.\n */\n ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr) {\n quitEarlyArr[0] = false;\n // Find the start of the differences\n while (originalStart <= originalEnd && modifiedStart <= modifiedEnd && this.ElementsAreEqual(originalStart, modifiedStart)) {\n originalStart++;\n modifiedStart++;\n }\n // Find the end of the differences\n while (originalEnd >= originalStart && modifiedEnd >= modifiedStart && this.ElementsAreEqual(originalEnd, modifiedEnd)) {\n originalEnd--;\n modifiedEnd--;\n }\n // In the special case where we either have all insertions or all deletions or the sequences are identical\n if (originalStart > originalEnd || modifiedStart > modifiedEnd) {\n let changes;\n if (modifiedStart <= modifiedEnd) {\n Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd');\n // All insertions\n changes = [\n new DiffChange(originalStart, 0, modifiedStart, modifiedEnd - modifiedStart + 1)\n ];\n }\n else if (originalStart <= originalEnd) {\n Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd');\n // All deletions\n changes = [\n new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, 0)\n ];\n }\n else {\n Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd');\n Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd');\n // Identical sequences - No differences\n changes = [];\n }\n return changes;\n }\n // This problem can be solved using the Divide-And-Conquer technique.\n const midOriginalArr = [0];\n const midModifiedArr = [0];\n const result = this.ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr);\n const midOriginal = midOriginalArr[0];\n const midModified = midModifiedArr[0];\n if (result !== null) {\n // Result is not-null when there was enough memory to compute the changes while\n // searching for the recursion point\n return result;\n }\n else if (!quitEarlyArr[0]) {\n // We can break the problem down recursively by finding the changes in the\n // First Half: (originalStart, modifiedStart) to (midOriginal, midModified)\n // Second Half: (midOriginal + 1, minModified + 1) to (originalEnd, modifiedEnd)\n // NOTE: ComputeDiff() is inclusive, therefore the second range starts on the next point\n const leftChanges = this.ComputeDiffRecursive(originalStart, midOriginal, modifiedStart, midModified, quitEarlyArr);\n let rightChanges = [];\n if (!quitEarlyArr[0]) {\n rightChanges = this.ComputeDiffRecursive(midOriginal + 1, originalEnd, midModified + 1, modifiedEnd, quitEarlyArr);\n }\n else {\n // We didn't have time to finish the first half, so we don't have time to compute this half.\n // Consider the entire rest of the sequence different.\n rightChanges = [\n new DiffChange(midOriginal + 1, originalEnd - (midOriginal + 1) + 1, midModified + 1, modifiedEnd - (midModified + 1) + 1)\n ];\n }\n return this.ConcatenateChanges(leftChanges, rightChanges);\n }\n // If we hit here, we quit early, and so can't return anything meaningful\n return [\n new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1)\n ];\n }\n WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr) {\n let forwardChanges = null;\n let reverseChanges = null;\n // First, walk backward through the forward diagonals history\n let changeHelper = new DiffChangeHelper();\n let diagonalMin = diagonalForwardStart;\n let diagonalMax = diagonalForwardEnd;\n let diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalForwardOffset;\n let lastOriginalIndex = -1073741824 /* Constants.MIN_SAFE_SMALL_INTEGER */;\n let historyIndex = this.m_forwardHistory.length - 1;\n do {\n // Get the diagonal index from the relative diagonal number\n const diagonal = diagonalRelative + diagonalForwardBase;\n // Figure out where we came from\n if (diagonal === diagonalMin || (diagonal < diagonalMax && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) {\n // Vertical line (the element is an insert)\n originalIndex = forwardPoints[diagonal + 1];\n modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset;\n if (originalIndex < lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex;\n changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex);\n diagonalRelative = (diagonal + 1) - diagonalForwardBase; //Setup for the next iteration\n }\n else {\n // Horizontal line (the element is a deletion)\n originalIndex = forwardPoints[diagonal - 1] + 1;\n modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset;\n if (originalIndex < lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex - 1;\n changeHelper.AddOriginalElement(originalIndex, modifiedIndex + 1);\n diagonalRelative = (diagonal - 1) - diagonalForwardBase; //Setup for the next iteration\n }\n if (historyIndex >= 0) {\n forwardPoints = this.m_forwardHistory[historyIndex];\n diagonalForwardBase = forwardPoints[0]; //We stored this in the first spot\n diagonalMin = 1;\n diagonalMax = forwardPoints.length - 1;\n }\n } while (--historyIndex >= -1);\n // Ironically, we get the forward changes as the reverse of the\n // order we added them since we technically added them backwards\n forwardChanges = changeHelper.getReverseChanges();\n if (quitEarlyArr[0]) {\n // TODO: Calculate a partial from the reverse diagonals.\n // For now, just assume everything after the midOriginal/midModified point is a diff\n let originalStartPoint = midOriginalArr[0] + 1;\n let modifiedStartPoint = midModifiedArr[0] + 1;\n if (forwardChanges !== null && forwardChanges.length > 0) {\n const lastForwardChange = forwardChanges[forwardChanges.length - 1];\n originalStartPoint = Math.max(originalStartPoint, lastForwardChange.getOriginalEnd());\n modifiedStartPoint = Math.max(modifiedStartPoint, lastForwardChange.getModifiedEnd());\n }\n reverseChanges = [\n new DiffChange(originalStartPoint, originalEnd - originalStartPoint + 1, modifiedStartPoint, modifiedEnd - modifiedStartPoint + 1)\n ];\n }\n else {\n // Now walk backward through the reverse diagonals history\n changeHelper = new DiffChangeHelper();\n diagonalMin = diagonalReverseStart;\n diagonalMax = diagonalReverseEnd;\n diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalReverseOffset;\n lastOriginalIndex = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n historyIndex = (deltaIsEven) ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2;\n do {\n // Get the diagonal index from the relative diagonal number\n const diagonal = diagonalRelative + diagonalReverseBase;\n // Figure out where we came from\n if (diagonal === diagonalMin || (diagonal < diagonalMax && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) {\n // Horizontal line (the element is a deletion))\n originalIndex = reversePoints[diagonal + 1] - 1;\n modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset;\n if (originalIndex > lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex + 1;\n changeHelper.AddOriginalElement(originalIndex + 1, modifiedIndex + 1);\n diagonalRelative = (diagonal + 1) - diagonalReverseBase; //Setup for the next iteration\n }\n else {\n // Vertical line (the element is an insertion)\n originalIndex = reversePoints[diagonal - 1];\n modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset;\n if (originalIndex > lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex;\n changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex + 1);\n diagonalRelative = (diagonal - 1) - diagonalReverseBase; //Setup for the next iteration\n }\n if (historyIndex >= 0) {\n reversePoints = this.m_reverseHistory[historyIndex];\n diagonalReverseBase = reversePoints[0]; //We stored this in the first spot\n diagonalMin = 1;\n diagonalMax = reversePoints.length - 1;\n }\n } while (--historyIndex >= -1);\n // There are cases where the reverse history will find diffs that\n // are correct, but not intuitive, so we need shift them.\n reverseChanges = changeHelper.getChanges();\n }\n return this.ConcatenateChanges(forwardChanges, reverseChanges);\n }\n /**\n * Given the range to compute the diff on, this method finds the point:\n * (midOriginal, midModified)\n * that exists in the middle of the LCS of the two sequences and\n * is the point at which the LCS problem may be broken down recursively.\n * This method will try to keep the LCS trace in memory. If the LCS recursion\n * point is calculated and the full trace is available in memory, then this method\n * will return the change list.\n * @param originalStart The start bound of the original sequence range\n * @param originalEnd The end bound of the original sequence range\n * @param modifiedStart The start bound of the modified sequence range\n * @param modifiedEnd The end bound of the modified sequence range\n * @param midOriginal The middle point of the original sequence range\n * @param midModified The middle point of the modified sequence range\n * @returns The diff changes, if available, otherwise null\n */\n ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr) {\n let originalIndex = 0, modifiedIndex = 0;\n let diagonalForwardStart = 0, diagonalForwardEnd = 0;\n let diagonalReverseStart = 0, diagonalReverseEnd = 0;\n // To traverse the edit graph and produce the proper LCS, our actual\n // start position is just outside the given boundary\n originalStart--;\n modifiedStart--;\n // We set these up to make the compiler happy, but they will\n // be replaced before we return with the actual recursion point\n midOriginalArr[0] = 0;\n midModifiedArr[0] = 0;\n // Clear out the history\n this.m_forwardHistory = [];\n this.m_reverseHistory = [];\n // Each cell in the two arrays corresponds to a diagonal in the edit graph.\n // The integer value in the cell represents the originalIndex of the furthest\n // reaching point found so far that ends in that diagonal.\n // The modifiedIndex can be computed mathematically from the originalIndex and the diagonal number.\n const maxDifferences = (originalEnd - originalStart) + (modifiedEnd - modifiedStart);\n const numDiagonals = maxDifferences + 1;\n const forwardPoints = new Int32Array(numDiagonals);\n const reversePoints = new Int32Array(numDiagonals);\n // diagonalForwardBase: Index into forwardPoints of the diagonal which passes through (originalStart, modifiedStart)\n // diagonalReverseBase: Index into reversePoints of the diagonal which passes through (originalEnd, modifiedEnd)\n const diagonalForwardBase = (modifiedEnd - modifiedStart);\n const diagonalReverseBase = (originalEnd - originalStart);\n // diagonalForwardOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the\n // diagonal number (relative to diagonalForwardBase)\n // diagonalReverseOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the\n // diagonal number (relative to diagonalReverseBase)\n const diagonalForwardOffset = (originalStart - modifiedStart);\n const diagonalReverseOffset = (originalEnd - modifiedEnd);\n // delta: The difference between the end diagonal and the start diagonal. This is used to relate diagonal numbers\n // relative to the start diagonal with diagonal numbers relative to the end diagonal.\n // The Even/Oddn-ness of this delta is important for determining when we should check for overlap\n const delta = diagonalReverseBase - diagonalForwardBase;\n const deltaIsEven = (delta % 2 === 0);\n // Here we set up the start and end points as the furthest points found so far\n // in both the forward and reverse directions, respectively\n forwardPoints[diagonalForwardBase] = originalStart;\n reversePoints[diagonalReverseBase] = originalEnd;\n // Remember if we quit early, and thus need to do a best-effort result instead of a real result.\n quitEarlyArr[0] = false;\n // A couple of points:\n // --With this method, we iterate on the number of differences between the two sequences.\n // The more differences there actually are, the longer this will take.\n // --Also, as the number of differences increases, we have to search on diagonals further\n // away from the reference diagonal (which is diagonalForwardBase for forward, diagonalReverseBase for reverse).\n // --We extend on even diagonals (relative to the reference diagonal) only when numDifferences\n // is even and odd diagonals only when numDifferences is odd.\n for (let numDifferences = 1; numDifferences <= (maxDifferences / 2) + 1; numDifferences++) {\n let furthestOriginalIndex = 0;\n let furthestModifiedIndex = 0;\n // Run the algorithm in the forward direction\n diagonalForwardStart = this.ClipDiagonalBound(diagonalForwardBase - numDifferences, numDifferences, diagonalForwardBase, numDiagonals);\n diagonalForwardEnd = this.ClipDiagonalBound(diagonalForwardBase + numDifferences, numDifferences, diagonalForwardBase, numDiagonals);\n for (let diagonal = diagonalForwardStart; diagonal <= diagonalForwardEnd; diagonal += 2) {\n // STEP 1: We extend the furthest reaching point in the present diagonal\n // by looking at the diagonals above and below and picking the one whose point\n // is further away from the start point (originalStart, modifiedStart)\n if (diagonal === diagonalForwardStart || (diagonal < diagonalForwardEnd && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) {\n originalIndex = forwardPoints[diagonal + 1];\n }\n else {\n originalIndex = forwardPoints[diagonal - 1] + 1;\n }\n modifiedIndex = originalIndex - (diagonal - diagonalForwardBase) - diagonalForwardOffset;\n // Save the current originalIndex so we can test for false overlap in step 3\n const tempOriginalIndex = originalIndex;\n // STEP 2: We can continue to extend the furthest reaching point in the present diagonal\n // so long as the elements are equal.\n while (originalIndex < originalEnd && modifiedIndex < modifiedEnd && this.ElementsAreEqual(originalIndex + 1, modifiedIndex + 1)) {\n originalIndex++;\n modifiedIndex++;\n }\n forwardPoints[diagonal] = originalIndex;\n if (originalIndex + modifiedIndex > furthestOriginalIndex + furthestModifiedIndex) {\n furthestOriginalIndex = originalIndex;\n furthestModifiedIndex = modifiedIndex;\n }\n // STEP 3: If delta is odd (overlap first happens on forward when delta is odd)\n // and diagonal is in the range of reverse diagonals computed for numDifferences-1\n // (the previous iteration; we haven't computed reverse diagonals for numDifferences yet)\n // then check for overlap.\n if (!deltaIsEven && Math.abs(diagonal - diagonalReverseBase) <= (numDifferences - 1)) {\n if (originalIndex >= reversePoints[diagonal]) {\n midOriginalArr[0] = originalIndex;\n midModifiedArr[0] = modifiedIndex;\n if (tempOriginalIndex <= reversePoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n // BINGO! We overlapped, and we have the full trace in memory!\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n else {\n // Either false overlap, or we didn't have enough memory for the full trace\n // Just return the recursion point\n return null;\n }\n }\n }\n }\n // Check to see if we should be quitting early, before moving on to the next iteration.\n const matchLengthOfLongest = ((furthestOriginalIndex - originalStart) + (furthestModifiedIndex - modifiedStart) - numDifferences) / 2;\n if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(furthestOriginalIndex, matchLengthOfLongest)) {\n // We can't finish, so skip ahead to generating a result from what we have.\n quitEarlyArr[0] = true;\n // Use the furthest distance we got in the forward direction.\n midOriginalArr[0] = furthestOriginalIndex;\n midModifiedArr[0] = furthestModifiedIndex;\n if (matchLengthOfLongest > 0 && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n // Enough of the history is in memory to walk it backwards\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n else {\n // We didn't actually remember enough of the history.\n //Since we are quitting the diff early, we need to shift back the originalStart and modified start\n //back into the boundary limits since we decremented their value above beyond the boundary limit.\n originalStart++;\n modifiedStart++;\n return [\n new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1)\n ];\n }\n }\n // Run the algorithm in the reverse direction\n diagonalReverseStart = this.ClipDiagonalBound(diagonalReverseBase - numDifferences, numDifferences, diagonalReverseBase, numDiagonals);\n diagonalReverseEnd = this.ClipDiagonalBound(diagonalReverseBase + numDifferences, numDifferences, diagonalReverseBase, numDiagonals);\n for (let diagonal = diagonalReverseStart; diagonal <= diagonalReverseEnd; diagonal += 2) {\n // STEP 1: We extend the furthest reaching point in the present diagonal\n // by looking at the diagonals above and below and picking the one whose point\n // is further away from the start point (originalEnd, modifiedEnd)\n if (diagonal === diagonalReverseStart || (diagonal < diagonalReverseEnd && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) {\n originalIndex = reversePoints[diagonal + 1] - 1;\n }\n else {\n originalIndex = reversePoints[diagonal - 1];\n }\n modifiedIndex = originalIndex - (diagonal - diagonalReverseBase) - diagonalReverseOffset;\n // Save the current originalIndex so we can test for false overlap\n const tempOriginalIndex = originalIndex;\n // STEP 2: We can continue to extend the furthest reaching point in the present diagonal\n // as long as the elements are equal.\n while (originalIndex > originalStart && modifiedIndex > modifiedStart && this.ElementsAreEqual(originalIndex, modifiedIndex)) {\n originalIndex--;\n modifiedIndex--;\n }\n reversePoints[diagonal] = originalIndex;\n // STEP 4: If delta is even (overlap first happens on reverse when delta is even)\n // and diagonal is in the range of forward diagonals computed for numDifferences\n // then check for overlap.\n if (deltaIsEven && Math.abs(diagonal - diagonalForwardBase) <= numDifferences) {\n if (originalIndex <= forwardPoints[diagonal]) {\n midOriginalArr[0] = originalIndex;\n midModifiedArr[0] = modifiedIndex;\n if (tempOriginalIndex >= forwardPoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n // BINGO! We overlapped, and we have the full trace in memory!\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n else {\n // Either false overlap, or we didn't have enough memory for the full trace\n // Just return the recursion point\n return null;\n }\n }\n }\n }\n // Save current vectors to history before the next iteration\n if (numDifferences <= 1447 /* LocalConstants.MaxDifferencesHistory */) {\n // We are allocating space for one extra int, which we fill with\n // the index of the diagonal base index\n let temp = new Int32Array(diagonalForwardEnd - diagonalForwardStart + 2);\n temp[0] = diagonalForwardBase - diagonalForwardStart + 1;\n MyArray.Copy2(forwardPoints, diagonalForwardStart, temp, 1, diagonalForwardEnd - diagonalForwardStart + 1);\n this.m_forwardHistory.push(temp);\n temp = new Int32Array(diagonalReverseEnd - diagonalReverseStart + 2);\n temp[0] = diagonalReverseBase - diagonalReverseStart + 1;\n MyArray.Copy2(reversePoints, diagonalReverseStart, temp, 1, diagonalReverseEnd - diagonalReverseStart + 1);\n this.m_reverseHistory.push(temp);\n }\n }\n // If we got here, then we have the full trace in history. We just have to convert it to a change list\n // NOTE: This part is a bit messy\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n /**\n * Shifts the given changes to provide a more intuitive diff.\n * While the first element in a diff matches the first element after the diff,\n * we shift the diff down.\n *\n * @param changes The list of changes to shift\n * @returns The shifted changes\n */\n PrettifyChanges(changes) {\n // Shift all the changes down first\n for (let i = 0; i < changes.length; i++) {\n const change = changes[i];\n const originalStop = (i < changes.length - 1) ? changes[i + 1].originalStart : this._originalElementsOrHash.length;\n const modifiedStop = (i < changes.length - 1) ? changes[i + 1].modifiedStart : this._modifiedElementsOrHash.length;\n const checkOriginal = change.originalLength > 0;\n const checkModified = change.modifiedLength > 0;\n while (change.originalStart + change.originalLength < originalStop\n && change.modifiedStart + change.modifiedLength < modifiedStop\n && (!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength))\n && (!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))) {\n const startStrictEqual = this.ElementsAreStrictEqual(change.originalStart, change.modifiedStart);\n const endStrictEqual = this.ElementsAreStrictEqual(change.originalStart + change.originalLength, change.modifiedStart + change.modifiedLength);\n if (endStrictEqual && !startStrictEqual) {\n // moving the change down would create an equal change, but the elements are not strict equal\n break;\n }\n change.originalStart++;\n change.modifiedStart++;\n }\n const mergedChangeArr = [null];\n if (i < changes.length - 1 && this.ChangesOverlap(changes[i], changes[i + 1], mergedChangeArr)) {\n changes[i] = mergedChangeArr[0];\n changes.splice(i + 1, 1);\n i--;\n continue;\n }\n }\n // Shift changes back up until we hit empty or whitespace-only lines\n for (let i = changes.length - 1; i >= 0; i--) {\n const change = changes[i];\n let originalStop = 0;\n let modifiedStop = 0;\n if (i > 0) {\n const prevChange = changes[i - 1];\n originalStop = prevChange.originalStart + prevChange.originalLength;\n modifiedStop = prevChange.modifiedStart + prevChange.modifiedLength;\n }\n const checkOriginal = change.originalLength > 0;\n const checkModified = change.modifiedLength > 0;\n let bestDelta = 0;\n let bestScore = this._boundaryScore(change.originalStart, change.originalLength, change.modifiedStart, change.modifiedLength);\n for (let delta = 1;; delta++) {\n const originalStart = change.originalStart - delta;\n const modifiedStart = change.modifiedStart - delta;\n if (originalStart < originalStop || modifiedStart < modifiedStop) {\n break;\n }\n if (checkOriginal && !this.OriginalElementsAreEqual(originalStart, originalStart + change.originalLength)) {\n break;\n }\n if (checkModified && !this.ModifiedElementsAreEqual(modifiedStart, modifiedStart + change.modifiedLength)) {\n break;\n }\n const touchingPreviousChange = (originalStart === originalStop && modifiedStart === modifiedStop);\n const score = ((touchingPreviousChange ? 5 : 0)\n + this._boundaryScore(originalStart, change.originalLength, modifiedStart, change.modifiedLength));\n if (score > bestScore) {\n bestScore = score;\n bestDelta = delta;\n }\n }\n change.originalStart -= bestDelta;\n change.modifiedStart -= bestDelta;\n const mergedChangeArr = [null];\n if (i > 0 && this.ChangesOverlap(changes[i - 1], changes[i], mergedChangeArr)) {\n changes[i - 1] = mergedChangeArr[0];\n changes.splice(i, 1);\n i++;\n continue;\n }\n }\n // There could be multiple longest common substrings.\n // Give preference to the ones containing longer lines\n if (this._hasStrings) {\n for (let i = 1, len = changes.length; i < len; i++) {\n const aChange = changes[i - 1];\n const bChange = changes[i];\n const matchedLength = bChange.originalStart - aChange.originalStart - aChange.originalLength;\n const aOriginalStart = aChange.originalStart;\n const bOriginalEnd = bChange.originalStart + bChange.originalLength;\n const abOriginalLength = bOriginalEnd - aOriginalStart;\n const aModifiedStart = aChange.modifiedStart;\n const bModifiedEnd = bChange.modifiedStart + bChange.modifiedLength;\n const abModifiedLength = bModifiedEnd - aModifiedStart;\n // Avoid wasting a lot of time with these searches\n if (matchedLength < 5 && abOriginalLength < 20 && abModifiedLength < 20) {\n const t = this._findBetterContiguousSequence(aOriginalStart, abOriginalLength, aModifiedStart, abModifiedLength, matchedLength);\n if (t) {\n const [originalMatchStart, modifiedMatchStart] = t;\n if (originalMatchStart !== aChange.originalStart + aChange.originalLength || modifiedMatchStart !== aChange.modifiedStart + aChange.modifiedLength) {\n // switch to another sequence that has a better score\n aChange.originalLength = originalMatchStart - aChange.originalStart;\n aChange.modifiedLength = modifiedMatchStart - aChange.modifiedStart;\n bChange.originalStart = originalMatchStart + matchedLength;\n bChange.modifiedStart = modifiedMatchStart + matchedLength;\n bChange.originalLength = bOriginalEnd - bChange.originalStart;\n bChange.modifiedLength = bModifiedEnd - bChange.modifiedStart;\n }\n }\n }\n }\n }\n return changes;\n }\n _findBetterContiguousSequence(originalStart, originalLength, modifiedStart, modifiedLength, desiredLength) {\n if (originalLength < desiredLength || modifiedLength < desiredLength) {\n return null;\n }\n const originalMax = originalStart + originalLength - desiredLength + 1;\n const modifiedMax = modifiedStart + modifiedLength - desiredLength + 1;\n let bestScore = 0;\n let bestOriginalStart = 0;\n let bestModifiedStart = 0;\n for (let i = originalStart; i < originalMax; i++) {\n for (let j = modifiedStart; j < modifiedMax; j++) {\n const score = this._contiguousSequenceScore(i, j, desiredLength);\n if (score > 0 && score > bestScore) {\n bestScore = score;\n bestOriginalStart = i;\n bestModifiedStart = j;\n }\n }\n }\n if (bestScore > 0) {\n return [bestOriginalStart, bestModifiedStart];\n }\n return null;\n }\n _contiguousSequenceScore(originalStart, modifiedStart, length) {\n let score = 0;\n for (let l = 0; l < length; l++) {\n if (!this.ElementsAreEqual(originalStart + l, modifiedStart + l)) {\n return 0;\n }\n score += this._originalStringElements[originalStart + l].length;\n }\n return score;\n }\n _OriginalIsBoundary(index) {\n if (index <= 0 || index >= this._originalElementsOrHash.length - 1) {\n return true;\n }\n return (this._hasStrings && /^\\s*$/.test(this._originalStringElements[index]));\n }\n _OriginalRegionIsBoundary(originalStart, originalLength) {\n if (this._OriginalIsBoundary(originalStart) || this._OriginalIsBoundary(originalStart - 1)) {\n return true;\n }\n if (originalLength > 0) {\n const originalEnd = originalStart + originalLength;\n if (this._OriginalIsBoundary(originalEnd - 1) || this._OriginalIsBoundary(originalEnd)) {\n return true;\n }\n }\n return false;\n }\n _ModifiedIsBoundary(index) {\n if (index <= 0 || index >= this._modifiedElementsOrHash.length - 1) {\n return true;\n }\n return (this._hasStrings && /^\\s*$/.test(this._modifiedStringElements[index]));\n }\n _ModifiedRegionIsBoundary(modifiedStart, modifiedLength) {\n if (this._ModifiedIsBoundary(modifiedStart) || this._ModifiedIsBoundary(modifiedStart - 1)) {\n return true;\n }\n if (modifiedLength > 0) {\n const modifiedEnd = modifiedStart + modifiedLength;\n if (this._ModifiedIsBoundary(modifiedEnd - 1) || this._ModifiedIsBoundary(modifiedEnd)) {\n return true;\n }\n }\n return false;\n }\n _boundaryScore(originalStart, originalLength, modifiedStart, modifiedLength) {\n const originalScore = (this._OriginalRegionIsBoundary(originalStart, originalLength) ? 1 : 0);\n const modifiedScore = (this._ModifiedRegionIsBoundary(modifiedStart, modifiedLength) ? 1 : 0);\n return (originalScore + modifiedScore);\n }\n /**\n * Concatenates the two input DiffChange lists and returns the resulting\n * list.\n * @param The left changes\n * @param The right changes\n * @returns The concatenated list\n */\n ConcatenateChanges(left, right) {\n const mergedChangeArr = [];\n if (left.length === 0 || right.length === 0) {\n return (right.length > 0) ? right : left;\n }\n else if (this.ChangesOverlap(left[left.length - 1], right[0], mergedChangeArr)) {\n // Since we break the problem down recursively, it is possible that we\n // might recurse in the middle of a change thereby splitting it into\n // two changes. Here in the combining stage, we detect and fuse those\n // changes back together\n const result = new Array(left.length + right.length - 1);\n MyArray.Copy(left, 0, result, 0, left.length - 1);\n result[left.length - 1] = mergedChangeArr[0];\n MyArray.Copy(right, 1, result, left.length, right.length - 1);\n return result;\n }\n else {\n const result = new Array(left.length + right.length);\n MyArray.Copy(left, 0, result, 0, left.length);\n MyArray.Copy(right, 0, result, left.length, right.length);\n return result;\n }\n }\n /**\n * Returns true if the two changes overlap and can be merged into a single\n * change\n * @param left The left change\n * @param right The right change\n * @param mergedChange The merged change if the two overlap, null otherwise\n * @returns True if the two changes overlap\n */\n ChangesOverlap(left, right, mergedChangeArr) {\n Debug.Assert(left.originalStart <= right.originalStart, 'Left change is not less than or equal to right change');\n Debug.Assert(left.modifiedStart <= right.modifiedStart, 'Left change is not less than or equal to right change');\n if (left.originalStart + left.originalLength >= right.originalStart || left.modifiedStart + left.modifiedLength >= right.modifiedStart) {\n const originalStart = left.originalStart;\n let originalLength = left.originalLength;\n const modifiedStart = left.modifiedStart;\n let modifiedLength = left.modifiedLength;\n if (left.originalStart + left.originalLength >= right.originalStart) {\n originalLength = right.originalStart + right.originalLength - left.originalStart;\n }\n if (left.modifiedStart + left.modifiedLength >= right.modifiedStart) {\n modifiedLength = right.modifiedStart + right.modifiedLength - left.modifiedStart;\n }\n mergedChangeArr[0] = new DiffChange(originalStart, originalLength, modifiedStart, modifiedLength);\n return true;\n }\n else {\n mergedChangeArr[0] = null;\n return false;\n }\n }\n /**\n * Helper method used to clip a diagonal index to the range of valid\n * diagonals. This also decides whether or not the diagonal index,\n * if it exceeds the boundary, should be clipped to the boundary or clipped\n * one inside the boundary depending on the Even/Odd status of the boundary\n * and numDifferences.\n * @param diagonal The index of the diagonal to clip.\n * @param numDifferences The current number of differences being iterated upon.\n * @param diagonalBaseIndex The base reference diagonal.\n * @param numDiagonals The total number of diagonals.\n * @returns The clipped diagonal index.\n */\n ClipDiagonalBound(diagonal, numDifferences, diagonalBaseIndex, numDiagonals) {\n if (diagonal >= 0 && diagonal < numDiagonals) {\n // Nothing to clip, its in range\n return diagonal;\n }\n // diagonalsBelow: The number of diagonals below the reference diagonal\n // diagonalsAbove: The number of diagonals above the reference diagonal\n const diagonalsBelow = diagonalBaseIndex;\n const diagonalsAbove = numDiagonals - diagonalBaseIndex - 1;\n const diffEven = (numDifferences % 2 === 0);\n if (diagonal < 0) {\n const lowerBoundEven = (diagonalsBelow % 2 === 0);\n return (diffEven === lowerBoundEven) ? 0 : 1;\n }\n else {\n const upperBoundEven = (diagonalsAbove % 2 === 0);\n return (diffEven === upperBoundEven) ? numDiagonals - 1 : numDiagonals - 2;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/**\n * Represents information about a specific difference between two sequences.\n */\nexport class DiffChange {\n /**\n * Constructs a new DiffChange with the given sequence information\n * and content.\n */\n constructor(originalStart, originalLength, modifiedStart, modifiedLength) {\n //Debug.Assert(originalLength > 0 || modifiedLength > 0, \"originalLength and modifiedLength cannot both be <= 0\");\n this.originalStart = originalStart;\n this.originalLength = originalLength;\n this.modifiedStart = modifiedStart;\n this.modifiedLength = modifiedLength;\n }\n /**\n * The end point (exclusive) of the change in the original sequence.\n */\n getOriginalEnd() {\n return this.originalStart + this.originalLength;\n }\n /**\n * The end point (exclusive) of the change in the modified sequence.\n */\n getModifiedEnd() {\n return this.modifiedStart + this.modifiedLength;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// Avoid circular dependency on EventEmitter by implementing a subset of the interface.\nexport class ErrorHandler {\n constructor() {\n this.listeners = [];\n this.unexpectedErrorHandler = function (e) {\n setTimeout(() => {\n if (e.stack) {\n if (ErrorNoTelemetry.isErrorNoTelemetry(e)) {\n throw new ErrorNoTelemetry(e.message + '\\n\\n' + e.stack);\n }\n throw new Error(e.message + '\\n\\n' + e.stack);\n }\n throw e;\n }, 0);\n };\n }\n emit(e) {\n this.listeners.forEach((listener) => {\n listener(e);\n });\n }\n onUnexpectedError(e) {\n this.unexpectedErrorHandler(e);\n this.emit(e);\n }\n // For external errors, we don't want the listeners to be called\n onUnexpectedExternalError(e) {\n this.unexpectedErrorHandler(e);\n }\n}\nexport const errorHandler = new ErrorHandler();\nexport function onUnexpectedError(e) {\n // ignore errors from cancelled promises\n if (!isCancellationError(e)) {\n errorHandler.onUnexpectedError(e);\n }\n return undefined;\n}\nexport function onUnexpectedExternalError(e) {\n // ignore errors from cancelled promises\n if (!isCancellationError(e)) {\n errorHandler.onUnexpectedExternalError(e);\n }\n return undefined;\n}\nexport function transformErrorForSerialization(error) {\n if (error instanceof Error) {\n const { name, message } = error;\n const stack = error.stacktrace || error.stack;\n return {\n $isError: true,\n name,\n message,\n stack,\n noTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error)\n };\n }\n // return as is\n return error;\n}\nconst canceledName = 'Canceled';\n/**\n * Checks if the given error is a promise in canceled state\n */\nexport function isCancellationError(error) {\n if (error instanceof CancellationError) {\n return true;\n }\n return error instanceof Error && error.name === canceledName && error.message === canceledName;\n}\n// !!!IMPORTANT!!!\n// Do NOT change this class because it is also used as an API-type.\nexport class CancellationError extends Error {\n constructor() {\n super(canceledName);\n this.name = this.message;\n }\n}\n/**\n * @deprecated use {@link CancellationError `new CancellationError()`} instead\n */\nexport function canceled() {\n const error = new Error(canceledName);\n error.name = error.message;\n return error;\n}\nexport function illegalArgument(name) {\n if (name) {\n return new Error(`Illegal argument: ${name}`);\n }\n else {\n return new Error('Illegal argument');\n }\n}\nexport function illegalState(name) {\n if (name) {\n return new Error(`Illegal state: ${name}`);\n }\n else {\n return new Error('Illegal state');\n }\n}\nexport class NotSupportedError extends Error {\n constructor(message) {\n super('NotSupported');\n if (message) {\n this.message = message;\n }\n }\n}\n/**\n * Error that when thrown won't be logged in telemetry as an unhandled error.\n */\nexport class ErrorNoTelemetry extends Error {\n constructor(msg) {\n super(msg);\n this.name = 'ErrorNoTelemetry';\n }\n static fromError(err) {\n if (err instanceof ErrorNoTelemetry) {\n return err;\n }\n const result = new ErrorNoTelemetry();\n result.message = err.message;\n result.stack = err.stack;\n return result;\n }\n static isErrorNoTelemetry(err) {\n return err.name === 'ErrorNoTelemetry';\n }\n}\n/**\n * This error indicates a bug.\n * Do not throw this for invalid user input.\n * Only catch this error to recover gracefully from bugs.\n */\nexport class BugIndicatingError extends Error {\n constructor(message) {\n super(message || 'An unexpected bug occurred.');\n Object.setPrototypeOf(this, BugIndicatingError.prototype);\n // Because we know for sure only buggy code throws this,\n // we definitely want to break here and fix the bug.\n // eslint-disable-next-line no-debugger\n debugger;\n }\n}\n","import { onUnexpectedError } from './errors.js';\nimport { combinedDisposable, Disposable, DisposableStore, SafeDisposable, toDisposable } from './lifecycle.js';\nimport { LinkedList } from './linkedList.js';\nimport { StopWatch } from './stopwatch.js';\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever an emitter with listeners is disposed. That is a sign of code smell.\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableDisposeWithListenerWarning = false;\n// _enableDisposeWithListenerWarning = Boolean(\"TRUE\"); // causes a linter warning so that it cannot be pushed\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever a snapshotted event is used repeatedly without cleanup.\n// See https://github.com/microsoft/vscode/issues/142851\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableSnapshotPotentialLeakWarning = false;\nexport var Event;\n(function (Event) {\n Event.None = () => Disposable.None;\n function _addLeakageTraceLogic(options) {\n if (_enableSnapshotPotentialLeakWarning) {\n const { onListenerDidAdd: origListenerDidAdd } = options;\n const stack = Stacktrace.create();\n let count = 0;\n options.onListenerDidAdd = () => {\n if (++count === 2) {\n console.warn('snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here');\n stack.print();\n }\n origListenerDidAdd === null || origListenerDidAdd === void 0 ? void 0 : origListenerDidAdd();\n };\n }\n }\n /**\n * Given an event, returns another event which only fires once.\n */\n function once(event) {\n return (listener, thisArgs = null, disposables) => {\n // we need this, in case the event fires during the listener call\n let didFire = false;\n let result = undefined;\n result = event(e => {\n if (didFire) {\n return;\n }\n else if (result) {\n result.dispose();\n }\n else {\n didFire = true;\n }\n return listener.call(thisArgs, e);\n }, null, disposables);\n if (didFire) {\n result.dispose();\n }\n return result;\n };\n }\n Event.once = once;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function map(event, map, disposable) {\n return snapshot((listener, thisArgs = null, disposables) => event(i => listener.call(thisArgs, map(i)), null, disposables), disposable);\n }\n Event.map = map;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function forEach(event, each, disposable) {\n return snapshot((listener, thisArgs = null, disposables) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables), disposable);\n }\n Event.forEach = forEach;\n function filter(event, filter, disposable) {\n return snapshot((listener, thisArgs = null, disposables) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables), disposable);\n }\n Event.filter = filter;\n /**\n * Given an event, returns the same event but typed as `Event`.\n */\n function signal(event) {\n return event;\n }\n Event.signal = signal;\n function any(...events) {\n return (listener, thisArgs = null, disposables) => combinedDisposable(...events.map(event => event(e => listener.call(thisArgs, e), null, disposables)));\n }\n Event.any = any;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function reduce(event, merge, initial, disposable) {\n let output = initial;\n return map(event, e => {\n output = merge(output, e);\n return output;\n }, disposable);\n }\n Event.reduce = reduce;\n function snapshot(event, disposable) {\n let listener;\n const options = {\n onFirstListenerAdd() {\n listener = event(emitter.fire, emitter);\n },\n onLastListenerRemove() {\n listener === null || listener === void 0 ? void 0 : listener.dispose();\n }\n };\n if (!disposable) {\n _addLeakageTraceLogic(options);\n }\n const emitter = new Emitter(options);\n disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter);\n return emitter.event;\n }\n function debounce(event, merge, delay = 100, leading = false, leakWarningThreshold, disposable) {\n let subscription;\n let output = undefined;\n let handle = undefined;\n let numDebouncedCalls = 0;\n const options = {\n leakWarningThreshold,\n onFirstListenerAdd() {\n subscription = event(cur => {\n numDebouncedCalls++;\n output = merge(output, cur);\n if (leading && !handle) {\n emitter.fire(output);\n output = undefined;\n }\n clearTimeout(handle);\n handle = setTimeout(() => {\n const _output = output;\n output = undefined;\n handle = undefined;\n if (!leading || numDebouncedCalls > 1) {\n emitter.fire(_output);\n }\n numDebouncedCalls = 0;\n }, delay);\n });\n },\n onLastListenerRemove() {\n subscription.dispose();\n }\n };\n if (!disposable) {\n _addLeakageTraceLogic(options);\n }\n const emitter = new Emitter(options);\n disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter);\n return emitter.event;\n }\n Event.debounce = debounce;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function latch(event, equals = (a, b) => a === b, disposable) {\n let firstCall = true;\n let cache;\n return filter(event, value => {\n const shouldEmit = firstCall || !equals(value, cache);\n firstCall = false;\n cache = value;\n return shouldEmit;\n }, disposable);\n }\n Event.latch = latch;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function split(event, isT, disposable) {\n return [\n Event.filter(event, isT, disposable),\n Event.filter(event, e => !isT(e), disposable),\n ];\n }\n Event.split = split;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function buffer(event, flushAfterTimeout = false, _buffer = []) {\n let buffer = _buffer.slice();\n let listener = event(e => {\n if (buffer) {\n buffer.push(e);\n }\n else {\n emitter.fire(e);\n }\n });\n const flush = () => {\n buffer === null || buffer === void 0 ? void 0 : buffer.forEach(e => emitter.fire(e));\n buffer = null;\n };\n const emitter = new Emitter({\n onFirstListenerAdd() {\n if (!listener) {\n listener = event(e => emitter.fire(e));\n }\n },\n onFirstListenerDidAdd() {\n if (buffer) {\n if (flushAfterTimeout) {\n setTimeout(flush);\n }\n else {\n flush();\n }\n }\n },\n onLastListenerRemove() {\n if (listener) {\n listener.dispose();\n }\n listener = null;\n }\n });\n return emitter.event;\n }\n Event.buffer = buffer;\n class ChainableEvent {\n constructor(event) {\n this.event = event;\n this.disposables = new DisposableStore();\n }\n map(fn) {\n return new ChainableEvent(map(this.event, fn, this.disposables));\n }\n forEach(fn) {\n return new ChainableEvent(forEach(this.event, fn, this.disposables));\n }\n filter(fn) {\n return new ChainableEvent(filter(this.event, fn, this.disposables));\n }\n reduce(merge, initial) {\n return new ChainableEvent(reduce(this.event, merge, initial, this.disposables));\n }\n latch() {\n return new ChainableEvent(latch(this.event, undefined, this.disposables));\n }\n debounce(merge, delay = 100, leading = false, leakWarningThreshold) {\n return new ChainableEvent(debounce(this.event, merge, delay, leading, leakWarningThreshold, this.disposables));\n }\n on(listener, thisArgs, disposables) {\n return this.event(listener, thisArgs, disposables);\n }\n once(listener, thisArgs, disposables) {\n return once(this.event)(listener, thisArgs, disposables);\n }\n dispose() {\n this.disposables.dispose();\n }\n }\n function chain(event) {\n return new ChainableEvent(event);\n }\n Event.chain = chain;\n function fromNodeEventEmitter(emitter, eventName, map = id => id) {\n const fn = (...args) => result.fire(map(...args));\n const onFirstListenerAdd = () => emitter.on(eventName, fn);\n const onLastListenerRemove = () => emitter.removeListener(eventName, fn);\n const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove });\n return result.event;\n }\n Event.fromNodeEventEmitter = fromNodeEventEmitter;\n function fromDOMEventEmitter(emitter, eventName, map = id => id) {\n const fn = (...args) => result.fire(map(...args));\n const onFirstListenerAdd = () => emitter.addEventListener(eventName, fn);\n const onLastListenerRemove = () => emitter.removeEventListener(eventName, fn);\n const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove });\n return result.event;\n }\n Event.fromDOMEventEmitter = fromDOMEventEmitter;\n function toPromise(event) {\n return new Promise(resolve => once(event)(resolve));\n }\n Event.toPromise = toPromise;\n function runAndSubscribe(event, handler) {\n handler(undefined);\n return event(e => handler(e));\n }\n Event.runAndSubscribe = runAndSubscribe;\n function runAndSubscribeWithStore(event, handler) {\n let store = null;\n function run(e) {\n store === null || store === void 0 ? void 0 : store.dispose();\n store = new DisposableStore();\n handler(e, store);\n }\n run(undefined);\n const disposable = event(e => run(e));\n return toDisposable(() => {\n disposable.dispose();\n store === null || store === void 0 ? void 0 : store.dispose();\n });\n }\n Event.runAndSubscribeWithStore = runAndSubscribeWithStore;\n class EmitterObserver {\n constructor(obs, store) {\n this.obs = obs;\n this._counter = 0;\n this._hasChanged = false;\n const options = {\n onFirstListenerAdd: () => {\n obs.addObserver(this);\n },\n onLastListenerRemove: () => {\n obs.removeObserver(this);\n }\n };\n if (!store) {\n _addLeakageTraceLogic(options);\n }\n this.emitter = new Emitter(options);\n if (store) {\n store.add(this.emitter);\n }\n }\n beginUpdate(_observable) {\n // console.assert(_observable === this.obs);\n this._counter++;\n }\n handleChange(_observable, _change) {\n this._hasChanged = true;\n }\n endUpdate(_observable) {\n if (--this._counter === 0) {\n if (this._hasChanged) {\n this._hasChanged = false;\n this.emitter.fire(this.obs.get());\n }\n }\n }\n }\n function fromObservable(obs, store) {\n const observer = new EmitterObserver(obs, store);\n return observer.emitter.event;\n }\n Event.fromObservable = fromObservable;\n})(Event || (Event = {}));\nclass EventProfiling {\n constructor(name) {\n this._listenerCount = 0;\n this._invocationCount = 0;\n this._elapsedOverall = 0;\n this._name = `${name}_${EventProfiling._idPool++}`;\n }\n start(listenerCount) {\n this._stopWatch = new StopWatch(true);\n this._listenerCount = listenerCount;\n }\n stop() {\n if (this._stopWatch) {\n const elapsed = this._stopWatch.elapsed();\n this._elapsedOverall += elapsed;\n this._invocationCount += 1;\n console.info(`did FIRE ${this._name}: elapsed_ms: ${elapsed.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`);\n this._stopWatch = undefined;\n }\n }\n}\nEventProfiling._idPool = 0;\nlet _globalLeakWarningThreshold = -1;\nclass LeakageMonitor {\n constructor(customThreshold, name = Math.random().toString(18).slice(2, 5)) {\n this.customThreshold = customThreshold;\n this.name = name;\n this._warnCountdown = 0;\n }\n dispose() {\n if (this._stacks) {\n this._stacks.clear();\n }\n }\n check(stack, listenerCount) {\n let threshold = _globalLeakWarningThreshold;\n if (typeof this.customThreshold === 'number') {\n threshold = this.customThreshold;\n }\n if (threshold <= 0 || listenerCount < threshold) {\n return undefined;\n }\n if (!this._stacks) {\n this._stacks = new Map();\n }\n const count = (this._stacks.get(stack.value) || 0);\n this._stacks.set(stack.value, count + 1);\n this._warnCountdown -= 1;\n if (this._warnCountdown <= 0) {\n // only warn on first exceed and then every time the limit\n // is exceeded by 50% again\n this._warnCountdown = threshold * 0.5;\n // find most frequent listener and print warning\n let topStack;\n let topCount = 0;\n for (const [stack, count] of this._stacks) {\n if (!topStack || topCount < count) {\n topStack = stack;\n topCount = count;\n }\n }\n console.warn(`[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`);\n console.warn(topStack);\n }\n return () => {\n const count = (this._stacks.get(stack.value) || 0);\n this._stacks.set(stack.value, count - 1);\n };\n }\n}\nclass Stacktrace {\n constructor(value) {\n this.value = value;\n }\n static create() {\n var _a;\n return new Stacktrace((_a = new Error().stack) !== null && _a !== void 0 ? _a : '');\n }\n print() {\n console.warn(this.value.split('\\n').slice(2).join('\\n'));\n }\n}\nclass Listener {\n constructor(callback, callbackThis, stack) {\n this.callback = callback;\n this.callbackThis = callbackThis;\n this.stack = stack;\n this.subscription = new SafeDisposable();\n }\n invoke(e) {\n this.callback.call(this.callbackThis, e);\n }\n}\n/**\n * The Emitter can be used to expose an Event to the public\n * to fire it from the insides.\n * Sample:\n class Document {\n\n private readonly _onDidChange = new Emitter<(value:string)=>any>();\n\n public onDidChange = this._onDidChange.event;\n\n // getter-style\n // get onDidChange(): Event<(value:string)=>any> {\n // \treturn this._onDidChange.event;\n // }\n\n private _doIt() {\n //...\n this._onDidChange.fire(value);\n }\n }\n */\nexport class Emitter {\n constructor(options) {\n var _a, _b;\n this._disposed = false;\n this._options = options;\n this._leakageMon = _globalLeakWarningThreshold > 0 ? new LeakageMonitor(this._options && this._options.leakWarningThreshold) : undefined;\n this._perfMon = ((_a = this._options) === null || _a === void 0 ? void 0 : _a._profName) ? new EventProfiling(this._options._profName) : undefined;\n this._deliveryQueue = (_b = this._options) === null || _b === void 0 ? void 0 : _b.deliveryQueue;\n }\n dispose() {\n var _a, _b, _c, _d;\n if (!this._disposed) {\n this._disposed = true;\n // It is bad to have listeners at the time of disposing an emitter, it is worst to have listeners keep the emitter\n // alive via the reference that's embedded in their disposables. Therefore we loop over all remaining listeners and\n // unset their subscriptions/disposables. Looping and blaming remaining listeners is done on next tick because the\n // the following programming pattern is very popular:\n //\n // const someModel = this._disposables.add(new ModelObject()); // (1) create and register model\n // this._disposables.add(someModel.onDidChange(() => { ... }); // (2) subscribe and register model-event listener\n // ...later...\n // this._disposables.dispose(); disposes (1) then (2): don't warn after (1) but after the \"overall dispose\" is done\n if (this._listeners) {\n if (_enableDisposeWithListenerWarning) {\n const listeners = Array.from(this._listeners);\n queueMicrotask(() => {\n var _a;\n for (const listener of listeners) {\n if (listener.subscription.isset()) {\n listener.subscription.unset();\n (_a = listener.stack) === null || _a === void 0 ? void 0 : _a.print();\n }\n }\n });\n }\n this._listeners.clear();\n }\n (_a = this._deliveryQueue) === null || _a === void 0 ? void 0 : _a.clear(this);\n (_c = (_b = this._options) === null || _b === void 0 ? void 0 : _b.onLastListenerRemove) === null || _c === void 0 ? void 0 : _c.call(_b);\n (_d = this._leakageMon) === null || _d === void 0 ? void 0 : _d.dispose();\n }\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (callback, thisArgs, disposables) => {\n var _a, _b, _c;\n if (!this._listeners) {\n this._listeners = new LinkedList();\n }\n const firstListener = this._listeners.isEmpty();\n if (firstListener && ((_a = this._options) === null || _a === void 0 ? void 0 : _a.onFirstListenerAdd)) {\n this._options.onFirstListenerAdd(this);\n }\n let removeMonitor;\n let stack;\n if (this._leakageMon && this._listeners.size >= 30) {\n // check and record this emitter for potential leakage\n stack = Stacktrace.create();\n removeMonitor = this._leakageMon.check(stack, this._listeners.size + 1);\n }\n if (_enableDisposeWithListenerWarning) {\n stack = stack !== null && stack !== void 0 ? stack : Stacktrace.create();\n }\n const listener = new Listener(callback, thisArgs, stack);\n const removeListener = this._listeners.push(listener);\n if (firstListener && ((_b = this._options) === null || _b === void 0 ? void 0 : _b.onFirstListenerDidAdd)) {\n this._options.onFirstListenerDidAdd(this);\n }\n if ((_c = this._options) === null || _c === void 0 ? void 0 : _c.onListenerDidAdd) {\n this._options.onListenerDidAdd(this, callback, thisArgs);\n }\n const result = listener.subscription.set(() => {\n removeMonitor === null || removeMonitor === void 0 ? void 0 : removeMonitor();\n if (!this._disposed) {\n removeListener();\n if (this._options && this._options.onLastListenerRemove) {\n const hasListeners = (this._listeners && !this._listeners.isEmpty());\n if (!hasListeners) {\n this._options.onLastListenerRemove(this);\n }\n }\n }\n });\n if (disposables instanceof DisposableStore) {\n disposables.add(result);\n }\n else if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n var _a, _b;\n if (this._listeners) {\n // put all [listener,event]-pairs into delivery queue\n // then emit all event. an inner/nested event might be\n // the driver of this\n if (!this._deliveryQueue) {\n this._deliveryQueue = new PrivateEventDeliveryQueue();\n }\n for (const listener of this._listeners) {\n this._deliveryQueue.push(this, listener, event);\n }\n // start/stop performance insight collection\n (_a = this._perfMon) === null || _a === void 0 ? void 0 : _a.start(this._deliveryQueue.size);\n this._deliveryQueue.deliver();\n (_b = this._perfMon) === null || _b === void 0 ? void 0 : _b.stop();\n }\n }\n}\nexport class EventDeliveryQueue {\n constructor() {\n this._queue = new LinkedList();\n }\n get size() {\n return this._queue.size;\n }\n push(emitter, listener, event) {\n this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));\n }\n clear(emitter) {\n const newQueue = new LinkedList();\n for (const element of this._queue) {\n if (element.emitter !== emitter) {\n newQueue.push(element);\n }\n }\n this._queue = newQueue;\n }\n deliver() {\n while (this._queue.size > 0) {\n const element = this._queue.shift();\n try {\n element.listener.invoke(element.event);\n }\n catch (e) {\n onUnexpectedError(e);\n }\n }\n }\n}\n/**\n * An `EventDeliveryQueue` that is guaranteed to be used by a single `Emitter`.\n */\nclass PrivateEventDeliveryQueue extends EventDeliveryQueue {\n clear(emitter) {\n // Here we can just clear the entire linked list because\n // all elements are guaranteed to belong to this emitter\n this._queue.clear();\n }\n}\nclass EventDeliveryQueueElement {\n constructor(emitter, listener, event) {\n this.emitter = emitter;\n this.listener = listener;\n this.event = event;\n }\n}\nexport class PauseableEmitter extends Emitter {\n constructor(options) {\n super(options);\n this._isPaused = 0;\n this._eventQueue = new LinkedList();\n this._mergeFn = options === null || options === void 0 ? void 0 : options.merge;\n }\n pause() {\n this._isPaused++;\n }\n resume() {\n if (this._isPaused !== 0 && --this._isPaused === 0) {\n if (this._mergeFn) {\n // use the merge function to create a single composite\n // event. make a copy in case firing pauses this emitter\n const events = Array.from(this._eventQueue);\n this._eventQueue.clear();\n super.fire(this._mergeFn(events));\n }\n else {\n // no merging, fire each event individually and test\n // that this emitter isn't paused halfway through\n while (!this._isPaused && this._eventQueue.size !== 0) {\n super.fire(this._eventQueue.shift());\n }\n }\n }\n }\n fire(event) {\n if (this._listeners) {\n if (this._isPaused !== 0) {\n this._eventQueue.push(event);\n }\n else {\n super.fire(event);\n }\n }\n }\n}\nexport class DebounceEmitter extends PauseableEmitter {\n constructor(options) {\n var _a;\n super(options);\n this._delay = (_a = options.delay) !== null && _a !== void 0 ? _a : 100;\n }\n fire(event) {\n if (!this._handle) {\n this.pause();\n this._handle = setTimeout(() => {\n this._handle = undefined;\n this.resume();\n }, this._delay);\n }\n super.fire(event);\n }\n}\n/**\n * The EventBufferer is useful in situations in which you want\n * to delay firing your events during some code.\n * You can wrap that code and be sure that the event will not\n * be fired during that wrap.\n *\n * ```\n * const emitter: Emitter;\n * const delayer = new EventDelayer();\n * const delayedEvent = delayer.wrapEvent(emitter.event);\n *\n * delayedEvent(console.log);\n *\n * delayer.bufferEvents(() => {\n * emitter.fire(); // event will not be fired yet\n * });\n *\n * // event will only be fired at this point\n * ```\n */\nexport class EventBufferer {\n constructor() {\n this.buffers = [];\n }\n wrapEvent(event) {\n return (listener, thisArgs, disposables) => {\n return event(i => {\n const buffer = this.buffers[this.buffers.length - 1];\n if (buffer) {\n buffer.push(() => listener.call(thisArgs, i));\n }\n else {\n listener.call(thisArgs, i);\n }\n }, undefined, disposables);\n };\n }\n bufferEvents(fn) {\n const buffer = [];\n this.buffers.push(buffer);\n const r = fn();\n this.buffers.pop();\n buffer.forEach(flush => flush());\n return r;\n }\n}\n/**\n * A Relay is an event forwarder which functions as a replugabble event pipe.\n * Once created, you can connect an input event to it and it will simply forward\n * events from that input event through its own `event` property. The `input`\n * can be changed at any point in time.\n */\nexport class Relay {\n constructor() {\n this.listening = false;\n this.inputEvent = Event.None;\n this.inputEventListener = Disposable.None;\n this.emitter = new Emitter({\n onFirstListenerDidAdd: () => {\n this.listening = true;\n this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter);\n },\n onLastListenerRemove: () => {\n this.listening = false;\n this.inputEventListener.dispose();\n }\n });\n this.event = this.emitter.event;\n }\n set input(event) {\n this.inputEvent = event;\n if (this.listening) {\n this.inputEventListener.dispose();\n this.inputEventListener = event(this.emitter.fire, this.emitter);\n }\n }\n dispose() {\n this.inputEventListener.dispose();\n this.emitter.dispose();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nexport function once(fn) {\n const _this = this;\n let didCall = false;\n let result;\n return function () {\n if (didCall) {\n return result;\n }\n didCall = true;\n result = fn.apply(_this, arguments);\n return result;\n };\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as strings from './strings.js';\n/**\n * Return a hash value for an object.\n */\nexport function hash(obj) {\n return doHash(obj, 0);\n}\nexport function doHash(obj, hashVal) {\n switch (typeof obj) {\n case 'object':\n if (obj === null) {\n return numberHash(349, hashVal);\n }\n else if (Array.isArray(obj)) {\n return arrayHash(obj, hashVal);\n }\n return objectHash(obj, hashVal);\n case 'string':\n return stringHash(obj, hashVal);\n case 'boolean':\n return booleanHash(obj, hashVal);\n case 'number':\n return numberHash(obj, hashVal);\n case 'undefined':\n return numberHash(937, hashVal);\n default:\n return numberHash(617, hashVal);\n }\n}\nexport function numberHash(val, initialHashVal) {\n return (((initialHashVal << 5) - initialHashVal) + val) | 0; // hashVal * 31 + ch, keep as int32\n}\nfunction booleanHash(b, initialHashVal) {\n return numberHash(b ? 433 : 863, initialHashVal);\n}\nexport function stringHash(s, hashVal) {\n hashVal = numberHash(149417, hashVal);\n for (let i = 0, length = s.length; i < length; i++) {\n hashVal = numberHash(s.charCodeAt(i), hashVal);\n }\n return hashVal;\n}\nfunction arrayHash(arr, initialHashVal) {\n initialHashVal = numberHash(104579, initialHashVal);\n return arr.reduce((hashVal, item) => doHash(item, hashVal), initialHashVal);\n}\nfunction objectHash(obj, initialHashVal) {\n initialHashVal = numberHash(181387, initialHashVal);\n return Object.keys(obj).sort().reduce((hashVal, key) => {\n hashVal = stringHash(key, hashVal);\n return doHash(obj[key], hashVal);\n }, initialHashVal);\n}\nfunction leftRotate(value, bits, totalBits = 32) {\n // delta + bits = totalBits\n const delta = totalBits - bits;\n // All ones, expect `delta` zeros aligned to the right\n const mask = ~((1 << delta) - 1);\n // Join (value left-shifted `bits` bits) with (masked value right-shifted `delta` bits)\n return ((value << bits) | ((mask & value) >>> delta)) >>> 0;\n}\nfunction fill(dest, index = 0, count = dest.byteLength, value = 0) {\n for (let i = 0; i < count; i++) {\n dest[index + i] = value;\n }\n}\nfunction leftPad(value, length, char = '0') {\n while (value.length < length) {\n value = char + value;\n }\n return value;\n}\nexport function toHexString(bufferOrValue, bitsize = 32) {\n if (bufferOrValue instanceof ArrayBuffer) {\n return Array.from(new Uint8Array(bufferOrValue)).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n return leftPad((bufferOrValue >>> 0).toString(16), bitsize / 4);\n}\n/**\n * A SHA1 implementation that works with strings and does not allocate.\n */\nexport class StringSHA1 {\n constructor() {\n this._h0 = 0x67452301;\n this._h1 = 0xEFCDAB89;\n this._h2 = 0x98BADCFE;\n this._h3 = 0x10325476;\n this._h4 = 0xC3D2E1F0;\n this._buff = new Uint8Array(64 /* SHA1Constant.BLOCK_SIZE */ + 3 /* to fit any utf-8 */);\n this._buffDV = new DataView(this._buff.buffer);\n this._buffLen = 0;\n this._totalLen = 0;\n this._leftoverHighSurrogate = 0;\n this._finished = false;\n }\n update(str) {\n const strLen = str.length;\n if (strLen === 0) {\n return;\n }\n const buff = this._buff;\n let buffLen = this._buffLen;\n let leftoverHighSurrogate = this._leftoverHighSurrogate;\n let charCode;\n let offset;\n if (leftoverHighSurrogate !== 0) {\n charCode = leftoverHighSurrogate;\n offset = -1;\n leftoverHighSurrogate = 0;\n }\n else {\n charCode = str.charCodeAt(0);\n offset = 0;\n }\n while (true) {\n let codePoint = charCode;\n if (strings.isHighSurrogate(charCode)) {\n if (offset + 1 < strLen) {\n const nextCharCode = str.charCodeAt(offset + 1);\n if (strings.isLowSurrogate(nextCharCode)) {\n offset++;\n codePoint = strings.computeCodePoint(charCode, nextCharCode);\n }\n else {\n // illegal => unicode replacement character\n codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */;\n }\n }\n else {\n // last character is a surrogate pair\n leftoverHighSurrogate = charCode;\n break;\n }\n }\n else if (strings.isLowSurrogate(charCode)) {\n // illegal => unicode replacement character\n codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */;\n }\n buffLen = this._push(buff, buffLen, codePoint);\n offset++;\n if (offset < strLen) {\n charCode = str.charCodeAt(offset);\n }\n else {\n break;\n }\n }\n this._buffLen = buffLen;\n this._leftoverHighSurrogate = leftoverHighSurrogate;\n }\n _push(buff, buffLen, codePoint) {\n if (codePoint < 0x0080) {\n buff[buffLen++] = codePoint;\n }\n else if (codePoint < 0x0800) {\n buff[buffLen++] = 0b11000000 | ((codePoint & 0b00000000000000000000011111000000) >>> 6);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n }\n else if (codePoint < 0x10000) {\n buff[buffLen++] = 0b11100000 | ((codePoint & 0b00000000000000001111000000000000) >>> 12);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n }\n else {\n buff[buffLen++] = 0b11110000 | ((codePoint & 0b00000000000111000000000000000000) >>> 18);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000111111000000000000) >>> 12);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n }\n if (buffLen >= 64 /* SHA1Constant.BLOCK_SIZE */) {\n this._step();\n buffLen -= 64 /* SHA1Constant.BLOCK_SIZE */;\n this._totalLen += 64 /* SHA1Constant.BLOCK_SIZE */;\n // take last 3 in case of UTF8 overflow\n buff[0] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 0];\n buff[1] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 1];\n buff[2] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 2];\n }\n return buffLen;\n }\n digest() {\n if (!this._finished) {\n this._finished = true;\n if (this._leftoverHighSurrogate) {\n // illegal => unicode replacement character\n this._leftoverHighSurrogate = 0;\n this._buffLen = this._push(this._buff, this._buffLen, 65533 /* SHA1Constant.UNICODE_REPLACEMENT */);\n }\n this._totalLen += this._buffLen;\n this._wrapUp();\n }\n return toHexString(this._h0) + toHexString(this._h1) + toHexString(this._h2) + toHexString(this._h3) + toHexString(this._h4);\n }\n _wrapUp() {\n this._buff[this._buffLen++] = 0x80;\n fill(this._buff, this._buffLen);\n if (this._buffLen > 56) {\n this._step();\n fill(this._buff);\n }\n // this will fit because the mantissa can cover up to 52 bits\n const ml = 8 * this._totalLen;\n this._buffDV.setUint32(56, Math.floor(ml / 4294967296), false);\n this._buffDV.setUint32(60, ml % 4294967296, false);\n this._step();\n }\n _step() {\n const bigBlock32 = StringSHA1._bigBlock32;\n const data = this._buffDV;\n for (let j = 0; j < 64 /* 16*4 */; j += 4) {\n bigBlock32.setUint32(j, data.getUint32(j, false), false);\n }\n for (let j = 64; j < 320 /* 80*4 */; j += 4) {\n bigBlock32.setUint32(j, leftRotate((bigBlock32.getUint32(j - 12, false) ^ bigBlock32.getUint32(j - 32, false) ^ bigBlock32.getUint32(j - 56, false) ^ bigBlock32.getUint32(j - 64, false)), 1), false);\n }\n let a = this._h0;\n let b = this._h1;\n let c = this._h2;\n let d = this._h3;\n let e = this._h4;\n let f, k;\n let temp;\n for (let j = 0; j < 80; j++) {\n if (j < 20) {\n f = (b & c) | ((~b) & d);\n k = 0x5A827999;\n }\n else if (j < 40) {\n f = b ^ c ^ d;\n k = 0x6ED9EBA1;\n }\n else if (j < 60) {\n f = (b & c) | (b & d) | (c & d);\n k = 0x8F1BBCDC;\n }\n else {\n f = b ^ c ^ d;\n k = 0xCA62C1D6;\n }\n temp = (leftRotate(a, 5) + f + e + k + bigBlock32.getUint32(j * 4, false)) & 0xffffffff;\n e = d;\n d = c;\n c = leftRotate(b, 30);\n b = a;\n a = temp;\n }\n this._h0 = (this._h0 + a) & 0xffffffff;\n this._h1 = (this._h1 + b) & 0xffffffff;\n this._h2 = (this._h2 + c) & 0xffffffff;\n this._h3 = (this._h3 + d) & 0xffffffff;\n this._h4 = (this._h4 + e) & 0xffffffff;\n }\n}\nStringSHA1._bigBlock32 = new DataView(new ArrayBuffer(320)); // 80 * 4 = 320\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nexport var Iterable;\n(function (Iterable) {\n function is(thing) {\n return thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function';\n }\n Iterable.is = is;\n const _empty = Object.freeze([]);\n function empty() {\n return _empty;\n }\n Iterable.empty = empty;\n function* single(element) {\n yield element;\n }\n Iterable.single = single;\n function from(iterable) {\n return iterable || _empty;\n }\n Iterable.from = from;\n function isEmpty(iterable) {\n return !iterable || iterable[Symbol.iterator]().next().done === true;\n }\n Iterable.isEmpty = isEmpty;\n function first(iterable) {\n return iterable[Symbol.iterator]().next().value;\n }\n Iterable.first = first;\n function some(iterable, predicate) {\n for (const element of iterable) {\n if (predicate(element)) {\n return true;\n }\n }\n return false;\n }\n Iterable.some = some;\n function find(iterable, predicate) {\n for (const element of iterable) {\n if (predicate(element)) {\n return element;\n }\n }\n return undefined;\n }\n Iterable.find = find;\n function* filter(iterable, predicate) {\n for (const element of iterable) {\n if (predicate(element)) {\n yield element;\n }\n }\n }\n Iterable.filter = filter;\n function* map(iterable, fn) {\n let index = 0;\n for (const element of iterable) {\n yield fn(element, index++);\n }\n }\n Iterable.map = map;\n function* concat(...iterables) {\n for (const iterable of iterables) {\n for (const element of iterable) {\n yield element;\n }\n }\n }\n Iterable.concat = concat;\n function* concatNested(iterables) {\n for (const iterable of iterables) {\n for (const element of iterable) {\n yield element;\n }\n }\n }\n Iterable.concatNested = concatNested;\n function reduce(iterable, reducer, initialValue) {\n let value = initialValue;\n for (const element of iterable) {\n value = reducer(value, element);\n }\n return value;\n }\n Iterable.reduce = reduce;\n function forEach(iterable, fn) {\n let index = 0;\n for (const element of iterable) {\n fn(element, index++);\n }\n }\n Iterable.forEach = forEach;\n /**\n * Returns an iterable slice of the array, with the same semantics as `array.slice()`.\n */\n function* slice(arr, from, to = arr.length) {\n if (from < 0) {\n from += arr.length;\n }\n if (to < 0) {\n to += arr.length;\n }\n else if (to > arr.length) {\n to = arr.length;\n }\n for (; from < to; from++) {\n yield arr[from];\n }\n }\n Iterable.slice = slice;\n /**\n * Consumes `atMost` elements from iterable and returns the consumed elements,\n * and an iterable for the rest of the elements.\n */\n function consume(iterable, atMost = Number.POSITIVE_INFINITY) {\n const consumed = [];\n if (atMost === 0) {\n return [consumed, iterable];\n }\n const iterator = iterable[Symbol.iterator]();\n for (let i = 0; i < atMost; i++) {\n const next = iterator.next();\n if (next.done) {\n return [consumed, Iterable.empty()];\n }\n consumed.push(next.value);\n }\n return [consumed, { [Symbol.iterator]() { return iterator; } }];\n }\n Iterable.consume = consume;\n /**\n * Consumes `atMost` elements from iterable and returns the consumed elements,\n * and an iterable for the rest of the elements.\n */\n function collect(iterable) {\n return consume(iterable)[0];\n }\n Iterable.collect = collect;\n /**\n * Returns whether the iterables are the same length and all items are\n * equal using the comparator function.\n */\n function equals(a, b, comparator = (at, bt) => at === bt) {\n const ai = a[Symbol.iterator]();\n const bi = b[Symbol.iterator]();\n while (true) {\n const an = ai.next();\n const bn = bi.next();\n if (an.done !== bn.done) {\n return false;\n }\n else if (an.done) {\n return true;\n }\n else if (!comparator(an.value, bn.value)) {\n return false;\n }\n }\n }\n Iterable.equals = equals;\n})(Iterable || (Iterable = {}));\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass KeyCodeStrMap {\n constructor() {\n this._keyCodeToStr = [];\n this._strToKeyCode = Object.create(null);\n }\n define(keyCode, str) {\n this._keyCodeToStr[keyCode] = str;\n this._strToKeyCode[str.toLowerCase()] = keyCode;\n }\n keyCodeToStr(keyCode) {\n return this._keyCodeToStr[keyCode];\n }\n strToKeyCode(str) {\n return this._strToKeyCode[str.toLowerCase()] || 0 /* KeyCode.Unknown */;\n }\n}\nconst uiMap = new KeyCodeStrMap();\nconst userSettingsUSMap = new KeyCodeStrMap();\nconst userSettingsGeneralMap = new KeyCodeStrMap();\nexport const EVENT_KEY_CODE_MAP = new Array(230);\nexport const NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE = {};\nconst scanCodeIntToStr = [];\nconst scanCodeStrToInt = Object.create(null);\nconst scanCodeLowerCaseStrToInt = Object.create(null);\n/**\n * -1 if a ScanCode => KeyCode mapping depends on kb layout.\n */\nexport const IMMUTABLE_CODE_TO_KEY_CODE = [];\n/**\n * -1 if a KeyCode => ScanCode mapping depends on kb layout.\n */\nexport const IMMUTABLE_KEY_CODE_TO_CODE = [];\nfor (let i = 0; i <= 193 /* ScanCode.MAX_VALUE */; i++) {\n IMMUTABLE_CODE_TO_KEY_CODE[i] = -1 /* KeyCode.DependsOnKbLayout */;\n}\nfor (let i = 0; i <= 127 /* KeyCode.MAX_VALUE */; i++) {\n IMMUTABLE_KEY_CODE_TO_CODE[i] = -1 /* ScanCode.DependsOnKbLayout */;\n}\n(function () {\n // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n // See https://github.com/microsoft/node-native-keymap/blob/master/deps/chromium/keyboard_codes_win.h\n const empty = '';\n const mappings = [\n // keyCodeOrd, immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel\n [0, 1, 0 /* ScanCode.None */, 'None', 0 /* KeyCode.Unknown */, 'unknown', 0, 'VK_UNKNOWN', empty, empty],\n [0, 1, 1 /* ScanCode.Hyper */, 'Hyper', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 2 /* ScanCode.Super */, 'Super', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 3 /* ScanCode.Fn */, 'Fn', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 4 /* ScanCode.FnLock */, 'FnLock', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 5 /* ScanCode.Suspend */, 'Suspend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 6 /* ScanCode.Resume */, 'Resume', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 7 /* ScanCode.Turbo */, 'Turbo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 8 /* ScanCode.Sleep */, 'Sleep', 0 /* KeyCode.Unknown */, empty, 0, 'VK_SLEEP', empty, empty],\n [0, 1, 9 /* ScanCode.WakeUp */, 'WakeUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [31, 0, 10 /* ScanCode.KeyA */, 'KeyA', 31 /* KeyCode.KeyA */, 'A', 65, 'VK_A', empty, empty],\n [32, 0, 11 /* ScanCode.KeyB */, 'KeyB', 32 /* KeyCode.KeyB */, 'B', 66, 'VK_B', empty, empty],\n [33, 0, 12 /* ScanCode.KeyC */, 'KeyC', 33 /* KeyCode.KeyC */, 'C', 67, 'VK_C', empty, empty],\n [34, 0, 13 /* ScanCode.KeyD */, 'KeyD', 34 /* KeyCode.KeyD */, 'D', 68, 'VK_D', empty, empty],\n [35, 0, 14 /* ScanCode.KeyE */, 'KeyE', 35 /* KeyCode.KeyE */, 'E', 69, 'VK_E', empty, empty],\n [36, 0, 15 /* ScanCode.KeyF */, 'KeyF', 36 /* KeyCode.KeyF */, 'F', 70, 'VK_F', empty, empty],\n [37, 0, 16 /* ScanCode.KeyG */, 'KeyG', 37 /* KeyCode.KeyG */, 'G', 71, 'VK_G', empty, empty],\n [38, 0, 17 /* ScanCode.KeyH */, 'KeyH', 38 /* KeyCode.KeyH */, 'H', 72, 'VK_H', empty, empty],\n [39, 0, 18 /* ScanCode.KeyI */, 'KeyI', 39 /* KeyCode.KeyI */, 'I', 73, 'VK_I', empty, empty],\n [40, 0, 19 /* ScanCode.KeyJ */, 'KeyJ', 40 /* KeyCode.KeyJ */, 'J', 74, 'VK_J', empty, empty],\n [41, 0, 20 /* ScanCode.KeyK */, 'KeyK', 41 /* KeyCode.KeyK */, 'K', 75, 'VK_K', empty, empty],\n [42, 0, 21 /* ScanCode.KeyL */, 'KeyL', 42 /* KeyCode.KeyL */, 'L', 76, 'VK_L', empty, empty],\n [43, 0, 22 /* ScanCode.KeyM */, 'KeyM', 43 /* KeyCode.KeyM */, 'M', 77, 'VK_M', empty, empty],\n [44, 0, 23 /* ScanCode.KeyN */, 'KeyN', 44 /* KeyCode.KeyN */, 'N', 78, 'VK_N', empty, empty],\n [45, 0, 24 /* ScanCode.KeyO */, 'KeyO', 45 /* KeyCode.KeyO */, 'O', 79, 'VK_O', empty, empty],\n [46, 0, 25 /* ScanCode.KeyP */, 'KeyP', 46 /* KeyCode.KeyP */, 'P', 80, 'VK_P', empty, empty],\n [47, 0, 26 /* ScanCode.KeyQ */, 'KeyQ', 47 /* KeyCode.KeyQ */, 'Q', 81, 'VK_Q', empty, empty],\n [48, 0, 27 /* ScanCode.KeyR */, 'KeyR', 48 /* KeyCode.KeyR */, 'R', 82, 'VK_R', empty, empty],\n [49, 0, 28 /* ScanCode.KeyS */, 'KeyS', 49 /* KeyCode.KeyS */, 'S', 83, 'VK_S', empty, empty],\n [50, 0, 29 /* ScanCode.KeyT */, 'KeyT', 50 /* KeyCode.KeyT */, 'T', 84, 'VK_T', empty, empty],\n [51, 0, 30 /* ScanCode.KeyU */, 'KeyU', 51 /* KeyCode.KeyU */, 'U', 85, 'VK_U', empty, empty],\n [52, 0, 31 /* ScanCode.KeyV */, 'KeyV', 52 /* KeyCode.KeyV */, 'V', 86, 'VK_V', empty, empty],\n [53, 0, 32 /* ScanCode.KeyW */, 'KeyW', 53 /* KeyCode.KeyW */, 'W', 87, 'VK_W', empty, empty],\n [54, 0, 33 /* ScanCode.KeyX */, 'KeyX', 54 /* KeyCode.KeyX */, 'X', 88, 'VK_X', empty, empty],\n [55, 0, 34 /* ScanCode.KeyY */, 'KeyY', 55 /* KeyCode.KeyY */, 'Y', 89, 'VK_Y', empty, empty],\n [56, 0, 35 /* ScanCode.KeyZ */, 'KeyZ', 56 /* KeyCode.KeyZ */, 'Z', 90, 'VK_Z', empty, empty],\n [22, 0, 36 /* ScanCode.Digit1 */, 'Digit1', 22 /* KeyCode.Digit1 */, '1', 49, 'VK_1', empty, empty],\n [23, 0, 37 /* ScanCode.Digit2 */, 'Digit2', 23 /* KeyCode.Digit2 */, '2', 50, 'VK_2', empty, empty],\n [24, 0, 38 /* ScanCode.Digit3 */, 'Digit3', 24 /* KeyCode.Digit3 */, '3', 51, 'VK_3', empty, empty],\n [25, 0, 39 /* ScanCode.Digit4 */, 'Digit4', 25 /* KeyCode.Digit4 */, '4', 52, 'VK_4', empty, empty],\n [26, 0, 40 /* ScanCode.Digit5 */, 'Digit5', 26 /* KeyCode.Digit5 */, '5', 53, 'VK_5', empty, empty],\n [27, 0, 41 /* ScanCode.Digit6 */, 'Digit6', 27 /* KeyCode.Digit6 */, '6', 54, 'VK_6', empty, empty],\n [28, 0, 42 /* ScanCode.Digit7 */, 'Digit7', 28 /* KeyCode.Digit7 */, '7', 55, 'VK_7', empty, empty],\n [29, 0, 43 /* ScanCode.Digit8 */, 'Digit8', 29 /* KeyCode.Digit8 */, '8', 56, 'VK_8', empty, empty],\n [30, 0, 44 /* ScanCode.Digit9 */, 'Digit9', 30 /* KeyCode.Digit9 */, '9', 57, 'VK_9', empty, empty],\n [21, 0, 45 /* ScanCode.Digit0 */, 'Digit0', 21 /* KeyCode.Digit0 */, '0', 48, 'VK_0', empty, empty],\n [3, 1, 46 /* ScanCode.Enter */, 'Enter', 3 /* KeyCode.Enter */, 'Enter', 13, 'VK_RETURN', empty, empty],\n [9, 1, 47 /* ScanCode.Escape */, 'Escape', 9 /* KeyCode.Escape */, 'Escape', 27, 'VK_ESCAPE', empty, empty],\n [1, 1, 48 /* ScanCode.Backspace */, 'Backspace', 1 /* KeyCode.Backspace */, 'Backspace', 8, 'VK_BACK', empty, empty],\n [2, 1, 49 /* ScanCode.Tab */, 'Tab', 2 /* KeyCode.Tab */, 'Tab', 9, 'VK_TAB', empty, empty],\n [10, 1, 50 /* ScanCode.Space */, 'Space', 10 /* KeyCode.Space */, 'Space', 32, 'VK_SPACE', empty, empty],\n [83, 0, 51 /* ScanCode.Minus */, 'Minus', 83 /* KeyCode.Minus */, '-', 189, 'VK_OEM_MINUS', '-', 'OEM_MINUS'],\n [81, 0, 52 /* ScanCode.Equal */, 'Equal', 81 /* KeyCode.Equal */, '=', 187, 'VK_OEM_PLUS', '=', 'OEM_PLUS'],\n [87, 0, 53 /* ScanCode.BracketLeft */, 'BracketLeft', 87 /* KeyCode.BracketLeft */, '[', 219, 'VK_OEM_4', '[', 'OEM_4'],\n [89, 0, 54 /* ScanCode.BracketRight */, 'BracketRight', 89 /* KeyCode.BracketRight */, ']', 221, 'VK_OEM_6', ']', 'OEM_6'],\n [88, 0, 55 /* ScanCode.Backslash */, 'Backslash', 88 /* KeyCode.Backslash */, '\\\\', 220, 'VK_OEM_5', '\\\\', 'OEM_5'],\n [0, 0, 56 /* ScanCode.IntlHash */, 'IntlHash', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [80, 0, 57 /* ScanCode.Semicolon */, 'Semicolon', 80 /* KeyCode.Semicolon */, ';', 186, 'VK_OEM_1', ';', 'OEM_1'],\n [90, 0, 58 /* ScanCode.Quote */, 'Quote', 90 /* KeyCode.Quote */, '\\'', 222, 'VK_OEM_7', '\\'', 'OEM_7'],\n [86, 0, 59 /* ScanCode.Backquote */, 'Backquote', 86 /* KeyCode.Backquote */, '`', 192, 'VK_OEM_3', '`', 'OEM_3'],\n [82, 0, 60 /* ScanCode.Comma */, 'Comma', 82 /* KeyCode.Comma */, ',', 188, 'VK_OEM_COMMA', ',', 'OEM_COMMA'],\n [84, 0, 61 /* ScanCode.Period */, 'Period', 84 /* KeyCode.Period */, '.', 190, 'VK_OEM_PERIOD', '.', 'OEM_PERIOD'],\n [85, 0, 62 /* ScanCode.Slash */, 'Slash', 85 /* KeyCode.Slash */, '/', 191, 'VK_OEM_2', '/', 'OEM_2'],\n [8, 1, 63 /* ScanCode.CapsLock */, 'CapsLock', 8 /* KeyCode.CapsLock */, 'CapsLock', 20, 'VK_CAPITAL', empty, empty],\n [59, 1, 64 /* ScanCode.F1 */, 'F1', 59 /* KeyCode.F1 */, 'F1', 112, 'VK_F1', empty, empty],\n [60, 1, 65 /* ScanCode.F2 */, 'F2', 60 /* KeyCode.F2 */, 'F2', 113, 'VK_F2', empty, empty],\n [61, 1, 66 /* ScanCode.F3 */, 'F3', 61 /* KeyCode.F3 */, 'F3', 114, 'VK_F3', empty, empty],\n [62, 1, 67 /* ScanCode.F4 */, 'F4', 62 /* KeyCode.F4 */, 'F4', 115, 'VK_F4', empty, empty],\n [63, 1, 68 /* ScanCode.F5 */, 'F5', 63 /* KeyCode.F5 */, 'F5', 116, 'VK_F5', empty, empty],\n [64, 1, 69 /* ScanCode.F6 */, 'F6', 64 /* KeyCode.F6 */, 'F6', 117, 'VK_F6', empty, empty],\n [65, 1, 70 /* ScanCode.F7 */, 'F7', 65 /* KeyCode.F7 */, 'F7', 118, 'VK_F7', empty, empty],\n [66, 1, 71 /* ScanCode.F8 */, 'F8', 66 /* KeyCode.F8 */, 'F8', 119, 'VK_F8', empty, empty],\n [67, 1, 72 /* ScanCode.F9 */, 'F9', 67 /* KeyCode.F9 */, 'F9', 120, 'VK_F9', empty, empty],\n [68, 1, 73 /* ScanCode.F10 */, 'F10', 68 /* KeyCode.F10 */, 'F10', 121, 'VK_F10', empty, empty],\n [69, 1, 74 /* ScanCode.F11 */, 'F11', 69 /* KeyCode.F11 */, 'F11', 122, 'VK_F11', empty, empty],\n [70, 1, 75 /* ScanCode.F12 */, 'F12', 70 /* KeyCode.F12 */, 'F12', 123, 'VK_F12', empty, empty],\n [0, 1, 76 /* ScanCode.PrintScreen */, 'PrintScreen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [79, 1, 77 /* ScanCode.ScrollLock */, 'ScrollLock', 79 /* KeyCode.ScrollLock */, 'ScrollLock', 145, 'VK_SCROLL', empty, empty],\n [7, 1, 78 /* ScanCode.Pause */, 'Pause', 7 /* KeyCode.PauseBreak */, 'PauseBreak', 19, 'VK_PAUSE', empty, empty],\n [19, 1, 79 /* ScanCode.Insert */, 'Insert', 19 /* KeyCode.Insert */, 'Insert', 45, 'VK_INSERT', empty, empty],\n [14, 1, 80 /* ScanCode.Home */, 'Home', 14 /* KeyCode.Home */, 'Home', 36, 'VK_HOME', empty, empty],\n [11, 1, 81 /* ScanCode.PageUp */, 'PageUp', 11 /* KeyCode.PageUp */, 'PageUp', 33, 'VK_PRIOR', empty, empty],\n [20, 1, 82 /* ScanCode.Delete */, 'Delete', 20 /* KeyCode.Delete */, 'Delete', 46, 'VK_DELETE', empty, empty],\n [13, 1, 83 /* ScanCode.End */, 'End', 13 /* KeyCode.End */, 'End', 35, 'VK_END', empty, empty],\n [12, 1, 84 /* ScanCode.PageDown */, 'PageDown', 12 /* KeyCode.PageDown */, 'PageDown', 34, 'VK_NEXT', empty, empty],\n [17, 1, 85 /* ScanCode.ArrowRight */, 'ArrowRight', 17 /* KeyCode.RightArrow */, 'RightArrow', 39, 'VK_RIGHT', 'Right', empty],\n [15, 1, 86 /* ScanCode.ArrowLeft */, 'ArrowLeft', 15 /* KeyCode.LeftArrow */, 'LeftArrow', 37, 'VK_LEFT', 'Left', empty],\n [18, 1, 87 /* ScanCode.ArrowDown */, 'ArrowDown', 18 /* KeyCode.DownArrow */, 'DownArrow', 40, 'VK_DOWN', 'Down', empty],\n [16, 1, 88 /* ScanCode.ArrowUp */, 'ArrowUp', 16 /* KeyCode.UpArrow */, 'UpArrow', 38, 'VK_UP', 'Up', empty],\n [78, 1, 89 /* ScanCode.NumLock */, 'NumLock', 78 /* KeyCode.NumLock */, 'NumLock', 144, 'VK_NUMLOCK', empty, empty],\n [108, 1, 90 /* ScanCode.NumpadDivide */, 'NumpadDivide', 108 /* KeyCode.NumpadDivide */, 'NumPad_Divide', 111, 'VK_DIVIDE', empty, empty],\n [103, 1, 91 /* ScanCode.NumpadMultiply */, 'NumpadMultiply', 103 /* KeyCode.NumpadMultiply */, 'NumPad_Multiply', 106, 'VK_MULTIPLY', empty, empty],\n [106, 1, 92 /* ScanCode.NumpadSubtract */, 'NumpadSubtract', 106 /* KeyCode.NumpadSubtract */, 'NumPad_Subtract', 109, 'VK_SUBTRACT', empty, empty],\n [104, 1, 93 /* ScanCode.NumpadAdd */, 'NumpadAdd', 104 /* KeyCode.NumpadAdd */, 'NumPad_Add', 107, 'VK_ADD', empty, empty],\n [3, 1, 94 /* ScanCode.NumpadEnter */, 'NumpadEnter', 3 /* KeyCode.Enter */, empty, 0, empty, empty, empty],\n [94, 1, 95 /* ScanCode.Numpad1 */, 'Numpad1', 94 /* KeyCode.Numpad1 */, 'NumPad1', 97, 'VK_NUMPAD1', empty, empty],\n [95, 1, 96 /* ScanCode.Numpad2 */, 'Numpad2', 95 /* KeyCode.Numpad2 */, 'NumPad2', 98, 'VK_NUMPAD2', empty, empty],\n [96, 1, 97 /* ScanCode.Numpad3 */, 'Numpad3', 96 /* KeyCode.Numpad3 */, 'NumPad3', 99, 'VK_NUMPAD3', empty, empty],\n [97, 1, 98 /* ScanCode.Numpad4 */, 'Numpad4', 97 /* KeyCode.Numpad4 */, 'NumPad4', 100, 'VK_NUMPAD4', empty, empty],\n [98, 1, 99 /* ScanCode.Numpad5 */, 'Numpad5', 98 /* KeyCode.Numpad5 */, 'NumPad5', 101, 'VK_NUMPAD5', empty, empty],\n [99, 1, 100 /* ScanCode.Numpad6 */, 'Numpad6', 99 /* KeyCode.Numpad6 */, 'NumPad6', 102, 'VK_NUMPAD6', empty, empty],\n [100, 1, 101 /* ScanCode.Numpad7 */, 'Numpad7', 100 /* KeyCode.Numpad7 */, 'NumPad7', 103, 'VK_NUMPAD7', empty, empty],\n [101, 1, 102 /* ScanCode.Numpad8 */, 'Numpad8', 101 /* KeyCode.Numpad8 */, 'NumPad8', 104, 'VK_NUMPAD8', empty, empty],\n [102, 1, 103 /* ScanCode.Numpad9 */, 'Numpad9', 102 /* KeyCode.Numpad9 */, 'NumPad9', 105, 'VK_NUMPAD9', empty, empty],\n [93, 1, 104 /* ScanCode.Numpad0 */, 'Numpad0', 93 /* KeyCode.Numpad0 */, 'NumPad0', 96, 'VK_NUMPAD0', empty, empty],\n [107, 1, 105 /* ScanCode.NumpadDecimal */, 'NumpadDecimal', 107 /* KeyCode.NumpadDecimal */, 'NumPad_Decimal', 110, 'VK_DECIMAL', empty, empty],\n [92, 0, 106 /* ScanCode.IntlBackslash */, 'IntlBackslash', 92 /* KeyCode.IntlBackslash */, 'OEM_102', 226, 'VK_OEM_102', empty, empty],\n [58, 1, 107 /* ScanCode.ContextMenu */, 'ContextMenu', 58 /* KeyCode.ContextMenu */, 'ContextMenu', 93, empty, empty, empty],\n [0, 1, 108 /* ScanCode.Power */, 'Power', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 109 /* ScanCode.NumpadEqual */, 'NumpadEqual', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [71, 1, 110 /* ScanCode.F13 */, 'F13', 71 /* KeyCode.F13 */, 'F13', 124, 'VK_F13', empty, empty],\n [72, 1, 111 /* ScanCode.F14 */, 'F14', 72 /* KeyCode.F14 */, 'F14', 125, 'VK_F14', empty, empty],\n [73, 1, 112 /* ScanCode.F15 */, 'F15', 73 /* KeyCode.F15 */, 'F15', 126, 'VK_F15', empty, empty],\n [74, 1, 113 /* ScanCode.F16 */, 'F16', 74 /* KeyCode.F16 */, 'F16', 127, 'VK_F16', empty, empty],\n [75, 1, 114 /* ScanCode.F17 */, 'F17', 75 /* KeyCode.F17 */, 'F17', 128, 'VK_F17', empty, empty],\n [76, 1, 115 /* ScanCode.F18 */, 'F18', 76 /* KeyCode.F18 */, 'F18', 129, 'VK_F18', empty, empty],\n [77, 1, 116 /* ScanCode.F19 */, 'F19', 77 /* KeyCode.F19 */, 'F19', 130, 'VK_F19', empty, empty],\n [0, 1, 117 /* ScanCode.F20 */, 'F20', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F20', empty, empty],\n [0, 1, 118 /* ScanCode.F21 */, 'F21', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F21', empty, empty],\n [0, 1, 119 /* ScanCode.F22 */, 'F22', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F22', empty, empty],\n [0, 1, 120 /* ScanCode.F23 */, 'F23', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F23', empty, empty],\n [0, 1, 121 /* ScanCode.F24 */, 'F24', 0 /* KeyCode.Unknown */, empty, 0, 'VK_F24', empty, empty],\n [0, 1, 122 /* ScanCode.Open */, 'Open', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 123 /* ScanCode.Help */, 'Help', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 124 /* ScanCode.Select */, 'Select', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 125 /* ScanCode.Again */, 'Again', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 126 /* ScanCode.Undo */, 'Undo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 127 /* ScanCode.Cut */, 'Cut', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 128 /* ScanCode.Copy */, 'Copy', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 129 /* ScanCode.Paste */, 'Paste', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 130 /* ScanCode.Find */, 'Find', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 131 /* ScanCode.AudioVolumeMute */, 'AudioVolumeMute', 112 /* KeyCode.AudioVolumeMute */, 'AudioVolumeMute', 173, 'VK_VOLUME_MUTE', empty, empty],\n [0, 1, 132 /* ScanCode.AudioVolumeUp */, 'AudioVolumeUp', 113 /* KeyCode.AudioVolumeUp */, 'AudioVolumeUp', 175, 'VK_VOLUME_UP', empty, empty],\n [0, 1, 133 /* ScanCode.AudioVolumeDown */, 'AudioVolumeDown', 114 /* KeyCode.AudioVolumeDown */, 'AudioVolumeDown', 174, 'VK_VOLUME_DOWN', empty, empty],\n [105, 1, 134 /* ScanCode.NumpadComma */, 'NumpadComma', 105 /* KeyCode.NUMPAD_SEPARATOR */, 'NumPad_Separator', 108, 'VK_SEPARATOR', empty, empty],\n [110, 0, 135 /* ScanCode.IntlRo */, 'IntlRo', 110 /* KeyCode.ABNT_C1 */, 'ABNT_C1', 193, 'VK_ABNT_C1', empty, empty],\n [0, 1, 136 /* ScanCode.KanaMode */, 'KanaMode', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 0, 137 /* ScanCode.IntlYen */, 'IntlYen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 138 /* ScanCode.Convert */, 'Convert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 139 /* ScanCode.NonConvert */, 'NonConvert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 140 /* ScanCode.Lang1 */, 'Lang1', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 141 /* ScanCode.Lang2 */, 'Lang2', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 142 /* ScanCode.Lang3 */, 'Lang3', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 143 /* ScanCode.Lang4 */, 'Lang4', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 144 /* ScanCode.Lang5 */, 'Lang5', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 145 /* ScanCode.Abort */, 'Abort', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 146 /* ScanCode.Props */, 'Props', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 147 /* ScanCode.NumpadParenLeft */, 'NumpadParenLeft', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 148 /* ScanCode.NumpadParenRight */, 'NumpadParenRight', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 149 /* ScanCode.NumpadBackspace */, 'NumpadBackspace', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 150 /* ScanCode.NumpadMemoryStore */, 'NumpadMemoryStore', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 151 /* ScanCode.NumpadMemoryRecall */, 'NumpadMemoryRecall', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 152 /* ScanCode.NumpadMemoryClear */, 'NumpadMemoryClear', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 153 /* ScanCode.NumpadMemoryAdd */, 'NumpadMemoryAdd', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 154 /* ScanCode.NumpadMemorySubtract */, 'NumpadMemorySubtract', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 155 /* ScanCode.NumpadClear */, 'NumpadClear', 126 /* KeyCode.Clear */, 'Clear', 12, 'VK_CLEAR', empty, empty],\n [0, 1, 156 /* ScanCode.NumpadClearEntry */, 'NumpadClearEntry', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [5, 1, 0 /* ScanCode.None */, empty, 5 /* KeyCode.Ctrl */, 'Ctrl', 17, 'VK_CONTROL', empty, empty],\n [4, 1, 0 /* ScanCode.None */, empty, 4 /* KeyCode.Shift */, 'Shift', 16, 'VK_SHIFT', empty, empty],\n [6, 1, 0 /* ScanCode.None */, empty, 6 /* KeyCode.Alt */, 'Alt', 18, 'VK_MENU', empty, empty],\n [57, 1, 0 /* ScanCode.None */, empty, 57 /* KeyCode.Meta */, 'Meta', 0, 'VK_COMMAND', empty, empty],\n [5, 1, 157 /* ScanCode.ControlLeft */, 'ControlLeft', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_LCONTROL', empty, empty],\n [4, 1, 158 /* ScanCode.ShiftLeft */, 'ShiftLeft', 4 /* KeyCode.Shift */, empty, 0, 'VK_LSHIFT', empty, empty],\n [6, 1, 159 /* ScanCode.AltLeft */, 'AltLeft', 6 /* KeyCode.Alt */, empty, 0, 'VK_LMENU', empty, empty],\n [57, 1, 160 /* ScanCode.MetaLeft */, 'MetaLeft', 57 /* KeyCode.Meta */, empty, 0, 'VK_LWIN', empty, empty],\n [5, 1, 161 /* ScanCode.ControlRight */, 'ControlRight', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_RCONTROL', empty, empty],\n [4, 1, 162 /* ScanCode.ShiftRight */, 'ShiftRight', 4 /* KeyCode.Shift */, empty, 0, 'VK_RSHIFT', empty, empty],\n [6, 1, 163 /* ScanCode.AltRight */, 'AltRight', 6 /* KeyCode.Alt */, empty, 0, 'VK_RMENU', empty, empty],\n [57, 1, 164 /* ScanCode.MetaRight */, 'MetaRight', 57 /* KeyCode.Meta */, empty, 0, 'VK_RWIN', empty, empty],\n [0, 1, 165 /* ScanCode.BrightnessUp */, 'BrightnessUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 166 /* ScanCode.BrightnessDown */, 'BrightnessDown', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 167 /* ScanCode.MediaPlay */, 'MediaPlay', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 168 /* ScanCode.MediaRecord */, 'MediaRecord', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 169 /* ScanCode.MediaFastForward */, 'MediaFastForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 170 /* ScanCode.MediaRewind */, 'MediaRewind', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [114, 1, 171 /* ScanCode.MediaTrackNext */, 'MediaTrackNext', 119 /* KeyCode.MediaTrackNext */, 'MediaTrackNext', 176, 'VK_MEDIA_NEXT_TRACK', empty, empty],\n [115, 1, 172 /* ScanCode.MediaTrackPrevious */, 'MediaTrackPrevious', 120 /* KeyCode.MediaTrackPrevious */, 'MediaTrackPrevious', 177, 'VK_MEDIA_PREV_TRACK', empty, empty],\n [116, 1, 173 /* ScanCode.MediaStop */, 'MediaStop', 121 /* KeyCode.MediaStop */, 'MediaStop', 178, 'VK_MEDIA_STOP', empty, empty],\n [0, 1, 174 /* ScanCode.Eject */, 'Eject', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [117, 1, 175 /* ScanCode.MediaPlayPause */, 'MediaPlayPause', 122 /* KeyCode.MediaPlayPause */, 'MediaPlayPause', 179, 'VK_MEDIA_PLAY_PAUSE', empty, empty],\n [0, 1, 176 /* ScanCode.MediaSelect */, 'MediaSelect', 123 /* KeyCode.LaunchMediaPlayer */, 'LaunchMediaPlayer', 181, 'VK_MEDIA_LAUNCH_MEDIA_SELECT', empty, empty],\n [0, 1, 177 /* ScanCode.LaunchMail */, 'LaunchMail', 124 /* KeyCode.LaunchMail */, 'LaunchMail', 180, 'VK_MEDIA_LAUNCH_MAIL', empty, empty],\n [0, 1, 178 /* ScanCode.LaunchApp2 */, 'LaunchApp2', 125 /* KeyCode.LaunchApp2 */, 'LaunchApp2', 183, 'VK_MEDIA_LAUNCH_APP2', empty, empty],\n [0, 1, 179 /* ScanCode.LaunchApp1 */, 'LaunchApp1', 0 /* KeyCode.Unknown */, empty, 0, 'VK_MEDIA_LAUNCH_APP1', empty, empty],\n [0, 1, 180 /* ScanCode.SelectTask */, 'SelectTask', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 181 /* ScanCode.LaunchScreenSaver */, 'LaunchScreenSaver', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 182 /* ScanCode.BrowserSearch */, 'BrowserSearch', 115 /* KeyCode.BrowserSearch */, 'BrowserSearch', 170, 'VK_BROWSER_SEARCH', empty, empty],\n [0, 1, 183 /* ScanCode.BrowserHome */, 'BrowserHome', 116 /* KeyCode.BrowserHome */, 'BrowserHome', 172, 'VK_BROWSER_HOME', empty, empty],\n [112, 1, 184 /* ScanCode.BrowserBack */, 'BrowserBack', 117 /* KeyCode.BrowserBack */, 'BrowserBack', 166, 'VK_BROWSER_BACK', empty, empty],\n [113, 1, 185 /* ScanCode.BrowserForward */, 'BrowserForward', 118 /* KeyCode.BrowserForward */, 'BrowserForward', 167, 'VK_BROWSER_FORWARD', empty, empty],\n [0, 1, 186 /* ScanCode.BrowserStop */, 'BrowserStop', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_STOP', empty, empty],\n [0, 1, 187 /* ScanCode.BrowserRefresh */, 'BrowserRefresh', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_REFRESH', empty, empty],\n [0, 1, 188 /* ScanCode.BrowserFavorites */, 'BrowserFavorites', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_FAVORITES', empty, empty],\n [0, 1, 189 /* ScanCode.ZoomToggle */, 'ZoomToggle', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 190 /* ScanCode.MailReply */, 'MailReply', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 191 /* ScanCode.MailForward */, 'MailForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 1, 192 /* ScanCode.MailSend */, 'MailSend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n // See https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n // If an Input Method Editor is processing key input and the event is keydown, return 229.\n [109, 1, 0 /* ScanCode.None */, empty, 109 /* KeyCode.KEY_IN_COMPOSITION */, 'KeyInComposition', 229, empty, empty, empty],\n [111, 1, 0 /* ScanCode.None */, empty, 111 /* KeyCode.ABNT_C2 */, 'ABNT_C2', 194, 'VK_ABNT_C2', empty, empty],\n [91, 1, 0 /* ScanCode.None */, empty, 91 /* KeyCode.OEM_8 */, 'OEM_8', 223, 'VK_OEM_8', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANA', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANGUL', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_JUNJA', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_FINAL', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANJA', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANJI', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CONVERT', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONCONVERT', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ACCEPT', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_MODECHANGE', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SELECT', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PRINT', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXECUTE', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SNAPSHOT', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HELP', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_APPS', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PROCESSKEY', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PACKET', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_SBCSCHAR', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_DBCSCHAR', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ATTN', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CRSEL', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXSEL', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EREOF', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PLAY', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ZOOM', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONAME', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PA1', empty, empty],\n [0, 1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_OEM_CLEAR', empty, empty],\n ];\n const seenKeyCode = [];\n const seenScanCode = [];\n for (const mapping of mappings) {\n const [_keyCodeOrd, immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel] = mapping;\n if (!seenScanCode[scanCode]) {\n seenScanCode[scanCode] = true;\n scanCodeIntToStr[scanCode] = scanCodeStr;\n scanCodeStrToInt[scanCodeStr] = scanCode;\n scanCodeLowerCaseStrToInt[scanCodeStr.toLowerCase()] = scanCode;\n if (immutable) {\n IMMUTABLE_CODE_TO_KEY_CODE[scanCode] = keyCode;\n if ((keyCode !== 0 /* KeyCode.Unknown */)\n && (keyCode !== 3 /* KeyCode.Enter */)\n && (keyCode !== 5 /* KeyCode.Ctrl */)\n && (keyCode !== 4 /* KeyCode.Shift */)\n && (keyCode !== 6 /* KeyCode.Alt */)\n && (keyCode !== 57 /* KeyCode.Meta */)) {\n IMMUTABLE_KEY_CODE_TO_CODE[keyCode] = scanCode;\n }\n }\n }\n if (!seenKeyCode[keyCode]) {\n seenKeyCode[keyCode] = true;\n if (!keyCodeStr) {\n throw new Error(`String representation missing for key code ${keyCode} around scan code ${scanCodeStr}`);\n }\n uiMap.define(keyCode, keyCodeStr);\n userSettingsUSMap.define(keyCode, usUserSettingsLabel || keyCodeStr);\n userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel || usUserSettingsLabel || keyCodeStr);\n }\n if (eventKeyCode) {\n EVENT_KEY_CODE_MAP[eventKeyCode] = keyCode;\n }\n if (vkey) {\n NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE[vkey] = keyCode;\n }\n }\n // Manually added due to the exclusion above (due to duplication with NumpadEnter)\n IMMUTABLE_KEY_CODE_TO_CODE[3 /* KeyCode.Enter */] = 46 /* ScanCode.Enter */;\n})();\nexport var KeyCodeUtils;\n(function (KeyCodeUtils) {\n function toString(keyCode) {\n return uiMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toString = toString;\n function fromString(key) {\n return uiMap.strToKeyCode(key);\n }\n KeyCodeUtils.fromString = fromString;\n function toUserSettingsUS(keyCode) {\n return userSettingsUSMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toUserSettingsUS = toUserSettingsUS;\n function toUserSettingsGeneral(keyCode) {\n return userSettingsGeneralMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toUserSettingsGeneral = toUserSettingsGeneral;\n function fromUserSettings(key) {\n return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key);\n }\n KeyCodeUtils.fromUserSettings = fromUserSettings;\n function toElectronAccelerator(keyCode) {\n if (keyCode >= 93 /* KeyCode.Numpad0 */ && keyCode <= 108 /* KeyCode.NumpadDivide */) {\n // [Electron Accelerators] Electron is able to parse numpad keys, but unfortunately it\n // renders them just as regular keys in menus. For example, num0 is rendered as \"0\",\n // numdiv is rendered as \"/\", numsub is rendered as \"-\".\n //\n // This can lead to incredible confusion, as it makes numpad based keybindings indistinguishable\n // from keybindings based on regular keys.\n //\n // We therefore need to fall back to custom rendering for numpad keys.\n return null;\n }\n switch (keyCode) {\n case 16 /* KeyCode.UpArrow */:\n return 'Up';\n case 18 /* KeyCode.DownArrow */:\n return 'Down';\n case 15 /* KeyCode.LeftArrow */:\n return 'Left';\n case 17 /* KeyCode.RightArrow */:\n return 'Right';\n }\n return uiMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toElectronAccelerator = toElectronAccelerator;\n})(KeyCodeUtils || (KeyCodeUtils = {}));\nexport function KeyChord(firstPart, secondPart) {\n const chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0;\n return (firstPart | chordPart) >>> 0;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nexport class Lazy {\n constructor(executor) {\n this.executor = executor;\n this._didRun = false;\n }\n /**\n * True if the lazy value has been resolved.\n */\n hasValue() { return this._didRun; }\n /**\n * Get the wrapped value.\n *\n * This will force evaluation of the lazy value if it has not been resolved yet. Lazy values are only\n * resolved once. `getValue` will re-throw exceptions that are hit while resolving the value\n */\n getValue() {\n if (!this._didRun) {\n try {\n this._value = this.executor();\n }\n catch (err) {\n this._error = err;\n }\n finally {\n this._didRun = true;\n }\n }\n if (this._error) {\n throw this._error;\n }\n return this._value;\n }\n /**\n * Get the wrapped value without forcing evaluation.\n */\n get rawValue() { return this._value; }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { once } from './functional.js';\nimport { Iterable } from './iterator.js';\n/**\n * Enables logging of potentially leaked disposables.\n *\n * A disposable is considered leaked if it is not disposed or not registered as the child of\n * another disposable. This tracking is very simple an only works for classes that either\n * extend Disposable or use a DisposableStore. This means there are a lot of false positives.\n */\nconst TRACK_DISPOSABLES = false;\nlet disposableTracker = null;\nexport function setDisposableTracker(tracker) {\n disposableTracker = tracker;\n}\nif (TRACK_DISPOSABLES) {\n const __is_disposable_tracked__ = '__is_disposable_tracked__';\n setDisposableTracker(new class {\n trackDisposable(x) {\n const stack = new Error('Potentially leaked disposable').stack;\n setTimeout(() => {\n if (!x[__is_disposable_tracked__]) {\n console.log(stack);\n }\n }, 3000);\n }\n setParent(child, parent) {\n if (child && child !== Disposable.None) {\n try {\n child[__is_disposable_tracked__] = true;\n }\n catch (_a) {\n // noop\n }\n }\n }\n markAsDisposed(disposable) {\n if (disposable && disposable !== Disposable.None) {\n try {\n disposable[__is_disposable_tracked__] = true;\n }\n catch (_a) {\n // noop\n }\n }\n }\n markAsSingleton(disposable) { }\n });\n}\nfunction trackDisposable(x) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.trackDisposable(x);\n return x;\n}\nfunction markAsDisposed(disposable) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsDisposed(disposable);\n}\nfunction setParentOfDisposable(child, parent) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.setParent(child, parent);\n}\nfunction setParentOfDisposables(children, parent) {\n if (!disposableTracker) {\n return;\n }\n for (const child of children) {\n disposableTracker.setParent(child, parent);\n }\n}\n/**\n * Indicates that the given object is a singleton which does not need to be disposed.\n*/\nexport function markAsSingleton(singleton) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsSingleton(singleton);\n return singleton;\n}\nexport class MultiDisposeError extends Error {\n constructor(errors) {\n super(`Encountered errors while disposing of store. Errors: [${errors.join(', ')}]`);\n this.errors = errors;\n }\n}\nexport function isDisposable(thing) {\n return typeof thing.dispose === 'function' && thing.dispose.length === 0;\n}\nexport function dispose(arg) {\n if (Iterable.is(arg)) {\n const errors = [];\n for (const d of arg) {\n if (d) {\n try {\n d.dispose();\n }\n catch (e) {\n errors.push(e);\n }\n }\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n else if (errors.length > 1) {\n throw new MultiDisposeError(errors);\n }\n return Array.isArray(arg) ? [] : arg;\n }\n else if (arg) {\n arg.dispose();\n return arg;\n }\n}\nexport function combinedDisposable(...disposables) {\n const parent = toDisposable(() => dispose(disposables));\n setParentOfDisposables(disposables, parent);\n return parent;\n}\nexport function toDisposable(fn) {\n const self = trackDisposable({\n dispose: once(() => {\n markAsDisposed(self);\n fn();\n })\n });\n return self;\n}\nexport class DisposableStore {\n constructor() {\n this._toDispose = new Set();\n this._isDisposed = false;\n trackDisposable(this);\n }\n /**\n * Dispose of all registered disposables and mark this object as disposed.\n *\n * Any future disposables added to this object will be disposed of on `add`.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n markAsDisposed(this);\n this._isDisposed = true;\n this.clear();\n }\n /**\n * Returns `true` if this object has been disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of all registered disposables but do not mark this object as disposed.\n */\n clear() {\n try {\n dispose(this._toDispose.values());\n }\n finally {\n this._toDispose.clear();\n }\n }\n add(o) {\n if (!o) {\n return o;\n }\n if (o === this) {\n throw new Error('Cannot register a disposable on itself!');\n }\n setParentOfDisposable(o, this);\n if (this._isDisposed) {\n if (!DisposableStore.DISABLE_DISPOSED_WARNING) {\n console.warn(new Error('Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!').stack);\n }\n }\n else {\n this._toDispose.add(o);\n }\n return o;\n }\n}\nDisposableStore.DISABLE_DISPOSED_WARNING = false;\nexport class Disposable {\n constructor() {\n this._store = new DisposableStore();\n trackDisposable(this);\n setParentOfDisposable(this._store, this);\n }\n dispose() {\n markAsDisposed(this);\n this._store.dispose();\n }\n _register(o) {\n if (o === this) {\n throw new Error('Cannot register a disposable on itself!');\n }\n return this._store.add(o);\n }\n}\nDisposable.None = Object.freeze({ dispose() { } });\n/**\n * Manages the lifecycle of a disposable value that may be changed.\n *\n * This ensures that when the disposable value is changed, the previously held disposable is disposed of. You can\n * also register a `MutableDisposable` on a `Disposable` to ensure it is automatically cleaned up.\n */\nexport class MutableDisposable {\n constructor() {\n this._isDisposed = false;\n trackDisposable(this);\n }\n get value() {\n return this._isDisposed ? undefined : this._value;\n }\n set value(value) {\n var _a;\n if (this._isDisposed || value === this._value) {\n return;\n }\n (_a = this._value) === null || _a === void 0 ? void 0 : _a.dispose();\n if (value) {\n setParentOfDisposable(value, this);\n }\n this._value = value;\n }\n clear() {\n this.value = undefined;\n }\n dispose() {\n var _a;\n this._isDisposed = true;\n markAsDisposed(this);\n (_a = this._value) === null || _a === void 0 ? void 0 : _a.dispose();\n this._value = undefined;\n }\n /**\n * Clears the value, but does not dispose it.\n * The old value is returned.\n */\n clearAndLeak() {\n const oldValue = this._value;\n this._value = undefined;\n if (oldValue) {\n setParentOfDisposable(oldValue, null);\n }\n return oldValue;\n }\n}\nexport class RefCountedDisposable {\n constructor(_disposable) {\n this._disposable = _disposable;\n this._counter = 1;\n }\n acquire() {\n this._counter++;\n return this;\n }\n release() {\n if (--this._counter === 0) {\n this._disposable.dispose();\n }\n return this;\n }\n}\n/**\n * A safe disposable can be `unset` so that a leaked reference (listener)\n * can be cut-off.\n */\nexport class SafeDisposable {\n constructor() {\n this.dispose = () => { };\n this.unset = () => { };\n this.isset = () => false;\n trackDisposable(this);\n }\n set(fn) {\n let callback = fn;\n this.unset = () => callback = undefined;\n this.isset = () => callback !== undefined;\n this.dispose = () => {\n if (callback) {\n callback();\n callback = undefined;\n markAsDisposed(this);\n }\n };\n return this;\n }\n}\nexport class ImmortalReference {\n constructor(object) {\n this.object = object;\n }\n dispose() { }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass Node {\n constructor(element) {\n this.element = element;\n this.next = Node.Undefined;\n this.prev = Node.Undefined;\n }\n}\nNode.Undefined = new Node(undefined);\nexport class LinkedList {\n constructor() {\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n this._size = 0;\n }\n get size() {\n return this._size;\n }\n isEmpty() {\n return this._first === Node.Undefined;\n }\n clear() {\n let node = this._first;\n while (node !== Node.Undefined) {\n const next = node.next;\n node.prev = Node.Undefined;\n node.next = Node.Undefined;\n node = next;\n }\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n this._size = 0;\n }\n unshift(element) {\n return this._insert(element, false);\n }\n push(element) {\n return this._insert(element, true);\n }\n _insert(element, atTheEnd) {\n const newNode = new Node(element);\n if (this._first === Node.Undefined) {\n this._first = newNode;\n this._last = newNode;\n }\n else if (atTheEnd) {\n // push\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n }\n else {\n // unshift\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n this._size += 1;\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n shift() {\n if (this._first === Node.Undefined) {\n return undefined;\n }\n else {\n const res = this._first.element;\n this._remove(this._first);\n return res;\n }\n }\n pop() {\n if (this._last === Node.Undefined) {\n return undefined;\n }\n else {\n const res = this._last.element;\n this._remove(this._last);\n return res;\n }\n }\n _remove(node) {\n if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {\n // middle\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n }\n else if (node.prev === Node.Undefined && node.next === Node.Undefined) {\n // only node\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n }\n else if (node.next === Node.Undefined) {\n // last\n this._last = this._last.prev;\n this._last.next = Node.Undefined;\n }\n else if (node.prev === Node.Undefined) {\n // first\n this._first = this._first.next;\n this._first.prev = Node.Undefined;\n }\n // done\n this._size -= 1;\n }\n *[Symbol.iterator]() {\n let node = this._first;\n while (node !== Node.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { isArray, isTypedArray, isObject, isUndefinedOrNull } from './types.js';\nexport function deepClone(obj) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n if (obj instanceof RegExp) {\n // See https://github.com/microsoft/TypeScript/issues/10990\n return obj;\n }\n const result = Array.isArray(obj) ? [] : {};\n Object.keys(obj).forEach((key) => {\n if (obj[key] && typeof obj[key] === 'object') {\n result[key] = deepClone(obj[key]);\n }\n else {\n result[key] = obj[key];\n }\n });\n return result;\n}\nexport function deepFreeze(obj) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n const stack = [obj];\n while (stack.length > 0) {\n const obj = stack.shift();\n Object.freeze(obj);\n for (const key in obj) {\n if (_hasOwnProperty.call(obj, key)) {\n const prop = obj[key];\n if (typeof prop === 'object' && !Object.isFrozen(prop) && !isTypedArray(prop)) {\n stack.push(prop);\n }\n }\n }\n }\n return obj;\n}\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\nexport function cloneAndChange(obj, changer) {\n return _cloneAndChange(obj, changer, new Set());\n}\nfunction _cloneAndChange(obj, changer, seen) {\n if (isUndefinedOrNull(obj)) {\n return obj;\n }\n const changed = changer(obj);\n if (typeof changed !== 'undefined') {\n return changed;\n }\n if (isArray(obj)) {\n const r1 = [];\n for (const e of obj) {\n r1.push(_cloneAndChange(e, changer, seen));\n }\n return r1;\n }\n if (isObject(obj)) {\n if (seen.has(obj)) {\n throw new Error('Cannot clone recursive data-structure');\n }\n seen.add(obj);\n const r2 = {};\n for (const i2 in obj) {\n if (_hasOwnProperty.call(obj, i2)) {\n r2[i2] = _cloneAndChange(obj[i2], changer, seen);\n }\n }\n seen.delete(obj);\n return r2;\n }\n return obj;\n}\n/**\n * Copies all properties of source into destination. The optional parameter \"overwrite\" allows to control\n * if existing properties on the destination should be overwritten or not. Defaults to true (overwrite).\n */\nexport function mixin(destination, source, overwrite = true) {\n if (!isObject(destination)) {\n return source;\n }\n if (isObject(source)) {\n Object.keys(source).forEach(key => {\n if (key in destination) {\n if (overwrite) {\n if (isObject(destination[key]) && isObject(source[key])) {\n mixin(destination[key], source[key], overwrite);\n }\n else {\n destination[key] = source[key];\n }\n }\n }\n else {\n destination[key] = source[key];\n }\n });\n }\n return destination;\n}\nexport function equals(one, other) {\n if (one === other) {\n return true;\n }\n if (one === null || one === undefined || other === null || other === undefined) {\n return false;\n }\n if (typeof one !== typeof other) {\n return false;\n }\n if (typeof one !== 'object') {\n return false;\n }\n if ((Array.isArray(one)) !== (Array.isArray(other))) {\n return false;\n }\n let i;\n let key;\n if (Array.isArray(one)) {\n if (one.length !== other.length) {\n return false;\n }\n for (i = 0; i < one.length; i++) {\n if (!equals(one[i], other[i])) {\n return false;\n }\n }\n }\n else {\n const oneKeys = [];\n for (key in one) {\n oneKeys.push(key);\n }\n oneKeys.sort();\n const otherKeys = [];\n for (key in other) {\n otherKeys.push(key);\n }\n otherKeys.sort();\n if (!equals(oneKeys, otherKeys)) {\n return false;\n }\n for (i = 0; i < oneKeys.length; i++) {\n if (!equals(one[oneKeys[i]], other[oneKeys[i]])) {\n return false;\n }\n }\n }\n return true;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// NOTE: VSCode's copy of nodejs path library to be usable in common (non-node) namespace\n// Copied from: https://github.com/nodejs/node/blob/v14.16.0/lib/path.js\n/**\n * Copyright Joyent, Inc. and other Node contributors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to permit\n * persons to whom the Software is furnished to do so, subject to the\n * following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n * USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nimport * as process from './process.js';\nconst CHAR_UPPERCASE_A = 65; /* A */\nconst CHAR_LOWERCASE_A = 97; /* a */\nconst CHAR_UPPERCASE_Z = 90; /* Z */\nconst CHAR_LOWERCASE_Z = 122; /* z */\nconst CHAR_DOT = 46; /* . */\nconst CHAR_FORWARD_SLASH = 47; /* / */\nconst CHAR_BACKWARD_SLASH = 92; /* \\ */\nconst CHAR_COLON = 58; /* : */\nconst CHAR_QUESTION_MARK = 63; /* ? */\nclass ErrorInvalidArgType extends Error {\n constructor(name, expected, actual) {\n // determiner: 'must be' or 'must not be'\n let determiner;\n if (typeof expected === 'string' && expected.indexOf('not ') === 0) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n }\n else {\n determiner = 'must be';\n }\n const type = name.indexOf('.') !== -1 ? 'property' : 'argument';\n let msg = `The \"${name}\" ${type} ${determiner} of type ${expected}`;\n msg += `. Received type ${typeof actual}`;\n super(msg);\n this.code = 'ERR_INVALID_ARG_TYPE';\n }\n}\nfunction validateString(value, name) {\n if (typeof value !== 'string') {\n throw new ErrorInvalidArgType(name, 'string', value);\n }\n}\nfunction isPathSeparator(code) {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\nfunction isPosixPathSeparator(code) {\n return code === CHAR_FORWARD_SLASH;\n}\nfunction isWindowsDeviceRoot(code) {\n return (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||\n (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z);\n}\n// Resolves . and .. elements in a path with directory names\nfunction normalizeString(path, allowAboveRoot, separator, isPathSeparator) {\n let res = '';\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code = 0;\n for (let i = 0; i <= path.length; ++i) {\n if (i < path.length) {\n code = path.charCodeAt(i);\n }\n else if (isPathSeparator(code)) {\n break;\n }\n else {\n code = CHAR_FORWARD_SLASH;\n }\n if (isPathSeparator(code)) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n }\n else if (dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 ||\n res.charCodeAt(res.length - 1) !== CHAR_DOT ||\n res.charCodeAt(res.length - 2) !== CHAR_DOT) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(separator);\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n }\n else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n else if (res.length !== 0) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n res += res.length > 0 ? `${separator}..` : '..';\n lastSegmentLength = 2;\n }\n }\n else {\n if (res.length > 0) {\n res += `${separator}${path.slice(lastSlash + 1, i)}`;\n }\n else {\n res = path.slice(lastSlash + 1, i);\n }\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n }\n else if (code === CHAR_DOT && dots !== -1) {\n ++dots;\n }\n else {\n dots = -1;\n }\n }\n return res;\n}\nfunction _format(sep, pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new ErrorInvalidArgType('pathObject', 'Object', pathObject);\n }\n const dir = pathObject.dir || pathObject.root;\n const base = pathObject.base ||\n `${pathObject.name || ''}${pathObject.ext || ''}`;\n if (!dir) {\n return base;\n }\n return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`;\n}\nexport const win32 = {\n // path.resolve([from ...], to)\n resolve(...pathSegments) {\n let resolvedDevice = '';\n let resolvedTail = '';\n let resolvedAbsolute = false;\n for (let i = pathSegments.length - 1; i >= -1; i--) {\n let path;\n if (i >= 0) {\n path = pathSegments[i];\n validateString(path, 'path');\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n }\n else if (resolvedDevice.length === 0) {\n path = process.cwd();\n }\n else {\n // Windows has the concept of drive-specific current working\n // directories. If we've resolved a drive letter but not yet an\n // absolute path, get cwd for that drive, or the process cwd if\n // the drive cwd is not available. We're sure the device is not\n // a UNC path at this points, because UNC paths are always absolute.\n path = process.env[`=${resolvedDevice}`] || process.cwd();\n // Verify that a cwd was found and that it actually points\n // to our drive. If not, default to the drive's root.\n if (path === undefined ||\n (path.slice(0, 2).toLowerCase() !== resolvedDevice.toLowerCase() &&\n path.charCodeAt(2) === CHAR_BACKWARD_SLASH)) {\n path = `${resolvedDevice}\\\\`;\n }\n }\n const len = path.length;\n let rootEnd = 0;\n let device = '';\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n // Try to match a root\n if (len === 1) {\n if (isPathSeparator(code)) {\n // `path` contains just a path separator\n rootEnd = 1;\n isAbsolute = true;\n }\n }\n else if (isPathSeparator(code)) {\n // Possible UNC root\n // If we started with a separator, we know we at least have an\n // absolute path of some kind (UNC or otherwise)\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len || j !== last) {\n // We matched a UNC root\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n }\n else {\n rootEnd = 1;\n }\n }\n else if (isWindowsDeviceRoot(code) &&\n path.charCodeAt(1) === CHAR_COLON) {\n // Possible device root\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2 && isPathSeparator(path.charCodeAt(2))) {\n // Treat separator following drive name as an absolute path\n // indicator\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n if (device.length > 0) {\n if (resolvedDevice.length > 0) {\n if (device.toLowerCase() !== resolvedDevice.toLowerCase()) {\n // This path points to another device so it is not applicable\n continue;\n }\n }\n else {\n resolvedDevice = device;\n }\n }\n if (resolvedAbsolute) {\n if (resolvedDevice.length > 0) {\n break;\n }\n }\n else {\n resolvedTail = `${path.slice(rootEnd)}\\\\${resolvedTail}`;\n resolvedAbsolute = isAbsolute;\n if (isAbsolute && resolvedDevice.length > 0) {\n break;\n }\n }\n }\n // At this point the path should be resolved to a full absolute path,\n // but handle relative paths to be safe (might happen when process.cwd()\n // fails)\n // Normalize the tail path\n resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, '\\\\', isPathSeparator);\n return resolvedAbsolute ?\n `${resolvedDevice}\\\\${resolvedTail}` :\n `${resolvedDevice}${resolvedTail}` || '.';\n },\n normalize(path) {\n validateString(path, 'path');\n const len = path.length;\n if (len === 0) {\n return '.';\n }\n let rootEnd = 0;\n let device;\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n // Try to match a root\n if (len === 1) {\n // `path` contains just a single char, exit early to avoid\n // unnecessary work\n return isPosixPathSeparator(code) ? '\\\\' : path;\n }\n if (isPathSeparator(code)) {\n // Possible UNC root\n // If we started with a separator, we know we at least have an absolute\n // path of some kind (UNC or otherwise)\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len) {\n // We matched a UNC root only\n // Return the normalized version of the UNC root since there\n // is nothing left to process\n return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n }\n else {\n rootEnd = 1;\n }\n }\n else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n // Possible device root\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2 && isPathSeparator(path.charCodeAt(2))) {\n // Treat separator following drive name as an absolute path\n // indicator\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n let tail = rootEnd < len ?\n normalizeString(path.slice(rootEnd), !isAbsolute, '\\\\', isPathSeparator) :\n '';\n if (tail.length === 0 && !isAbsolute) {\n tail = '.';\n }\n if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n tail += '\\\\';\n }\n if (device === undefined) {\n return isAbsolute ? `\\\\${tail}` : tail;\n }\n return isAbsolute ? `${device}\\\\${tail}` : `${device}${tail}`;\n },\n isAbsolute(path) {\n validateString(path, 'path');\n const len = path.length;\n if (len === 0) {\n return false;\n }\n const code = path.charCodeAt(0);\n return isPathSeparator(code) ||\n // Possible device root\n (len > 2 &&\n isWindowsDeviceRoot(code) &&\n path.charCodeAt(1) === CHAR_COLON &&\n isPathSeparator(path.charCodeAt(2)));\n },\n join(...paths) {\n if (paths.length === 0) {\n return '.';\n }\n let joined;\n let firstPart;\n for (let i = 0; i < paths.length; ++i) {\n const arg = paths[i];\n validateString(arg, 'path');\n if (arg.length > 0) {\n if (joined === undefined) {\n joined = firstPart = arg;\n }\n else {\n joined += `\\\\${arg}`;\n }\n }\n }\n if (joined === undefined) {\n return '.';\n }\n // Make sure that the joined path doesn't start with two slashes, because\n // normalize() will mistake it for a UNC path then.\n //\n // This step is skipped when it is very clear that the user actually\n // intended to point at a UNC path. This is assumed when the first\n // non-empty string arguments starts with exactly two slashes followed by\n // at least one more non-slash character.\n //\n // Note that for normalize() to treat a path as a UNC path it needs to\n // have at least 2 components, so we don't filter for that here.\n // This means that the user can use join to construct UNC paths from\n // a server name and a share name; for example:\n // path.join('//server', 'share') -> '\\\\\\\\server\\\\share\\\\')\n let needsReplace = true;\n let slashCount = 0;\n if (typeof firstPart === 'string' && isPathSeparator(firstPart.charCodeAt(0))) {\n ++slashCount;\n const firstLen = firstPart.length;\n if (firstLen > 1 && isPathSeparator(firstPart.charCodeAt(1))) {\n ++slashCount;\n if (firstLen > 2) {\n if (isPathSeparator(firstPart.charCodeAt(2))) {\n ++slashCount;\n }\n else {\n // We matched a UNC path in the first part\n needsReplace = false;\n }\n }\n }\n }\n if (needsReplace) {\n // Find any more consecutive slashes we need to replace\n while (slashCount < joined.length &&\n isPathSeparator(joined.charCodeAt(slashCount))) {\n slashCount++;\n }\n // Replace the slashes if needed\n if (slashCount >= 2) {\n joined = `\\\\${joined.slice(slashCount)}`;\n }\n }\n return win32.normalize(joined);\n },\n // It will solve the relative path from `from` to `to`, for instance:\n // from = 'C:\\\\orandea\\\\test\\\\aaa'\n // to = 'C:\\\\orandea\\\\impl\\\\bbb'\n // The output of the function should be: '..\\\\..\\\\impl\\\\bbb'\n relative(from, to) {\n validateString(from, 'from');\n validateString(to, 'to');\n if (from === to) {\n return '';\n }\n const fromOrig = win32.resolve(from);\n const toOrig = win32.resolve(to);\n if (fromOrig === toOrig) {\n return '';\n }\n from = fromOrig.toLowerCase();\n to = toOrig.toLowerCase();\n if (from === to) {\n return '';\n }\n // Trim any leading backslashes\n let fromStart = 0;\n while (fromStart < from.length &&\n from.charCodeAt(fromStart) === CHAR_BACKWARD_SLASH) {\n fromStart++;\n }\n // Trim trailing backslashes (applicable to UNC paths only)\n let fromEnd = from.length;\n while (fromEnd - 1 > fromStart &&\n from.charCodeAt(fromEnd - 1) === CHAR_BACKWARD_SLASH) {\n fromEnd--;\n }\n const fromLen = fromEnd - fromStart;\n // Trim any leading backslashes\n let toStart = 0;\n while (toStart < to.length &&\n to.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) {\n toStart++;\n }\n // Trim trailing backslashes (applicable to UNC paths only)\n let toEnd = to.length;\n while (toEnd - 1 > toStart &&\n to.charCodeAt(toEnd - 1) === CHAR_BACKWARD_SLASH) {\n toEnd--;\n }\n const toLen = toEnd - toStart;\n // Compare paths to find the longest common path from root\n const length = fromLen < toLen ? fromLen : toLen;\n let lastCommonSep = -1;\n let i = 0;\n for (; i < length; i++) {\n const fromCode = from.charCodeAt(fromStart + i);\n if (fromCode !== to.charCodeAt(toStart + i)) {\n break;\n }\n else if (fromCode === CHAR_BACKWARD_SLASH) {\n lastCommonSep = i;\n }\n }\n // We found a mismatch before the first common path separator was seen, so\n // return the original `to`.\n if (i !== length) {\n if (lastCommonSep === -1) {\n return toOrig;\n }\n }\n else {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === CHAR_BACKWARD_SLASH) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\foo\\\\bar\\\\baz'\n return toOrig.slice(toStart + i + 1);\n }\n if (i === 2) {\n // We get here if `from` is the device root.\n // For example: from='C:\\\\'; to='C:\\\\foo'\n return toOrig.slice(toStart + i);\n }\n }\n if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === CHAR_BACKWARD_SLASH) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\foo'\n lastCommonSep = i;\n }\n else if (i === 2) {\n // We get here if `to` is the device root.\n // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\'\n lastCommonSep = 3;\n }\n }\n if (lastCommonSep === -1) {\n lastCommonSep = 0;\n }\n }\n let out = '';\n // Generate the relative path based on the path difference between `to` and\n // `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === CHAR_BACKWARD_SLASH) {\n out += out.length === 0 ? '..' : '\\\\..';\n }\n }\n toStart += lastCommonSep;\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0) {\n return `${out}${toOrig.slice(toStart, toEnd)}`;\n }\n if (toOrig.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) {\n ++toStart;\n }\n return toOrig.slice(toStart, toEnd);\n },\n toNamespacedPath(path) {\n // Note: this will *probably* throw somewhere.\n if (typeof path !== 'string') {\n return path;\n }\n if (path.length === 0) {\n return '';\n }\n const resolvedPath = win32.resolve(path);\n if (resolvedPath.length <= 2) {\n return path;\n }\n if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) {\n // Possible UNC root\n if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) {\n const code = resolvedPath.charCodeAt(2);\n if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) {\n // Matched non-long UNC root, convert the path to a long UNC path\n return `\\\\\\\\?\\\\UNC\\\\${resolvedPath.slice(2)}`;\n }\n }\n }\n else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0)) &&\n resolvedPath.charCodeAt(1) === CHAR_COLON &&\n resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH) {\n // Matched device root, convert the path to a long UNC path\n return `\\\\\\\\?\\\\${resolvedPath}`;\n }\n return path;\n },\n dirname(path) {\n validateString(path, 'path');\n const len = path.length;\n if (len === 0) {\n return '.';\n }\n let rootEnd = -1;\n let offset = 0;\n const code = path.charCodeAt(0);\n if (len === 1) {\n // `path` contains just a path separator, exit early to avoid\n // unnecessary work or a dot.\n return isPathSeparator(code) ? path : '.';\n }\n // Try to match a root\n if (isPathSeparator(code)) {\n // Possible UNC root\n rootEnd = offset = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len) {\n // We matched a UNC root only\n return path;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n // Offset by 1 to include the separator after the UNC root to\n // treat it as a \"normal root\" on top of a (UNC) root\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n // Possible device root\n }\n else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n rootEnd = len > 2 && isPathSeparator(path.charCodeAt(2)) ? 3 : 2;\n offset = rootEnd;\n }\n let end = -1;\n let matchedSlash = true;\n for (let i = len - 1; i >= offset; --i) {\n if (isPathSeparator(path.charCodeAt(i))) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n }\n else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n if (end === -1) {\n if (rootEnd === -1) {\n return '.';\n }\n end = rootEnd;\n }\n return path.slice(0, end);\n },\n basename(path, ext) {\n if (ext !== undefined) {\n validateString(ext, 'ext');\n }\n validateString(path, 'path');\n let start = 0;\n let end = -1;\n let matchedSlash = true;\n let i;\n // Check for a drive letter prefix so as not to mistake the following\n // path separator as an extra separator at the end of the path that can be\n // disregarded\n if (path.length >= 2 &&\n isWindowsDeviceRoot(path.charCodeAt(0)) &&\n path.charCodeAt(1) === CHAR_COLON) {\n start = 2;\n }\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext === path) {\n return '';\n }\n let extIdx = ext.length - 1;\n let firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= start; --i) {\n const code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n }\n else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n if (start === end) {\n end = firstNonSlashEnd;\n }\n else if (end === -1) {\n end = path.length;\n }\n return path.slice(start, end);\n }\n for (i = path.length - 1; i >= start; --i) {\n if (isPathSeparator(path.charCodeAt(i))) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n if (end === -1) {\n return '';\n }\n return path.slice(start, end);\n },\n extname(path) {\n validateString(path, 'path');\n let start = 0;\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n // Check for a drive letter prefix so as not to mistake the following\n // path separator as an extra separator at the end of the path that can be\n // disregarded\n if (path.length >= 2 &&\n path.charCodeAt(1) === CHAR_COLON &&\n isWindowsDeviceRoot(path.charCodeAt(0))) {\n start = startPart = 2;\n }\n for (let i = path.length - 1; i >= start; --i) {\n const code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (startDot === -1 ||\n end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n return '';\n }\n return path.slice(startDot, end);\n },\n format: _format.bind(null, '\\\\'),\n parse(path) {\n validateString(path, 'path');\n const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) {\n return ret;\n }\n const len = path.length;\n let rootEnd = 0;\n let code = path.charCodeAt(0);\n if (len === 1) {\n if (isPathSeparator(code)) {\n // `path` contains just a path separator, exit early to avoid\n // unnecessary work\n ret.root = ret.dir = path;\n return ret;\n }\n ret.base = ret.name = path;\n return ret;\n }\n // Try to match a root\n if (isPathSeparator(code)) {\n // Possible UNC root\n rootEnd = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len) {\n // We matched a UNC root only\n rootEnd = j;\n }\n else if (j !== last) {\n // We matched a UNC root with leftovers\n rootEnd = j + 1;\n }\n }\n }\n }\n }\n else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n // Possible device root\n if (len <= 2) {\n // `path` contains just a drive root, exit early to avoid\n // unnecessary work\n ret.root = ret.dir = path;\n return ret;\n }\n rootEnd = 2;\n if (isPathSeparator(path.charCodeAt(2))) {\n if (len === 3) {\n // `path` contains just a drive root, exit early to avoid\n // unnecessary work\n ret.root = ret.dir = path;\n return ret;\n }\n rootEnd = 3;\n }\n }\n if (rootEnd > 0) {\n ret.root = path.slice(0, rootEnd);\n }\n let startDot = -1;\n let startPart = rootEnd;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n // Get non-dir info\n for (; i >= rootEnd; --i) {\n code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (end !== -1) {\n if (startDot === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n ret.base = ret.name = path.slice(startPart, end);\n }\n else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n ret.ext = path.slice(startDot, end);\n }\n }\n // If the directory is the root, use the entire root as the `dir` including\n // the trailing slash if any (`C:\\abc` -> `C:\\`). Otherwise, strip out the\n // trailing slash (`C:\\abc\\def` -> `C:\\abc`).\n if (startPart > 0 && startPart !== rootEnd) {\n ret.dir = path.slice(0, startPart - 1);\n }\n else {\n ret.dir = ret.root;\n }\n return ret;\n },\n sep: '\\\\',\n delimiter: ';',\n win32: null,\n posix: null\n};\nexport const posix = {\n // path.resolve([from ...], to)\n resolve(...pathSegments) {\n let resolvedPath = '';\n let resolvedAbsolute = false;\n for (let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n const path = i >= 0 ? pathSegments[i] : process.cwd();\n validateString(path, 'path');\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n }\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n // Normalize the path\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator);\n if (resolvedAbsolute) {\n return `/${resolvedPath}`;\n }\n return resolvedPath.length > 0 ? resolvedPath : '.';\n },\n normalize(path) {\n validateString(path, 'path');\n if (path.length === 0) {\n return '.';\n }\n const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH;\n // Normalize the path\n path = normalizeString(path, !isAbsolute, '/', isPosixPathSeparator);\n if (path.length === 0) {\n if (isAbsolute) {\n return '/';\n }\n return trailingSeparator ? './' : '.';\n }\n if (trailingSeparator) {\n path += '/';\n }\n return isAbsolute ? `/${path}` : path;\n },\n isAbsolute(path) {\n validateString(path, 'path');\n return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n },\n join(...paths) {\n if (paths.length === 0) {\n return '.';\n }\n let joined;\n for (let i = 0; i < paths.length; ++i) {\n const arg = paths[i];\n validateString(arg, 'path');\n if (arg.length > 0) {\n if (joined === undefined) {\n joined = arg;\n }\n else {\n joined += `/${arg}`;\n }\n }\n }\n if (joined === undefined) {\n return '.';\n }\n return posix.normalize(joined);\n },\n relative(from, to) {\n validateString(from, 'from');\n validateString(to, 'to');\n if (from === to) {\n return '';\n }\n // Trim leading forward slashes.\n from = posix.resolve(from);\n to = posix.resolve(to);\n if (from === to) {\n return '';\n }\n const fromStart = 1;\n const fromEnd = from.length;\n const fromLen = fromEnd - fromStart;\n const toStart = 1;\n const toLen = to.length - toStart;\n // Compare paths to find the longest common path from root\n const length = (fromLen < toLen ? fromLen : toLen);\n let lastCommonSep = -1;\n let i = 0;\n for (; i < length; i++) {\n const fromCode = from.charCodeAt(fromStart + i);\n if (fromCode !== to.charCodeAt(toStart + i)) {\n break;\n }\n else if (fromCode === CHAR_FORWARD_SLASH) {\n lastCommonSep = i;\n }\n }\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n }\n if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n }\n else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n }\n else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo/bar'; to='/'\n lastCommonSep = 0;\n }\n }\n }\n let out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`.\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n out += out.length === 0 ? '..' : '/..';\n }\n }\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts.\n return `${out}${to.slice(toStart + lastCommonSep)}`;\n },\n toNamespacedPath(path) {\n // Non-op on posix systems\n return path;\n },\n dirname(path) {\n validateString(path, 'path');\n if (path.length === 0) {\n return '.';\n }\n const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n let end = -1;\n let matchedSlash = true;\n for (let i = path.length - 1; i >= 1; --i) {\n if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n }\n else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n if (end === -1) {\n return hasRoot ? '/' : '.';\n }\n if (hasRoot && end === 1) {\n return '//';\n }\n return path.slice(0, end);\n },\n basename(path, ext) {\n if (ext !== undefined) {\n validateString(ext, 'ext');\n }\n validateString(path, 'path');\n let start = 0;\n let end = -1;\n let matchedSlash = true;\n let i;\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext === path) {\n return '';\n }\n let extIdx = ext.length - 1;\n let firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n const code = path.charCodeAt(i);\n if (code === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n }\n else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n if (start === end) {\n end = firstNonSlashEnd;\n }\n else if (end === -1) {\n end = path.length;\n }\n return path.slice(start, end);\n }\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n if (end === -1) {\n return '';\n }\n return path.slice(start, end);\n },\n extname(path) {\n validateString(path, 'path');\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n for (let i = path.length - 1; i >= 0; --i) {\n const code = path.charCodeAt(i);\n if (code === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (startDot === -1 ||\n end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n return '';\n }\n return path.slice(startDot, end);\n },\n format: _format.bind(null, '/'),\n parse(path) {\n validateString(path, 'path');\n const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) {\n return ret;\n }\n const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n let start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n }\n else {\n start = 0;\n }\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n // Get non-dir info\n for (; i >= start; --i) {\n const code = path.charCodeAt(i);\n if (code === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (end !== -1) {\n const start = startPart === 0 && isAbsolute ? 1 : startPart;\n if (startDot === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n ret.base = ret.name = path.slice(start, end);\n }\n else {\n ret.name = path.slice(start, startDot);\n ret.base = path.slice(start, end);\n ret.ext = path.slice(startDot, end);\n }\n }\n if (startPart > 0) {\n ret.dir = path.slice(0, startPart - 1);\n }\n else if (isAbsolute) {\n ret.dir = '/';\n }\n return ret;\n },\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\nposix.win32 = win32.win32 = win32;\nposix.posix = win32.posix = posix;\nexport const normalize = (process.platform === 'win32' ? win32.normalize : posix.normalize);\nexport const resolve = (process.platform === 'win32' ? win32.resolve : posix.resolve);\nexport const relative = (process.platform === 'win32' ? win32.relative : posix.relative);\nexport const dirname = (process.platform === 'win32' ? win32.dirname : posix.dirname);\nexport const basename = (process.platform === 'win32' ? win32.basename : posix.basename);\nexport const extname = (process.platform === 'win32' ? win32.extname : posix.extname);\nexport const sep = (process.platform === 'win32' ? win32.sep : posix.sep);\n","var _a;\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as nls from '../../nls.js';\nconst LANGUAGE_DEFAULT = 'en';\nlet _isWindows = false;\nlet _isMacintosh = false;\nlet _isLinux = false;\nlet _isLinuxSnap = false;\nlet _isNative = false;\nlet _isWeb = false;\nlet _isElectron = false;\nlet _isIOS = false;\nlet _isCI = false;\nlet _locale = undefined;\nlet _language = LANGUAGE_DEFAULT;\nlet _translationsConfigFile = undefined;\nlet _userAgent = undefined;\nexport const globals = (typeof self === 'object' ? self : typeof global === 'object' ? global : {});\nlet nodeProcess = undefined;\nif (typeof globals.vscode !== 'undefined' && typeof globals.vscode.process !== 'undefined') {\n // Native environment (sandboxed)\n nodeProcess = globals.vscode.process;\n}\nelse if (typeof process !== 'undefined') {\n // Native environment (non-sandboxed)\n nodeProcess = process;\n}\nconst isElectronProcess = typeof ((_a = nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.versions) === null || _a === void 0 ? void 0 : _a.electron) === 'string';\nconst isElectronRenderer = isElectronProcess && (nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.type) === 'renderer';\n// Web environment\nif (typeof navigator === 'object' && !isElectronRenderer) {\n _userAgent = navigator.userAgent;\n _isWindows = _userAgent.indexOf('Windows') >= 0;\n _isMacintosh = _userAgent.indexOf('Macintosh') >= 0;\n _isIOS = (_userAgent.indexOf('Macintosh') >= 0 || _userAgent.indexOf('iPad') >= 0 || _userAgent.indexOf('iPhone') >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0;\n _isLinux = _userAgent.indexOf('Linux') >= 0;\n _isWeb = true;\n const configuredLocale = nls.getConfiguredDefaultLocale(\n // This call _must_ be done in the file that calls `nls.getConfiguredDefaultLocale`\n // to ensure that the NLS AMD Loader plugin has been loaded and configured.\n // This is because the loader plugin decides what the default locale is based on\n // how it's able to resolve the strings.\n nls.localize({ key: 'ensureLoaderPluginIsLoaded', comment: ['{Locked}'] }, '_'));\n _locale = configuredLocale || LANGUAGE_DEFAULT;\n _language = _locale;\n}\n// Native environment\nelse if (typeof nodeProcess === 'object') {\n _isWindows = (nodeProcess.platform === 'win32');\n _isMacintosh = (nodeProcess.platform === 'darwin');\n _isLinux = (nodeProcess.platform === 'linux');\n _isLinuxSnap = _isLinux && !!nodeProcess.env['SNAP'] && !!nodeProcess.env['SNAP_REVISION'];\n _isElectron = isElectronProcess;\n _isCI = !!nodeProcess.env['CI'] || !!nodeProcess.env['BUILD_ARTIFACTSTAGINGDIRECTORY'];\n _locale = LANGUAGE_DEFAULT;\n _language = LANGUAGE_DEFAULT;\n const rawNlsConfig = nodeProcess.env['VSCODE_NLS_CONFIG'];\n if (rawNlsConfig) {\n try {\n const nlsConfig = JSON.parse(rawNlsConfig);\n const resolved = nlsConfig.availableLanguages['*'];\n _locale = nlsConfig.locale;\n // VSCode's default language is 'en'\n _language = resolved ? resolved : LANGUAGE_DEFAULT;\n _translationsConfigFile = nlsConfig._translationsConfigFile;\n }\n catch (e) {\n }\n }\n _isNative = true;\n}\n// Unknown environment\nelse {\n console.error('Unable to resolve platform.');\n}\nlet _platform = 0 /* Platform.Web */;\nif (_isMacintosh) {\n _platform = 1 /* Platform.Mac */;\n}\nelse if (_isWindows) {\n _platform = 3 /* Platform.Windows */;\n}\nelse if (_isLinux) {\n _platform = 2 /* Platform.Linux */;\n}\nexport const isWindows = _isWindows;\nexport const isMacintosh = _isMacintosh;\nexport const isLinux = _isLinux;\nexport const isNative = _isNative;\nexport const isWeb = _isWeb;\nexport const isWebWorker = (_isWeb && typeof globals.importScripts === 'function');\nexport const isIOS = _isIOS;\nexport const userAgent = _userAgent;\n/**\n * The language used for the user interface. The format of\n * the string is all lower case (e.g. zh-tw for Traditional\n * Chinese)\n */\nexport const language = _language;\nexport const setTimeout0IsFaster = (typeof globals.postMessage === 'function' && !globals.importScripts);\n/**\n * See https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#:~:text=than%204%2C%20then-,set%20timeout%20to%204,-.\n *\n * Works similarly to `setTimeout(0)` but doesn't suffer from the 4ms artificial delay\n * that browsers set when the nesting level is > 5.\n */\nexport const setTimeout0 = (() => {\n if (setTimeout0IsFaster) {\n const pending = [];\n globals.addEventListener('message', (e) => {\n if (e.data && e.data.vscodeScheduleAsyncWork) {\n for (let i = 0, len = pending.length; i < len; i++) {\n const candidate = pending[i];\n if (candidate.id === e.data.vscodeScheduleAsyncWork) {\n pending.splice(i, 1);\n candidate.callback();\n return;\n }\n }\n }\n });\n let lastId = 0;\n return (callback) => {\n const myId = ++lastId;\n pending.push({\n id: myId,\n callback: callback\n });\n globals.postMessage({ vscodeScheduleAsyncWork: myId }, '*');\n };\n }\n return (callback) => setTimeout(callback);\n})();\nexport const OS = (_isMacintosh || _isIOS ? 2 /* OperatingSystem.Macintosh */ : (_isWindows ? 1 /* OperatingSystem.Windows */ : 3 /* OperatingSystem.Linux */));\nlet _isLittleEndian = true;\nlet _isLittleEndianComputed = false;\nexport function isLittleEndian() {\n if (!_isLittleEndianComputed) {\n _isLittleEndianComputed = true;\n const test = new Uint8Array(2);\n test[0] = 1;\n test[1] = 2;\n const view = new Uint16Array(test.buffer);\n _isLittleEndian = (view[0] === (2 << 8) + 1);\n }\n return _isLittleEndian;\n}\nexport const isChrome = !!(userAgent && userAgent.indexOf('Chrome') >= 0);\nexport const isFirefox = !!(userAgent && userAgent.indexOf('Firefox') >= 0);\nexport const isSafari = !!(!isChrome && (userAgent && userAgent.indexOf('Safari') >= 0));\nexport const isEdge = !!(userAgent && userAgent.indexOf('Edg/') >= 0);\nexport const isAndroid = !!(userAgent && userAgent.indexOf('Android') >= 0);\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { globals, isMacintosh, isWindows } from './platform.js';\nlet safeProcess;\n// Native sandbox environment\nif (typeof globals.vscode !== 'undefined' && typeof globals.vscode.process !== 'undefined') {\n const sandboxProcess = globals.vscode.process;\n safeProcess = {\n get platform() { return sandboxProcess.platform; },\n get arch() { return sandboxProcess.arch; },\n get env() { return sandboxProcess.env; },\n cwd() { return sandboxProcess.cwd(); }\n };\n}\n// Native node.js environment\nelse if (typeof process !== 'undefined') {\n safeProcess = {\n get platform() { return process.platform; },\n get arch() { return process.arch; },\n get env() { return process.env; },\n cwd() { return process.env['VSCODE_CWD'] || process.cwd(); }\n };\n}\n// Web environment\nelse {\n safeProcess = {\n // Supported\n get platform() { return isWindows ? 'win32' : isMacintosh ? 'darwin' : 'linux'; },\n get arch() { return undefined; /* arch is undefined in web */ },\n // Unsupported\n get env() { return {}; },\n cwd() { return '/'; }\n };\n}\n/**\n * Provides safe access to the `cwd` property in node.js, sandboxed or web\n * environments.\n *\n * Note: in web, this property is hardcoded to be `/`.\n */\nexport const cwd = safeProcess.cwd;\n/**\n * Provides safe access to the `env` property in node.js, sandboxed or web\n * environments.\n *\n * Note: in web, this property is hardcoded to be `{}`.\n */\nexport const env = safeProcess.env;\n/**\n * Provides safe access to the `platform` property in node.js, sandboxed or web\n * environments.\n */\nexport const platform = safeProcess.platform;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { globals } from './platform.js';\nconst hasPerformanceNow = (globals.performance && typeof globals.performance.now === 'function');\nexport class StopWatch {\n constructor(highResolution) {\n this._highResolution = hasPerformanceNow && highResolution;\n this._startTime = this._now();\n this._stopTime = -1;\n }\n static create(highResolution = true) {\n return new StopWatch(highResolution);\n }\n stop() {\n this._stopTime = this._now();\n }\n elapsed() {\n if (this._stopTime !== -1) {\n return this._stopTime - this._startTime;\n }\n return this._now() - this._startTime;\n }\n _now() {\n return this._highResolution ? globals.performance.now() : Date.now();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar _a;\nimport { LRUCachedFunction } from './cache.js';\nimport { Lazy } from './lazy.js';\nexport function isFalsyOrWhitespace(str) {\n if (!str || typeof str !== 'string') {\n return true;\n }\n return str.trim().length === 0;\n}\nconst _formatRegexp = /{(\\d+)}/g;\n/**\n * Helper to produce a string with a variable number of arguments. Insert variable segments\n * into the string using the {n} notation where N is the index of the argument following the string.\n * @param value string to which formatting is applied\n * @param args replacements for {n}-entries\n */\nexport function format(value, ...args) {\n if (args.length === 0) {\n return value;\n }\n return value.replace(_formatRegexp, function (match, group) {\n const idx = parseInt(group, 10);\n return isNaN(idx) || idx < 0 || idx >= args.length ?\n match :\n args[idx];\n });\n}\n/**\n * Converts HTML characters inside the string to use entities instead. Makes the string safe from\n * being used e.g. in HTMLElement.innerHTML.\n */\nexport function escape(html) {\n return html.replace(/[<>&]/g, function (match) {\n switch (match) {\n case '<': return '<';\n case '>': return '>';\n case '&': return '&';\n default: return match;\n }\n });\n}\n/**\n * Escapes regular expression characters in a given string\n */\nexport function escapeRegExpCharacters(value) {\n return value.replace(/[\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\[\\]\\(\\)]/g, '\\\\$&');\n}\n/**\n * Removes all occurrences of needle from the beginning and end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim (default is a blank)\n */\nexport function trim(haystack, needle = ' ') {\n const trimmed = ltrim(haystack, needle);\n return rtrim(trimmed, needle);\n}\n/**\n * Removes all occurrences of needle from the beginning of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nexport function ltrim(haystack, needle) {\n if (!haystack || !needle) {\n return haystack;\n }\n const needleLen = needle.length;\n if (needleLen === 0 || haystack.length === 0) {\n return haystack;\n }\n let offset = 0;\n while (haystack.indexOf(needle, offset) === offset) {\n offset = offset + needleLen;\n }\n return haystack.substring(offset);\n}\n/**\n * Removes all occurrences of needle from the end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nexport function rtrim(haystack, needle) {\n if (!haystack || !needle) {\n return haystack;\n }\n const needleLen = needle.length, haystackLen = haystack.length;\n if (needleLen === 0 || haystackLen === 0) {\n return haystack;\n }\n let offset = haystackLen, idx = -1;\n while (true) {\n idx = haystack.lastIndexOf(needle, offset - 1);\n if (idx === -1 || idx + needleLen !== offset) {\n break;\n }\n if (idx === 0) {\n return '';\n }\n offset = idx;\n }\n return haystack.substring(0, offset);\n}\nexport function convertSimple2RegExpPattern(pattern) {\n return pattern.replace(/[\\-\\\\\\{\\}\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, '\\\\$&').replace(/[\\*]/g, '.*');\n}\nexport function stripWildcards(pattern) {\n return pattern.replace(/\\*/g, '');\n}\nexport function createRegExp(searchString, isRegex, options = {}) {\n if (!searchString) {\n throw new Error('Cannot create regex from empty string');\n }\n if (!isRegex) {\n searchString = escapeRegExpCharacters(searchString);\n }\n if (options.wholeWord) {\n if (!/\\B/.test(searchString.charAt(0))) {\n searchString = '\\\\b' + searchString;\n }\n if (!/\\B/.test(searchString.charAt(searchString.length - 1))) {\n searchString = searchString + '\\\\b';\n }\n }\n let modifiers = '';\n if (options.global) {\n modifiers += 'g';\n }\n if (!options.matchCase) {\n modifiers += 'i';\n }\n if (options.multiline) {\n modifiers += 'm';\n }\n if (options.unicode) {\n modifiers += 'u';\n }\n return new RegExp(searchString, modifiers);\n}\nexport function regExpLeadsToEndlessLoop(regexp) {\n // Exit early if it's one of these special cases which are meant to match\n // against an empty string\n if (regexp.source === '^' || regexp.source === '^$' || regexp.source === '$' || regexp.source === '^\\\\s*$') {\n return false;\n }\n // We check against an empty string. If the regular expression doesn't advance\n // (e.g. ends in an endless loop) it will match an empty string.\n const match = regexp.exec('');\n return !!(match && regexp.lastIndex === 0);\n}\nexport function regExpFlags(regexp) {\n return (regexp.global ? 'g' : '')\n + (regexp.ignoreCase ? 'i' : '')\n + (regexp.multiline ? 'm' : '')\n + (regexp /* standalone editor compilation */.unicode ? 'u' : '');\n}\nexport function splitLines(str) {\n return str.split(/\\r\\n|\\r|\\n/);\n}\n/**\n * Returns first index of the string that is not whitespace.\n * If string is empty or contains only whitespaces, returns -1\n */\nexport function firstNonWhitespaceIndex(str) {\n for (let i = 0, len = str.length; i < len; i++) {\n const chCode = str.charCodeAt(i);\n if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n return i;\n }\n }\n return -1;\n}\n/**\n * Returns the leading whitespace of the string.\n * If the string contains only whitespaces, returns entire string\n */\nexport function getLeadingWhitespace(str, start = 0, end = str.length) {\n for (let i = start; i < end; i++) {\n const chCode = str.charCodeAt(i);\n if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n return str.substring(start, i);\n }\n }\n return str.substring(start, end);\n}\n/**\n * Returns last index of the string that is not whitespace.\n * If string is empty or contains only whitespaces, returns -1\n */\nexport function lastNonWhitespaceIndex(str, startIndex = str.length - 1) {\n for (let i = startIndex; i >= 0; i--) {\n const chCode = str.charCodeAt(i);\n if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n return i;\n }\n }\n return -1;\n}\nexport function compare(a, b) {\n if (a < b) {\n return -1;\n }\n else if (a > b) {\n return 1;\n }\n else {\n return 0;\n }\n}\nexport function compareSubstring(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) {\n for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) {\n const codeA = a.charCodeAt(aStart);\n const codeB = b.charCodeAt(bStart);\n if (codeA < codeB) {\n return -1;\n }\n else if (codeA > codeB) {\n return 1;\n }\n }\n const aLen = aEnd - aStart;\n const bLen = bEnd - bStart;\n if (aLen < bLen) {\n return -1;\n }\n else if (aLen > bLen) {\n return 1;\n }\n return 0;\n}\nexport function compareIgnoreCase(a, b) {\n return compareSubstringIgnoreCase(a, b, 0, a.length, 0, b.length);\n}\nexport function compareSubstringIgnoreCase(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) {\n for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) {\n let codeA = a.charCodeAt(aStart);\n let codeB = b.charCodeAt(bStart);\n if (codeA === codeB) {\n // equal\n continue;\n }\n if (codeA >= 128 || codeB >= 128) {\n // not ASCII letters -> fallback to lower-casing strings\n return compareSubstring(a.toLowerCase(), b.toLowerCase(), aStart, aEnd, bStart, bEnd);\n }\n // mapper lower-case ascii letter onto upper-case varinats\n // [97-122] (lower ascii) --> [65-90] (upper ascii)\n if (isLowerAsciiLetter(codeA)) {\n codeA -= 32;\n }\n if (isLowerAsciiLetter(codeB)) {\n codeB -= 32;\n }\n // compare both code points\n const diff = codeA - codeB;\n if (diff === 0) {\n continue;\n }\n return diff;\n }\n const aLen = aEnd - aStart;\n const bLen = bEnd - bStart;\n if (aLen < bLen) {\n return -1;\n }\n else if (aLen > bLen) {\n return 1;\n }\n return 0;\n}\nexport function isAsciiDigit(code) {\n return code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */;\n}\nexport function isLowerAsciiLetter(code) {\n return code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */;\n}\nexport function isUpperAsciiLetter(code) {\n return code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */;\n}\nexport function equalsIgnoreCase(a, b) {\n return a.length === b.length && compareSubstringIgnoreCase(a, b) === 0;\n}\nexport function startsWithIgnoreCase(str, candidate) {\n const candidateLength = candidate.length;\n if (candidate.length > str.length) {\n return false;\n }\n return compareSubstringIgnoreCase(str, candidate, 0, candidateLength) === 0;\n}\n/**\n * @returns the length of the common prefix of the two strings.\n */\nexport function commonPrefixLength(a, b) {\n const len = Math.min(a.length, b.length);\n let i;\n for (i = 0; i < len; i++) {\n if (a.charCodeAt(i) !== b.charCodeAt(i)) {\n return i;\n }\n }\n return len;\n}\n/**\n * @returns the length of the common suffix of the two strings.\n */\nexport function commonSuffixLength(a, b) {\n const len = Math.min(a.length, b.length);\n let i;\n const aLastIndex = a.length - 1;\n const bLastIndex = b.length - 1;\n for (i = 0; i < len; i++) {\n if (a.charCodeAt(aLastIndex - i) !== b.charCodeAt(bLastIndex - i)) {\n return i;\n }\n }\n return len;\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nexport function isHighSurrogate(charCode) {\n return (0xD800 <= charCode && charCode <= 0xDBFF);\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nexport function isLowSurrogate(charCode) {\n return (0xDC00 <= charCode && charCode <= 0xDFFF);\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nexport function computeCodePoint(highSurrogate, lowSurrogate) {\n return ((highSurrogate - 0xD800) << 10) + (lowSurrogate - 0xDC00) + 0x10000;\n}\n/**\n * get the code point that begins at offset `offset`\n */\nexport function getNextCodePoint(str, len, offset) {\n const charCode = str.charCodeAt(offset);\n if (isHighSurrogate(charCode) && offset + 1 < len) {\n const nextCharCode = str.charCodeAt(offset + 1);\n if (isLowSurrogate(nextCharCode)) {\n return computeCodePoint(charCode, nextCharCode);\n }\n }\n return charCode;\n}\n/**\n * get the code point that ends right before offset `offset`\n */\nfunction getPrevCodePoint(str, offset) {\n const charCode = str.charCodeAt(offset - 1);\n if (isLowSurrogate(charCode) && offset > 1) {\n const prevCharCode = str.charCodeAt(offset - 2);\n if (isHighSurrogate(prevCharCode)) {\n return computeCodePoint(prevCharCode, charCode);\n }\n }\n return charCode;\n}\nexport class CodePointIterator {\n constructor(str, offset = 0) {\n this._str = str;\n this._len = str.length;\n this._offset = offset;\n }\n get offset() {\n return this._offset;\n }\n setOffset(offset) {\n this._offset = offset;\n }\n prevCodePoint() {\n const codePoint = getPrevCodePoint(this._str, this._offset);\n this._offset -= (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1);\n return codePoint;\n }\n nextCodePoint() {\n const codePoint = getNextCodePoint(this._str, this._len, this._offset);\n this._offset += (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1);\n return codePoint;\n }\n eol() {\n return (this._offset >= this._len);\n }\n}\nexport class GraphemeIterator {\n constructor(str, offset = 0) {\n this._iterator = new CodePointIterator(str, offset);\n }\n get offset() {\n return this._iterator.offset;\n }\n nextGraphemeLength() {\n const graphemeBreakTree = GraphemeBreakTree.getInstance();\n const iterator = this._iterator;\n const initialOffset = iterator.offset;\n let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint());\n while (!iterator.eol()) {\n const offset = iterator.offset;\n const nextGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint());\n if (breakBetweenGraphemeBreakType(graphemeBreakType, nextGraphemeBreakType)) {\n // move iterator back\n iterator.setOffset(offset);\n break;\n }\n graphemeBreakType = nextGraphemeBreakType;\n }\n return (iterator.offset - initialOffset);\n }\n prevGraphemeLength() {\n const graphemeBreakTree = GraphemeBreakTree.getInstance();\n const iterator = this._iterator;\n const initialOffset = iterator.offset;\n let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint());\n while (iterator.offset > 0) {\n const offset = iterator.offset;\n const prevGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint());\n if (breakBetweenGraphemeBreakType(prevGraphemeBreakType, graphemeBreakType)) {\n // move iterator back\n iterator.setOffset(offset);\n break;\n }\n graphemeBreakType = prevGraphemeBreakType;\n }\n return (initialOffset - iterator.offset);\n }\n eol() {\n return this._iterator.eol();\n }\n}\nexport function nextCharLength(str, initialOffset) {\n const iterator = new GraphemeIterator(str, initialOffset);\n return iterator.nextGraphemeLength();\n}\nexport function prevCharLength(str, initialOffset) {\n const iterator = new GraphemeIterator(str, initialOffset);\n return iterator.prevGraphemeLength();\n}\nexport function getCharContainingOffset(str, offset) {\n if (offset > 0 && isLowSurrogate(str.charCodeAt(offset))) {\n offset--;\n }\n const endOffset = offset + nextCharLength(str, offset);\n const startOffset = endOffset - prevCharLength(str, endOffset);\n return [startOffset, endOffset];\n}\n/**\n * Generated using https://github.com/alexdima/unicode-utils/blob/main/rtl-test.js\n */\nconst CONTAINS_RTL = /(?:[\\u05BE\\u05C0\\u05C3\\u05C6\\u05D0-\\u05F4\\u0608\\u060B\\u060D\\u061B-\\u064A\\u066D-\\u066F\\u0671-\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1-\\u07EA\\u07F4\\u07F5\\u07FA\\u07FE-\\u0815\\u081A\\u0824\\u0828\\u0830-\\u0858\\u085E-\\u088E\\u08A0-\\u08C9\\u200F\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFD3D\\uFD50-\\uFDC7\\uFDF0-\\uFDFC\\uFE70-\\uFEFC]|\\uD802[\\uDC00-\\uDD1B\\uDD20-\\uDE00\\uDE10-\\uDE35\\uDE40-\\uDEE4\\uDEEB-\\uDF35\\uDF40-\\uDFFF]|\\uD803[\\uDC00-\\uDD23\\uDE80-\\uDEA9\\uDEAD-\\uDF45\\uDF51-\\uDF81\\uDF86-\\uDFF6]|\\uD83A[\\uDC00-\\uDCCF\\uDD00-\\uDD43\\uDD4B-\\uDFFF]|\\uD83B[\\uDC00-\\uDEBB])/;\n/**\n * Returns true if `str` contains any Unicode character that is classified as \"R\" or \"AL\".\n */\nexport function containsRTL(str) {\n return CONTAINS_RTL.test(str);\n}\nconst IS_BASIC_ASCII = /^[\\t\\n\\r\\x20-\\x7E]*$/;\n/**\n * Returns true if `str` contains only basic ASCII characters in the range 32 - 126 (including 32 and 126) or \\n, \\r, \\t\n */\nexport function isBasicASCII(str) {\n return IS_BASIC_ASCII.test(str);\n}\nexport const UNUSUAL_LINE_TERMINATORS = /[\\u2028\\u2029]/; // LINE SEPARATOR (LS) or PARAGRAPH SEPARATOR (PS)\n/**\n * Returns true if `str` contains unusual line terminators, like LS or PS\n */\nexport function containsUnusualLineTerminators(str) {\n return UNUSUAL_LINE_TERMINATORS.test(str);\n}\nexport function isFullWidthCharacter(charCode) {\n // Do a cheap trick to better support wrapping of wide characters, treat them as 2 columns\n // http://jrgraphix.net/research/unicode_blocks.php\n // 2E80 - 2EFF CJK Radicals Supplement\n // 2F00 - 2FDF Kangxi Radicals\n // 2FF0 - 2FFF Ideographic Description Characters\n // 3000 - 303F CJK Symbols and Punctuation\n // 3040 - 309F Hiragana\n // 30A0 - 30FF Katakana\n // 3100 - 312F Bopomofo\n // 3130 - 318F Hangul Compatibility Jamo\n // 3190 - 319F Kanbun\n // 31A0 - 31BF Bopomofo Extended\n // 31F0 - 31FF Katakana Phonetic Extensions\n // 3200 - 32FF Enclosed CJK Letters and Months\n // 3300 - 33FF CJK Compatibility\n // 3400 - 4DBF CJK Unified Ideographs Extension A\n // 4DC0 - 4DFF Yijing Hexagram Symbols\n // 4E00 - 9FFF CJK Unified Ideographs\n // A000 - A48F Yi Syllables\n // A490 - A4CF Yi Radicals\n // AC00 - D7AF Hangul Syllables\n // [IGNORE] D800 - DB7F High Surrogates\n // [IGNORE] DB80 - DBFF High Private Use Surrogates\n // [IGNORE] DC00 - DFFF Low Surrogates\n // [IGNORE] E000 - F8FF Private Use Area\n // F900 - FAFF CJK Compatibility Ideographs\n // [IGNORE] FB00 - FB4F Alphabetic Presentation Forms\n // [IGNORE] FB50 - FDFF Arabic Presentation Forms-A\n // [IGNORE] FE00 - FE0F Variation Selectors\n // [IGNORE] FE20 - FE2F Combining Half Marks\n // [IGNORE] FE30 - FE4F CJK Compatibility Forms\n // [IGNORE] FE50 - FE6F Small Form Variants\n // [IGNORE] FE70 - FEFF Arabic Presentation Forms-B\n // FF00 - FFEF Halfwidth and Fullwidth Forms\n // [https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms]\n // of which FF01 - FF5E fullwidth ASCII of 21 to 7E\n // [IGNORE] and FF65 - FFDC halfwidth of Katakana and Hangul\n // [IGNORE] FFF0 - FFFF Specials\n return ((charCode >= 0x2E80 && charCode <= 0xD7AF)\n || (charCode >= 0xF900 && charCode <= 0xFAFF)\n || (charCode >= 0xFF01 && charCode <= 0xFF5E));\n}\n/**\n * A fast function (therefore imprecise) to check if code points are emojis.\n * Generated using https://github.com/alexdima/unicode-utils/blob/main/emoji-test.js\n */\nexport function isEmojiImprecise(x) {\n return ((x >= 0x1F1E6 && x <= 0x1F1FF) || (x === 8986) || (x === 8987) || (x === 9200)\n || (x === 9203) || (x >= 9728 && x <= 10175) || (x === 11088) || (x === 11093)\n || (x >= 127744 && x <= 128591) || (x >= 128640 && x <= 128764)\n || (x >= 128992 && x <= 129008) || (x >= 129280 && x <= 129535)\n || (x >= 129648 && x <= 129782));\n}\n// -- UTF-8 BOM\nexport const UTF8_BOM_CHARACTER = String.fromCharCode(65279 /* CharCode.UTF8_BOM */);\nexport function startsWithUTF8BOM(str) {\n return !!(str && str.length > 0 && str.charCodeAt(0) === 65279 /* CharCode.UTF8_BOM */);\n}\nexport function containsUppercaseCharacter(target, ignoreEscapedChars = false) {\n if (!target) {\n return false;\n }\n if (ignoreEscapedChars) {\n target = target.replace(/\\\\./g, '');\n }\n return target.toLowerCase() !== target;\n}\n/**\n * Produces 'a'-'z', followed by 'A'-'Z'... followed by 'a'-'z', etc.\n */\nexport function singleLetterHash(n) {\n const LETTERS_CNT = (90 /* CharCode.Z */ - 65 /* CharCode.A */ + 1);\n n = n % (2 * LETTERS_CNT);\n if (n < LETTERS_CNT) {\n return String.fromCharCode(97 /* CharCode.a */ + n);\n }\n return String.fromCharCode(65 /* CharCode.A */ + n - LETTERS_CNT);\n}\nfunction breakBetweenGraphemeBreakType(breakTypeA, breakTypeB) {\n // http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules\n // !!! Let's make the common case a bit faster\n if (breakTypeA === 0 /* GraphemeBreakType.Other */) {\n // see https://www.unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakTest-13.0.0d10.html#table\n return (breakTypeB !== 5 /* GraphemeBreakType.Extend */ && breakTypeB !== 7 /* GraphemeBreakType.SpacingMark */);\n }\n // Do not break between a CR and LF. Otherwise, break before and after controls.\n // GB3 CR × LF\n // GB4 (Control | CR | LF) ÷\n // GB5 ÷ (Control | CR | LF)\n if (breakTypeA === 2 /* GraphemeBreakType.CR */) {\n if (breakTypeB === 3 /* GraphemeBreakType.LF */) {\n return false; // GB3\n }\n }\n if (breakTypeA === 4 /* GraphemeBreakType.Control */ || breakTypeA === 2 /* GraphemeBreakType.CR */ || breakTypeA === 3 /* GraphemeBreakType.LF */) {\n return true; // GB4\n }\n if (breakTypeB === 4 /* GraphemeBreakType.Control */ || breakTypeB === 2 /* GraphemeBreakType.CR */ || breakTypeB === 3 /* GraphemeBreakType.LF */) {\n return true; // GB5\n }\n // Do not break Hangul syllable sequences.\n // GB6 L × (L | V | LV | LVT)\n // GB7 (LV | V) × (V | T)\n // GB8 (LVT | T) × T\n if (breakTypeA === 8 /* GraphemeBreakType.L */) {\n if (breakTypeB === 8 /* GraphemeBreakType.L */ || breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 11 /* GraphemeBreakType.LV */ || breakTypeB === 12 /* GraphemeBreakType.LVT */) {\n return false; // GB6\n }\n }\n if (breakTypeA === 11 /* GraphemeBreakType.LV */ || breakTypeA === 9 /* GraphemeBreakType.V */) {\n if (breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 10 /* GraphemeBreakType.T */) {\n return false; // GB7\n }\n }\n if (breakTypeA === 12 /* GraphemeBreakType.LVT */ || breakTypeA === 10 /* GraphemeBreakType.T */) {\n if (breakTypeB === 10 /* GraphemeBreakType.T */) {\n return false; // GB8\n }\n }\n // Do not break before extending characters or ZWJ.\n // GB9 × (Extend | ZWJ)\n if (breakTypeB === 5 /* GraphemeBreakType.Extend */ || breakTypeB === 13 /* GraphemeBreakType.ZWJ */) {\n return false; // GB9\n }\n // The GB9a and GB9b rules only apply to extended grapheme clusters:\n // Do not break before SpacingMarks, or after Prepend characters.\n // GB9a × SpacingMark\n // GB9b Prepend ×\n if (breakTypeB === 7 /* GraphemeBreakType.SpacingMark */) {\n return false; // GB9a\n }\n if (breakTypeA === 1 /* GraphemeBreakType.Prepend */) {\n return false; // GB9b\n }\n // Do not break within emoji modifier sequences or emoji zwj sequences.\n // GB11 \\p{Extended_Pictographic} Extend* ZWJ × \\p{Extended_Pictographic}\n if (breakTypeA === 13 /* GraphemeBreakType.ZWJ */ && breakTypeB === 14 /* GraphemeBreakType.Extended_Pictographic */) {\n // Note: we are not implementing the rule entirely here to avoid introducing states\n return false; // GB11\n }\n // GB12 sot (RI RI)* RI × RI\n // GB13 [^RI] (RI RI)* RI × RI\n if (breakTypeA === 6 /* GraphemeBreakType.Regional_Indicator */ && breakTypeB === 6 /* GraphemeBreakType.Regional_Indicator */) {\n // Note: we are not implementing the rule entirely here to avoid introducing states\n return false; // GB12 & GB13\n }\n // GB999 Any ÷ Any\n return true;\n}\nclass GraphemeBreakTree {\n constructor() {\n this._data = getGraphemeBreakRawData();\n }\n static getInstance() {\n if (!GraphemeBreakTree._INSTANCE) {\n GraphemeBreakTree._INSTANCE = new GraphemeBreakTree();\n }\n return GraphemeBreakTree._INSTANCE;\n }\n getGraphemeBreakType(codePoint) {\n // !!! Let's make 7bit ASCII a bit faster: 0..31\n if (codePoint < 32) {\n if (codePoint === 10 /* CharCode.LineFeed */) {\n return 3 /* GraphemeBreakType.LF */;\n }\n if (codePoint === 13 /* CharCode.CarriageReturn */) {\n return 2 /* GraphemeBreakType.CR */;\n }\n return 4 /* GraphemeBreakType.Control */;\n }\n // !!! Let's make 7bit ASCII a bit faster: 32..126\n if (codePoint < 127) {\n return 0 /* GraphemeBreakType.Other */;\n }\n const data = this._data;\n const nodeCount = data.length / 3;\n let nodeIndex = 1;\n while (nodeIndex <= nodeCount) {\n if (codePoint < data[3 * nodeIndex]) {\n // go left\n nodeIndex = 2 * nodeIndex;\n }\n else if (codePoint > data[3 * nodeIndex + 1]) {\n // go right\n nodeIndex = 2 * nodeIndex + 1;\n }\n else {\n // hit\n return data[3 * nodeIndex + 2];\n }\n }\n return 0 /* GraphemeBreakType.Other */;\n }\n}\nGraphemeBreakTree._INSTANCE = null;\nfunction getGraphemeBreakRawData() {\n // generated using https://github.com/alexdima/unicode-utils/blob/main/grapheme-break.js\n return JSON.parse('[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]');\n}\n//#endregion\n/**\n * Computes the offset after performing a left delete on the given string,\n * while considering unicode grapheme/emoji rules.\n*/\nexport function getLeftDeleteOffset(offset, str) {\n if (offset === 0) {\n return 0;\n }\n // Try to delete emoji part.\n const emojiOffset = getOffsetBeforeLastEmojiComponent(offset, str);\n if (emojiOffset !== undefined) {\n return emojiOffset;\n }\n // Otherwise, just skip a single code point.\n const iterator = new CodePointIterator(str, offset);\n iterator.prevCodePoint();\n return iterator.offset;\n}\nfunction getOffsetBeforeLastEmojiComponent(initialOffset, str) {\n // See https://www.unicode.org/reports/tr51/tr51-14.html#EBNF_and_Regex for the\n // structure of emojis.\n const iterator = new CodePointIterator(str, initialOffset);\n let codePoint = iterator.prevCodePoint();\n // Skip modifiers\n while ((isEmojiModifier(codePoint) || codePoint === 65039 /* CodePoint.emojiVariantSelector */ || codePoint === 8419 /* CodePoint.enclosingKeyCap */)) {\n if (iterator.offset === 0) {\n // Cannot skip modifier, no preceding emoji base.\n return undefined;\n }\n codePoint = iterator.prevCodePoint();\n }\n // Expect base emoji\n if (!isEmojiImprecise(codePoint)) {\n // Unexpected code point, not a valid emoji.\n return undefined;\n }\n let resultOffset = iterator.offset;\n if (resultOffset > 0) {\n // Skip optional ZWJ code points that combine multiple emojis.\n // In theory, we should check if that ZWJ actually combines multiple emojis\n // to prevent deleting ZWJs in situations we didn't account for.\n const optionalZwjCodePoint = iterator.prevCodePoint();\n if (optionalZwjCodePoint === 8205 /* CodePoint.zwj */) {\n resultOffset = iterator.offset;\n }\n }\n return resultOffset;\n}\nfunction isEmojiModifier(codePoint) {\n return 0x1F3FB <= codePoint && codePoint <= 0x1F3FF;\n}\nexport const noBreakWhitespace = '\\xa0';\nexport class AmbiguousCharacters {\n constructor(confusableDictionary) {\n this.confusableDictionary = confusableDictionary;\n }\n static getInstance(locales) {\n return AmbiguousCharacters.cache.get(Array.from(locales));\n }\n static getLocales() {\n return AmbiguousCharacters._locales.getValue();\n }\n isAmbiguous(codePoint) {\n return this.confusableDictionary.has(codePoint);\n }\n /**\n * Returns the non basic ASCII code point that the given code point can be confused,\n * or undefined if such code point does note exist.\n */\n getPrimaryConfusable(codePoint) {\n return this.confusableDictionary.get(codePoint);\n }\n getConfusableCodePoints() {\n return new Set(this.confusableDictionary.keys());\n }\n}\n_a = AmbiguousCharacters;\nAmbiguousCharacters.ambiguousCharacterData = new Lazy(() => {\n // Generated using https://github.com/hediet/vscode-unicode-data\n // Stored as key1, value1, key2, value2, ...\n return JSON.parse('{\\\"_common\\\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125],\\\"_default\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"cs\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"de\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"es\\\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"fr\\\":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"it\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"ja\\\":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],\\\"ko\\\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"pl\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"pt-BR\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"qps-ploc\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"ru\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"tr\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"zh-hans\\\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],\\\"zh-hant\\\":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}');\n});\nAmbiguousCharacters.cache = new LRUCachedFunction((locales) => {\n function arrayToMap(arr) {\n const result = new Map();\n for (let i = 0; i < arr.length; i += 2) {\n result.set(arr[i], arr[i + 1]);\n }\n return result;\n }\n function mergeMaps(map1, map2) {\n const result = new Map(map1);\n for (const [key, value] of map2) {\n result.set(key, value);\n }\n return result;\n }\n function intersectMaps(map1, map2) {\n if (!map1) {\n return map2;\n }\n const result = new Map();\n for (const [key, value] of map1) {\n if (map2.has(key)) {\n result.set(key, value);\n }\n }\n return result;\n }\n const data = _a.ambiguousCharacterData.getValue();\n let filteredLocales = locales.filter((l) => !l.startsWith('_') && l in data);\n if (filteredLocales.length === 0) {\n filteredLocales = ['_default'];\n }\n let languageSpecificMap = undefined;\n for (const locale of filteredLocales) {\n const map = arrayToMap(data[locale]);\n languageSpecificMap = intersectMaps(languageSpecificMap, map);\n }\n const commonMap = arrayToMap(data['_common']);\n const map = mergeMaps(commonMap, languageSpecificMap);\n return new AmbiguousCharacters(map);\n});\nAmbiguousCharacters._locales = new Lazy(() => Object.keys(AmbiguousCharacters.ambiguousCharacterData.getValue()).filter((k) => !k.startsWith('_')));\nexport class InvisibleCharacters {\n static getRawData() {\n // Generated using https://github.com/hediet/vscode-unicode-data\n return JSON.parse('[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]');\n }\n static getData() {\n if (!this._data) {\n this._data = new Set(InvisibleCharacters.getRawData());\n }\n return this._data;\n }\n static isInvisibleCharacter(codePoint) {\n return InvisibleCharacters.getData().has(codePoint);\n }\n static get codePoints() {\n return InvisibleCharacters.getData();\n }\n}\nInvisibleCharacters._data = undefined;\n","/**\n * @returns whether the provided parameter is a JavaScript Array or not.\n */\nexport function isArray(array) {\n return Array.isArray(array);\n}\n/**\n * @returns whether the provided parameter is a JavaScript String or not.\n */\nexport function isString(str) {\n return (typeof str === 'string');\n}\n/**\n *\n * @returns whether the provided parameter is of type `object` but **not**\n *\t`null`, an `array`, a `regexp`, nor a `date`.\n */\nexport function isObject(obj) {\n // The method can't do a type cast since there are type (like strings) which\n // are subclasses of any put not positvely matched by the function. Hence type\n // narrowing results in wrong results.\n return typeof obj === 'object'\n && obj !== null\n && !Array.isArray(obj)\n && !(obj instanceof RegExp)\n && !(obj instanceof Date);\n}\n/**\n *\n * @returns whether the provided parameter is of type `Buffer` or Uint8Array dervived type\n */\nexport function isTypedArray(obj) {\n const TypedArray = Object.getPrototypeOf(Uint8Array);\n return typeof obj === 'object'\n && obj instanceof TypedArray;\n}\n/**\n * In **contrast** to just checking `typeof` this will return `false` for `NaN`.\n * @returns whether the provided parameter is a JavaScript Number or not.\n */\nexport function isNumber(obj) {\n return (typeof obj === 'number' && !isNaN(obj));\n}\n/**\n * @returns whether the provided parameter is an Iterable, casting to the given generic\n */\nexport function isIterable(obj) {\n return !!obj && typeof obj[Symbol.iterator] === 'function';\n}\n/**\n * @returns whether the provided parameter is a JavaScript Boolean or not.\n */\nexport function isBoolean(obj) {\n return (obj === true || obj === false);\n}\n/**\n * @returns whether the provided parameter is undefined.\n */\nexport function isUndefined(obj) {\n return (typeof obj === 'undefined');\n}\n/**\n * @returns whether the provided parameter is defined.\n */\nexport function isDefined(arg) {\n return !isUndefinedOrNull(arg);\n}\n/**\n * @returns whether the provided parameter is undefined or null.\n */\nexport function isUndefinedOrNull(obj) {\n return (isUndefined(obj) || obj === null);\n}\nexport function assertType(condition, type) {\n if (!condition) {\n throw new Error(type ? `Unexpected type, expected '${type}'` : 'Unexpected type');\n }\n}\n/**\n * Asserts that the argument passed in is neither undefined nor null.\n */\nexport function assertIsDefined(arg) {\n if (isUndefinedOrNull(arg)) {\n throw new Error('Assertion Failed: argument is undefined or null');\n }\n return arg;\n}\n/**\n * @returns whether the provided parameter is a JavaScript Function or not.\n */\nexport function isFunction(obj) {\n return (typeof obj === 'function');\n}\nexport function validateConstraints(args, constraints) {\n const len = Math.min(args.length, constraints.length);\n for (let i = 0; i < len; i++) {\n validateConstraint(args[i], constraints[i]);\n }\n}\nexport function validateConstraint(arg, constraint) {\n if (isString(constraint)) {\n if (typeof arg !== constraint) {\n throw new Error(`argument does not match constraint: typeof ${constraint}`);\n }\n }\n else if (isFunction(constraint)) {\n try {\n if (arg instanceof constraint) {\n return;\n }\n }\n catch (_a) {\n // ignore\n }\n if (!isUndefinedOrNull(arg) && arg.constructor === constraint) {\n return;\n }\n if (constraint.length === 1 && constraint.call(undefined, arg) === true) {\n return;\n }\n throw new Error(`argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true`);\n }\n}\nexport function getAllPropertyNames(obj) {\n let res = [];\n let proto = Object.getPrototypeOf(obj);\n while (Object.prototype !== proto) {\n res = res.concat(Object.getOwnPropertyNames(proto));\n proto = Object.getPrototypeOf(proto);\n }\n return res;\n}\nexport function getAllMethodNames(obj) {\n const methods = [];\n for (const prop of getAllPropertyNames(obj)) {\n if (typeof obj[prop] === 'function') {\n methods.push(prop);\n }\n }\n return methods;\n}\nexport function createProxyObject(methodNames, invoke) {\n const createProxyMethod = (method) => {\n return function () {\n const args = Array.prototype.slice.call(arguments, 0);\n return invoke(method, args);\n };\n };\n const result = {};\n for (const methodName of methodNames) {\n result[methodName] = createProxyMethod(methodName);\n }\n return result;\n}\n/**\n * Converts null to undefined, passes all other values through.\n */\nexport function withNullAsUndefined(x) {\n return x === null ? undefined : x;\n}\nexport function assertNever(value, message = 'Unreachable') {\n throw new Error(message);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nexport function toUint8(v) {\n if (v < 0) {\n return 0;\n }\n if (v > 255 /* Constants.MAX_UINT_8 */) {\n return 255 /* Constants.MAX_UINT_8 */;\n }\n return v | 0;\n}\nexport function toUint32(v) {\n if (v < 0) {\n return 0;\n }\n if (v > 4294967295 /* Constants.MAX_UINT_32 */) {\n return 4294967295 /* Constants.MAX_UINT_32 */;\n }\n return v | 0;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as paths from './path.js';\nimport { isWindows } from './platform.js';\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\nfunction _validateUri(ret, _strict) {\n // scheme, must be set\n if (!ret.scheme && _strict) {\n throw new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n }\n // scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n // ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n if (ret.scheme && !_schemePattern.test(ret.scheme)) {\n throw new Error('[UriError]: Scheme contains illegal characters.');\n }\n // path, http://tools.ietf.org/html/rfc3986#section-3.3\n // If a URI contains an authority component, then the path component\n // must either be empty or begin with a slash (\"/\") character. If a URI\n // does not contain an authority component, then the path cannot begin\n // with two slash characters (\"//\").\n if (ret.path) {\n if (ret.authority) {\n if (!_singleSlashStart.test(ret.path)) {\n throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n }\n }\n else {\n if (_doubleSlashStart.test(ret.path)) {\n throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n }\n }\n }\n}\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme, _strict) {\n if (!scheme && !_strict) {\n return 'file';\n }\n return scheme;\n}\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme, path) {\n // the slash-character is our 'default base' as we don't\n // support constructing URIs relative to other URIs. This\n // also means that we alter and potentially break paths.\n // see https://tools.ietf.org/html/rfc3986#section-5.1.4\n switch (scheme) {\n case 'https':\n case 'http':\n case 'file':\n if (!path) {\n path = _slash;\n }\n else if (path[0] !== _slash) {\n path = _slash + path;\n }\n break;\n }\n return path;\n}\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nexport class URI {\n /**\n * @internal\n */\n constructor(schemeOrData, authority, path, query, fragment, _strict = false) {\n if (typeof schemeOrData === 'object') {\n this.scheme = schemeOrData.scheme || _empty;\n this.authority = schemeOrData.authority || _empty;\n this.path = schemeOrData.path || _empty;\n this.query = schemeOrData.query || _empty;\n this.fragment = schemeOrData.fragment || _empty;\n // no validation because it's this URI\n // that creates uri components.\n // _validateUri(this);\n }\n else {\n this.scheme = _schemeFix(schemeOrData, _strict);\n this.authority = authority || _empty;\n this.path = _referenceResolution(this.scheme, path || _empty);\n this.query = query || _empty;\n this.fragment = fragment || _empty;\n _validateUri(this, _strict);\n }\n }\n static isUri(thing) {\n if (thing instanceof URI) {\n return true;\n }\n if (!thing) {\n return false;\n }\n return typeof thing.authority === 'string'\n && typeof thing.fragment === 'string'\n && typeof thing.path === 'string'\n && typeof thing.query === 'string'\n && typeof thing.scheme === 'string'\n && typeof thing.fsPath === 'string'\n && typeof thing.with === 'function'\n && typeof thing.toString === 'function';\n }\n // ---- filesystem path -----------------------\n /**\n * Returns a string representing the corresponding file system path of this URI.\n * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n * platform specific path separator.\n *\n * * Will *not* validate the path for invalid characters and semantics.\n * * Will *not* look at the scheme of this URI.\n * * The result shall *not* be used for display purposes but for accessing a file on disk.\n *\n *\n * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n *\n * ```ts\n const u = URI.parse('file://server/c$/folder/file.txt')\n u.authority === 'server'\n u.path === '/shares/c$/file.txt'\n u.fsPath === '\\\\server\\c$\\folder\\file.txt'\n ```\n *\n * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n * with URIs that represent files on disk (`file` scheme).\n */\n get fsPath() {\n // if (this.scheme !== 'file') {\n // \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n // }\n return uriToFsPath(this, false);\n }\n // ---- modify to new -------------------------\n with(change) {\n if (!change) {\n return this;\n }\n let { scheme, authority, path, query, fragment } = change;\n if (scheme === undefined) {\n scheme = this.scheme;\n }\n else if (scheme === null) {\n scheme = _empty;\n }\n if (authority === undefined) {\n authority = this.authority;\n }\n else if (authority === null) {\n authority = _empty;\n }\n if (path === undefined) {\n path = this.path;\n }\n else if (path === null) {\n path = _empty;\n }\n if (query === undefined) {\n query = this.query;\n }\n else if (query === null) {\n query = _empty;\n }\n if (fragment === undefined) {\n fragment = this.fragment;\n }\n else if (fragment === null) {\n fragment = _empty;\n }\n if (scheme === this.scheme\n && authority === this.authority\n && path === this.path\n && query === this.query\n && fragment === this.fragment) {\n return this;\n }\n return new Uri(scheme, authority, path, query, fragment);\n }\n // ---- parse & validate ------------------------\n /**\n * Creates a new URI from a string, e.g. `http://www.example.com/some/path`,\n * `file:///usr/home`, or `scheme:with/path`.\n *\n * @param value A string which represents an URI (see `URI#toString`).\n */\n static parse(value, _strict = false) {\n const match = _regexp.exec(value);\n if (!match) {\n return new Uri(_empty, _empty, _empty, _empty, _empty);\n }\n return new Uri(match[2] || _empty, percentDecode(match[4] || _empty), percentDecode(match[5] || _empty), percentDecode(match[7] || _empty), percentDecode(match[9] || _empty), _strict);\n }\n /**\n * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n * `/usr/home`, or `\\\\server\\share\\some\\path`.\n *\n * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n * `URI.parse('file://' + path)` because the path might contain characters that are\n * interpreted (# and ?). See the following sample:\n * ```ts\n const good = URI.file('/coding/c#/project1');\n good.scheme === 'file';\n good.path === '/coding/c#/project1';\n good.fragment === '';\n const bad = URI.parse('file://' + '/coding/c#/project1');\n bad.scheme === 'file';\n bad.path === '/coding/c'; // path is now broken\n bad.fragment === '/project1';\n ```\n *\n * @param path A file system path (see `URI#fsPath`)\n */\n static file(path) {\n let authority = _empty;\n // normalize to fwd-slashes on windows,\n // on other systems bwd-slashes are valid\n // filename character, eg /f\\oo/ba\\r.txt\n if (isWindows) {\n path = path.replace(/\\\\/g, _slash);\n }\n // check for authority as used in UNC shares\n // or use the path as given\n if (path[0] === _slash && path[1] === _slash) {\n const idx = path.indexOf(_slash, 2);\n if (idx === -1) {\n authority = path.substring(2);\n path = _slash;\n }\n else {\n authority = path.substring(2, idx);\n path = path.substring(idx) || _slash;\n }\n }\n return new Uri('file', authority, path, _empty, _empty);\n }\n static from(components) {\n const result = new Uri(components.scheme, components.authority, components.path, components.query, components.fragment);\n _validateUri(result, true);\n return result;\n }\n /**\n * Join a URI path with path fragments and normalizes the resulting path.\n *\n * @param uri The input URI.\n * @param pathFragment The path fragment to add to the URI path.\n * @returns The resulting URI.\n */\n static joinPath(uri, ...pathFragment) {\n if (!uri.path) {\n throw new Error(`[UriError]: cannot call joinPath on URI without path`);\n }\n let newPath;\n if (isWindows && uri.scheme === 'file') {\n newPath = URI.file(paths.win32.join(uriToFsPath(uri, true), ...pathFragment)).path;\n }\n else {\n newPath = paths.posix.join(uri.path, ...pathFragment);\n }\n return uri.with({ path: newPath });\n }\n // ---- printing/externalize ---------------------------\n /**\n * Creates a string representation for this URI. It's guaranteed that calling\n * `URI.parse` with the result of this function creates an URI which is equal\n * to this URI.\n *\n * * The result shall *not* be used for display purposes but for externalization or transport.\n * * The result will be encoded using the percentage encoding and encoding happens mostly\n * ignore the scheme-specific encoding rules.\n *\n * @param skipEncoding Do not encode the result, default is `false`\n */\n toString(skipEncoding = false) {\n return _asFormatted(this, skipEncoding);\n }\n toJSON() {\n return this;\n }\n static revive(data) {\n if (!data) {\n return data;\n }\n else if (data instanceof URI) {\n return data;\n }\n else {\n const result = new Uri(data);\n result._formatted = data.external;\n result._fsPath = data._sep === _pathSepMarker ? data.fsPath : null;\n return result;\n }\n }\n}\nconst _pathSepMarker = isWindows ? 1 : undefined;\n// This class exists so that URI is compatible with vscode.Uri (API).\nclass Uri extends URI {\n constructor() {\n super(...arguments);\n this._formatted = null;\n this._fsPath = null;\n }\n get fsPath() {\n if (!this._fsPath) {\n this._fsPath = uriToFsPath(this, false);\n }\n return this._fsPath;\n }\n toString(skipEncoding = false) {\n if (!skipEncoding) {\n if (!this._formatted) {\n this._formatted = _asFormatted(this, false);\n }\n return this._formatted;\n }\n else {\n // we don't cache that\n return _asFormatted(this, true);\n }\n }\n toJSON() {\n const res = {\n $mid: 1 /* MarshalledId.Uri */\n };\n // cached state\n if (this._fsPath) {\n res.fsPath = this._fsPath;\n res._sep = _pathSepMarker;\n }\n if (this._formatted) {\n res.external = this._formatted;\n }\n // uri components\n if (this.path) {\n res.path = this.path;\n }\n if (this.scheme) {\n res.scheme = this.scheme;\n }\n if (this.authority) {\n res.authority = this.authority;\n }\n if (this.query) {\n res.query = this.query;\n }\n if (this.fragment) {\n res.fragment = this.fragment;\n }\n return res;\n }\n}\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable = {\n [58 /* CharCode.Colon */]: '%3A',\n [47 /* CharCode.Slash */]: '%2F',\n [63 /* CharCode.QuestionMark */]: '%3F',\n [35 /* CharCode.Hash */]: '%23',\n [91 /* CharCode.OpenSquareBracket */]: '%5B',\n [93 /* CharCode.CloseSquareBracket */]: '%5D',\n [64 /* CharCode.AtSign */]: '%40',\n [33 /* CharCode.ExclamationMark */]: '%21',\n [36 /* CharCode.DollarSign */]: '%24',\n [38 /* CharCode.Ampersand */]: '%26',\n [39 /* CharCode.SingleQuote */]: '%27',\n [40 /* CharCode.OpenParen */]: '%28',\n [41 /* CharCode.CloseParen */]: '%29',\n [42 /* CharCode.Asterisk */]: '%2A',\n [43 /* CharCode.Plus */]: '%2B',\n [44 /* CharCode.Comma */]: '%2C',\n [59 /* CharCode.Semicolon */]: '%3B',\n [61 /* CharCode.Equals */]: '%3D',\n [32 /* CharCode.Space */]: '%20',\n};\nfunction encodeURIComponentFast(uriComponent, allowSlash) {\n let res = undefined;\n let nativeEncodePos = -1;\n for (let pos = 0; pos < uriComponent.length; pos++) {\n const code = uriComponent.charCodeAt(pos);\n // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n if ((code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */)\n || (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */)\n || (code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */)\n || code === 45 /* CharCode.Dash */\n || code === 46 /* CharCode.Period */\n || code === 95 /* CharCode.Underline */\n || code === 126 /* CharCode.Tilde */\n || (allowSlash && code === 47 /* CharCode.Slash */)) {\n // check if we are delaying native encode\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n nativeEncodePos = -1;\n }\n // check if we write into a new string (by default we try to return the param)\n if (res !== undefined) {\n res += uriComponent.charAt(pos);\n }\n }\n else {\n // encoding needed, we need to allocate a new string\n if (res === undefined) {\n res = uriComponent.substr(0, pos);\n }\n // check with default table first\n const escaped = encodeTable[code];\n if (escaped !== undefined) {\n // check if we are delaying native encode\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n nativeEncodePos = -1;\n }\n // append escaped variant to result\n res += escaped;\n }\n else if (nativeEncodePos === -1) {\n // use native encode only when needed\n nativeEncodePos = pos;\n }\n }\n }\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n }\n return res !== undefined ? res : uriComponent;\n}\nfunction encodeURIComponentMinimal(path) {\n let res = undefined;\n for (let pos = 0; pos < path.length; pos++) {\n const code = path.charCodeAt(pos);\n if (code === 35 /* CharCode.Hash */ || code === 63 /* CharCode.QuestionMark */) {\n if (res === undefined) {\n res = path.substr(0, pos);\n }\n res += encodeTable[code];\n }\n else {\n if (res !== undefined) {\n res += path[pos];\n }\n }\n }\n return res !== undefined ? res : path;\n}\n/**\n * Compute `fsPath` for the given uri\n */\nexport function uriToFsPath(uri, keepDriveLetterCasing) {\n let value;\n if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n // unc path: file://shares/c$/far/boo\n value = `//${uri.authority}${uri.path}`;\n }\n else if (uri.path.charCodeAt(0) === 47 /* CharCode.Slash */\n && (uri.path.charCodeAt(1) >= 65 /* CharCode.A */ && uri.path.charCodeAt(1) <= 90 /* CharCode.Z */ || uri.path.charCodeAt(1) >= 97 /* CharCode.a */ && uri.path.charCodeAt(1) <= 122 /* CharCode.z */)\n && uri.path.charCodeAt(2) === 58 /* CharCode.Colon */) {\n if (!keepDriveLetterCasing) {\n // windows drive letter: file:///c:/far/boo\n value = uri.path[1].toLowerCase() + uri.path.substr(2);\n }\n else {\n value = uri.path.substr(1);\n }\n }\n else {\n // other path\n value = uri.path;\n }\n if (isWindows) {\n value = value.replace(/\\//g, '\\\\');\n }\n return value;\n}\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri, skipEncoding) {\n const encoder = !skipEncoding\n ? encodeURIComponentFast\n : encodeURIComponentMinimal;\n let res = '';\n let { scheme, authority, path, query, fragment } = uri;\n if (scheme) {\n res += scheme;\n res += ':';\n }\n if (authority || scheme === 'file') {\n res += _slash;\n res += _slash;\n }\n if (authority) {\n let idx = authority.indexOf('@');\n if (idx !== -1) {\n // @\n const userinfo = authority.substr(0, idx);\n authority = authority.substr(idx + 1);\n idx = userinfo.indexOf(':');\n if (idx === -1) {\n res += encoder(userinfo, false);\n }\n else {\n // :@\n res += encoder(userinfo.substr(0, idx), false);\n res += ':';\n res += encoder(userinfo.substr(idx + 1), false);\n }\n res += '@';\n }\n authority = authority.toLowerCase();\n idx = authority.indexOf(':');\n if (idx === -1) {\n res += encoder(authority, false);\n }\n else {\n // :\n res += encoder(authority.substr(0, idx), false);\n res += authority.substr(idx);\n }\n }\n if (path) {\n // lower-case windows drive letters in /C:/fff or C:/fff\n if (path.length >= 3 && path.charCodeAt(0) === 47 /* CharCode.Slash */ && path.charCodeAt(2) === 58 /* CharCode.Colon */) {\n const code = path.charCodeAt(1);\n if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) {\n path = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n }\n }\n else if (path.length >= 2 && path.charCodeAt(1) === 58 /* CharCode.Colon */) {\n const code = path.charCodeAt(0);\n if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) {\n path = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n }\n }\n // encode the rest of the path\n res += encoder(path, true);\n }\n if (query) {\n res += '?';\n res += encoder(query, false);\n }\n if (fragment) {\n res += '#';\n res += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment;\n }\n return res;\n}\n// --- decode\nfunction decodeURIComponentGraceful(str) {\n try {\n return decodeURIComponent(str);\n }\n catch (_a) {\n if (str.length > 3) {\n return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n }\n else {\n return str;\n }\n }\n}\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\nfunction percentDecode(str) {\n if (!str.match(_rEncodedAsHex)) {\n return str;\n }\n return str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { transformErrorForSerialization } from '../errors.js';\nimport { Emitter } from '../event.js';\nimport { Disposable } from '../lifecycle.js';\nimport { globals, isWeb } from '../platform.js';\nimport * as types from '../types.js';\nimport * as strings from '../strings.js';\nconst INITIALIZE = '$initialize';\nlet webWorkerWarningLogged = false;\nexport function logOnceWebWorkerWarning(err) {\n if (!isWeb) {\n // running tests\n return;\n }\n if (!webWorkerWarningLogged) {\n webWorkerWarningLogged = true;\n console.warn('Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq');\n }\n console.warn(err.message);\n}\nclass RequestMessage {\n constructor(vsWorker, req, method, args) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.method = method;\n this.args = args;\n this.type = 0 /* MessageType.Request */;\n }\n}\nclass ReplyMessage {\n constructor(vsWorker, seq, res, err) {\n this.vsWorker = vsWorker;\n this.seq = seq;\n this.res = res;\n this.err = err;\n this.type = 1 /* MessageType.Reply */;\n }\n}\nclass SubscribeEventMessage {\n constructor(vsWorker, req, eventName, arg) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.eventName = eventName;\n this.arg = arg;\n this.type = 2 /* MessageType.SubscribeEvent */;\n }\n}\nclass EventMessage {\n constructor(vsWorker, req, event) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.event = event;\n this.type = 3 /* MessageType.Event */;\n }\n}\nclass UnsubscribeEventMessage {\n constructor(vsWorker, req) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.type = 4 /* MessageType.UnsubscribeEvent */;\n }\n}\nclass SimpleWorkerProtocol {\n constructor(handler) {\n this._workerId = -1;\n this._handler = handler;\n this._lastSentReq = 0;\n this._pendingReplies = Object.create(null);\n this._pendingEmitters = new Map();\n this._pendingEvents = new Map();\n }\n setWorkerId(workerId) {\n this._workerId = workerId;\n }\n sendMessage(method, args) {\n const req = String(++this._lastSentReq);\n return new Promise((resolve, reject) => {\n this._pendingReplies[req] = {\n resolve: resolve,\n reject: reject\n };\n this._send(new RequestMessage(this._workerId, req, method, args));\n });\n }\n listen(eventName, arg) {\n let req = null;\n const emitter = new Emitter({\n onFirstListenerAdd: () => {\n req = String(++this._lastSentReq);\n this._pendingEmitters.set(req, emitter);\n this._send(new SubscribeEventMessage(this._workerId, req, eventName, arg));\n },\n onLastListenerRemove: () => {\n this._pendingEmitters.delete(req);\n this._send(new UnsubscribeEventMessage(this._workerId, req));\n req = null;\n }\n });\n return emitter.event;\n }\n handleMessage(message) {\n if (!message || !message.vsWorker) {\n return;\n }\n if (this._workerId !== -1 && message.vsWorker !== this._workerId) {\n return;\n }\n this._handleMessage(message);\n }\n _handleMessage(msg) {\n switch (msg.type) {\n case 1 /* MessageType.Reply */:\n return this._handleReplyMessage(msg);\n case 0 /* MessageType.Request */:\n return this._handleRequestMessage(msg);\n case 2 /* MessageType.SubscribeEvent */:\n return this._handleSubscribeEventMessage(msg);\n case 3 /* MessageType.Event */:\n return this._handleEventMessage(msg);\n case 4 /* MessageType.UnsubscribeEvent */:\n return this._handleUnsubscribeEventMessage(msg);\n }\n }\n _handleReplyMessage(replyMessage) {\n if (!this._pendingReplies[replyMessage.seq]) {\n console.warn('Got reply to unknown seq');\n return;\n }\n const reply = this._pendingReplies[replyMessage.seq];\n delete this._pendingReplies[replyMessage.seq];\n if (replyMessage.err) {\n let err = replyMessage.err;\n if (replyMessage.err.$isError) {\n err = new Error();\n err.name = replyMessage.err.name;\n err.message = replyMessage.err.message;\n err.stack = replyMessage.err.stack;\n }\n reply.reject(err);\n return;\n }\n reply.resolve(replyMessage.res);\n }\n _handleRequestMessage(requestMessage) {\n const req = requestMessage.req;\n const result = this._handler.handleMessage(requestMessage.method, requestMessage.args);\n result.then((r) => {\n this._send(new ReplyMessage(this._workerId, req, r, undefined));\n }, (e) => {\n if (e.detail instanceof Error) {\n // Loading errors have a detail property that points to the actual error\n e.detail = transformErrorForSerialization(e.detail);\n }\n this._send(new ReplyMessage(this._workerId, req, undefined, transformErrorForSerialization(e)));\n });\n }\n _handleSubscribeEventMessage(msg) {\n const req = msg.req;\n const disposable = this._handler.handleEvent(msg.eventName, msg.arg)((event) => {\n this._send(new EventMessage(this._workerId, req, event));\n });\n this._pendingEvents.set(req, disposable);\n }\n _handleEventMessage(msg) {\n if (!this._pendingEmitters.has(msg.req)) {\n console.warn('Got event for unknown req');\n return;\n }\n this._pendingEmitters.get(msg.req).fire(msg.event);\n }\n _handleUnsubscribeEventMessage(msg) {\n if (!this._pendingEvents.has(msg.req)) {\n console.warn('Got unsubscribe for unknown req');\n return;\n }\n this._pendingEvents.get(msg.req).dispose();\n this._pendingEvents.delete(msg.req);\n }\n _send(msg) {\n const transfer = [];\n if (msg.type === 0 /* MessageType.Request */) {\n for (let i = 0; i < msg.args.length; i++) {\n if (msg.args[i] instanceof ArrayBuffer) {\n transfer.push(msg.args[i]);\n }\n }\n }\n else if (msg.type === 1 /* MessageType.Reply */) {\n if (msg.res instanceof ArrayBuffer) {\n transfer.push(msg.res);\n }\n }\n this._handler.sendMessage(msg, transfer);\n }\n}\n/**\n * Main thread side\n */\nexport class SimpleWorkerClient extends Disposable {\n constructor(workerFactory, moduleId, host) {\n super();\n let lazyProxyReject = null;\n this._worker = this._register(workerFactory.create('vs/base/common/worker/simpleWorker', (msg) => {\n this._protocol.handleMessage(msg);\n }, (err) => {\n // in Firefox, web workers fail lazily :(\n // we will reject the proxy\n lazyProxyReject === null || lazyProxyReject === void 0 ? void 0 : lazyProxyReject(err);\n }));\n this._protocol = new SimpleWorkerProtocol({\n sendMessage: (msg, transfer) => {\n this._worker.postMessage(msg, transfer);\n },\n handleMessage: (method, args) => {\n if (typeof host[method] !== 'function') {\n return Promise.reject(new Error('Missing method ' + method + ' on main thread host.'));\n }\n try {\n return Promise.resolve(host[method].apply(host, args));\n }\n catch (e) {\n return Promise.reject(e);\n }\n },\n handleEvent: (eventName, arg) => {\n if (propertyIsDynamicEvent(eventName)) {\n const event = host[eventName].call(host, arg);\n if (typeof event !== 'function') {\n throw new Error(`Missing dynamic event ${eventName} on main thread host.`);\n }\n return event;\n }\n if (propertyIsEvent(eventName)) {\n const event = host[eventName];\n if (typeof event !== 'function') {\n throw new Error(`Missing event ${eventName} on main thread host.`);\n }\n return event;\n }\n throw new Error(`Malformed event name ${eventName}`);\n }\n });\n this._protocol.setWorkerId(this._worker.getId());\n // Gather loader configuration\n let loaderConfiguration = null;\n if (typeof globals.require !== 'undefined' && typeof globals.require.getConfig === 'function') {\n // Get the configuration from the Monaco AMD Loader\n loaderConfiguration = globals.require.getConfig();\n }\n else if (typeof globals.requirejs !== 'undefined') {\n // Get the configuration from requirejs\n loaderConfiguration = globals.requirejs.s.contexts._.config;\n }\n const hostMethods = types.getAllMethodNames(host);\n // Send initialize message\n this._onModuleLoaded = this._protocol.sendMessage(INITIALIZE, [\n this._worker.getId(),\n JSON.parse(JSON.stringify(loaderConfiguration)),\n moduleId,\n hostMethods,\n ]);\n // Create proxy to loaded code\n const proxyMethodRequest = (method, args) => {\n return this._request(method, args);\n };\n const proxyListen = (eventName, arg) => {\n return this._protocol.listen(eventName, arg);\n };\n this._lazyProxy = new Promise((resolve, reject) => {\n lazyProxyReject = reject;\n this._onModuleLoaded.then((availableMethods) => {\n resolve(createProxyObject(availableMethods, proxyMethodRequest, proxyListen));\n }, (e) => {\n reject(e);\n this._onError('Worker failed to load ' + moduleId, e);\n });\n });\n }\n getProxyObject() {\n return this._lazyProxy;\n }\n _request(method, args) {\n return new Promise((resolve, reject) => {\n this._onModuleLoaded.then(() => {\n this._protocol.sendMessage(method, args).then(resolve, reject);\n }, reject);\n });\n }\n _onError(message, error) {\n console.error(message);\n console.info(error);\n }\n}\nfunction propertyIsEvent(name) {\n // Assume a property is an event if it has a form of \"onSomething\"\n return name[0] === 'o' && name[1] === 'n' && strings.isUpperAsciiLetter(name.charCodeAt(2));\n}\nfunction propertyIsDynamicEvent(name) {\n // Assume a property is a dynamic event (a method that returns an event) if it has a form of \"onDynamicSomething\"\n return /^onDynamic/.test(name) && strings.isUpperAsciiLetter(name.charCodeAt(9));\n}\nfunction createProxyObject(methodNames, invoke, proxyListen) {\n const createProxyMethod = (method) => {\n return function () {\n const args = Array.prototype.slice.call(arguments, 0);\n return invoke(method, args);\n };\n };\n const createProxyDynamicEvent = (eventName) => {\n return function (arg) {\n return proxyListen(eventName, arg);\n };\n };\n const result = {};\n for (const methodName of methodNames) {\n if (propertyIsDynamicEvent(methodName)) {\n result[methodName] = createProxyDynamicEvent(methodName);\n continue;\n }\n if (propertyIsEvent(methodName)) {\n result[methodName] = proxyListen(methodName, undefined);\n continue;\n }\n result[methodName] = createProxyMethod(methodName);\n }\n return result;\n}\n/**\n * Worker side\n */\nexport class SimpleWorkerServer {\n constructor(postMessage, requestHandlerFactory) {\n this._requestHandlerFactory = requestHandlerFactory;\n this._requestHandler = null;\n this._protocol = new SimpleWorkerProtocol({\n sendMessage: (msg, transfer) => {\n postMessage(msg, transfer);\n },\n handleMessage: (method, args) => this._handleMessage(method, args),\n handleEvent: (eventName, arg) => this._handleEvent(eventName, arg)\n });\n }\n onmessage(msg) {\n this._protocol.handleMessage(msg);\n }\n _handleMessage(method, args) {\n if (method === INITIALIZE) {\n return this.initialize(args[0], args[1], args[2], args[3]);\n }\n if (!this._requestHandler || typeof this._requestHandler[method] !== 'function') {\n return Promise.reject(new Error('Missing requestHandler or method: ' + method));\n }\n try {\n return Promise.resolve(this._requestHandler[method].apply(this._requestHandler, args));\n }\n catch (e) {\n return Promise.reject(e);\n }\n }\n _handleEvent(eventName, arg) {\n if (!this._requestHandler) {\n throw new Error(`Missing requestHandler`);\n }\n if (propertyIsDynamicEvent(eventName)) {\n const event = this._requestHandler[eventName].call(this._requestHandler, arg);\n if (typeof event !== 'function') {\n throw new Error(`Missing dynamic event ${eventName} on request handler.`);\n }\n return event;\n }\n if (propertyIsEvent(eventName)) {\n const event = this._requestHandler[eventName];\n if (typeof event !== 'function') {\n throw new Error(`Missing event ${eventName} on request handler.`);\n }\n return event;\n }\n throw new Error(`Malformed event name ${eventName}`);\n }\n initialize(workerId, loaderConfig, moduleId, hostMethods) {\n this._protocol.setWorkerId(workerId);\n const proxyMethodRequest = (method, args) => {\n return this._protocol.sendMessage(method, args);\n };\n const proxyListen = (eventName, arg) => {\n return this._protocol.listen(eventName, arg);\n };\n const hostProxy = createProxyObject(hostMethods, proxyMethodRequest, proxyListen);\n if (this._requestHandlerFactory) {\n // static request handler\n this._requestHandler = this._requestHandlerFactory(hostProxy);\n return Promise.resolve(types.getAllMethodNames(this._requestHandler));\n }\n if (loaderConfig) {\n // Remove 'baseUrl', handling it is beyond scope for now\n if (typeof loaderConfig.baseUrl !== 'undefined') {\n delete loaderConfig['baseUrl'];\n }\n if (typeof loaderConfig.paths !== 'undefined') {\n if (typeof loaderConfig.paths.vs !== 'undefined') {\n delete loaderConfig.paths['vs'];\n }\n }\n if (typeof loaderConfig.trustedTypesPolicy !== undefined) {\n // don't use, it has been destroyed during serialize\n delete loaderConfig['trustedTypesPolicy'];\n }\n // Since this is in a web worker, enable catching errors\n loaderConfig.catchError = true;\n globals.require.config(loaderConfig);\n }\n return new Promise((resolve, reject) => {\n // Use the global require to be sure to get the global config\n // ESM-comment-begin\n // \t\t\tconst req = (globals.require || require);\n // ESM-comment-end\n // ESM-uncomment-begin\n const req = globals.require;\n // ESM-uncomment-end\n req([moduleId], (module) => {\n this._requestHandler = module.create(hostProxy);\n if (!this._requestHandler) {\n reject(new Error(`No RequestHandler!`));\n return;\n }\n resolve(types.getAllMethodNames(this._requestHandler));\n }, reject);\n });\n }\n}\n/**\n * Called on the worker side\n */\nexport function create(postMessage) {\n return new SimpleWorkerServer(postMessage, null);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { toUint8 } from '../../../base/common/uint.js';\n/**\n * A fast character classifier that uses a compact array for ASCII values.\n */\nexport class CharacterClassifier {\n constructor(_defaultValue) {\n const defaultValue = toUint8(_defaultValue);\n this._defaultValue = defaultValue;\n this._asciiMap = CharacterClassifier._createAsciiMap(defaultValue);\n this._map = new Map();\n }\n static _createAsciiMap(defaultValue) {\n const asciiMap = new Uint8Array(256);\n for (let i = 0; i < 256; i++) {\n asciiMap[i] = defaultValue;\n }\n return asciiMap;\n }\n set(charCode, _value) {\n const value = toUint8(_value);\n if (charCode >= 0 && charCode < 256) {\n this._asciiMap[charCode] = value;\n }\n else {\n this._map.set(charCode, value);\n }\n }\n get(charCode) {\n if (charCode >= 0 && charCode < 256) {\n return this._asciiMap[charCode];\n }\n else {\n return (this._map.get(charCode) || this._defaultValue);\n }\n }\n}\nexport class CharacterSet {\n constructor() {\n this._actual = new CharacterClassifier(0 /* Boolean.False */);\n }\n add(charCode) {\n this._actual.set(charCode, 1 /* Boolean.True */);\n }\n has(charCode) {\n return (this._actual.get(charCode) === 1 /* Boolean.True */);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/**\n * A position in the editor.\n */\nexport class Position {\n constructor(lineNumber, column) {\n this.lineNumber = lineNumber;\n this.column = column;\n }\n /**\n * Create a new position from this position.\n *\n * @param newLineNumber new line number\n * @param newColumn new column\n */\n with(newLineNumber = this.lineNumber, newColumn = this.column) {\n if (newLineNumber === this.lineNumber && newColumn === this.column) {\n return this;\n }\n else {\n return new Position(newLineNumber, newColumn);\n }\n }\n /**\n * Derive a new position from this position.\n *\n * @param deltaLineNumber line number delta\n * @param deltaColumn column delta\n */\n delta(deltaLineNumber = 0, deltaColumn = 0) {\n return this.with(this.lineNumber + deltaLineNumber, this.column + deltaColumn);\n }\n /**\n * Test if this position equals other position\n */\n equals(other) {\n return Position.equals(this, other);\n }\n /**\n * Test if position `a` equals position `b`\n */\n static equals(a, b) {\n if (!a && !b) {\n return true;\n }\n return (!!a &&\n !!b &&\n a.lineNumber === b.lineNumber &&\n a.column === b.column);\n }\n /**\n * Test if this position is before other position.\n * If the two positions are equal, the result will be false.\n */\n isBefore(other) {\n return Position.isBefore(this, other);\n }\n /**\n * Test if position `a` is before position `b`.\n * If the two positions are equal, the result will be false.\n */\n static isBefore(a, b) {\n if (a.lineNumber < b.lineNumber) {\n return true;\n }\n if (b.lineNumber < a.lineNumber) {\n return false;\n }\n return a.column < b.column;\n }\n /**\n * Test if this position is before other position.\n * If the two positions are equal, the result will be true.\n */\n isBeforeOrEqual(other) {\n return Position.isBeforeOrEqual(this, other);\n }\n /**\n * Test if position `a` is before position `b`.\n * If the two positions are equal, the result will be true.\n */\n static isBeforeOrEqual(a, b) {\n if (a.lineNumber < b.lineNumber) {\n return true;\n }\n if (b.lineNumber < a.lineNumber) {\n return false;\n }\n return a.column <= b.column;\n }\n /**\n * A function that compares positions, useful for sorting\n */\n static compare(a, b) {\n const aLineNumber = a.lineNumber | 0;\n const bLineNumber = b.lineNumber | 0;\n if (aLineNumber === bLineNumber) {\n const aColumn = a.column | 0;\n const bColumn = b.column | 0;\n return aColumn - bColumn;\n }\n return aLineNumber - bLineNumber;\n }\n /**\n * Clone this position.\n */\n clone() {\n return new Position(this.lineNumber, this.column);\n }\n /**\n * Convert to a human-readable representation.\n */\n toString() {\n return '(' + this.lineNumber + ',' + this.column + ')';\n }\n // ---\n /**\n * Create a `Position` from an `IPosition`.\n */\n static lift(pos) {\n return new Position(pos.lineNumber, pos.column);\n }\n /**\n * Test if `obj` is an `IPosition`.\n */\n static isIPosition(obj) {\n return (obj\n && (typeof obj.lineNumber === 'number')\n && (typeof obj.column === 'number'));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Position } from './position.js';\n/**\n * A range in the editor. (startLineNumber,startColumn) is <= (endLineNumber,endColumn)\n */\nexport class Range {\n constructor(startLineNumber, startColumn, endLineNumber, endColumn) {\n if ((startLineNumber > endLineNumber) || (startLineNumber === endLineNumber && startColumn > endColumn)) {\n this.startLineNumber = endLineNumber;\n this.startColumn = endColumn;\n this.endLineNumber = startLineNumber;\n this.endColumn = startColumn;\n }\n else {\n this.startLineNumber = startLineNumber;\n this.startColumn = startColumn;\n this.endLineNumber = endLineNumber;\n this.endColumn = endColumn;\n }\n }\n /**\n * Test if this range is empty.\n */\n isEmpty() {\n return Range.isEmpty(this);\n }\n /**\n * Test if `range` is empty.\n */\n static isEmpty(range) {\n return (range.startLineNumber === range.endLineNumber && range.startColumn === range.endColumn);\n }\n /**\n * Test if position is in this range. If the position is at the edges, will return true.\n */\n containsPosition(position) {\n return Range.containsPosition(this, position);\n }\n /**\n * Test if `position` is in `range`. If the position is at the edges, will return true.\n */\n static containsPosition(range, position) {\n if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n return false;\n }\n if (position.lineNumber === range.startLineNumber && position.column < range.startColumn) {\n return false;\n }\n if (position.lineNumber === range.endLineNumber && position.column > range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * Test if `position` is in `range`. If the position is at the edges, will return false.\n * @internal\n */\n static strictContainsPosition(range, position) {\n if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n return false;\n }\n if (position.lineNumber === range.startLineNumber && position.column <= range.startColumn) {\n return false;\n }\n if (position.lineNumber === range.endLineNumber && position.column >= range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * Test if range is in this range. If the range is equal to this range, will return true.\n */\n containsRange(range) {\n return Range.containsRange(this, range);\n }\n /**\n * Test if `otherRange` is in `range`. If the ranges are equal, will return true.\n */\n static containsRange(range, otherRange) {\n if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn < range.startColumn) {\n return false;\n }\n if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn > range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true.\n */\n strictContainsRange(range) {\n return Range.strictContainsRange(this, range);\n }\n /**\n * Test if `otherRange` is strictly in `range` (must start after, and end before). If the ranges are equal, will return false.\n */\n static strictContainsRange(range, otherRange) {\n if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn <= range.startColumn) {\n return false;\n }\n if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn >= range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * A reunion of the two ranges.\n * The smallest position will be used as the start point, and the largest one as the end point.\n */\n plusRange(range) {\n return Range.plusRange(this, range);\n }\n /**\n * A reunion of the two ranges.\n * The smallest position will be used as the start point, and the largest one as the end point.\n */\n static plusRange(a, b) {\n let startLineNumber;\n let startColumn;\n let endLineNumber;\n let endColumn;\n if (b.startLineNumber < a.startLineNumber) {\n startLineNumber = b.startLineNumber;\n startColumn = b.startColumn;\n }\n else if (b.startLineNumber === a.startLineNumber) {\n startLineNumber = b.startLineNumber;\n startColumn = Math.min(b.startColumn, a.startColumn);\n }\n else {\n startLineNumber = a.startLineNumber;\n startColumn = a.startColumn;\n }\n if (b.endLineNumber > a.endLineNumber) {\n endLineNumber = b.endLineNumber;\n endColumn = b.endColumn;\n }\n else if (b.endLineNumber === a.endLineNumber) {\n endLineNumber = b.endLineNumber;\n endColumn = Math.max(b.endColumn, a.endColumn);\n }\n else {\n endLineNumber = a.endLineNumber;\n endColumn = a.endColumn;\n }\n return new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n }\n /**\n * A intersection of the two ranges.\n */\n intersectRanges(range) {\n return Range.intersectRanges(this, range);\n }\n /**\n * A intersection of the two ranges.\n */\n static intersectRanges(a, b) {\n let resultStartLineNumber = a.startLineNumber;\n let resultStartColumn = a.startColumn;\n let resultEndLineNumber = a.endLineNumber;\n let resultEndColumn = a.endColumn;\n const otherStartLineNumber = b.startLineNumber;\n const otherStartColumn = b.startColumn;\n const otherEndLineNumber = b.endLineNumber;\n const otherEndColumn = b.endColumn;\n if (resultStartLineNumber < otherStartLineNumber) {\n resultStartLineNumber = otherStartLineNumber;\n resultStartColumn = otherStartColumn;\n }\n else if (resultStartLineNumber === otherStartLineNumber) {\n resultStartColumn = Math.max(resultStartColumn, otherStartColumn);\n }\n if (resultEndLineNumber > otherEndLineNumber) {\n resultEndLineNumber = otherEndLineNumber;\n resultEndColumn = otherEndColumn;\n }\n else if (resultEndLineNumber === otherEndLineNumber) {\n resultEndColumn = Math.min(resultEndColumn, otherEndColumn);\n }\n // Check if selection is now empty\n if (resultStartLineNumber > resultEndLineNumber) {\n return null;\n }\n if (resultStartLineNumber === resultEndLineNumber && resultStartColumn > resultEndColumn) {\n return null;\n }\n return new Range(resultStartLineNumber, resultStartColumn, resultEndLineNumber, resultEndColumn);\n }\n /**\n * Test if this range equals other.\n */\n equalsRange(other) {\n return Range.equalsRange(this, other);\n }\n /**\n * Test if range `a` equals `b`.\n */\n static equalsRange(a, b) {\n return (!!a &&\n !!b &&\n a.startLineNumber === b.startLineNumber &&\n a.startColumn === b.startColumn &&\n a.endLineNumber === b.endLineNumber &&\n a.endColumn === b.endColumn);\n }\n /**\n * Return the end position (which will be after or equal to the start position)\n */\n getEndPosition() {\n return Range.getEndPosition(this);\n }\n /**\n * Return the end position (which will be after or equal to the start position)\n */\n static getEndPosition(range) {\n return new Position(range.endLineNumber, range.endColumn);\n }\n /**\n * Return the start position (which will be before or equal to the end position)\n */\n getStartPosition() {\n return Range.getStartPosition(this);\n }\n /**\n * Return the start position (which will be before or equal to the end position)\n */\n static getStartPosition(range) {\n return new Position(range.startLineNumber, range.startColumn);\n }\n /**\n * Transform to a user presentable string representation.\n */\n toString() {\n return '[' + this.startLineNumber + ',' + this.startColumn + ' -> ' + this.endLineNumber + ',' + this.endColumn + ']';\n }\n /**\n * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position.\n */\n setEndPosition(endLineNumber, endColumn) {\n return new Range(this.startLineNumber, this.startColumn, endLineNumber, endColumn);\n }\n /**\n * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position.\n */\n setStartPosition(startLineNumber, startColumn) {\n return new Range(startLineNumber, startColumn, this.endLineNumber, this.endColumn);\n }\n /**\n * Create a new empty range using this range's start position.\n */\n collapseToStart() {\n return Range.collapseToStart(this);\n }\n /**\n * Create a new empty range using this range's start position.\n */\n static collapseToStart(range) {\n return new Range(range.startLineNumber, range.startColumn, range.startLineNumber, range.startColumn);\n }\n // ---\n static fromPositions(start, end = start) {\n return new Range(start.lineNumber, start.column, end.lineNumber, end.column);\n }\n static lift(range) {\n if (!range) {\n return null;\n }\n return new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n }\n /**\n * Test if `obj` is an `IRange`.\n */\n static isIRange(obj) {\n return (obj\n && (typeof obj.startLineNumber === 'number')\n && (typeof obj.startColumn === 'number')\n && (typeof obj.endLineNumber === 'number')\n && (typeof obj.endColumn === 'number'));\n }\n /**\n * Test if the two ranges are touching in any way.\n */\n static areIntersectingOrTouching(a, b) {\n // Check if `a` is before `b`\n if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn < b.startColumn)) {\n return false;\n }\n // Check if `b` is before `a`\n if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn < a.startColumn)) {\n return false;\n }\n // These ranges must intersect\n return true;\n }\n /**\n * Test if the two ranges are intersecting. If the ranges are touching it returns true.\n */\n static areIntersecting(a, b) {\n // Check if `a` is before `b`\n if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn <= b.startColumn)) {\n return false;\n }\n // Check if `b` is before `a`\n if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn <= a.startColumn)) {\n return false;\n }\n // These ranges must intersect\n return true;\n }\n /**\n * A function that compares ranges, useful for sorting ranges\n * It will first compare ranges on the startPosition and then on the endPosition\n */\n static compareRangesUsingStarts(a, b) {\n if (a && b) {\n const aStartLineNumber = a.startLineNumber | 0;\n const bStartLineNumber = b.startLineNumber | 0;\n if (aStartLineNumber === bStartLineNumber) {\n const aStartColumn = a.startColumn | 0;\n const bStartColumn = b.startColumn | 0;\n if (aStartColumn === bStartColumn) {\n const aEndLineNumber = a.endLineNumber | 0;\n const bEndLineNumber = b.endLineNumber | 0;\n if (aEndLineNumber === bEndLineNumber) {\n const aEndColumn = a.endColumn | 0;\n const bEndColumn = b.endColumn | 0;\n return aEndColumn - bEndColumn;\n }\n return aEndLineNumber - bEndLineNumber;\n }\n return aStartColumn - bStartColumn;\n }\n return aStartLineNumber - bStartLineNumber;\n }\n const aExists = (a ? 1 : 0);\n const bExists = (b ? 1 : 0);\n return aExists - bExists;\n }\n /**\n * A function that compares ranges, useful for sorting ranges\n * It will first compare ranges on the endPosition and then on the startPosition\n */\n static compareRangesUsingEnds(a, b) {\n if (a.endLineNumber === b.endLineNumber) {\n if (a.endColumn === b.endColumn) {\n if (a.startLineNumber === b.startLineNumber) {\n return a.startColumn - b.startColumn;\n }\n return a.startLineNumber - b.startLineNumber;\n }\n return a.endColumn - b.endColumn;\n }\n return a.endLineNumber - b.endLineNumber;\n }\n /**\n * Test if the range spans multiple lines.\n */\n static spansMultipleLines(range) {\n return range.endLineNumber > range.startLineNumber;\n }\n toJSON() {\n return this;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Position } from './position.js';\nimport { Range } from './range.js';\n/**\n * A selection in the editor.\n * The selection is a range that has an orientation.\n */\nexport class Selection extends Range {\n constructor(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn) {\n super(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn);\n this.selectionStartLineNumber = selectionStartLineNumber;\n this.selectionStartColumn = selectionStartColumn;\n this.positionLineNumber = positionLineNumber;\n this.positionColumn = positionColumn;\n }\n /**\n * Transform to a human-readable representation.\n */\n toString() {\n return '[' + this.selectionStartLineNumber + ',' + this.selectionStartColumn + ' -> ' + this.positionLineNumber + ',' + this.positionColumn + ']';\n }\n /**\n * Test if equals other selection.\n */\n equalsSelection(other) {\n return (Selection.selectionsEqual(this, other));\n }\n /**\n * Test if the two selections are equal.\n */\n static selectionsEqual(a, b) {\n return (a.selectionStartLineNumber === b.selectionStartLineNumber &&\n a.selectionStartColumn === b.selectionStartColumn &&\n a.positionLineNumber === b.positionLineNumber &&\n a.positionColumn === b.positionColumn);\n }\n /**\n * Get directions (LTR or RTL).\n */\n getDirection() {\n if (this.selectionStartLineNumber === this.startLineNumber && this.selectionStartColumn === this.startColumn) {\n return 0 /* SelectionDirection.LTR */;\n }\n return 1 /* SelectionDirection.RTL */;\n }\n /**\n * Create a new selection with a different `positionLineNumber` and `positionColumn`.\n */\n setEndPosition(endLineNumber, endColumn) {\n if (this.getDirection() === 0 /* SelectionDirection.LTR */) {\n return new Selection(this.startLineNumber, this.startColumn, endLineNumber, endColumn);\n }\n return new Selection(endLineNumber, endColumn, this.startLineNumber, this.startColumn);\n }\n /**\n * Get the position at `positionLineNumber` and `positionColumn`.\n */\n getPosition() {\n return new Position(this.positionLineNumber, this.positionColumn);\n }\n /**\n * Get the position at the start of the selection.\n */\n getSelectionStart() {\n return new Position(this.selectionStartLineNumber, this.selectionStartColumn);\n }\n /**\n * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`.\n */\n setStartPosition(startLineNumber, startColumn) {\n if (this.getDirection() === 0 /* SelectionDirection.LTR */) {\n return new Selection(startLineNumber, startColumn, this.endLineNumber, this.endColumn);\n }\n return new Selection(this.endLineNumber, this.endColumn, startLineNumber, startColumn);\n }\n // ----\n /**\n * Create a `Selection` from one or two positions\n */\n static fromPositions(start, end = start) {\n return new Selection(start.lineNumber, start.column, end.lineNumber, end.column);\n }\n /**\n * Creates a `Selection` from a range, given a direction.\n */\n static fromRange(range, direction) {\n if (direction === 0 /* SelectionDirection.LTR */) {\n return new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n }\n else {\n return new Selection(range.endLineNumber, range.endColumn, range.startLineNumber, range.startColumn);\n }\n }\n /**\n * Create a `Selection` from an `ISelection`.\n */\n static liftSelection(sel) {\n return new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn);\n }\n /**\n * `a` equals `b`.\n */\n static selectionsArrEqual(a, b) {\n if (a && !b || !a && b) {\n return false;\n }\n if (!a && !b) {\n return true;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0, len = a.length; i < len; i++) {\n if (!this.selectionsEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Test if `obj` is an `ISelection`.\n */\n static isISelection(obj) {\n return (obj\n && (typeof obj.selectionStartLineNumber === 'number')\n && (typeof obj.selectionStartColumn === 'number')\n && (typeof obj.positionLineNumber === 'number')\n && (typeof obj.positionColumn === 'number'));\n }\n /**\n * Create with a direction.\n */\n static createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, direction) {\n if (direction === 0 /* SelectionDirection.LTR */) {\n return new Selection(startLineNumber, startColumn, endLineNumber, endColumn);\n }\n return new Selection(endLineNumber, endColumn, startLineNumber, startColumn);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { CharacterClassifier } from './characterClassifier.js';\nexport class WordCharacterClassifier extends CharacterClassifier {\n constructor(wordSeparators) {\n super(0 /* WordCharacterClass.Regular */);\n for (let i = 0, len = wordSeparators.length; i < len; i++) {\n this.set(wordSeparators.charCodeAt(i), 2 /* WordCharacterClass.WordSeparator */);\n }\n this.set(32 /* CharCode.Space */, 1 /* WordCharacterClass.Whitespace */);\n this.set(9 /* CharCode.Tab */, 1 /* WordCharacterClass.Whitespace */);\n }\n}\nfunction once(computeFn) {\n const cache = {}; // TODO@Alex unbounded cache\n return (input) => {\n if (!cache.hasOwnProperty(input)) {\n cache[input] = computeFn(input);\n }\n return cache[input];\n };\n}\nexport const getMapForWordSeparators = once((input) => new WordCharacterClassifier(input));\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Iterable } from '../../../base/common/iterator.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\nexport const USUAL_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\\\|;:\\'\",.<>/?';\n/**\n * Create a word definition regular expression based on default word separators.\n * Optionally provide allowed separators that should be included in words.\n *\n * The default would look like this:\n * /(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)/g\n */\nfunction createWordRegExp(allowInWords = '') {\n let source = '(-?\\\\d*\\\\.\\\\d\\\\w*)|([^';\n for (const sep of USUAL_WORD_SEPARATORS) {\n if (allowInWords.indexOf(sep) >= 0) {\n continue;\n }\n source += '\\\\' + sep;\n }\n source += '\\\\s]+)';\n return new RegExp(source, 'g');\n}\n// catches numbers (including floating numbers) in the first group, and alphanum in the second\nexport const DEFAULT_WORD_REGEXP = createWordRegExp();\nexport function ensureValidWordDefinition(wordDefinition) {\n let result = DEFAULT_WORD_REGEXP;\n if (wordDefinition && (wordDefinition instanceof RegExp)) {\n if (!wordDefinition.global) {\n let flags = 'g';\n if (wordDefinition.ignoreCase) {\n flags += 'i';\n }\n if (wordDefinition.multiline) {\n flags += 'm';\n }\n if (wordDefinition.unicode) {\n flags += 'u';\n }\n result = new RegExp(wordDefinition.source, flags);\n }\n else {\n result = wordDefinition;\n }\n }\n result.lastIndex = 0;\n return result;\n}\nconst _defaultConfig = new LinkedList();\n_defaultConfig.unshift({\n maxLen: 1000,\n windowSize: 15,\n timeBudget: 150\n});\nexport function getWordAtText(column, wordDefinition, text, textOffset, config) {\n if (!config) {\n config = Iterable.first(_defaultConfig);\n }\n if (text.length > config.maxLen) {\n // don't throw strings that long at the regexp\n // but use a sub-string in which a word must occur\n let start = column - config.maxLen / 2;\n if (start < 0) {\n start = 0;\n }\n else {\n textOffset += start;\n }\n text = text.substring(start, column + config.maxLen / 2);\n return getWordAtText(column, wordDefinition, text, textOffset, config);\n }\n const t1 = Date.now();\n const pos = column - 1 - textOffset;\n let prevRegexIndex = -1;\n let match = null;\n for (let i = 1;; i++) {\n // check time budget\n if (Date.now() - t1 >= config.timeBudget) {\n break;\n }\n // reset the index at which the regexp should start matching, also know where it\n // should stop so that subsequent search don't repeat previous searches\n const regexIndex = pos - config.windowSize * i;\n wordDefinition.lastIndex = Math.max(0, regexIndex);\n const thisMatch = _findRegexMatchEnclosingPosition(wordDefinition, text, pos, prevRegexIndex);\n if (!thisMatch && match) {\n // stop: we have something\n break;\n }\n match = thisMatch;\n // stop: searched at start\n if (regexIndex <= 0) {\n break;\n }\n prevRegexIndex = regexIndex;\n }\n if (match) {\n const result = {\n word: match[0],\n startColumn: textOffset + 1 + match.index,\n endColumn: textOffset + 1 + match.index + match[0].length\n };\n wordDefinition.lastIndex = 0;\n return result;\n }\n return null;\n}\nfunction _findRegexMatchEnclosingPosition(wordDefinition, text, pos, stopPos) {\n let match;\n while (match = wordDefinition.exec(text)) {\n const matchIndex = match.index || 0;\n if (matchIndex <= pos && wordDefinition.lastIndex >= pos) {\n return match;\n }\n else if (stopPos > 0 && matchIndex > stopPos) {\n return null;\n }\n }\n return null;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { LcsDiff } from '../../../base/common/diff/diff.js';\nimport * as strings from '../../../base/common/strings.js';\nconst MINIMUM_MATCHING_CHARACTER_LENGTH = 3;\nfunction computeDiff(originalSequence, modifiedSequence, continueProcessingPredicate, pretty) {\n const diffAlgo = new LcsDiff(originalSequence, modifiedSequence, continueProcessingPredicate);\n return diffAlgo.ComputeDiff(pretty);\n}\nclass LineSequence {\n constructor(lines) {\n const startColumns = [];\n const endColumns = [];\n for (let i = 0, length = lines.length; i < length; i++) {\n startColumns[i] = getFirstNonBlankColumn(lines[i], 1);\n endColumns[i] = getLastNonBlankColumn(lines[i], 1);\n }\n this.lines = lines;\n this._startColumns = startColumns;\n this._endColumns = endColumns;\n }\n getElements() {\n const elements = [];\n for (let i = 0, len = this.lines.length; i < len; i++) {\n elements[i] = this.lines[i].substring(this._startColumns[i] - 1, this._endColumns[i] - 1);\n }\n return elements;\n }\n getStrictElement(index) {\n return this.lines[index];\n }\n getStartLineNumber(i) {\n return i + 1;\n }\n getEndLineNumber(i) {\n return i + 1;\n }\n createCharSequence(shouldIgnoreTrimWhitespace, startIndex, endIndex) {\n const charCodes = [];\n const lineNumbers = [];\n const columns = [];\n let len = 0;\n for (let index = startIndex; index <= endIndex; index++) {\n const lineContent = this.lines[index];\n const startColumn = (shouldIgnoreTrimWhitespace ? this._startColumns[index] : 1);\n const endColumn = (shouldIgnoreTrimWhitespace ? this._endColumns[index] : lineContent.length + 1);\n for (let col = startColumn; col < endColumn; col++) {\n charCodes[len] = lineContent.charCodeAt(col - 1);\n lineNumbers[len] = index + 1;\n columns[len] = col;\n len++;\n }\n if (!shouldIgnoreTrimWhitespace && index < endIndex) {\n // Add \\n if trim whitespace is not ignored\n charCodes[len] = 10 /* CharCode.LineFeed */;\n lineNumbers[len] = index + 1;\n columns[len] = lineContent.length + 1;\n len++;\n }\n }\n return new CharSequence(charCodes, lineNumbers, columns);\n }\n}\nclass CharSequence {\n constructor(charCodes, lineNumbers, columns) {\n this._charCodes = charCodes;\n this._lineNumbers = lineNumbers;\n this._columns = columns;\n }\n toString() {\n return ('[' + this._charCodes.map((s, idx) => (s === 10 /* CharCode.LineFeed */ ? '\\\\n' : String.fromCharCode(s)) + `-(${this._lineNumbers[idx]},${this._columns[idx]})`).join(', ') + ']');\n }\n _assertIndex(index, arr) {\n if (index < 0 || index >= arr.length) {\n throw new Error(`Illegal index`);\n }\n }\n getElements() {\n return this._charCodes;\n }\n getStartLineNumber(i) {\n if (i > 0 && i === this._lineNumbers.length) {\n // the start line number of the element after the last element\n // is the end line number of the last element\n return this.getEndLineNumber(i - 1);\n }\n this._assertIndex(i, this._lineNumbers);\n return this._lineNumbers[i];\n }\n getEndLineNumber(i) {\n if (i === -1) {\n // the end line number of the element before the first element\n // is the start line number of the first element\n return this.getStartLineNumber(i + 1);\n }\n this._assertIndex(i, this._lineNumbers);\n if (this._charCodes[i] === 10 /* CharCode.LineFeed */) {\n return this._lineNumbers[i] + 1;\n }\n return this._lineNumbers[i];\n }\n getStartColumn(i) {\n if (i > 0 && i === this._columns.length) {\n // the start column of the element after the last element\n // is the end column of the last element\n return this.getEndColumn(i - 1);\n }\n this._assertIndex(i, this._columns);\n return this._columns[i];\n }\n getEndColumn(i) {\n if (i === -1) {\n // the end column of the element before the first element\n // is the start column of the first element\n return this.getStartColumn(i + 1);\n }\n this._assertIndex(i, this._columns);\n if (this._charCodes[i] === 10 /* CharCode.LineFeed */) {\n return 1;\n }\n return this._columns[i] + 1;\n }\n}\nclass CharChange {\n constructor(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn) {\n this.originalStartLineNumber = originalStartLineNumber;\n this.originalStartColumn = originalStartColumn;\n this.originalEndLineNumber = originalEndLineNumber;\n this.originalEndColumn = originalEndColumn;\n this.modifiedStartLineNumber = modifiedStartLineNumber;\n this.modifiedStartColumn = modifiedStartColumn;\n this.modifiedEndLineNumber = modifiedEndLineNumber;\n this.modifiedEndColumn = modifiedEndColumn;\n }\n static createFromDiffChange(diffChange, originalCharSequence, modifiedCharSequence) {\n const originalStartLineNumber = originalCharSequence.getStartLineNumber(diffChange.originalStart);\n const originalStartColumn = originalCharSequence.getStartColumn(diffChange.originalStart);\n const originalEndLineNumber = originalCharSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1);\n const originalEndColumn = originalCharSequence.getEndColumn(diffChange.originalStart + diffChange.originalLength - 1);\n const modifiedStartLineNumber = modifiedCharSequence.getStartLineNumber(diffChange.modifiedStart);\n const modifiedStartColumn = modifiedCharSequence.getStartColumn(diffChange.modifiedStart);\n const modifiedEndLineNumber = modifiedCharSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n const modifiedEndColumn = modifiedCharSequence.getEndColumn(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n return new CharChange(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn);\n }\n}\nfunction postProcessCharChanges(rawChanges) {\n if (rawChanges.length <= 1) {\n return rawChanges;\n }\n const result = [rawChanges[0]];\n let prevChange = result[0];\n for (let i = 1, len = rawChanges.length; i < len; i++) {\n const currChange = rawChanges[i];\n const originalMatchingLength = currChange.originalStart - (prevChange.originalStart + prevChange.originalLength);\n const modifiedMatchingLength = currChange.modifiedStart - (prevChange.modifiedStart + prevChange.modifiedLength);\n // Both of the above should be equal, but the continueProcessingPredicate may prevent this from being true\n const matchingLength = Math.min(originalMatchingLength, modifiedMatchingLength);\n if (matchingLength < MINIMUM_MATCHING_CHARACTER_LENGTH) {\n // Merge the current change into the previous one\n prevChange.originalLength = (currChange.originalStart + currChange.originalLength) - prevChange.originalStart;\n prevChange.modifiedLength = (currChange.modifiedStart + currChange.modifiedLength) - prevChange.modifiedStart;\n }\n else {\n // Add the current change\n result.push(currChange);\n prevChange = currChange;\n }\n }\n return result;\n}\nclass LineChange {\n constructor(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges) {\n this.originalStartLineNumber = originalStartLineNumber;\n this.originalEndLineNumber = originalEndLineNumber;\n this.modifiedStartLineNumber = modifiedStartLineNumber;\n this.modifiedEndLineNumber = modifiedEndLineNumber;\n this.charChanges = charChanges;\n }\n static createFromDiffResult(shouldIgnoreTrimWhitespace, diffChange, originalLineSequence, modifiedLineSequence, continueCharDiff, shouldComputeCharChanges, shouldPostProcessCharChanges) {\n let originalStartLineNumber;\n let originalEndLineNumber;\n let modifiedStartLineNumber;\n let modifiedEndLineNumber;\n let charChanges = undefined;\n if (diffChange.originalLength === 0) {\n originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart) - 1;\n originalEndLineNumber = 0;\n }\n else {\n originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart);\n originalEndLineNumber = originalLineSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1);\n }\n if (diffChange.modifiedLength === 0) {\n modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart) - 1;\n modifiedEndLineNumber = 0;\n }\n else {\n modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart);\n modifiedEndLineNumber = modifiedLineSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n }\n if (shouldComputeCharChanges && diffChange.originalLength > 0 && diffChange.originalLength < 20 && diffChange.modifiedLength > 0 && diffChange.modifiedLength < 20 && continueCharDiff()) {\n // Compute character changes for diff chunks of at most 20 lines...\n const originalCharSequence = originalLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.originalStart, diffChange.originalStart + diffChange.originalLength - 1);\n const modifiedCharSequence = modifiedLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.modifiedStart, diffChange.modifiedStart + diffChange.modifiedLength - 1);\n if (originalCharSequence.getElements().length > 0 && modifiedCharSequence.getElements().length > 0) {\n let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueCharDiff, true).changes;\n if (shouldPostProcessCharChanges) {\n rawChanges = postProcessCharChanges(rawChanges);\n }\n charChanges = [];\n for (let i = 0, length = rawChanges.length; i < length; i++) {\n charChanges.push(CharChange.createFromDiffChange(rawChanges[i], originalCharSequence, modifiedCharSequence));\n }\n }\n }\n return new LineChange(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges);\n }\n}\nexport class DiffComputer {\n constructor(originalLines, modifiedLines, opts) {\n this.shouldComputeCharChanges = opts.shouldComputeCharChanges;\n this.shouldPostProcessCharChanges = opts.shouldPostProcessCharChanges;\n this.shouldIgnoreTrimWhitespace = opts.shouldIgnoreTrimWhitespace;\n this.shouldMakePrettyDiff = opts.shouldMakePrettyDiff;\n this.originalLines = originalLines;\n this.modifiedLines = modifiedLines;\n this.original = new LineSequence(originalLines);\n this.modified = new LineSequence(modifiedLines);\n this.continueLineDiff = createContinueProcessingPredicate(opts.maxComputationTime);\n this.continueCharDiff = createContinueProcessingPredicate(opts.maxComputationTime === 0 ? 0 : Math.min(opts.maxComputationTime, 5000)); // never run after 5s for character changes...\n }\n computeDiff() {\n if (this.original.lines.length === 1 && this.original.lines[0].length === 0) {\n // empty original => fast path\n if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) {\n return {\n quitEarly: false,\n changes: []\n };\n }\n return {\n quitEarly: false,\n changes: [{\n originalStartLineNumber: 1,\n originalEndLineNumber: 1,\n modifiedStartLineNumber: 1,\n modifiedEndLineNumber: this.modified.lines.length,\n charChanges: [{\n modifiedEndColumn: 0,\n modifiedEndLineNumber: 0,\n modifiedStartColumn: 0,\n modifiedStartLineNumber: 0,\n originalEndColumn: 0,\n originalEndLineNumber: 0,\n originalStartColumn: 0,\n originalStartLineNumber: 0\n }]\n }]\n };\n }\n if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) {\n // empty modified => fast path\n return {\n quitEarly: false,\n changes: [{\n originalStartLineNumber: 1,\n originalEndLineNumber: this.original.lines.length,\n modifiedStartLineNumber: 1,\n modifiedEndLineNumber: 1,\n charChanges: [{\n modifiedEndColumn: 0,\n modifiedEndLineNumber: 0,\n modifiedStartColumn: 0,\n modifiedStartLineNumber: 0,\n originalEndColumn: 0,\n originalEndLineNumber: 0,\n originalStartColumn: 0,\n originalStartLineNumber: 0\n }]\n }]\n };\n }\n const diffResult = computeDiff(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff);\n const rawChanges = diffResult.changes;\n const quitEarly = diffResult.quitEarly;\n // The diff is always computed with ignoring trim whitespace\n // This ensures we get the prettiest diff\n if (this.shouldIgnoreTrimWhitespace) {\n const lineChanges = [];\n for (let i = 0, length = rawChanges.length; i < length; i++) {\n lineChanges.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, rawChanges[i], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges));\n }\n return {\n quitEarly: quitEarly,\n changes: lineChanges\n };\n }\n // Need to post-process and introduce changes where the trim whitespace is different\n // Note that we are looping starting at -1 to also cover the lines before the first change\n const result = [];\n let originalLineIndex = 0;\n let modifiedLineIndex = 0;\n for (let i = -1 /* !!!! */, len = rawChanges.length; i < len; i++) {\n const nextChange = (i + 1 < len ? rawChanges[i + 1] : null);\n const originalStop = (nextChange ? nextChange.originalStart : this.originalLines.length);\n const modifiedStop = (nextChange ? nextChange.modifiedStart : this.modifiedLines.length);\n while (originalLineIndex < originalStop && modifiedLineIndex < modifiedStop) {\n const originalLine = this.originalLines[originalLineIndex];\n const modifiedLine = this.modifiedLines[modifiedLineIndex];\n if (originalLine !== modifiedLine) {\n // These lines differ only in trim whitespace\n // Check the leading whitespace\n {\n let originalStartColumn = getFirstNonBlankColumn(originalLine, 1);\n let modifiedStartColumn = getFirstNonBlankColumn(modifiedLine, 1);\n while (originalStartColumn > 1 && modifiedStartColumn > 1) {\n const originalChar = originalLine.charCodeAt(originalStartColumn - 2);\n const modifiedChar = modifiedLine.charCodeAt(modifiedStartColumn - 2);\n if (originalChar !== modifiedChar) {\n break;\n }\n originalStartColumn--;\n modifiedStartColumn--;\n }\n if (originalStartColumn > 1 || modifiedStartColumn > 1) {\n this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, 1, originalStartColumn, modifiedLineIndex + 1, 1, modifiedStartColumn);\n }\n }\n // Check the trailing whitespace\n {\n let originalEndColumn = getLastNonBlankColumn(originalLine, 1);\n let modifiedEndColumn = getLastNonBlankColumn(modifiedLine, 1);\n const originalMaxColumn = originalLine.length + 1;\n const modifiedMaxColumn = modifiedLine.length + 1;\n while (originalEndColumn < originalMaxColumn && modifiedEndColumn < modifiedMaxColumn) {\n const originalChar = originalLine.charCodeAt(originalEndColumn - 1);\n const modifiedChar = originalLine.charCodeAt(modifiedEndColumn - 1);\n if (originalChar !== modifiedChar) {\n break;\n }\n originalEndColumn++;\n modifiedEndColumn++;\n }\n if (originalEndColumn < originalMaxColumn || modifiedEndColumn < modifiedMaxColumn) {\n this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, originalEndColumn, originalMaxColumn, modifiedLineIndex + 1, modifiedEndColumn, modifiedMaxColumn);\n }\n }\n }\n originalLineIndex++;\n modifiedLineIndex++;\n }\n if (nextChange) {\n // Emit the actual change\n result.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, nextChange, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges));\n originalLineIndex += nextChange.originalLength;\n modifiedLineIndex += nextChange.modifiedLength;\n }\n }\n return {\n quitEarly: quitEarly,\n changes: result\n };\n }\n _pushTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) {\n if (this._mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn)) {\n // Merged into previous\n return;\n }\n let charChanges = undefined;\n if (this.shouldComputeCharChanges) {\n charChanges = [new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)];\n }\n result.push(new LineChange(originalLineNumber, originalLineNumber, modifiedLineNumber, modifiedLineNumber, charChanges));\n }\n _mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) {\n const len = result.length;\n if (len === 0) {\n return false;\n }\n const prevChange = result[len - 1];\n if (prevChange.originalEndLineNumber === 0 || prevChange.modifiedEndLineNumber === 0) {\n // Don't merge with inserts/deletes\n return false;\n }\n if (prevChange.originalEndLineNumber + 1 === originalLineNumber && prevChange.modifiedEndLineNumber + 1 === modifiedLineNumber) {\n prevChange.originalEndLineNumber = originalLineNumber;\n prevChange.modifiedEndLineNumber = modifiedLineNumber;\n if (this.shouldComputeCharChanges && prevChange.charChanges) {\n prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn));\n }\n return true;\n }\n return false;\n }\n}\nfunction getFirstNonBlankColumn(txt, defaultValue) {\n const r = strings.firstNonWhitespaceIndex(txt);\n if (r === -1) {\n return defaultValue;\n }\n return r + 1;\n}\nfunction getLastNonBlankColumn(txt, defaultValue) {\n const r = strings.lastNonWhitespaceIndex(txt);\n if (r === -1) {\n return defaultValue;\n }\n return r + 2;\n}\nfunction createContinueProcessingPredicate(maximumRuntime) {\n if (maximumRuntime === 0) {\n return () => true;\n }\n const startTime = Date.now();\n return () => {\n return Date.now() - startTime < maximumRuntime;\n };\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Codicon } from '../../base/common/codicons.js';\nimport { URI } from '../../base/common/uri.js';\nimport { Range } from './core/range.js';\nimport { TokenizationRegistry as TokenizationRegistryImpl } from './tokenizationRegistry.js';\nexport class Token {\n constructor(offset, type, language) {\n this._tokenBrand = undefined;\n this.offset = offset;\n this.type = type;\n this.language = language;\n }\n toString() {\n return '(' + this.offset + ', ' + this.type + ')';\n }\n}\n/**\n * @internal\n */\nexport class TokenizationResult {\n constructor(tokens, endState) {\n this._tokenizationResultBrand = undefined;\n this.tokens = tokens;\n this.endState = endState;\n }\n}\n/**\n * @internal\n */\nexport class EncodedTokenizationResult {\n constructor(tokens, endState) {\n this._encodedTokenizationResultBrand = undefined;\n this.tokens = tokens;\n this.endState = endState;\n }\n}\n/**\n * @internal\n */\nexport var CompletionItemKinds;\n(function (CompletionItemKinds) {\n const byKind = new Map();\n byKind.set(0 /* CompletionItemKind.Method */, Codicon.symbolMethod);\n byKind.set(1 /* CompletionItemKind.Function */, Codicon.symbolFunction);\n byKind.set(2 /* CompletionItemKind.Constructor */, Codicon.symbolConstructor);\n byKind.set(3 /* CompletionItemKind.Field */, Codicon.symbolField);\n byKind.set(4 /* CompletionItemKind.Variable */, Codicon.symbolVariable);\n byKind.set(5 /* CompletionItemKind.Class */, Codicon.symbolClass);\n byKind.set(6 /* CompletionItemKind.Struct */, Codicon.symbolStruct);\n byKind.set(7 /* CompletionItemKind.Interface */, Codicon.symbolInterface);\n byKind.set(8 /* CompletionItemKind.Module */, Codicon.symbolModule);\n byKind.set(9 /* CompletionItemKind.Property */, Codicon.symbolProperty);\n byKind.set(10 /* CompletionItemKind.Event */, Codicon.symbolEvent);\n byKind.set(11 /* CompletionItemKind.Operator */, Codicon.symbolOperator);\n byKind.set(12 /* CompletionItemKind.Unit */, Codicon.symbolUnit);\n byKind.set(13 /* CompletionItemKind.Value */, Codicon.symbolValue);\n byKind.set(15 /* CompletionItemKind.Enum */, Codicon.symbolEnum);\n byKind.set(14 /* CompletionItemKind.Constant */, Codicon.symbolConstant);\n byKind.set(15 /* CompletionItemKind.Enum */, Codicon.symbolEnum);\n byKind.set(16 /* CompletionItemKind.EnumMember */, Codicon.symbolEnumMember);\n byKind.set(17 /* CompletionItemKind.Keyword */, Codicon.symbolKeyword);\n byKind.set(27 /* CompletionItemKind.Snippet */, Codicon.symbolSnippet);\n byKind.set(18 /* CompletionItemKind.Text */, Codicon.symbolText);\n byKind.set(19 /* CompletionItemKind.Color */, Codicon.symbolColor);\n byKind.set(20 /* CompletionItemKind.File */, Codicon.symbolFile);\n byKind.set(21 /* CompletionItemKind.Reference */, Codicon.symbolReference);\n byKind.set(22 /* CompletionItemKind.Customcolor */, Codicon.symbolCustomColor);\n byKind.set(23 /* CompletionItemKind.Folder */, Codicon.symbolFolder);\n byKind.set(24 /* CompletionItemKind.TypeParameter */, Codicon.symbolTypeParameter);\n byKind.set(25 /* CompletionItemKind.User */, Codicon.account);\n byKind.set(26 /* CompletionItemKind.Issue */, Codicon.issues);\n /**\n * @internal\n */\n function toIcon(kind) {\n let codicon = byKind.get(kind);\n if (!codicon) {\n console.info('No codicon found for CompletionItemKind ' + kind);\n codicon = Codicon.symbolProperty;\n }\n return codicon;\n }\n CompletionItemKinds.toIcon = toIcon;\n const data = new Map();\n data.set('method', 0 /* CompletionItemKind.Method */);\n data.set('function', 1 /* CompletionItemKind.Function */);\n data.set('constructor', 2 /* CompletionItemKind.Constructor */);\n data.set('field', 3 /* CompletionItemKind.Field */);\n data.set('variable', 4 /* CompletionItemKind.Variable */);\n data.set('class', 5 /* CompletionItemKind.Class */);\n data.set('struct', 6 /* CompletionItemKind.Struct */);\n data.set('interface', 7 /* CompletionItemKind.Interface */);\n data.set('module', 8 /* CompletionItemKind.Module */);\n data.set('property', 9 /* CompletionItemKind.Property */);\n data.set('event', 10 /* CompletionItemKind.Event */);\n data.set('operator', 11 /* CompletionItemKind.Operator */);\n data.set('unit', 12 /* CompletionItemKind.Unit */);\n data.set('value', 13 /* CompletionItemKind.Value */);\n data.set('constant', 14 /* CompletionItemKind.Constant */);\n data.set('enum', 15 /* CompletionItemKind.Enum */);\n data.set('enum-member', 16 /* CompletionItemKind.EnumMember */);\n data.set('enumMember', 16 /* CompletionItemKind.EnumMember */);\n data.set('keyword', 17 /* CompletionItemKind.Keyword */);\n data.set('snippet', 27 /* CompletionItemKind.Snippet */);\n data.set('text', 18 /* CompletionItemKind.Text */);\n data.set('color', 19 /* CompletionItemKind.Color */);\n data.set('file', 20 /* CompletionItemKind.File */);\n data.set('reference', 21 /* CompletionItemKind.Reference */);\n data.set('customcolor', 22 /* CompletionItemKind.Customcolor */);\n data.set('folder', 23 /* CompletionItemKind.Folder */);\n data.set('type-parameter', 24 /* CompletionItemKind.TypeParameter */);\n data.set('typeParameter', 24 /* CompletionItemKind.TypeParameter */);\n data.set('account', 25 /* CompletionItemKind.User */);\n data.set('issue', 26 /* CompletionItemKind.Issue */);\n /**\n * @internal\n */\n function fromString(value, strict) {\n let res = data.get(value);\n if (typeof res === 'undefined' && !strict) {\n res = 9 /* CompletionItemKind.Property */;\n }\n return res;\n }\n CompletionItemKinds.fromString = fromString;\n})(CompletionItemKinds || (CompletionItemKinds = {}));\n/**\n * How an {@link InlineCompletionsProvider inline completion provider} was triggered.\n */\nexport var InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered automatically while editing.\n * It is sufficient to return a single completion item in this case.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n /**\n * Completion was triggered explicitly by a user gesture.\n * Return multiple completion items to enable cycling through them.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Explicit\"] = 1] = \"Explicit\";\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\nexport var SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"Invoke\"] = 1] = \"Invoke\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"ContentChange\"] = 3] = \"ContentChange\";\n})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Text\"] = 0] = \"Text\";\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Read\"] = 1] = \"Read\";\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Write\"] = 2] = \"Write\";\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * @internal\n */\nexport function isLocationLink(thing) {\n return thing\n && URI.isUri(thing.uri)\n && Range.isIRange(thing.range)\n && (Range.isIRange(thing.originSelectionRange) || Range.isIRange(thing.targetSelectionRange));\n}\n/**\n * @internal\n */\nexport var SymbolKinds;\n(function (SymbolKinds) {\n const byKind = new Map();\n byKind.set(0 /* SymbolKind.File */, Codicon.symbolFile);\n byKind.set(1 /* SymbolKind.Module */, Codicon.symbolModule);\n byKind.set(2 /* SymbolKind.Namespace */, Codicon.symbolNamespace);\n byKind.set(3 /* SymbolKind.Package */, Codicon.symbolPackage);\n byKind.set(4 /* SymbolKind.Class */, Codicon.symbolClass);\n byKind.set(5 /* SymbolKind.Method */, Codicon.symbolMethod);\n byKind.set(6 /* SymbolKind.Property */, Codicon.symbolProperty);\n byKind.set(7 /* SymbolKind.Field */, Codicon.symbolField);\n byKind.set(8 /* SymbolKind.Constructor */, Codicon.symbolConstructor);\n byKind.set(9 /* SymbolKind.Enum */, Codicon.symbolEnum);\n byKind.set(10 /* SymbolKind.Interface */, Codicon.symbolInterface);\n byKind.set(11 /* SymbolKind.Function */, Codicon.symbolFunction);\n byKind.set(12 /* SymbolKind.Variable */, Codicon.symbolVariable);\n byKind.set(13 /* SymbolKind.Constant */, Codicon.symbolConstant);\n byKind.set(14 /* SymbolKind.String */, Codicon.symbolString);\n byKind.set(15 /* SymbolKind.Number */, Codicon.symbolNumber);\n byKind.set(16 /* SymbolKind.Boolean */, Codicon.symbolBoolean);\n byKind.set(17 /* SymbolKind.Array */, Codicon.symbolArray);\n byKind.set(18 /* SymbolKind.Object */, Codicon.symbolObject);\n byKind.set(19 /* SymbolKind.Key */, Codicon.symbolKey);\n byKind.set(20 /* SymbolKind.Null */, Codicon.symbolNull);\n byKind.set(21 /* SymbolKind.EnumMember */, Codicon.symbolEnumMember);\n byKind.set(22 /* SymbolKind.Struct */, Codicon.symbolStruct);\n byKind.set(23 /* SymbolKind.Event */, Codicon.symbolEvent);\n byKind.set(24 /* SymbolKind.Operator */, Codicon.symbolOperator);\n byKind.set(25 /* SymbolKind.TypeParameter */, Codicon.symbolTypeParameter);\n /**\n * @internal\n */\n function toIcon(kind) {\n let icon = byKind.get(kind);\n if (!icon) {\n console.info('No codicon found for SymbolKind ' + kind);\n icon = Codicon.symbolProperty;\n }\n return icon;\n }\n SymbolKinds.toIcon = toIcon;\n})(SymbolKinds || (SymbolKinds = {}));\nexport class FoldingRangeKind {\n /**\n * Creates a new {@link FoldingRangeKind}.\n *\n * @param value of the kind.\n */\n constructor(value) {\n this.value = value;\n }\n}\n/**\n * Kind for folding range representing a comment. The value of the kind is 'comment'.\n */\nFoldingRangeKind.Comment = new FoldingRangeKind('comment');\n/**\n * Kind for folding range representing a import. The value of the kind is 'imports'.\n */\nFoldingRangeKind.Imports = new FoldingRangeKind('imports');\n/**\n * Kind for folding range representing regions (for example marked by `#region`, `#endregion`).\n * The value of the kind is 'region'.\n */\nFoldingRangeKind.Region = new FoldingRangeKind('region');\n/**\n * @internal\n */\nexport var Command;\n(function (Command) {\n /**\n * @internal\n */\n function is(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n return typeof obj.id === 'string' &&\n typeof obj.title === 'string';\n }\n Command.is = is;\n})(Command || (Command = {}));\nexport var InlayHintKind;\n(function (InlayHintKind) {\n InlayHintKind[InlayHintKind[\"Type\"] = 1] = \"Type\";\n InlayHintKind[InlayHintKind[\"Parameter\"] = 2] = \"Parameter\";\n})(InlayHintKind || (InlayHintKind = {}));\n/**\n * @internal\n */\nexport const TokenizationRegistry = new TokenizationRegistryImpl();\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { CharacterClassifier } from '../core/characterClassifier.js';\nexport class Uint8Matrix {\n constructor(rows, cols, defaultValue) {\n const data = new Uint8Array(rows * cols);\n for (let i = 0, len = rows * cols; i < len; i++) {\n data[i] = defaultValue;\n }\n this._data = data;\n this.rows = rows;\n this.cols = cols;\n }\n get(row, col) {\n return this._data[row * this.cols + col];\n }\n set(row, col, value) {\n this._data[row * this.cols + col] = value;\n }\n}\nexport class StateMachine {\n constructor(edges) {\n let maxCharCode = 0;\n let maxState = 0 /* State.Invalid */;\n for (let i = 0, len = edges.length; i < len; i++) {\n const [from, chCode, to] = edges[i];\n if (chCode > maxCharCode) {\n maxCharCode = chCode;\n }\n if (from > maxState) {\n maxState = from;\n }\n if (to > maxState) {\n maxState = to;\n }\n }\n maxCharCode++;\n maxState++;\n const states = new Uint8Matrix(maxState, maxCharCode, 0 /* State.Invalid */);\n for (let i = 0, len = edges.length; i < len; i++) {\n const [from, chCode, to] = edges[i];\n states.set(from, chCode, to);\n }\n this._states = states;\n this._maxCharCode = maxCharCode;\n }\n nextState(currentState, chCode) {\n if (chCode < 0 || chCode >= this._maxCharCode) {\n return 0 /* State.Invalid */;\n }\n return this._states.get(currentState, chCode);\n }\n}\n// State machine for http:// or https:// or file://\nlet _stateMachine = null;\nfunction getStateMachine() {\n if (_stateMachine === null) {\n _stateMachine = new StateMachine([\n [1 /* State.Start */, 104 /* CharCode.h */, 2 /* State.H */],\n [1 /* State.Start */, 72 /* CharCode.H */, 2 /* State.H */],\n [1 /* State.Start */, 102 /* CharCode.f */, 6 /* State.F */],\n [1 /* State.Start */, 70 /* CharCode.F */, 6 /* State.F */],\n [2 /* State.H */, 116 /* CharCode.t */, 3 /* State.HT */],\n [2 /* State.H */, 84 /* CharCode.T */, 3 /* State.HT */],\n [3 /* State.HT */, 116 /* CharCode.t */, 4 /* State.HTT */],\n [3 /* State.HT */, 84 /* CharCode.T */, 4 /* State.HTT */],\n [4 /* State.HTT */, 112 /* CharCode.p */, 5 /* State.HTTP */],\n [4 /* State.HTT */, 80 /* CharCode.P */, 5 /* State.HTTP */],\n [5 /* State.HTTP */, 115 /* CharCode.s */, 9 /* State.BeforeColon */],\n [5 /* State.HTTP */, 83 /* CharCode.S */, 9 /* State.BeforeColon */],\n [5 /* State.HTTP */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */],\n [6 /* State.F */, 105 /* CharCode.i */, 7 /* State.FI */],\n [6 /* State.F */, 73 /* CharCode.I */, 7 /* State.FI */],\n [7 /* State.FI */, 108 /* CharCode.l */, 8 /* State.FIL */],\n [7 /* State.FI */, 76 /* CharCode.L */, 8 /* State.FIL */],\n [8 /* State.FIL */, 101 /* CharCode.e */, 9 /* State.BeforeColon */],\n [8 /* State.FIL */, 69 /* CharCode.E */, 9 /* State.BeforeColon */],\n [9 /* State.BeforeColon */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */],\n [10 /* State.AfterColon */, 47 /* CharCode.Slash */, 11 /* State.AlmostThere */],\n [11 /* State.AlmostThere */, 47 /* CharCode.Slash */, 12 /* State.End */],\n ]);\n }\n return _stateMachine;\n}\nlet _classifier = null;\nfunction getClassifier() {\n if (_classifier === null) {\n _classifier = new CharacterClassifier(0 /* CharacterClass.None */);\n // allow-any-unicode-next-line\n const FORCE_TERMINATION_CHARACTERS = ' \\t<>\\'\\\"、。。、,.:;‘〈「『〔([{「」}])〕』」〉’`~…';\n for (let i = 0; i < FORCE_TERMINATION_CHARACTERS.length; i++) {\n _classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), 1 /* CharacterClass.ForceTermination */);\n }\n const CANNOT_END_WITH_CHARACTERS = '.,;:';\n for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) {\n _classifier.set(CANNOT_END_WITH_CHARACTERS.charCodeAt(i), 2 /* CharacterClass.CannotEndIn */);\n }\n }\n return _classifier;\n}\nexport class LinkComputer {\n static _createLink(classifier, line, lineNumber, linkBeginIndex, linkEndIndex) {\n // Do not allow to end link in certain characters...\n let lastIncludedCharIndex = linkEndIndex - 1;\n do {\n const chCode = line.charCodeAt(lastIncludedCharIndex);\n const chClass = classifier.get(chCode);\n if (chClass !== 2 /* CharacterClass.CannotEndIn */) {\n break;\n }\n lastIncludedCharIndex--;\n } while (lastIncludedCharIndex > linkBeginIndex);\n // Handle links enclosed in parens, square brackets and curlys.\n if (linkBeginIndex > 0) {\n const charCodeBeforeLink = line.charCodeAt(linkBeginIndex - 1);\n const lastCharCodeInLink = line.charCodeAt(lastIncludedCharIndex);\n if ((charCodeBeforeLink === 40 /* CharCode.OpenParen */ && lastCharCodeInLink === 41 /* CharCode.CloseParen */)\n || (charCodeBeforeLink === 91 /* CharCode.OpenSquareBracket */ && lastCharCodeInLink === 93 /* CharCode.CloseSquareBracket */)\n || (charCodeBeforeLink === 123 /* CharCode.OpenCurlyBrace */ && lastCharCodeInLink === 125 /* CharCode.CloseCurlyBrace */)) {\n // Do not end in ) if ( is before the link start\n // Do not end in ] if [ is before the link start\n // Do not end in } if { is before the link start\n lastIncludedCharIndex--;\n }\n }\n return {\n range: {\n startLineNumber: lineNumber,\n startColumn: linkBeginIndex + 1,\n endLineNumber: lineNumber,\n endColumn: lastIncludedCharIndex + 2\n },\n url: line.substring(linkBeginIndex, lastIncludedCharIndex + 1)\n };\n }\n static computeLinks(model, stateMachine = getStateMachine()) {\n const classifier = getClassifier();\n const result = [];\n for (let i = 1, lineCount = model.getLineCount(); i <= lineCount; i++) {\n const line = model.getLineContent(i);\n const len = line.length;\n let j = 0;\n let linkBeginIndex = 0;\n let linkBeginChCode = 0;\n let state = 1 /* State.Start */;\n let hasOpenParens = false;\n let hasOpenSquareBracket = false;\n let inSquareBrackets = false;\n let hasOpenCurlyBracket = false;\n while (j < len) {\n let resetStateMachine = false;\n const chCode = line.charCodeAt(j);\n if (state === 13 /* State.Accept */) {\n let chClass;\n switch (chCode) {\n case 40 /* CharCode.OpenParen */:\n hasOpenParens = true;\n chClass = 0 /* CharacterClass.None */;\n break;\n case 41 /* CharCode.CloseParen */:\n chClass = (hasOpenParens ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n case 91 /* CharCode.OpenSquareBracket */:\n inSquareBrackets = true;\n hasOpenSquareBracket = true;\n chClass = 0 /* CharacterClass.None */;\n break;\n case 93 /* CharCode.CloseSquareBracket */:\n inSquareBrackets = false;\n chClass = (hasOpenSquareBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n case 123 /* CharCode.OpenCurlyBrace */:\n hasOpenCurlyBracket = true;\n chClass = 0 /* CharacterClass.None */;\n break;\n case 125 /* CharCode.CloseCurlyBrace */:\n chClass = (hasOpenCurlyBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n /* The following three rules make it that ' or \" or ` are allowed inside links if the link didn't begin with them */\n case 39 /* CharCode.SingleQuote */:\n chClass = (linkBeginChCode === 39 /* CharCode.SingleQuote */ ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */);\n break;\n case 34 /* CharCode.DoubleQuote */:\n chClass = (linkBeginChCode === 34 /* CharCode.DoubleQuote */ ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */);\n break;\n case 96 /* CharCode.BackTick */:\n chClass = (linkBeginChCode === 96 /* CharCode.BackTick */ ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */);\n break;\n case 42 /* CharCode.Asterisk */:\n // `*` terminates a link if the link began with `*`\n chClass = (linkBeginChCode === 42 /* CharCode.Asterisk */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */;\n break;\n case 124 /* CharCode.Pipe */:\n // `|` terminates a link if the link began with `|`\n chClass = (linkBeginChCode === 124 /* CharCode.Pipe */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */;\n break;\n case 32 /* CharCode.Space */:\n // ` ` allow space in between [ and ]\n chClass = (inSquareBrackets ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n default:\n chClass = classifier.get(chCode);\n }\n // Check if character terminates link\n if (chClass === 1 /* CharacterClass.ForceTermination */) {\n result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, j));\n resetStateMachine = true;\n }\n }\n else if (state === 12 /* State.End */) {\n let chClass;\n if (chCode === 91 /* CharCode.OpenSquareBracket */) {\n // Allow for the authority part to contain ipv6 addresses which contain [ and ]\n hasOpenSquareBracket = true;\n chClass = 0 /* CharacterClass.None */;\n }\n else {\n chClass = classifier.get(chCode);\n }\n // Check if character terminates link\n if (chClass === 1 /* CharacterClass.ForceTermination */) {\n resetStateMachine = true;\n }\n else {\n state = 13 /* State.Accept */;\n }\n }\n else {\n state = stateMachine.nextState(state, chCode);\n if (state === 0 /* State.Invalid */) {\n resetStateMachine = true;\n }\n }\n if (resetStateMachine) {\n state = 1 /* State.Start */;\n hasOpenParens = false;\n hasOpenSquareBracket = false;\n hasOpenCurlyBracket = false;\n // Record where the link started\n linkBeginIndex = j + 1;\n linkBeginChCode = chCode;\n }\n j++;\n }\n if (state === 13 /* State.Accept */) {\n result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, len));\n }\n }\n return result;\n }\n}\n/**\n * Returns an array of all links contains in the provided\n * document. *Note* that this operation is computational\n * expensive and should not run in the UI thread.\n */\nexport function computeLinks(model) {\n if (!model || typeof model.getLineCount !== 'function' || typeof model.getLineContent !== 'function') {\n // Unknown caller!\n return [];\n }\n return LinkComputer.computeLinks(model);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nexport class BasicInplaceReplace {\n constructor() {\n this._defaultValueSet = [\n ['true', 'false'],\n ['True', 'False'],\n ['Private', 'Public', 'Friend', 'ReadOnly', 'Partial', 'Protected', 'WriteOnly'],\n ['public', 'protected', 'private'],\n ];\n }\n navigateValueSet(range1, text1, range2, text2, up) {\n if (range1 && text1) {\n const result = this.doNavigateValueSet(text1, up);\n if (result) {\n return {\n range: range1,\n value: result\n };\n }\n }\n if (range2 && text2) {\n const result = this.doNavigateValueSet(text2, up);\n if (result) {\n return {\n range: range2,\n value: result\n };\n }\n }\n return null;\n }\n doNavigateValueSet(text, up) {\n const numberResult = this.numberReplace(text, up);\n if (numberResult !== null) {\n return numberResult;\n }\n return this.textReplace(text, up);\n }\n numberReplace(value, up) {\n const precision = Math.pow(10, value.length - (value.lastIndexOf('.') + 1));\n let n1 = Number(value);\n const n2 = parseFloat(value);\n if (!isNaN(n1) && !isNaN(n2) && n1 === n2) {\n if (n1 === 0 && !up) {\n return null; // don't do negative\n //\t\t\t} else if(n1 === 9 && up) {\n //\t\t\t\treturn null; // don't insert 10 into a number\n }\n else {\n n1 = Math.floor(n1 * precision);\n n1 += up ? precision : -precision;\n return String(n1 / precision);\n }\n }\n return null;\n }\n textReplace(value, up) {\n return this.valueSetsReplace(this._defaultValueSet, value, up);\n }\n valueSetsReplace(valueSets, value, up) {\n let result = null;\n for (let i = 0, len = valueSets.length; result === null && i < len; i++) {\n result = this.valueSetReplace(valueSets[i], value, up);\n }\n return result;\n }\n valueSetReplace(valueSet, value, up) {\n let idx = valueSet.indexOf(value);\n if (idx >= 0) {\n idx += up ? +1 : -1;\n if (idx < 0) {\n idx = valueSet.length - 1;\n }\n else {\n idx %= valueSet.length;\n }\n return valueSet[idx];\n }\n return null;\n }\n}\nBasicInplaceReplace.INSTANCE = new BasicInplaceReplace();\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { equals } from '../../base/common/objects.js';\n/**\n * Vertical Lane in the overview ruler of the editor.\n */\nexport var OverviewRulerLane;\n(function (OverviewRulerLane) {\n OverviewRulerLane[OverviewRulerLane[\"Left\"] = 1] = \"Left\";\n OverviewRulerLane[OverviewRulerLane[\"Center\"] = 2] = \"Center\";\n OverviewRulerLane[OverviewRulerLane[\"Right\"] = 4] = \"Right\";\n OverviewRulerLane[OverviewRulerLane[\"Full\"] = 7] = \"Full\";\n})(OverviewRulerLane || (OverviewRulerLane = {}));\n/**\n * Position in the minimap to render the decoration.\n */\nexport var MinimapPosition;\n(function (MinimapPosition) {\n MinimapPosition[MinimapPosition[\"Inline\"] = 1] = \"Inline\";\n MinimapPosition[MinimapPosition[\"Gutter\"] = 2] = \"Gutter\";\n})(MinimapPosition || (MinimapPosition = {}));\nexport var InjectedTextCursorStops;\n(function (InjectedTextCursorStops) {\n InjectedTextCursorStops[InjectedTextCursorStops[\"Both\"] = 0] = \"Both\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Right\"] = 1] = \"Right\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Left\"] = 2] = \"Left\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"None\"] = 3] = \"None\";\n})(InjectedTextCursorStops || (InjectedTextCursorStops = {}));\nexport class TextModelResolvedOptions {\n /**\n * @internal\n */\n constructor(src) {\n this._textModelResolvedOptionsBrand = undefined;\n this.tabSize = Math.max(1, src.tabSize | 0);\n this.indentSize = src.tabSize | 0;\n this.insertSpaces = Boolean(src.insertSpaces);\n this.defaultEOL = src.defaultEOL | 0;\n this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace);\n this.bracketPairColorizationOptions = src.bracketPairColorizationOptions;\n }\n /**\n * @internal\n */\n equals(other) {\n return (this.tabSize === other.tabSize\n && this.indentSize === other.indentSize\n && this.insertSpaces === other.insertSpaces\n && this.defaultEOL === other.defaultEOL\n && this.trimAutoWhitespace === other.trimAutoWhitespace\n && equals(this.bracketPairColorizationOptions, other.bracketPairColorizationOptions));\n }\n /**\n * @internal\n */\n createChangeEvent(newOpts) {\n return {\n tabSize: this.tabSize !== newOpts.tabSize,\n indentSize: this.indentSize !== newOpts.indentSize,\n insertSpaces: this.insertSpaces !== newOpts.insertSpaces,\n trimAutoWhitespace: this.trimAutoWhitespace !== newOpts.trimAutoWhitespace,\n };\n }\n}\nexport class FindMatch {\n /**\n * @internal\n */\n constructor(range, matches) {\n this._findMatchBrand = undefined;\n this.range = range;\n this.matches = matches;\n }\n}\n/**\n * @internal\n */\nexport function isITextSnapshot(obj) {\n return (obj && typeof obj.read === 'function');\n}\n/**\n * @internal\n */\nexport class ValidAnnotatedEditOperation {\n constructor(identifier, range, text, forceMoveMarkers, isAutoWhitespaceEdit, _isTracked) {\n this.identifier = identifier;\n this.range = range;\n this.text = text;\n this.forceMoveMarkers = forceMoveMarkers;\n this.isAutoWhitespaceEdit = isAutoWhitespaceEdit;\n this._isTracked = _isTracked;\n }\n}\n/**\n * @internal\n */\nexport class SearchData {\n constructor(regex, wordSeparators, simpleSearch) {\n this.regex = regex;\n this.wordSeparators = wordSeparators;\n this.simpleSearch = simpleSearch;\n }\n}\n/**\n * @internal\n */\nexport class ApplyEditsResult {\n constructor(reverseEdits, changes, trimAutoWhitespaceLineNumbers) {\n this.reverseEdits = reverseEdits;\n this.changes = changes;\n this.trimAutoWhitespaceLineNumbers = trimAutoWhitespaceLineNumbers;\n }\n}\n/**\n * @internal\n */\nexport function shouldSynchronizeModel(model) {\n return (!model.isTooLargeForSyncing() && !model.isForSimpleWidget);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { splitLines } from '../../../base/common/strings.js';\nimport { Position } from '../core/position.js';\nimport { PrefixSumComputer } from './prefixSumComputer.js';\nexport class MirrorTextModel {\n constructor(uri, lines, eol, versionId) {\n this._uri = uri;\n this._lines = lines;\n this._eol = eol;\n this._versionId = versionId;\n this._lineStarts = null;\n this._cachedTextValue = null;\n }\n dispose() {\n this._lines.length = 0;\n }\n get version() {\n return this._versionId;\n }\n getText() {\n if (this._cachedTextValue === null) {\n this._cachedTextValue = this._lines.join(this._eol);\n }\n return this._cachedTextValue;\n }\n onEvents(e) {\n if (e.eol && e.eol !== this._eol) {\n this._eol = e.eol;\n this._lineStarts = null;\n }\n // Update my lines\n const changes = e.changes;\n for (const change of changes) {\n this._acceptDeleteRange(change.range);\n this._acceptInsertText(new Position(change.range.startLineNumber, change.range.startColumn), change.text);\n }\n this._versionId = e.versionId;\n this._cachedTextValue = null;\n }\n _ensureLineStarts() {\n if (!this._lineStarts) {\n const eolLength = this._eol.length;\n const linesLength = this._lines.length;\n const lineStartValues = new Uint32Array(linesLength);\n for (let i = 0; i < linesLength; i++) {\n lineStartValues[i] = this._lines[i].length + eolLength;\n }\n this._lineStarts = new PrefixSumComputer(lineStartValues);\n }\n }\n /**\n * All changes to a line's text go through this method\n */\n _setLineText(lineIndex, newValue) {\n this._lines[lineIndex] = newValue;\n if (this._lineStarts) {\n // update prefix sum\n this._lineStarts.setValue(lineIndex, this._lines[lineIndex].length + this._eol.length);\n }\n }\n _acceptDeleteRange(range) {\n if (range.startLineNumber === range.endLineNumber) {\n if (range.startColumn === range.endColumn) {\n // Nothing to delete\n return;\n }\n // Delete text on the affected line\n this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)\n + this._lines[range.startLineNumber - 1].substring(range.endColumn - 1));\n return;\n }\n // Take remaining text on last line and append it to remaining text on first line\n this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)\n + this._lines[range.endLineNumber - 1].substring(range.endColumn - 1));\n // Delete middle lines\n this._lines.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n if (this._lineStarts) {\n // update prefix sum\n this._lineStarts.removeValues(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n }\n }\n _acceptInsertText(position, insertText) {\n if (insertText.length === 0) {\n // Nothing to insert\n return;\n }\n const insertLines = splitLines(insertText);\n if (insertLines.length === 1) {\n // Inserting text on one line\n this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)\n + insertLines[0]\n + this._lines[position.lineNumber - 1].substring(position.column - 1));\n return;\n }\n // Append overflowing text from first line to the end of text to insert\n insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1);\n // Delete overflowing text from first line and insert text on first line\n this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)\n + insertLines[0]);\n // Insert new lines & store lengths\n const newLengths = new Uint32Array(insertLines.length - 1);\n for (let i = 1; i < insertLines.length; i++) {\n this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]);\n newLengths[i - 1] = insertLines[i].length + this._eol.length;\n }\n if (this._lineStarts) {\n // update prefix sum\n this._lineStarts.insertValues(position.lineNumber, newLengths);\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { arrayInsert } from '../../../base/common/arrays.js';\nimport { toUint32 } from '../../../base/common/uint.js';\nexport class PrefixSumComputer {\n constructor(values) {\n this.values = values;\n this.prefixSum = new Uint32Array(values.length);\n this.prefixSumValidIndex = new Int32Array(1);\n this.prefixSumValidIndex[0] = -1;\n }\n insertValues(insertIndex, insertValues) {\n insertIndex = toUint32(insertIndex);\n const oldValues = this.values;\n const oldPrefixSum = this.prefixSum;\n const insertValuesLen = insertValues.length;\n if (insertValuesLen === 0) {\n return false;\n }\n this.values = new Uint32Array(oldValues.length + insertValuesLen);\n this.values.set(oldValues.subarray(0, insertIndex), 0);\n this.values.set(oldValues.subarray(insertIndex), insertIndex + insertValuesLen);\n this.values.set(insertValues, insertIndex);\n if (insertIndex - 1 < this.prefixSumValidIndex[0]) {\n this.prefixSumValidIndex[0] = insertIndex - 1;\n }\n this.prefixSum = new Uint32Array(this.values.length);\n if (this.prefixSumValidIndex[0] >= 0) {\n this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1));\n }\n return true;\n }\n setValue(index, value) {\n index = toUint32(index);\n value = toUint32(value);\n if (this.values[index] === value) {\n return false;\n }\n this.values[index] = value;\n if (index - 1 < this.prefixSumValidIndex[0]) {\n this.prefixSumValidIndex[0] = index - 1;\n }\n return true;\n }\n removeValues(startIndex, count) {\n startIndex = toUint32(startIndex);\n count = toUint32(count);\n const oldValues = this.values;\n const oldPrefixSum = this.prefixSum;\n if (startIndex >= oldValues.length) {\n return false;\n }\n const maxCount = oldValues.length - startIndex;\n if (count >= maxCount) {\n count = maxCount;\n }\n if (count === 0) {\n return false;\n }\n this.values = new Uint32Array(oldValues.length - count);\n this.values.set(oldValues.subarray(0, startIndex), 0);\n this.values.set(oldValues.subarray(startIndex + count), startIndex);\n this.prefixSum = new Uint32Array(this.values.length);\n if (startIndex - 1 < this.prefixSumValidIndex[0]) {\n this.prefixSumValidIndex[0] = startIndex - 1;\n }\n if (this.prefixSumValidIndex[0] >= 0) {\n this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1));\n }\n return true;\n }\n getTotalSum() {\n if (this.values.length === 0) {\n return 0;\n }\n return this._getPrefixSum(this.values.length - 1);\n }\n /**\n * Returns the sum of the first `index + 1` many items.\n * @returns `SUM(0 <= j <= index, values[j])`.\n */\n getPrefixSum(index) {\n if (index < 0) {\n return 0;\n }\n index = toUint32(index);\n return this._getPrefixSum(index);\n }\n _getPrefixSum(index) {\n if (index <= this.prefixSumValidIndex[0]) {\n return this.prefixSum[index];\n }\n let startIndex = this.prefixSumValidIndex[0] + 1;\n if (startIndex === 0) {\n this.prefixSum[0] = this.values[0];\n startIndex++;\n }\n if (index >= this.values.length) {\n index = this.values.length - 1;\n }\n for (let i = startIndex; i <= index; i++) {\n this.prefixSum[i] = this.prefixSum[i - 1] + this.values[i];\n }\n this.prefixSumValidIndex[0] = Math.max(this.prefixSumValidIndex[0], index);\n return this.prefixSum[index];\n }\n getIndexOf(sum) {\n sum = Math.floor(sum);\n // Compute all sums (to get a fully valid prefixSum)\n this.getTotalSum();\n let low = 0;\n let high = this.values.length - 1;\n let mid = 0;\n let midStop = 0;\n let midStart = 0;\n while (low <= high) {\n mid = low + ((high - low) / 2) | 0;\n midStop = this.prefixSum[mid];\n midStart = midStop - this.values[mid];\n if (sum < midStart) {\n high = mid - 1;\n }\n else if (sum >= midStop) {\n low = mid + 1;\n }\n else {\n break;\n }\n }\n return new PrefixSumIndexOfResult(mid, sum - midStart);\n }\n}\n/**\n * {@link getIndexOf} has an amortized runtime complexity of O(1).\n *\n * ({@link PrefixSumComputer.getIndexOf} is just O(log n))\n*/\nexport class ConstantTimePrefixSumComputer {\n constructor(values) {\n this._values = values;\n this._isValid = false;\n this._validEndIndex = -1;\n this._prefixSum = [];\n this._indexBySum = [];\n }\n /**\n * @returns SUM(0 <= j < values.length, values[j])\n */\n getTotalSum() {\n this._ensureValid();\n return this._indexBySum.length;\n }\n /**\n * Returns the sum of the first `count` many items.\n * @returns `SUM(0 <= j < count, values[j])`.\n */\n getPrefixSum(count) {\n this._ensureValid();\n if (count === 0) {\n return 0;\n }\n return this._prefixSum[count - 1];\n }\n /**\n * @returns `result`, such that `getPrefixSum(result.index) + result.remainder = sum`\n */\n getIndexOf(sum) {\n this._ensureValid();\n const idx = this._indexBySum[sum];\n const viewLinesAbove = idx > 0 ? this._prefixSum[idx - 1] : 0;\n return new PrefixSumIndexOfResult(idx, sum - viewLinesAbove);\n }\n removeValues(start, deleteCount) {\n this._values.splice(start, deleteCount);\n this._invalidate(start);\n }\n insertValues(insertIndex, insertArr) {\n this._values = arrayInsert(this._values, insertIndex, insertArr);\n this._invalidate(insertIndex);\n }\n _invalidate(index) {\n this._isValid = false;\n this._validEndIndex = Math.min(this._validEndIndex, index - 1);\n }\n _ensureValid() {\n if (this._isValid) {\n return;\n }\n for (let i = this._validEndIndex + 1, len = this._values.length; i < len; i++) {\n const value = this._values[i];\n const sumAbove = i > 0 ? this._prefixSum[i - 1] : 0;\n this._prefixSum[i] = sumAbove + value;\n for (let j = 0; j < value; j++) {\n this._indexBySum[sumAbove + j] = i;\n }\n }\n // trim things\n this._prefixSum.length = this._values.length;\n this._indexBySum.length = this._prefixSum[this._prefixSum.length - 1];\n // mark as valid\n this._isValid = true;\n this._validEndIndex = this._values.length - 1;\n }\n setValue(index, value) {\n if (this._values[index] === value) {\n // no change\n return;\n }\n this._values[index] = value;\n this._invalidate(index);\n }\n}\nexport class PrefixSumIndexOfResult {\n constructor(index, remainder) {\n this.index = index;\n this.remainder = remainder;\n this._prefixSumIndexOfResultBrand = undefined;\n this.index = index;\n this.remainder = remainder;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as strings from '../../../base/common/strings.js';\nimport { getMapForWordSeparators } from '../core/wordCharacterClassifier.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { FindMatch, SearchData } from '../model.js';\nconst LIMIT_FIND_COUNT = 999;\nexport class SearchParams {\n constructor(searchString, isRegex, matchCase, wordSeparators) {\n this.searchString = searchString;\n this.isRegex = isRegex;\n this.matchCase = matchCase;\n this.wordSeparators = wordSeparators;\n }\n parseSearchRequest() {\n if (this.searchString === '') {\n return null;\n }\n // Try to create a RegExp out of the params\n let multiline;\n if (this.isRegex) {\n multiline = isMultilineRegexSource(this.searchString);\n }\n else {\n multiline = (this.searchString.indexOf('\\n') >= 0);\n }\n let regex = null;\n try {\n regex = strings.createRegExp(this.searchString, this.isRegex, {\n matchCase: this.matchCase,\n wholeWord: false,\n multiline: multiline,\n global: true,\n unicode: true\n });\n }\n catch (err) {\n return null;\n }\n if (!regex) {\n return null;\n }\n let canUseSimpleSearch = (!this.isRegex && !multiline);\n if (canUseSimpleSearch && this.searchString.toLowerCase() !== this.searchString.toUpperCase()) {\n // casing might make a difference\n canUseSimpleSearch = this.matchCase;\n }\n return new SearchData(regex, this.wordSeparators ? getMapForWordSeparators(this.wordSeparators) : null, canUseSimpleSearch ? this.searchString : null);\n }\n}\nexport function isMultilineRegexSource(searchString) {\n if (!searchString || searchString.length === 0) {\n return false;\n }\n for (let i = 0, len = searchString.length; i < len; i++) {\n const chCode = searchString.charCodeAt(i);\n if (chCode === 10 /* CharCode.LineFeed */) {\n return true;\n }\n if (chCode === 92 /* CharCode.Backslash */) {\n // move to next char\n i++;\n if (i >= len) {\n // string ends with a \\\n break;\n }\n const nextChCode = searchString.charCodeAt(i);\n if (nextChCode === 110 /* CharCode.n */ || nextChCode === 114 /* CharCode.r */ || nextChCode === 87 /* CharCode.W */) {\n return true;\n }\n }\n }\n return false;\n}\nexport function createFindMatch(range, rawMatches, captureMatches) {\n if (!captureMatches) {\n return new FindMatch(range, null);\n }\n const matches = [];\n for (let i = 0, len = rawMatches.length; i < len; i++) {\n matches[i] = rawMatches[i];\n }\n return new FindMatch(range, matches);\n}\nclass LineFeedCounter {\n constructor(text) {\n const lineFeedsOffsets = [];\n let lineFeedsOffsetsLen = 0;\n for (let i = 0, textLen = text.length; i < textLen; i++) {\n if (text.charCodeAt(i) === 10 /* CharCode.LineFeed */) {\n lineFeedsOffsets[lineFeedsOffsetsLen++] = i;\n }\n }\n this._lineFeedsOffsets = lineFeedsOffsets;\n }\n findLineFeedCountBeforeOffset(offset) {\n const lineFeedsOffsets = this._lineFeedsOffsets;\n let min = 0;\n let max = lineFeedsOffsets.length - 1;\n if (max === -1) {\n // no line feeds\n return 0;\n }\n if (offset <= lineFeedsOffsets[0]) {\n // before first line feed\n return 0;\n }\n while (min < max) {\n const mid = min + ((max - min) / 2 >> 0);\n if (lineFeedsOffsets[mid] >= offset) {\n max = mid - 1;\n }\n else {\n if (lineFeedsOffsets[mid + 1] >= offset) {\n // bingo!\n min = mid;\n max = mid;\n }\n else {\n min = mid + 1;\n }\n }\n }\n return min + 1;\n }\n}\nexport class TextModelSearch {\n static findMatches(model, searchParams, searchRange, captureMatches, limitResultCount) {\n const searchData = searchParams.parseSearchRequest();\n if (!searchData) {\n return [];\n }\n if (searchData.regex.multiline) {\n return this._doFindMatchesMultiline(model, searchRange, new Searcher(searchData.wordSeparators, searchData.regex), captureMatches, limitResultCount);\n }\n return this._doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount);\n }\n /**\n * Multiline search always executes on the lines concatenated with \\n.\n * We must therefore compensate for the count of \\n in case the model is CRLF\n */\n static _getMultilineMatchRange(model, deltaOffset, text, lfCounter, matchIndex, match0) {\n let startOffset;\n let lineFeedCountBeforeMatch = 0;\n if (lfCounter) {\n lineFeedCountBeforeMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex);\n startOffset = deltaOffset + matchIndex + lineFeedCountBeforeMatch /* add as many \\r as there were \\n */;\n }\n else {\n startOffset = deltaOffset + matchIndex;\n }\n let endOffset;\n if (lfCounter) {\n const lineFeedCountBeforeEndOfMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex + match0.length);\n const lineFeedCountInMatch = lineFeedCountBeforeEndOfMatch - lineFeedCountBeforeMatch;\n endOffset = startOffset + match0.length + lineFeedCountInMatch /* add as many \\r as there were \\n */;\n }\n else {\n endOffset = startOffset + match0.length;\n }\n const startPosition = model.getPositionAt(startOffset);\n const endPosition = model.getPositionAt(endOffset);\n return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column);\n }\n static _doFindMatchesMultiline(model, searchRange, searcher, captureMatches, limitResultCount) {\n const deltaOffset = model.getOffsetAt(searchRange.getStartPosition());\n // We always execute multiline search over the lines joined with \\n\n // This makes it that \\n will match the EOL for both CRLF and LF models\n // We compensate for offset errors in `_getMultilineMatchRange`\n const text = model.getValueInRange(searchRange, 1 /* EndOfLinePreference.LF */);\n const lfCounter = (model.getEOL() === '\\r\\n' ? new LineFeedCounter(text) : null);\n const result = [];\n let counter = 0;\n let m;\n searcher.reset(0);\n while ((m = searcher.next(text))) {\n result[counter++] = createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches);\n if (counter >= limitResultCount) {\n return result;\n }\n }\n return result;\n }\n static _doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount) {\n const result = [];\n let resultLen = 0;\n // Early case for a search range that starts & stops on the same line number\n if (searchRange.startLineNumber === searchRange.endLineNumber) {\n const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1, searchRange.endColumn - 1);\n resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount);\n return result;\n }\n // Collect results from first line\n const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1);\n resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount);\n // Collect results from middle lines\n for (let lineNumber = searchRange.startLineNumber + 1; lineNumber < searchRange.endLineNumber && resultLen < limitResultCount; lineNumber++) {\n resultLen = this._findMatchesInLine(searchData, model.getLineContent(lineNumber), lineNumber, 0, resultLen, result, captureMatches, limitResultCount);\n }\n // Collect results from last line\n if (resultLen < limitResultCount) {\n const text = model.getLineContent(searchRange.endLineNumber).substring(0, searchRange.endColumn - 1);\n resultLen = this._findMatchesInLine(searchData, text, searchRange.endLineNumber, 0, resultLen, result, captureMatches, limitResultCount);\n }\n return result;\n }\n static _findMatchesInLine(searchData, text, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) {\n const wordSeparators = searchData.wordSeparators;\n if (!captureMatches && searchData.simpleSearch) {\n const searchString = searchData.simpleSearch;\n const searchStringLen = searchString.length;\n const textLength = text.length;\n let lastMatchIndex = -searchStringLen;\n while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) {\n if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) {\n result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null);\n if (resultLen >= limitResultCount) {\n return resultLen;\n }\n }\n }\n return resultLen;\n }\n const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n let m;\n // Reset regex to search from the beginning\n searcher.reset(0);\n do {\n m = searcher.next(text);\n if (m) {\n result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches);\n if (resultLen >= limitResultCount) {\n return resultLen;\n }\n }\n } while (m);\n return resultLen;\n }\n static findNextMatch(model, searchParams, searchStart, captureMatches) {\n const searchData = searchParams.parseSearchRequest();\n if (!searchData) {\n return null;\n }\n const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n if (searchData.regex.multiline) {\n return this._doFindNextMatchMultiline(model, searchStart, searcher, captureMatches);\n }\n return this._doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches);\n }\n static _doFindNextMatchMultiline(model, searchStart, searcher, captureMatches) {\n const searchTextStart = new Position(searchStart.lineNumber, 1);\n const deltaOffset = model.getOffsetAt(searchTextStart);\n const lineCount = model.getLineCount();\n // We always execute multiline search over the lines joined with \\n\n // This makes it that \\n will match the EOL for both CRLF and LF models\n // We compensate for offset errors in `_getMultilineMatchRange`\n const text = model.getValueInRange(new Range(searchTextStart.lineNumber, searchTextStart.column, lineCount, model.getLineMaxColumn(lineCount)), 1 /* EndOfLinePreference.LF */);\n const lfCounter = (model.getEOL() === '\\r\\n' ? new LineFeedCounter(text) : null);\n searcher.reset(searchStart.column - 1);\n const m = searcher.next(text);\n if (m) {\n return createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches);\n }\n if (searchStart.lineNumber !== 1 || searchStart.column !== 1) {\n // Try again from the top\n return this._doFindNextMatchMultiline(model, new Position(1, 1), searcher, captureMatches);\n }\n return null;\n }\n static _doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches) {\n const lineCount = model.getLineCount();\n const startLineNumber = searchStart.lineNumber;\n // Look in first line\n const text = model.getLineContent(startLineNumber);\n const r = this._findFirstMatchInLine(searcher, text, startLineNumber, searchStart.column, captureMatches);\n if (r) {\n return r;\n }\n for (let i = 1; i <= lineCount; i++) {\n const lineIndex = (startLineNumber + i - 1) % lineCount;\n const text = model.getLineContent(lineIndex + 1);\n const r = this._findFirstMatchInLine(searcher, text, lineIndex + 1, 1, captureMatches);\n if (r) {\n return r;\n }\n }\n return null;\n }\n static _findFirstMatchInLine(searcher, text, lineNumber, fromColumn, captureMatches) {\n // Set regex to search from column\n searcher.reset(fromColumn - 1);\n const m = searcher.next(text);\n if (m) {\n return createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches);\n }\n return null;\n }\n static findPreviousMatch(model, searchParams, searchStart, captureMatches) {\n const searchData = searchParams.parseSearchRequest();\n if (!searchData) {\n return null;\n }\n const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n if (searchData.regex.multiline) {\n return this._doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches);\n }\n return this._doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches);\n }\n static _doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches) {\n const matches = this._doFindMatchesMultiline(model, new Range(1, 1, searchStart.lineNumber, searchStart.column), searcher, captureMatches, 10 * LIMIT_FIND_COUNT);\n if (matches.length > 0) {\n return matches[matches.length - 1];\n }\n const lineCount = model.getLineCount();\n if (searchStart.lineNumber !== lineCount || searchStart.column !== model.getLineMaxColumn(lineCount)) {\n // Try again with all content\n return this._doFindPreviousMatchMultiline(model, new Position(lineCount, model.getLineMaxColumn(lineCount)), searcher, captureMatches);\n }\n return null;\n }\n static _doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches) {\n const lineCount = model.getLineCount();\n const startLineNumber = searchStart.lineNumber;\n // Look in first line\n const text = model.getLineContent(startLineNumber).substring(0, searchStart.column - 1);\n const r = this._findLastMatchInLine(searcher, text, startLineNumber, captureMatches);\n if (r) {\n return r;\n }\n for (let i = 1; i <= lineCount; i++) {\n const lineIndex = (lineCount + startLineNumber - i - 1) % lineCount;\n const text = model.getLineContent(lineIndex + 1);\n const r = this._findLastMatchInLine(searcher, text, lineIndex + 1, captureMatches);\n if (r) {\n return r;\n }\n }\n return null;\n }\n static _findLastMatchInLine(searcher, text, lineNumber, captureMatches) {\n let bestResult = null;\n let m;\n searcher.reset(0);\n while ((m = searcher.next(text))) {\n bestResult = createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches);\n }\n return bestResult;\n }\n}\nfunction leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n if (matchStartIndex === 0) {\n // Match starts at start of string\n return true;\n }\n const charBefore = text.charCodeAt(matchStartIndex - 1);\n if (wordSeparators.get(charBefore) !== 0 /* WordCharacterClass.Regular */) {\n // The character before the match is a word separator\n return true;\n }\n if (charBefore === 13 /* CharCode.CarriageReturn */ || charBefore === 10 /* CharCode.LineFeed */) {\n // The character before the match is line break or carriage return.\n return true;\n }\n if (matchLength > 0) {\n const firstCharInMatch = text.charCodeAt(matchStartIndex);\n if (wordSeparators.get(firstCharInMatch) !== 0 /* WordCharacterClass.Regular */) {\n // The first character inside the match is a word separator\n return true;\n }\n }\n return false;\n}\nfunction rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n if (matchStartIndex + matchLength === textLength) {\n // Match ends at end of string\n return true;\n }\n const charAfter = text.charCodeAt(matchStartIndex + matchLength);\n if (wordSeparators.get(charAfter) !== 0 /* WordCharacterClass.Regular */) {\n // The character after the match is a word separator\n return true;\n }\n if (charAfter === 13 /* CharCode.CarriageReturn */ || charAfter === 10 /* CharCode.LineFeed */) {\n // The character after the match is line break or carriage return.\n return true;\n }\n if (matchLength > 0) {\n const lastCharInMatch = text.charCodeAt(matchStartIndex + matchLength - 1);\n if (wordSeparators.get(lastCharInMatch) !== 0 /* WordCharacterClass.Regular */) {\n // The last character in the match is a word separator\n return true;\n }\n }\n return false;\n}\nexport function isValidMatch(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n return (leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength)\n && rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength));\n}\nexport class Searcher {\n constructor(wordSeparators, searchRegex) {\n this._wordSeparators = wordSeparators;\n this._searchRegex = searchRegex;\n this._prevMatchStartIndex = -1;\n this._prevMatchLength = 0;\n }\n reset(lastIndex) {\n this._searchRegex.lastIndex = lastIndex;\n this._prevMatchStartIndex = -1;\n this._prevMatchLength = 0;\n }\n next(text) {\n const textLength = text.length;\n let m;\n do {\n if (this._prevMatchStartIndex + this._prevMatchLength === textLength) {\n // Reached the end of the line\n return null;\n }\n m = this._searchRegex.exec(text);\n if (!m) {\n return null;\n }\n const matchStartIndex = m.index;\n const matchLength = m[0].length;\n if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) {\n if (matchLength === 0) {\n // the search result is an empty string and won't advance `regex.lastIndex`, so `regex.exec` will stuck here\n // we attempt to recover from that by advancing by two if surrogate pair found and by one otherwise\n if (strings.getNextCodePoint(text, textLength, this._searchRegex.lastIndex) > 0xFFFF) {\n this._searchRegex.lastIndex += 2;\n }\n else {\n this._searchRegex.lastIndex += 1;\n }\n continue;\n }\n // Exit early if the regex matches the same range twice\n return null;\n }\n this._prevMatchStartIndex = matchStartIndex;\n this._prevMatchLength = matchLength;\n if (!this._wordSeparators || isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) {\n return m;\n }\n } while (m);\n return null;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { CancellationTokenSource } from '../../../base/common/cancellation.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { KeyChord } from '../../../base/common/keyCodes.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\nimport { Token } from '../languages.js';\nimport * as standaloneEnums from '../standalone/standaloneEnums.js';\nexport class KeyMod {\n static chord(firstPart, secondPart) {\n return KeyChord(firstPart, secondPart);\n }\n}\nKeyMod.CtrlCmd = 2048 /* ConstKeyMod.CtrlCmd */;\nKeyMod.Shift = 1024 /* ConstKeyMod.Shift */;\nKeyMod.Alt = 512 /* ConstKeyMod.Alt */;\nKeyMod.WinCtrl = 256 /* ConstKeyMod.WinCtrl */;\nexport function createMonacoBaseAPI() {\n return {\n editor: undefined,\n languages: undefined,\n CancellationTokenSource: CancellationTokenSource,\n Emitter: Emitter,\n KeyCode: standaloneEnums.KeyCode,\n KeyMod: KeyMod,\n Position: Position,\n Range: Range,\n Selection: Selection,\n SelectionDirection: standaloneEnums.SelectionDirection,\n MarkerSeverity: standaloneEnums.MarkerSeverity,\n MarkerTag: standaloneEnums.MarkerTag,\n Uri: URI,\n Token: Token\n };\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { stringDiff } from '../../../base/common/diff/diff.js';\nimport { globals } from '../../../base/common/platform.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { DiffComputer } from '../diff/diffComputer.js';\nimport { MirrorTextModel as BaseMirrorModel } from '../model/mirrorTextModel.js';\nimport { ensureValidWordDefinition, getWordAtText } from '../core/wordHelper.js';\nimport { computeLinks } from '../languages/linkComputer.js';\nimport { BasicInplaceReplace } from '../languages/supports/inplaceReplaceSupport.js';\nimport { createMonacoBaseAPI } from './editorBaseApi.js';\nimport * as types from '../../../base/common/types.js';\nimport { StopWatch } from '../../../base/common/stopwatch.js';\nimport { UnicodeTextModelHighlighter } from './unicodeTextModelHighlighter.js';\n/**\n * @internal\n */\nexport class MirrorModel extends BaseMirrorModel {\n get uri() {\n return this._uri;\n }\n get eol() {\n return this._eol;\n }\n getValue() {\n return this.getText();\n }\n getLinesContent() {\n return this._lines.slice(0);\n }\n getLineCount() {\n return this._lines.length;\n }\n getLineContent(lineNumber) {\n return this._lines[lineNumber - 1];\n }\n getWordAtPosition(position, wordDefinition) {\n const wordAtText = getWordAtText(position.column, ensureValidWordDefinition(wordDefinition), this._lines[position.lineNumber - 1], 0);\n if (wordAtText) {\n return new Range(position.lineNumber, wordAtText.startColumn, position.lineNumber, wordAtText.endColumn);\n }\n return null;\n }\n words(wordDefinition) {\n const lines = this._lines;\n const wordenize = this._wordenize.bind(this);\n let lineNumber = 0;\n let lineText = '';\n let wordRangesIdx = 0;\n let wordRanges = [];\n return {\n *[Symbol.iterator]() {\n while (true) {\n if (wordRangesIdx < wordRanges.length) {\n const value = lineText.substring(wordRanges[wordRangesIdx].start, wordRanges[wordRangesIdx].end);\n wordRangesIdx += 1;\n yield value;\n }\n else {\n if (lineNumber < lines.length) {\n lineText = lines[lineNumber];\n wordRanges = wordenize(lineText, wordDefinition);\n wordRangesIdx = 0;\n lineNumber += 1;\n }\n else {\n break;\n }\n }\n }\n }\n };\n }\n getLineWords(lineNumber, wordDefinition) {\n const content = this._lines[lineNumber - 1];\n const ranges = this._wordenize(content, wordDefinition);\n const words = [];\n for (const range of ranges) {\n words.push({\n word: content.substring(range.start, range.end),\n startColumn: range.start + 1,\n endColumn: range.end + 1\n });\n }\n return words;\n }\n _wordenize(content, wordDefinition) {\n const result = [];\n let match;\n wordDefinition.lastIndex = 0; // reset lastIndex just to be sure\n while (match = wordDefinition.exec(content)) {\n if (match[0].length === 0) {\n // it did match the empty string\n break;\n }\n result.push({ start: match.index, end: match.index + match[0].length });\n }\n return result;\n }\n getValueInRange(range) {\n range = this._validateRange(range);\n if (range.startLineNumber === range.endLineNumber) {\n return this._lines[range.startLineNumber - 1].substring(range.startColumn - 1, range.endColumn - 1);\n }\n const lineEnding = this._eol;\n const startLineIndex = range.startLineNumber - 1;\n const endLineIndex = range.endLineNumber - 1;\n const resultLines = [];\n resultLines.push(this._lines[startLineIndex].substring(range.startColumn - 1));\n for (let i = startLineIndex + 1; i < endLineIndex; i++) {\n resultLines.push(this._lines[i]);\n }\n resultLines.push(this._lines[endLineIndex].substring(0, range.endColumn - 1));\n return resultLines.join(lineEnding);\n }\n offsetAt(position) {\n position = this._validatePosition(position);\n this._ensureLineStarts();\n return this._lineStarts.getPrefixSum(position.lineNumber - 2) + (position.column - 1);\n }\n positionAt(offset) {\n offset = Math.floor(offset);\n offset = Math.max(0, offset);\n this._ensureLineStarts();\n const out = this._lineStarts.getIndexOf(offset);\n const lineLength = this._lines[out.index].length;\n // Ensure we return a valid position\n return {\n lineNumber: 1 + out.index,\n column: 1 + Math.min(out.remainder, lineLength)\n };\n }\n _validateRange(range) {\n const start = this._validatePosition({ lineNumber: range.startLineNumber, column: range.startColumn });\n const end = this._validatePosition({ lineNumber: range.endLineNumber, column: range.endColumn });\n if (start.lineNumber !== range.startLineNumber\n || start.column !== range.startColumn\n || end.lineNumber !== range.endLineNumber\n || end.column !== range.endColumn) {\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column\n };\n }\n return range;\n }\n _validatePosition(position) {\n if (!Position.isIPosition(position)) {\n throw new Error('bad position');\n }\n let { lineNumber, column } = position;\n let hasChanged = false;\n if (lineNumber < 1) {\n lineNumber = 1;\n column = 1;\n hasChanged = true;\n }\n else if (lineNumber > this._lines.length) {\n lineNumber = this._lines.length;\n column = this._lines[lineNumber - 1].length + 1;\n hasChanged = true;\n }\n else {\n const maxCharacter = this._lines[lineNumber - 1].length + 1;\n if (column < 1) {\n column = 1;\n hasChanged = true;\n }\n else if (column > maxCharacter) {\n column = maxCharacter;\n hasChanged = true;\n }\n }\n if (!hasChanged) {\n return position;\n }\n else {\n return { lineNumber, column };\n }\n }\n}\n/**\n * @internal\n */\nexport class EditorSimpleWorker {\n constructor(host, foreignModuleFactory) {\n this._host = host;\n this._models = Object.create(null);\n this._foreignModuleFactory = foreignModuleFactory;\n this._foreignModule = null;\n }\n dispose() {\n this._models = Object.create(null);\n }\n _getModel(uri) {\n return this._models[uri];\n }\n _getModels() {\n const all = [];\n Object.keys(this._models).forEach((key) => all.push(this._models[key]));\n return all;\n }\n acceptNewModel(data) {\n this._models[data.url] = new MirrorModel(URI.parse(data.url), data.lines, data.EOL, data.versionId);\n }\n acceptModelChanged(strURL, e) {\n if (!this._models[strURL]) {\n return;\n }\n const model = this._models[strURL];\n model.onEvents(e);\n }\n acceptRemovedModel(strURL) {\n if (!this._models[strURL]) {\n return;\n }\n delete this._models[strURL];\n }\n computeUnicodeHighlights(url, options, range) {\n return __awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(url);\n if (!model) {\n return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 };\n }\n return UnicodeTextModelHighlighter.computeUnicodeHighlights(model, options, range);\n });\n }\n // ---- BEGIN diff --------------------------------------------------------------------------\n computeDiff(originalUrl, modifiedUrl, ignoreTrimWhitespace, maxComputationTime) {\n return __awaiter(this, void 0, void 0, function* () {\n const original = this._getModel(originalUrl);\n const modified = this._getModel(modifiedUrl);\n if (!original || !modified) {\n return null;\n }\n return EditorSimpleWorker.computeDiff(original, modified, ignoreTrimWhitespace, maxComputationTime);\n });\n }\n static computeDiff(originalTextModel, modifiedTextModel, ignoreTrimWhitespace, maxComputationTime) {\n const originalLines = originalTextModel.getLinesContent();\n const modifiedLines = modifiedTextModel.getLinesContent();\n const diffComputer = new DiffComputer(originalLines, modifiedLines, {\n shouldComputeCharChanges: true,\n shouldPostProcessCharChanges: true,\n shouldIgnoreTrimWhitespace: ignoreTrimWhitespace,\n shouldMakePrettyDiff: true,\n maxComputationTime: maxComputationTime\n });\n const diffResult = diffComputer.computeDiff();\n const identical = (diffResult.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel));\n return {\n quitEarly: diffResult.quitEarly,\n identical: identical,\n changes: diffResult.changes\n };\n }\n static _modelsAreIdentical(original, modified) {\n const originalLineCount = original.getLineCount();\n const modifiedLineCount = modified.getLineCount();\n if (originalLineCount !== modifiedLineCount) {\n return false;\n }\n for (let line = 1; line <= originalLineCount; line++) {\n const originalLine = original.getLineContent(line);\n const modifiedLine = modified.getLineContent(line);\n if (originalLine !== modifiedLine) {\n return false;\n }\n }\n return true;\n }\n computeMoreMinimalEdits(modelUrl, edits) {\n return __awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return edits;\n }\n const result = [];\n let lastEol = undefined;\n edits = edits.slice(0).sort((a, b) => {\n if (a.range && b.range) {\n return Range.compareRangesUsingStarts(a.range, b.range);\n }\n // eol only changes should go to the end\n const aRng = a.range ? 0 : 1;\n const bRng = b.range ? 0 : 1;\n return aRng - bRng;\n });\n for (let { range, text, eol } of edits) {\n if (typeof eol === 'number') {\n lastEol = eol;\n }\n if (Range.isEmpty(range) && !text) {\n // empty change\n continue;\n }\n const original = model.getValueInRange(range);\n text = text.replace(/\\r\\n|\\n|\\r/g, model.eol);\n if (original === text) {\n // noop\n continue;\n }\n // make sure diff won't take too long\n if (Math.max(text.length, original.length) > EditorSimpleWorker._diffLimit) {\n result.push({ range, text });\n continue;\n }\n // compute diff between original and edit.text\n const changes = stringDiff(original, text, false);\n const editOffset = model.offsetAt(Range.lift(range).getStartPosition());\n for (const change of changes) {\n const start = model.positionAt(editOffset + change.originalStart);\n const end = model.positionAt(editOffset + change.originalStart + change.originalLength);\n const newEdit = {\n text: text.substr(change.modifiedStart, change.modifiedLength),\n range: { startLineNumber: start.lineNumber, startColumn: start.column, endLineNumber: end.lineNumber, endColumn: end.column }\n };\n if (model.getValueInRange(newEdit.range) !== newEdit.text) {\n result.push(newEdit);\n }\n }\n }\n if (typeof lastEol === 'number') {\n result.push({ eol: lastEol, text: '', range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } });\n }\n return result;\n });\n }\n // ---- END minimal edits ---------------------------------------------------------------\n computeLinks(modelUrl) {\n return __awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return null;\n }\n return computeLinks(model);\n });\n }\n textualSuggest(modelUrls, leadingWord, wordDef, wordDefFlags) {\n return __awaiter(this, void 0, void 0, function* () {\n const sw = new StopWatch(true);\n const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n const seen = new Set();\n outer: for (const url of modelUrls) {\n const model = this._getModel(url);\n if (!model) {\n continue;\n }\n for (const word of model.words(wordDefRegExp)) {\n if (word === leadingWord || !isNaN(Number(word))) {\n continue;\n }\n seen.add(word);\n if (seen.size > EditorSimpleWorker._suggestionsLimit) {\n break outer;\n }\n }\n }\n return { words: Array.from(seen), duration: sw.elapsed() };\n });\n }\n // ---- END suggest --------------------------------------------------------------------------\n //#region -- word ranges --\n computeWordRanges(modelUrl, range, wordDef, wordDefFlags) {\n return __awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return Object.create(null);\n }\n const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n const result = Object.create(null);\n for (let line = range.startLineNumber; line < range.endLineNumber; line++) {\n const words = model.getLineWords(line, wordDefRegExp);\n for (const word of words) {\n if (!isNaN(Number(word.word))) {\n continue;\n }\n let array = result[word.word];\n if (!array) {\n array = [];\n result[word.word] = array;\n }\n array.push({\n startLineNumber: line,\n startColumn: word.startColumn,\n endLineNumber: line,\n endColumn: word.endColumn\n });\n }\n }\n return result;\n });\n }\n //#endregion\n navigateValueSet(modelUrl, range, up, wordDef, wordDefFlags) {\n return __awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return null;\n }\n const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n if (range.startColumn === range.endColumn) {\n range = {\n startLineNumber: range.startLineNumber,\n startColumn: range.startColumn,\n endLineNumber: range.endLineNumber,\n endColumn: range.endColumn + 1\n };\n }\n const selectionText = model.getValueInRange(range);\n const wordRange = model.getWordAtPosition({ lineNumber: range.startLineNumber, column: range.startColumn }, wordDefRegExp);\n if (!wordRange) {\n return null;\n }\n const word = model.getValueInRange(wordRange);\n const result = BasicInplaceReplace.INSTANCE.navigateValueSet(range, selectionText, wordRange, word, up);\n return result;\n });\n }\n // ---- BEGIN foreign module support --------------------------------------------------------------------------\n loadForeignModule(moduleId, createData, foreignHostMethods) {\n const proxyMethodRequest = (method, args) => {\n return this._host.fhr(method, args);\n };\n const foreignHost = types.createProxyObject(foreignHostMethods, proxyMethodRequest);\n const ctx = {\n host: foreignHost,\n getMirrorModels: () => {\n return this._getModels();\n }\n };\n if (this._foreignModuleFactory) {\n this._foreignModule = this._foreignModuleFactory(ctx, createData);\n // static foreing module\n return Promise.resolve(types.getAllMethodNames(this._foreignModule));\n }\n // ESM-comment-begin\n // \t\treturn new Promise((resolve, reject) => {\n // \t\t\trequire([moduleId], (foreignModule: { create: IForeignModuleFactory }) => {\n // \t\t\t\tthis._foreignModule = foreignModule.create(ctx, createData);\n // \n // \t\t\t\tresolve(types.getAllMethodNames(this._foreignModule));\n // \n // \t\t\t}, reject);\n // \t\t});\n // ESM-comment-end\n // ESM-uncomment-begin\n return Promise.reject(new Error(`Unexpected usage`));\n // ESM-uncomment-end\n }\n // foreign method request\n fmr(method, args) {\n if (!this._foreignModule || typeof this._foreignModule[method] !== 'function') {\n return Promise.reject(new Error('Missing requestHandler or method: ' + method));\n }\n try {\n return Promise.resolve(this._foreignModule[method].apply(this._foreignModule, args));\n }\n catch (e) {\n return Promise.reject(e);\n }\n }\n}\n// ---- END diff --------------------------------------------------------------------------\n// ---- BEGIN minimal edits ---------------------------------------------------------------\nEditorSimpleWorker._diffLimit = 100000;\n// ---- BEGIN suggest --------------------------------------------------------------------------\nEditorSimpleWorker._suggestionsLimit = 10000;\n/**\n * Called on the worker side\n * @internal\n */\nexport function create(host) {\n return new EditorSimpleWorker(host, null);\n}\nif (typeof importScripts === 'function') {\n // Running in a web worker\n globals.monaco = createMonacoBaseAPI();\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Range } from '../core/range.js';\nimport { Searcher } from '../model/textModelSearch.js';\nimport * as strings from '../../../base/common/strings.js';\nimport { assertNever } from '../../../base/common/types.js';\nimport { DEFAULT_WORD_REGEXP, getWordAtText } from '../core/wordHelper.js';\nexport class UnicodeTextModelHighlighter {\n static computeUnicodeHighlights(model, options, range) {\n const startLine = range ? range.startLineNumber : 1;\n const endLine = range ? range.endLineNumber : model.getLineCount();\n const codePointHighlighter = new CodePointHighlighter(options);\n const candidates = codePointHighlighter.getCandidateCodePoints();\n let regex;\n if (candidates === 'allNonBasicAscii') {\n regex = new RegExp('[^\\\\t\\\\n\\\\r\\\\x20-\\\\x7E]', 'g');\n }\n else {\n regex = new RegExp(`${buildRegExpCharClassExpr(Array.from(candidates))}`, 'g');\n }\n const searcher = new Searcher(null, regex);\n const ranges = [];\n let hasMore = false;\n let m;\n let ambiguousCharacterCount = 0;\n let invisibleCharacterCount = 0;\n let nonBasicAsciiCharacterCount = 0;\n forLoop: for (let lineNumber = startLine, lineCount = endLine; lineNumber <= lineCount; lineNumber++) {\n const lineContent = model.getLineContent(lineNumber);\n const lineLength = lineContent.length;\n // Reset regex to search from the beginning\n searcher.reset(0);\n do {\n m = searcher.next(lineContent);\n if (m) {\n let startIndex = m.index;\n let endIndex = m.index + m[0].length;\n // Extend range to entire code point\n if (startIndex > 0) {\n const charCodeBefore = lineContent.charCodeAt(startIndex - 1);\n if (strings.isHighSurrogate(charCodeBefore)) {\n startIndex--;\n }\n }\n if (endIndex + 1 < lineLength) {\n const charCodeBefore = lineContent.charCodeAt(endIndex - 1);\n if (strings.isHighSurrogate(charCodeBefore)) {\n endIndex++;\n }\n }\n const str = lineContent.substring(startIndex, endIndex);\n const word = getWordAtText(startIndex + 1, DEFAULT_WORD_REGEXP, lineContent, 0);\n const highlightReason = codePointHighlighter.shouldHighlightNonBasicASCII(str, word ? word.word : null);\n if (highlightReason !== 0 /* SimpleHighlightReason.None */) {\n if (highlightReason === 3 /* SimpleHighlightReason.Ambiguous */) {\n ambiguousCharacterCount++;\n }\n else if (highlightReason === 2 /* SimpleHighlightReason.Invisible */) {\n invisibleCharacterCount++;\n }\n else if (highlightReason === 1 /* SimpleHighlightReason.NonBasicASCII */) {\n nonBasicAsciiCharacterCount++;\n }\n else {\n assertNever(highlightReason);\n }\n const MAX_RESULT_LENGTH = 1000;\n if (ranges.length >= MAX_RESULT_LENGTH) {\n hasMore = true;\n break forLoop;\n }\n ranges.push(new Range(lineNumber, startIndex + 1, lineNumber, endIndex + 1));\n }\n }\n } while (m);\n }\n return {\n ranges,\n hasMore,\n ambiguousCharacterCount,\n invisibleCharacterCount,\n nonBasicAsciiCharacterCount\n };\n }\n static computeUnicodeHighlightReason(char, options) {\n const codePointHighlighter = new CodePointHighlighter(options);\n const reason = codePointHighlighter.shouldHighlightNonBasicASCII(char, null);\n switch (reason) {\n case 0 /* SimpleHighlightReason.None */:\n return null;\n case 2 /* SimpleHighlightReason.Invisible */:\n return { kind: 1 /* UnicodeHighlighterReasonKind.Invisible */ };\n case 3 /* SimpleHighlightReason.Ambiguous */: {\n const codePoint = char.codePointAt(0);\n const primaryConfusable = codePointHighlighter.ambiguousCharacters.getPrimaryConfusable(codePoint);\n const notAmbiguousInLocales = strings.AmbiguousCharacters.getLocales().filter((l) => !strings.AmbiguousCharacters.getInstance(new Set([...options.allowedLocales, l])).isAmbiguous(codePoint));\n return { kind: 0 /* UnicodeHighlighterReasonKind.Ambiguous */, confusableWith: String.fromCodePoint(primaryConfusable), notAmbiguousInLocales };\n }\n case 1 /* SimpleHighlightReason.NonBasicASCII */:\n return { kind: 2 /* UnicodeHighlighterReasonKind.NonBasicAscii */ };\n }\n }\n}\nfunction buildRegExpCharClassExpr(codePoints, flags) {\n const src = `[${strings.escapeRegExpCharacters(codePoints.map((i) => String.fromCodePoint(i)).join(''))}]`;\n return src;\n}\nclass CodePointHighlighter {\n constructor(options) {\n this.options = options;\n this.allowedCodePoints = new Set(options.allowedCodePoints);\n this.ambiguousCharacters = strings.AmbiguousCharacters.getInstance(new Set(options.allowedLocales));\n }\n getCandidateCodePoints() {\n if (this.options.nonBasicASCII) {\n return 'allNonBasicAscii';\n }\n const set = new Set();\n if (this.options.invisibleCharacters) {\n for (const cp of strings.InvisibleCharacters.codePoints) {\n if (!isAllowedInvisibleCharacter(String.fromCodePoint(cp))) {\n set.add(cp);\n }\n }\n }\n if (this.options.ambiguousCharacters) {\n for (const cp of this.ambiguousCharacters.getConfusableCodePoints()) {\n set.add(cp);\n }\n }\n for (const cp of this.allowedCodePoints) {\n set.delete(cp);\n }\n return set;\n }\n shouldHighlightNonBasicASCII(character, wordContext) {\n const codePoint = character.codePointAt(0);\n if (this.allowedCodePoints.has(codePoint)) {\n return 0 /* SimpleHighlightReason.None */;\n }\n if (this.options.nonBasicASCII) {\n return 1 /* SimpleHighlightReason.NonBasicASCII */;\n }\n let hasBasicASCIICharacters = false;\n let hasNonConfusableNonBasicAsciiCharacter = false;\n if (wordContext) {\n for (const char of wordContext) {\n const codePoint = char.codePointAt(0);\n const isBasicASCII = strings.isBasicASCII(char);\n hasBasicASCIICharacters = hasBasicASCIICharacters || isBasicASCII;\n if (!isBasicASCII &&\n !this.ambiguousCharacters.isAmbiguous(codePoint) &&\n !strings.InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n hasNonConfusableNonBasicAsciiCharacter = true;\n }\n }\n }\n if (\n /* Don't allow mixing weird looking characters with ASCII */ !hasBasicASCIICharacters &&\n /* Is there an obviously weird looking character? */ hasNonConfusableNonBasicAsciiCharacter) {\n return 0 /* SimpleHighlightReason.None */;\n }\n if (this.options.invisibleCharacters) {\n // TODO check for emojis\n if (!isAllowedInvisibleCharacter(character) && strings.InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n return 2 /* SimpleHighlightReason.Invisible */;\n }\n }\n if (this.options.ambiguousCharacters) {\n if (this.ambiguousCharacters.isAmbiguous(codePoint)) {\n return 3 /* SimpleHighlightReason.Ambiguous */;\n }\n }\n return 0 /* SimpleHighlightReason.None */;\n }\n}\nfunction isAllowedInvisibleCharacter(character) {\n return character === ' ' || character === '\\n' || character === '\\t';\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.\nexport var AccessibilitySupport;\n(function (AccessibilitySupport) {\n /**\n * This should be the browser case where it is not known if a screen reader is attached or no.\n */\n AccessibilitySupport[AccessibilitySupport[\"Unknown\"] = 0] = \"Unknown\";\n AccessibilitySupport[AccessibilitySupport[\"Disabled\"] = 1] = \"Disabled\";\n AccessibilitySupport[AccessibilitySupport[\"Enabled\"] = 2] = \"Enabled\";\n})(AccessibilitySupport || (AccessibilitySupport = {}));\nexport var CodeActionTriggerType;\n(function (CodeActionTriggerType) {\n CodeActionTriggerType[CodeActionTriggerType[\"Invoke\"] = 1] = \"Invoke\";\n CodeActionTriggerType[CodeActionTriggerType[\"Auto\"] = 2] = \"Auto\";\n})(CodeActionTriggerType || (CodeActionTriggerType = {}));\nexport var CompletionItemInsertTextRule;\n(function (CompletionItemInsertTextRule) {\n /**\n * Adjust whitespace/indentation of multiline insert texts to\n * match the current line indentation.\n */\n CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"KeepWhitespace\"] = 1] = \"KeepWhitespace\";\n /**\n * `insertText` is a snippet.\n */\n CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"InsertAsSnippet\"] = 4] = \"InsertAsSnippet\";\n})(CompletionItemInsertTextRule || (CompletionItemInsertTextRule = {}));\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind[CompletionItemKind[\"Method\"] = 0] = \"Method\";\n CompletionItemKind[CompletionItemKind[\"Function\"] = 1] = \"Function\";\n CompletionItemKind[CompletionItemKind[\"Constructor\"] = 2] = \"Constructor\";\n CompletionItemKind[CompletionItemKind[\"Field\"] = 3] = \"Field\";\n CompletionItemKind[CompletionItemKind[\"Variable\"] = 4] = \"Variable\";\n CompletionItemKind[CompletionItemKind[\"Class\"] = 5] = \"Class\";\n CompletionItemKind[CompletionItemKind[\"Struct\"] = 6] = \"Struct\";\n CompletionItemKind[CompletionItemKind[\"Interface\"] = 7] = \"Interface\";\n CompletionItemKind[CompletionItemKind[\"Module\"] = 8] = \"Module\";\n CompletionItemKind[CompletionItemKind[\"Property\"] = 9] = \"Property\";\n CompletionItemKind[CompletionItemKind[\"Event\"] = 10] = \"Event\";\n CompletionItemKind[CompletionItemKind[\"Operator\"] = 11] = \"Operator\";\n CompletionItemKind[CompletionItemKind[\"Unit\"] = 12] = \"Unit\";\n CompletionItemKind[CompletionItemKind[\"Value\"] = 13] = \"Value\";\n CompletionItemKind[CompletionItemKind[\"Constant\"] = 14] = \"Constant\";\n CompletionItemKind[CompletionItemKind[\"Enum\"] = 15] = \"Enum\";\n CompletionItemKind[CompletionItemKind[\"EnumMember\"] = 16] = \"EnumMember\";\n CompletionItemKind[CompletionItemKind[\"Keyword\"] = 17] = \"Keyword\";\n CompletionItemKind[CompletionItemKind[\"Text\"] = 18] = \"Text\";\n CompletionItemKind[CompletionItemKind[\"Color\"] = 19] = \"Color\";\n CompletionItemKind[CompletionItemKind[\"File\"] = 20] = \"File\";\n CompletionItemKind[CompletionItemKind[\"Reference\"] = 21] = \"Reference\";\n CompletionItemKind[CompletionItemKind[\"Customcolor\"] = 22] = \"Customcolor\";\n CompletionItemKind[CompletionItemKind[\"Folder\"] = 23] = \"Folder\";\n CompletionItemKind[CompletionItemKind[\"TypeParameter\"] = 24] = \"TypeParameter\";\n CompletionItemKind[CompletionItemKind[\"User\"] = 25] = \"User\";\n CompletionItemKind[CompletionItemKind[\"Issue\"] = 26] = \"Issue\";\n CompletionItemKind[CompletionItemKind[\"Snippet\"] = 27] = \"Snippet\";\n})(CompletionItemKind || (CompletionItemKind = {}));\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n CompletionItemTag[CompletionItemTag[\"Deprecated\"] = 1] = \"Deprecated\";\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * How a suggest provider was triggered.\n */\nexport var CompletionTriggerKind;\n(function (CompletionTriggerKind) {\n CompletionTriggerKind[CompletionTriggerKind[\"Invoke\"] = 0] = \"Invoke\";\n CompletionTriggerKind[CompletionTriggerKind[\"TriggerCharacter\"] = 1] = \"TriggerCharacter\";\n CompletionTriggerKind[CompletionTriggerKind[\"TriggerForIncompleteCompletions\"] = 2] = \"TriggerForIncompleteCompletions\";\n})(CompletionTriggerKind || (CompletionTriggerKind = {}));\n/**\n * A positioning preference for rendering content widgets.\n */\nexport var ContentWidgetPositionPreference;\n(function (ContentWidgetPositionPreference) {\n /**\n * Place the content widget exactly at a position\n */\n ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"EXACT\"] = 0] = \"EXACT\";\n /**\n * Place the content widget above a position\n */\n ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"ABOVE\"] = 1] = \"ABOVE\";\n /**\n * Place the content widget below a position\n */\n ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"BELOW\"] = 2] = \"BELOW\";\n})(ContentWidgetPositionPreference || (ContentWidgetPositionPreference = {}));\n/**\n * Describes the reason the cursor has changed its position.\n */\nexport var CursorChangeReason;\n(function (CursorChangeReason) {\n /**\n * Unknown or not set.\n */\n CursorChangeReason[CursorChangeReason[\"NotSet\"] = 0] = \"NotSet\";\n /**\n * A `model.setValue()` was called.\n */\n CursorChangeReason[CursorChangeReason[\"ContentFlush\"] = 1] = \"ContentFlush\";\n /**\n * The `model` has been changed outside of this cursor and the cursor recovers its position from associated markers.\n */\n CursorChangeReason[CursorChangeReason[\"RecoverFromMarkers\"] = 2] = \"RecoverFromMarkers\";\n /**\n * There was an explicit user gesture.\n */\n CursorChangeReason[CursorChangeReason[\"Explicit\"] = 3] = \"Explicit\";\n /**\n * There was a Paste.\n */\n CursorChangeReason[CursorChangeReason[\"Paste\"] = 4] = \"Paste\";\n /**\n * There was an Undo.\n */\n CursorChangeReason[CursorChangeReason[\"Undo\"] = 5] = \"Undo\";\n /**\n * There was a Redo.\n */\n CursorChangeReason[CursorChangeReason[\"Redo\"] = 6] = \"Redo\";\n})(CursorChangeReason || (CursorChangeReason = {}));\n/**\n * The default end of line to use when instantiating models.\n */\nexport var DefaultEndOfLine;\n(function (DefaultEndOfLine) {\n /**\n * Use line feed (\\n) as the end of line character.\n */\n DefaultEndOfLine[DefaultEndOfLine[\"LF\"] = 1] = \"LF\";\n /**\n * Use carriage return and line feed (\\r\\n) as the end of line character.\n */\n DefaultEndOfLine[DefaultEndOfLine[\"CRLF\"] = 2] = \"CRLF\";\n})(DefaultEndOfLine || (DefaultEndOfLine = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Text\"] = 0] = \"Text\";\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Read\"] = 1] = \"Read\";\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Write\"] = 2] = \"Write\";\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * Configuration options for auto indentation in the editor\n */\nexport var EditorAutoIndentStrategy;\n(function (EditorAutoIndentStrategy) {\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"None\"] = 0] = \"None\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Keep\"] = 1] = \"Keep\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Brackets\"] = 2] = \"Brackets\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Advanced\"] = 3] = \"Advanced\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Full\"] = 4] = \"Full\";\n})(EditorAutoIndentStrategy || (EditorAutoIndentStrategy = {}));\nexport var EditorOption;\n(function (EditorOption) {\n EditorOption[EditorOption[\"acceptSuggestionOnCommitCharacter\"] = 0] = \"acceptSuggestionOnCommitCharacter\";\n EditorOption[EditorOption[\"acceptSuggestionOnEnter\"] = 1] = \"acceptSuggestionOnEnter\";\n EditorOption[EditorOption[\"accessibilitySupport\"] = 2] = \"accessibilitySupport\";\n EditorOption[EditorOption[\"accessibilityPageSize\"] = 3] = \"accessibilityPageSize\";\n EditorOption[EditorOption[\"ariaLabel\"] = 4] = \"ariaLabel\";\n EditorOption[EditorOption[\"autoClosingBrackets\"] = 5] = \"autoClosingBrackets\";\n EditorOption[EditorOption[\"autoClosingDelete\"] = 6] = \"autoClosingDelete\";\n EditorOption[EditorOption[\"autoClosingOvertype\"] = 7] = \"autoClosingOvertype\";\n EditorOption[EditorOption[\"autoClosingQuotes\"] = 8] = \"autoClosingQuotes\";\n EditorOption[EditorOption[\"autoIndent\"] = 9] = \"autoIndent\";\n EditorOption[EditorOption[\"automaticLayout\"] = 10] = \"automaticLayout\";\n EditorOption[EditorOption[\"autoSurround\"] = 11] = \"autoSurround\";\n EditorOption[EditorOption[\"bracketPairColorization\"] = 12] = \"bracketPairColorization\";\n EditorOption[EditorOption[\"guides\"] = 13] = \"guides\";\n EditorOption[EditorOption[\"codeLens\"] = 14] = \"codeLens\";\n EditorOption[EditorOption[\"codeLensFontFamily\"] = 15] = \"codeLensFontFamily\";\n EditorOption[EditorOption[\"codeLensFontSize\"] = 16] = \"codeLensFontSize\";\n EditorOption[EditorOption[\"colorDecorators\"] = 17] = \"colorDecorators\";\n EditorOption[EditorOption[\"columnSelection\"] = 18] = \"columnSelection\";\n EditorOption[EditorOption[\"comments\"] = 19] = \"comments\";\n EditorOption[EditorOption[\"contextmenu\"] = 20] = \"contextmenu\";\n EditorOption[EditorOption[\"copyWithSyntaxHighlighting\"] = 21] = \"copyWithSyntaxHighlighting\";\n EditorOption[EditorOption[\"cursorBlinking\"] = 22] = \"cursorBlinking\";\n EditorOption[EditorOption[\"cursorSmoothCaretAnimation\"] = 23] = \"cursorSmoothCaretAnimation\";\n EditorOption[EditorOption[\"cursorStyle\"] = 24] = \"cursorStyle\";\n EditorOption[EditorOption[\"cursorSurroundingLines\"] = 25] = \"cursorSurroundingLines\";\n EditorOption[EditorOption[\"cursorSurroundingLinesStyle\"] = 26] = \"cursorSurroundingLinesStyle\";\n EditorOption[EditorOption[\"cursorWidth\"] = 27] = \"cursorWidth\";\n EditorOption[EditorOption[\"disableLayerHinting\"] = 28] = \"disableLayerHinting\";\n EditorOption[EditorOption[\"disableMonospaceOptimizations\"] = 29] = \"disableMonospaceOptimizations\";\n EditorOption[EditorOption[\"domReadOnly\"] = 30] = \"domReadOnly\";\n EditorOption[EditorOption[\"dragAndDrop\"] = 31] = \"dragAndDrop\";\n EditorOption[EditorOption[\"dropIntoEditor\"] = 32] = \"dropIntoEditor\";\n EditorOption[EditorOption[\"emptySelectionClipboard\"] = 33] = \"emptySelectionClipboard\";\n EditorOption[EditorOption[\"experimental\"] = 34] = \"experimental\";\n EditorOption[EditorOption[\"extraEditorClassName\"] = 35] = \"extraEditorClassName\";\n EditorOption[EditorOption[\"fastScrollSensitivity\"] = 36] = \"fastScrollSensitivity\";\n EditorOption[EditorOption[\"find\"] = 37] = \"find\";\n EditorOption[EditorOption[\"fixedOverflowWidgets\"] = 38] = \"fixedOverflowWidgets\";\n EditorOption[EditorOption[\"folding\"] = 39] = \"folding\";\n EditorOption[EditorOption[\"foldingStrategy\"] = 40] = \"foldingStrategy\";\n EditorOption[EditorOption[\"foldingHighlight\"] = 41] = \"foldingHighlight\";\n EditorOption[EditorOption[\"foldingImportsByDefault\"] = 42] = \"foldingImportsByDefault\";\n EditorOption[EditorOption[\"foldingMaximumRegions\"] = 43] = \"foldingMaximumRegions\";\n EditorOption[EditorOption[\"unfoldOnClickAfterEndOfLine\"] = 44] = \"unfoldOnClickAfterEndOfLine\";\n EditorOption[EditorOption[\"fontFamily\"] = 45] = \"fontFamily\";\n EditorOption[EditorOption[\"fontInfo\"] = 46] = \"fontInfo\";\n EditorOption[EditorOption[\"fontLigatures\"] = 47] = \"fontLigatures\";\n EditorOption[EditorOption[\"fontSize\"] = 48] = \"fontSize\";\n EditorOption[EditorOption[\"fontWeight\"] = 49] = \"fontWeight\";\n EditorOption[EditorOption[\"formatOnPaste\"] = 50] = \"formatOnPaste\";\n EditorOption[EditorOption[\"formatOnType\"] = 51] = \"formatOnType\";\n EditorOption[EditorOption[\"glyphMargin\"] = 52] = \"glyphMargin\";\n EditorOption[EditorOption[\"gotoLocation\"] = 53] = \"gotoLocation\";\n EditorOption[EditorOption[\"hideCursorInOverviewRuler\"] = 54] = \"hideCursorInOverviewRuler\";\n EditorOption[EditorOption[\"hover\"] = 55] = \"hover\";\n EditorOption[EditorOption[\"inDiffEditor\"] = 56] = \"inDiffEditor\";\n EditorOption[EditorOption[\"inlineSuggest\"] = 57] = \"inlineSuggest\";\n EditorOption[EditorOption[\"letterSpacing\"] = 58] = \"letterSpacing\";\n EditorOption[EditorOption[\"lightbulb\"] = 59] = \"lightbulb\";\n EditorOption[EditorOption[\"lineDecorationsWidth\"] = 60] = \"lineDecorationsWidth\";\n EditorOption[EditorOption[\"lineHeight\"] = 61] = \"lineHeight\";\n EditorOption[EditorOption[\"lineNumbers\"] = 62] = \"lineNumbers\";\n EditorOption[EditorOption[\"lineNumbersMinChars\"] = 63] = \"lineNumbersMinChars\";\n EditorOption[EditorOption[\"linkedEditing\"] = 64] = \"linkedEditing\";\n EditorOption[EditorOption[\"links\"] = 65] = \"links\";\n EditorOption[EditorOption[\"matchBrackets\"] = 66] = \"matchBrackets\";\n EditorOption[EditorOption[\"minimap\"] = 67] = \"minimap\";\n EditorOption[EditorOption[\"mouseStyle\"] = 68] = \"mouseStyle\";\n EditorOption[EditorOption[\"mouseWheelScrollSensitivity\"] = 69] = \"mouseWheelScrollSensitivity\";\n EditorOption[EditorOption[\"mouseWheelZoom\"] = 70] = \"mouseWheelZoom\";\n EditorOption[EditorOption[\"multiCursorMergeOverlapping\"] = 71] = \"multiCursorMergeOverlapping\";\n EditorOption[EditorOption[\"multiCursorModifier\"] = 72] = \"multiCursorModifier\";\n EditorOption[EditorOption[\"multiCursorPaste\"] = 73] = \"multiCursorPaste\";\n EditorOption[EditorOption[\"occurrencesHighlight\"] = 74] = \"occurrencesHighlight\";\n EditorOption[EditorOption[\"overviewRulerBorder\"] = 75] = \"overviewRulerBorder\";\n EditorOption[EditorOption[\"overviewRulerLanes\"] = 76] = \"overviewRulerLanes\";\n EditorOption[EditorOption[\"padding\"] = 77] = \"padding\";\n EditorOption[EditorOption[\"parameterHints\"] = 78] = \"parameterHints\";\n EditorOption[EditorOption[\"peekWidgetDefaultFocus\"] = 79] = \"peekWidgetDefaultFocus\";\n EditorOption[EditorOption[\"definitionLinkOpensInPeek\"] = 80] = \"definitionLinkOpensInPeek\";\n EditorOption[EditorOption[\"quickSuggestions\"] = 81] = \"quickSuggestions\";\n EditorOption[EditorOption[\"quickSuggestionsDelay\"] = 82] = \"quickSuggestionsDelay\";\n EditorOption[EditorOption[\"readOnly\"] = 83] = \"readOnly\";\n EditorOption[EditorOption[\"renameOnType\"] = 84] = \"renameOnType\";\n EditorOption[EditorOption[\"renderControlCharacters\"] = 85] = \"renderControlCharacters\";\n EditorOption[EditorOption[\"renderFinalNewline\"] = 86] = \"renderFinalNewline\";\n EditorOption[EditorOption[\"renderLineHighlight\"] = 87] = \"renderLineHighlight\";\n EditorOption[EditorOption[\"renderLineHighlightOnlyWhenFocus\"] = 88] = \"renderLineHighlightOnlyWhenFocus\";\n EditorOption[EditorOption[\"renderValidationDecorations\"] = 89] = \"renderValidationDecorations\";\n EditorOption[EditorOption[\"renderWhitespace\"] = 90] = \"renderWhitespace\";\n EditorOption[EditorOption[\"revealHorizontalRightPadding\"] = 91] = \"revealHorizontalRightPadding\";\n EditorOption[EditorOption[\"roundedSelection\"] = 92] = \"roundedSelection\";\n EditorOption[EditorOption[\"rulers\"] = 93] = \"rulers\";\n EditorOption[EditorOption[\"scrollbar\"] = 94] = \"scrollbar\";\n EditorOption[EditorOption[\"scrollBeyondLastColumn\"] = 95] = \"scrollBeyondLastColumn\";\n EditorOption[EditorOption[\"scrollBeyondLastLine\"] = 96] = \"scrollBeyondLastLine\";\n EditorOption[EditorOption[\"scrollPredominantAxis\"] = 97] = \"scrollPredominantAxis\";\n EditorOption[EditorOption[\"selectionClipboard\"] = 98] = \"selectionClipboard\";\n EditorOption[EditorOption[\"selectionHighlight\"] = 99] = \"selectionHighlight\";\n EditorOption[EditorOption[\"selectOnLineNumbers\"] = 100] = \"selectOnLineNumbers\";\n EditorOption[EditorOption[\"showFoldingControls\"] = 101] = \"showFoldingControls\";\n EditorOption[EditorOption[\"showUnused\"] = 102] = \"showUnused\";\n EditorOption[EditorOption[\"snippetSuggestions\"] = 103] = \"snippetSuggestions\";\n EditorOption[EditorOption[\"smartSelect\"] = 104] = \"smartSelect\";\n EditorOption[EditorOption[\"smoothScrolling\"] = 105] = \"smoothScrolling\";\n EditorOption[EditorOption[\"stickyTabStops\"] = 106] = \"stickyTabStops\";\n EditorOption[EditorOption[\"stopRenderingLineAfter\"] = 107] = \"stopRenderingLineAfter\";\n EditorOption[EditorOption[\"suggest\"] = 108] = \"suggest\";\n EditorOption[EditorOption[\"suggestFontSize\"] = 109] = \"suggestFontSize\";\n EditorOption[EditorOption[\"suggestLineHeight\"] = 110] = \"suggestLineHeight\";\n EditorOption[EditorOption[\"suggestOnTriggerCharacters\"] = 111] = \"suggestOnTriggerCharacters\";\n EditorOption[EditorOption[\"suggestSelection\"] = 112] = \"suggestSelection\";\n EditorOption[EditorOption[\"tabCompletion\"] = 113] = \"tabCompletion\";\n EditorOption[EditorOption[\"tabIndex\"] = 114] = \"tabIndex\";\n EditorOption[EditorOption[\"unicodeHighlighting\"] = 115] = \"unicodeHighlighting\";\n EditorOption[EditorOption[\"unusualLineTerminators\"] = 116] = \"unusualLineTerminators\";\n EditorOption[EditorOption[\"useShadowDOM\"] = 117] = \"useShadowDOM\";\n EditorOption[EditorOption[\"useTabStops\"] = 118] = \"useTabStops\";\n EditorOption[EditorOption[\"wordSeparators\"] = 119] = \"wordSeparators\";\n EditorOption[EditorOption[\"wordWrap\"] = 120] = \"wordWrap\";\n EditorOption[EditorOption[\"wordWrapBreakAfterCharacters\"] = 121] = \"wordWrapBreakAfterCharacters\";\n EditorOption[EditorOption[\"wordWrapBreakBeforeCharacters\"] = 122] = \"wordWrapBreakBeforeCharacters\";\n EditorOption[EditorOption[\"wordWrapColumn\"] = 123] = \"wordWrapColumn\";\n EditorOption[EditorOption[\"wordWrapOverride1\"] = 124] = \"wordWrapOverride1\";\n EditorOption[EditorOption[\"wordWrapOverride2\"] = 125] = \"wordWrapOverride2\";\n EditorOption[EditorOption[\"wrappingIndent\"] = 126] = \"wrappingIndent\";\n EditorOption[EditorOption[\"wrappingStrategy\"] = 127] = \"wrappingStrategy\";\n EditorOption[EditorOption[\"showDeprecated\"] = 128] = \"showDeprecated\";\n EditorOption[EditorOption[\"inlayHints\"] = 129] = \"inlayHints\";\n EditorOption[EditorOption[\"editorClassName\"] = 130] = \"editorClassName\";\n EditorOption[EditorOption[\"pixelRatio\"] = 131] = \"pixelRatio\";\n EditorOption[EditorOption[\"tabFocusMode\"] = 132] = \"tabFocusMode\";\n EditorOption[EditorOption[\"layoutInfo\"] = 133] = \"layoutInfo\";\n EditorOption[EditorOption[\"wrappingInfo\"] = 134] = \"wrappingInfo\";\n})(EditorOption || (EditorOption = {}));\n/**\n * End of line character preference.\n */\nexport var EndOfLinePreference;\n(function (EndOfLinePreference) {\n /**\n * Use the end of line character identified in the text buffer.\n */\n EndOfLinePreference[EndOfLinePreference[\"TextDefined\"] = 0] = \"TextDefined\";\n /**\n * Use line feed (\\n) as the end of line character.\n */\n EndOfLinePreference[EndOfLinePreference[\"LF\"] = 1] = \"LF\";\n /**\n * Use carriage return and line feed (\\r\\n) as the end of line character.\n */\n EndOfLinePreference[EndOfLinePreference[\"CRLF\"] = 2] = \"CRLF\";\n})(EndOfLinePreference || (EndOfLinePreference = {}));\n/**\n * End of line character preference.\n */\nexport var EndOfLineSequence;\n(function (EndOfLineSequence) {\n /**\n * Use line feed (\\n) as the end of line character.\n */\n EndOfLineSequence[EndOfLineSequence[\"LF\"] = 0] = \"LF\";\n /**\n * Use carriage return and line feed (\\r\\n) as the end of line character.\n */\n EndOfLineSequence[EndOfLineSequence[\"CRLF\"] = 1] = \"CRLF\";\n})(EndOfLineSequence || (EndOfLineSequence = {}));\n/**\n * Describes what to do with the indentation when pressing Enter.\n */\nexport var IndentAction;\n(function (IndentAction) {\n /**\n * Insert new line and copy the previous line's indentation.\n */\n IndentAction[IndentAction[\"None\"] = 0] = \"None\";\n /**\n * Insert new line and indent once (relative to the previous line's indentation).\n */\n IndentAction[IndentAction[\"Indent\"] = 1] = \"Indent\";\n /**\n * Insert two new lines:\n * - the first one indented which will hold the cursor\n * - the second one at the same indentation level\n */\n IndentAction[IndentAction[\"IndentOutdent\"] = 2] = \"IndentOutdent\";\n /**\n * Insert new line and outdent once (relative to the previous line's indentation).\n */\n IndentAction[IndentAction[\"Outdent\"] = 3] = \"Outdent\";\n})(IndentAction || (IndentAction = {}));\nexport var InjectedTextCursorStops;\n(function (InjectedTextCursorStops) {\n InjectedTextCursorStops[InjectedTextCursorStops[\"Both\"] = 0] = \"Both\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Right\"] = 1] = \"Right\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Left\"] = 2] = \"Left\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"None\"] = 3] = \"None\";\n})(InjectedTextCursorStops || (InjectedTextCursorStops = {}));\nexport var InlayHintKind;\n(function (InlayHintKind) {\n InlayHintKind[InlayHintKind[\"Type\"] = 1] = \"Type\";\n InlayHintKind[InlayHintKind[\"Parameter\"] = 2] = \"Parameter\";\n})(InlayHintKind || (InlayHintKind = {}));\n/**\n * How an {@link InlineCompletionsProvider inline completion provider} was triggered.\n */\nexport var InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered automatically while editing.\n * It is sufficient to return a single completion item in this case.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n /**\n * Completion was triggered explicitly by a user gesture.\n * Return multiple completion items to enable cycling through them.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Explicit\"] = 1] = \"Explicit\";\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\n/**\n * Virtual Key Codes, the value does not hold any inherent meaning.\n * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n * But these are \"more general\", as they should work across browsers & OS`s.\n */\nexport var KeyCode;\n(function (KeyCode) {\n KeyCode[KeyCode[\"DependsOnKbLayout\"] = -1] = \"DependsOnKbLayout\";\n /**\n * Placed first to cover the 0 value of the enum.\n */\n KeyCode[KeyCode[\"Unknown\"] = 0] = \"Unknown\";\n KeyCode[KeyCode[\"Backspace\"] = 1] = \"Backspace\";\n KeyCode[KeyCode[\"Tab\"] = 2] = \"Tab\";\n KeyCode[KeyCode[\"Enter\"] = 3] = \"Enter\";\n KeyCode[KeyCode[\"Shift\"] = 4] = \"Shift\";\n KeyCode[KeyCode[\"Ctrl\"] = 5] = \"Ctrl\";\n KeyCode[KeyCode[\"Alt\"] = 6] = \"Alt\";\n KeyCode[KeyCode[\"PauseBreak\"] = 7] = \"PauseBreak\";\n KeyCode[KeyCode[\"CapsLock\"] = 8] = \"CapsLock\";\n KeyCode[KeyCode[\"Escape\"] = 9] = \"Escape\";\n KeyCode[KeyCode[\"Space\"] = 10] = \"Space\";\n KeyCode[KeyCode[\"PageUp\"] = 11] = \"PageUp\";\n KeyCode[KeyCode[\"PageDown\"] = 12] = \"PageDown\";\n KeyCode[KeyCode[\"End\"] = 13] = \"End\";\n KeyCode[KeyCode[\"Home\"] = 14] = \"Home\";\n KeyCode[KeyCode[\"LeftArrow\"] = 15] = \"LeftArrow\";\n KeyCode[KeyCode[\"UpArrow\"] = 16] = \"UpArrow\";\n KeyCode[KeyCode[\"RightArrow\"] = 17] = \"RightArrow\";\n KeyCode[KeyCode[\"DownArrow\"] = 18] = \"DownArrow\";\n KeyCode[KeyCode[\"Insert\"] = 19] = \"Insert\";\n KeyCode[KeyCode[\"Delete\"] = 20] = \"Delete\";\n KeyCode[KeyCode[\"Digit0\"] = 21] = \"Digit0\";\n KeyCode[KeyCode[\"Digit1\"] = 22] = \"Digit1\";\n KeyCode[KeyCode[\"Digit2\"] = 23] = \"Digit2\";\n KeyCode[KeyCode[\"Digit3\"] = 24] = \"Digit3\";\n KeyCode[KeyCode[\"Digit4\"] = 25] = \"Digit4\";\n KeyCode[KeyCode[\"Digit5\"] = 26] = \"Digit5\";\n KeyCode[KeyCode[\"Digit6\"] = 27] = \"Digit6\";\n KeyCode[KeyCode[\"Digit7\"] = 28] = \"Digit7\";\n KeyCode[KeyCode[\"Digit8\"] = 29] = \"Digit8\";\n KeyCode[KeyCode[\"Digit9\"] = 30] = \"Digit9\";\n KeyCode[KeyCode[\"KeyA\"] = 31] = \"KeyA\";\n KeyCode[KeyCode[\"KeyB\"] = 32] = \"KeyB\";\n KeyCode[KeyCode[\"KeyC\"] = 33] = \"KeyC\";\n KeyCode[KeyCode[\"KeyD\"] = 34] = \"KeyD\";\n KeyCode[KeyCode[\"KeyE\"] = 35] = \"KeyE\";\n KeyCode[KeyCode[\"KeyF\"] = 36] = \"KeyF\";\n KeyCode[KeyCode[\"KeyG\"] = 37] = \"KeyG\";\n KeyCode[KeyCode[\"KeyH\"] = 38] = \"KeyH\";\n KeyCode[KeyCode[\"KeyI\"] = 39] = \"KeyI\";\n KeyCode[KeyCode[\"KeyJ\"] = 40] = \"KeyJ\";\n KeyCode[KeyCode[\"KeyK\"] = 41] = \"KeyK\";\n KeyCode[KeyCode[\"KeyL\"] = 42] = \"KeyL\";\n KeyCode[KeyCode[\"KeyM\"] = 43] = \"KeyM\";\n KeyCode[KeyCode[\"KeyN\"] = 44] = \"KeyN\";\n KeyCode[KeyCode[\"KeyO\"] = 45] = \"KeyO\";\n KeyCode[KeyCode[\"KeyP\"] = 46] = \"KeyP\";\n KeyCode[KeyCode[\"KeyQ\"] = 47] = \"KeyQ\";\n KeyCode[KeyCode[\"KeyR\"] = 48] = \"KeyR\";\n KeyCode[KeyCode[\"KeyS\"] = 49] = \"KeyS\";\n KeyCode[KeyCode[\"KeyT\"] = 50] = \"KeyT\";\n KeyCode[KeyCode[\"KeyU\"] = 51] = \"KeyU\";\n KeyCode[KeyCode[\"KeyV\"] = 52] = \"KeyV\";\n KeyCode[KeyCode[\"KeyW\"] = 53] = \"KeyW\";\n KeyCode[KeyCode[\"KeyX\"] = 54] = \"KeyX\";\n KeyCode[KeyCode[\"KeyY\"] = 55] = \"KeyY\";\n KeyCode[KeyCode[\"KeyZ\"] = 56] = \"KeyZ\";\n KeyCode[KeyCode[\"Meta\"] = 57] = \"Meta\";\n KeyCode[KeyCode[\"ContextMenu\"] = 58] = \"ContextMenu\";\n KeyCode[KeyCode[\"F1\"] = 59] = \"F1\";\n KeyCode[KeyCode[\"F2\"] = 60] = \"F2\";\n KeyCode[KeyCode[\"F3\"] = 61] = \"F3\";\n KeyCode[KeyCode[\"F4\"] = 62] = \"F4\";\n KeyCode[KeyCode[\"F5\"] = 63] = \"F5\";\n KeyCode[KeyCode[\"F6\"] = 64] = \"F6\";\n KeyCode[KeyCode[\"F7\"] = 65] = \"F7\";\n KeyCode[KeyCode[\"F8\"] = 66] = \"F8\";\n KeyCode[KeyCode[\"F9\"] = 67] = \"F9\";\n KeyCode[KeyCode[\"F10\"] = 68] = \"F10\";\n KeyCode[KeyCode[\"F11\"] = 69] = \"F11\";\n KeyCode[KeyCode[\"F12\"] = 70] = \"F12\";\n KeyCode[KeyCode[\"F13\"] = 71] = \"F13\";\n KeyCode[KeyCode[\"F14\"] = 72] = \"F14\";\n KeyCode[KeyCode[\"F15\"] = 73] = \"F15\";\n KeyCode[KeyCode[\"F16\"] = 74] = \"F16\";\n KeyCode[KeyCode[\"F17\"] = 75] = \"F17\";\n KeyCode[KeyCode[\"F18\"] = 76] = \"F18\";\n KeyCode[KeyCode[\"F19\"] = 77] = \"F19\";\n KeyCode[KeyCode[\"NumLock\"] = 78] = \"NumLock\";\n KeyCode[KeyCode[\"ScrollLock\"] = 79] = \"ScrollLock\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the ';:' key\n */\n KeyCode[KeyCode[\"Semicolon\"] = 80] = \"Semicolon\";\n /**\n * For any country/region, the '+' key\n * For the US standard keyboard, the '=+' key\n */\n KeyCode[KeyCode[\"Equal\"] = 81] = \"Equal\";\n /**\n * For any country/region, the ',' key\n * For the US standard keyboard, the ',<' key\n */\n KeyCode[KeyCode[\"Comma\"] = 82] = \"Comma\";\n /**\n * For any country/region, the '-' key\n * For the US standard keyboard, the '-_' key\n */\n KeyCode[KeyCode[\"Minus\"] = 83] = \"Minus\";\n /**\n * For any country/region, the '.' key\n * For the US standard keyboard, the '.>' key\n */\n KeyCode[KeyCode[\"Period\"] = 84] = \"Period\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '/?' key\n */\n KeyCode[KeyCode[\"Slash\"] = 85] = \"Slash\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '`~' key\n */\n KeyCode[KeyCode[\"Backquote\"] = 86] = \"Backquote\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '[{' key\n */\n KeyCode[KeyCode[\"BracketLeft\"] = 87] = \"BracketLeft\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '\\|' key\n */\n KeyCode[KeyCode[\"Backslash\"] = 88] = \"Backslash\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the ']}' key\n */\n KeyCode[KeyCode[\"BracketRight\"] = 89] = \"BracketRight\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the ''\"' key\n */\n KeyCode[KeyCode[\"Quote\"] = 90] = \"Quote\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n */\n KeyCode[KeyCode[\"OEM_8\"] = 91] = \"OEM_8\";\n /**\n * Either the angle bracket key or the backslash key on the RT 102-key keyboard.\n */\n KeyCode[KeyCode[\"IntlBackslash\"] = 92] = \"IntlBackslash\";\n KeyCode[KeyCode[\"Numpad0\"] = 93] = \"Numpad0\";\n KeyCode[KeyCode[\"Numpad1\"] = 94] = \"Numpad1\";\n KeyCode[KeyCode[\"Numpad2\"] = 95] = \"Numpad2\";\n KeyCode[KeyCode[\"Numpad3\"] = 96] = \"Numpad3\";\n KeyCode[KeyCode[\"Numpad4\"] = 97] = \"Numpad4\";\n KeyCode[KeyCode[\"Numpad5\"] = 98] = \"Numpad5\";\n KeyCode[KeyCode[\"Numpad6\"] = 99] = \"Numpad6\";\n KeyCode[KeyCode[\"Numpad7\"] = 100] = \"Numpad7\";\n KeyCode[KeyCode[\"Numpad8\"] = 101] = \"Numpad8\";\n KeyCode[KeyCode[\"Numpad9\"] = 102] = \"Numpad9\";\n KeyCode[KeyCode[\"NumpadMultiply\"] = 103] = \"NumpadMultiply\";\n KeyCode[KeyCode[\"NumpadAdd\"] = 104] = \"NumpadAdd\";\n KeyCode[KeyCode[\"NUMPAD_SEPARATOR\"] = 105] = \"NUMPAD_SEPARATOR\";\n KeyCode[KeyCode[\"NumpadSubtract\"] = 106] = \"NumpadSubtract\";\n KeyCode[KeyCode[\"NumpadDecimal\"] = 107] = \"NumpadDecimal\";\n KeyCode[KeyCode[\"NumpadDivide\"] = 108] = \"NumpadDivide\";\n /**\n * Cover all key codes when IME is processing input.\n */\n KeyCode[KeyCode[\"KEY_IN_COMPOSITION\"] = 109] = \"KEY_IN_COMPOSITION\";\n KeyCode[KeyCode[\"ABNT_C1\"] = 110] = \"ABNT_C1\";\n KeyCode[KeyCode[\"ABNT_C2\"] = 111] = \"ABNT_C2\";\n KeyCode[KeyCode[\"AudioVolumeMute\"] = 112] = \"AudioVolumeMute\";\n KeyCode[KeyCode[\"AudioVolumeUp\"] = 113] = \"AudioVolumeUp\";\n KeyCode[KeyCode[\"AudioVolumeDown\"] = 114] = \"AudioVolumeDown\";\n KeyCode[KeyCode[\"BrowserSearch\"] = 115] = \"BrowserSearch\";\n KeyCode[KeyCode[\"BrowserHome\"] = 116] = \"BrowserHome\";\n KeyCode[KeyCode[\"BrowserBack\"] = 117] = \"BrowserBack\";\n KeyCode[KeyCode[\"BrowserForward\"] = 118] = \"BrowserForward\";\n KeyCode[KeyCode[\"MediaTrackNext\"] = 119] = \"MediaTrackNext\";\n KeyCode[KeyCode[\"MediaTrackPrevious\"] = 120] = \"MediaTrackPrevious\";\n KeyCode[KeyCode[\"MediaStop\"] = 121] = \"MediaStop\";\n KeyCode[KeyCode[\"MediaPlayPause\"] = 122] = \"MediaPlayPause\";\n KeyCode[KeyCode[\"LaunchMediaPlayer\"] = 123] = \"LaunchMediaPlayer\";\n KeyCode[KeyCode[\"LaunchMail\"] = 124] = \"LaunchMail\";\n KeyCode[KeyCode[\"LaunchApp2\"] = 125] = \"LaunchApp2\";\n /**\n * VK_CLEAR, 0x0C, CLEAR key\n */\n KeyCode[KeyCode[\"Clear\"] = 126] = \"Clear\";\n /**\n * Placed last to cover the length of the enum.\n * Please do not depend on this value!\n */\n KeyCode[KeyCode[\"MAX_VALUE\"] = 127] = \"MAX_VALUE\";\n})(KeyCode || (KeyCode = {}));\nexport var MarkerSeverity;\n(function (MarkerSeverity) {\n MarkerSeverity[MarkerSeverity[\"Hint\"] = 1] = \"Hint\";\n MarkerSeverity[MarkerSeverity[\"Info\"] = 2] = \"Info\";\n MarkerSeverity[MarkerSeverity[\"Warning\"] = 4] = \"Warning\";\n MarkerSeverity[MarkerSeverity[\"Error\"] = 8] = \"Error\";\n})(MarkerSeverity || (MarkerSeverity = {}));\nexport var MarkerTag;\n(function (MarkerTag) {\n MarkerTag[MarkerTag[\"Unnecessary\"] = 1] = \"Unnecessary\";\n MarkerTag[MarkerTag[\"Deprecated\"] = 2] = \"Deprecated\";\n})(MarkerTag || (MarkerTag = {}));\n/**\n * Position in the minimap to render the decoration.\n */\nexport var MinimapPosition;\n(function (MinimapPosition) {\n MinimapPosition[MinimapPosition[\"Inline\"] = 1] = \"Inline\";\n MinimapPosition[MinimapPosition[\"Gutter\"] = 2] = \"Gutter\";\n})(MinimapPosition || (MinimapPosition = {}));\n/**\n * Type of hit element with the mouse in the editor.\n */\nexport var MouseTargetType;\n(function (MouseTargetType) {\n /**\n * Mouse is on top of an unknown element.\n */\n MouseTargetType[MouseTargetType[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Mouse is on top of the textarea used for input.\n */\n MouseTargetType[MouseTargetType[\"TEXTAREA\"] = 1] = \"TEXTAREA\";\n /**\n * Mouse is on top of the glyph margin\n */\n MouseTargetType[MouseTargetType[\"GUTTER_GLYPH_MARGIN\"] = 2] = \"GUTTER_GLYPH_MARGIN\";\n /**\n * Mouse is on top of the line numbers\n */\n MouseTargetType[MouseTargetType[\"GUTTER_LINE_NUMBERS\"] = 3] = \"GUTTER_LINE_NUMBERS\";\n /**\n * Mouse is on top of the line decorations\n */\n MouseTargetType[MouseTargetType[\"GUTTER_LINE_DECORATIONS\"] = 4] = \"GUTTER_LINE_DECORATIONS\";\n /**\n * Mouse is on top of the whitespace left in the gutter by a view zone.\n */\n MouseTargetType[MouseTargetType[\"GUTTER_VIEW_ZONE\"] = 5] = \"GUTTER_VIEW_ZONE\";\n /**\n * Mouse is on top of text in the content.\n */\n MouseTargetType[MouseTargetType[\"CONTENT_TEXT\"] = 6] = \"CONTENT_TEXT\";\n /**\n * Mouse is on top of empty space in the content (e.g. after line text or below last line)\n */\n MouseTargetType[MouseTargetType[\"CONTENT_EMPTY\"] = 7] = \"CONTENT_EMPTY\";\n /**\n * Mouse is on top of a view zone in the content.\n */\n MouseTargetType[MouseTargetType[\"CONTENT_VIEW_ZONE\"] = 8] = \"CONTENT_VIEW_ZONE\";\n /**\n * Mouse is on top of a content widget.\n */\n MouseTargetType[MouseTargetType[\"CONTENT_WIDGET\"] = 9] = \"CONTENT_WIDGET\";\n /**\n * Mouse is on top of the decorations overview ruler.\n */\n MouseTargetType[MouseTargetType[\"OVERVIEW_RULER\"] = 10] = \"OVERVIEW_RULER\";\n /**\n * Mouse is on top of a scrollbar.\n */\n MouseTargetType[MouseTargetType[\"SCROLLBAR\"] = 11] = \"SCROLLBAR\";\n /**\n * Mouse is on top of an overlay widget.\n */\n MouseTargetType[MouseTargetType[\"OVERLAY_WIDGET\"] = 12] = \"OVERLAY_WIDGET\";\n /**\n * Mouse is outside of the editor.\n */\n MouseTargetType[MouseTargetType[\"OUTSIDE_EDITOR\"] = 13] = \"OUTSIDE_EDITOR\";\n})(MouseTargetType || (MouseTargetType = {}));\n/**\n * A positioning preference for rendering overlay widgets.\n */\nexport var OverlayWidgetPositionPreference;\n(function (OverlayWidgetPositionPreference) {\n /**\n * Position the overlay widget in the top right corner\n */\n OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"TOP_RIGHT_CORNER\"] = 0] = \"TOP_RIGHT_CORNER\";\n /**\n * Position the overlay widget in the bottom right corner\n */\n OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"BOTTOM_RIGHT_CORNER\"] = 1] = \"BOTTOM_RIGHT_CORNER\";\n /**\n * Position the overlay widget in the top center\n */\n OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"TOP_CENTER\"] = 2] = \"TOP_CENTER\";\n})(OverlayWidgetPositionPreference || (OverlayWidgetPositionPreference = {}));\n/**\n * Vertical Lane in the overview ruler of the editor.\n */\nexport var OverviewRulerLane;\n(function (OverviewRulerLane) {\n OverviewRulerLane[OverviewRulerLane[\"Left\"] = 1] = \"Left\";\n OverviewRulerLane[OverviewRulerLane[\"Center\"] = 2] = \"Center\";\n OverviewRulerLane[OverviewRulerLane[\"Right\"] = 4] = \"Right\";\n OverviewRulerLane[OverviewRulerLane[\"Full\"] = 7] = \"Full\";\n})(OverviewRulerLane || (OverviewRulerLane = {}));\nexport var PositionAffinity;\n(function (PositionAffinity) {\n /**\n * Prefers the left most position.\n */\n PositionAffinity[PositionAffinity[\"Left\"] = 0] = \"Left\";\n /**\n * Prefers the right most position.\n */\n PositionAffinity[PositionAffinity[\"Right\"] = 1] = \"Right\";\n /**\n * No preference.\n */\n PositionAffinity[PositionAffinity[\"None\"] = 2] = \"None\";\n /**\n * If the given position is on injected text, prefers the position left of it.\n */\n PositionAffinity[PositionAffinity[\"LeftOfInjectedText\"] = 3] = \"LeftOfInjectedText\";\n /**\n * If the given position is on injected text, prefers the position right of it.\n */\n PositionAffinity[PositionAffinity[\"RightOfInjectedText\"] = 4] = \"RightOfInjectedText\";\n})(PositionAffinity || (PositionAffinity = {}));\nexport var RenderLineNumbersType;\n(function (RenderLineNumbersType) {\n RenderLineNumbersType[RenderLineNumbersType[\"Off\"] = 0] = \"Off\";\n RenderLineNumbersType[RenderLineNumbersType[\"On\"] = 1] = \"On\";\n RenderLineNumbersType[RenderLineNumbersType[\"Relative\"] = 2] = \"Relative\";\n RenderLineNumbersType[RenderLineNumbersType[\"Interval\"] = 3] = \"Interval\";\n RenderLineNumbersType[RenderLineNumbersType[\"Custom\"] = 4] = \"Custom\";\n})(RenderLineNumbersType || (RenderLineNumbersType = {}));\nexport var RenderMinimap;\n(function (RenderMinimap) {\n RenderMinimap[RenderMinimap[\"None\"] = 0] = \"None\";\n RenderMinimap[RenderMinimap[\"Text\"] = 1] = \"Text\";\n RenderMinimap[RenderMinimap[\"Blocks\"] = 2] = \"Blocks\";\n})(RenderMinimap || (RenderMinimap = {}));\nexport var ScrollType;\n(function (ScrollType) {\n ScrollType[ScrollType[\"Smooth\"] = 0] = \"Smooth\";\n ScrollType[ScrollType[\"Immediate\"] = 1] = \"Immediate\";\n})(ScrollType || (ScrollType = {}));\nexport var ScrollbarVisibility;\n(function (ScrollbarVisibility) {\n ScrollbarVisibility[ScrollbarVisibility[\"Auto\"] = 1] = \"Auto\";\n ScrollbarVisibility[ScrollbarVisibility[\"Hidden\"] = 2] = \"Hidden\";\n ScrollbarVisibility[ScrollbarVisibility[\"Visible\"] = 3] = \"Visible\";\n})(ScrollbarVisibility || (ScrollbarVisibility = {}));\n/**\n * The direction of a selection.\n */\nexport var SelectionDirection;\n(function (SelectionDirection) {\n /**\n * The selection starts above where it ends.\n */\n SelectionDirection[SelectionDirection[\"LTR\"] = 0] = \"LTR\";\n /**\n * The selection starts below where it ends.\n */\n SelectionDirection[SelectionDirection[\"RTL\"] = 1] = \"RTL\";\n})(SelectionDirection || (SelectionDirection = {}));\nexport var SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"Invoke\"] = 1] = \"Invoke\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"ContentChange\"] = 3] = \"ContentChange\";\n})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind[SymbolKind[\"File\"] = 0] = \"File\";\n SymbolKind[SymbolKind[\"Module\"] = 1] = \"Module\";\n SymbolKind[SymbolKind[\"Namespace\"] = 2] = \"Namespace\";\n SymbolKind[SymbolKind[\"Package\"] = 3] = \"Package\";\n SymbolKind[SymbolKind[\"Class\"] = 4] = \"Class\";\n SymbolKind[SymbolKind[\"Method\"] = 5] = \"Method\";\n SymbolKind[SymbolKind[\"Property\"] = 6] = \"Property\";\n SymbolKind[SymbolKind[\"Field\"] = 7] = \"Field\";\n SymbolKind[SymbolKind[\"Constructor\"] = 8] = \"Constructor\";\n SymbolKind[SymbolKind[\"Enum\"] = 9] = \"Enum\";\n SymbolKind[SymbolKind[\"Interface\"] = 10] = \"Interface\";\n SymbolKind[SymbolKind[\"Function\"] = 11] = \"Function\";\n SymbolKind[SymbolKind[\"Variable\"] = 12] = \"Variable\";\n SymbolKind[SymbolKind[\"Constant\"] = 13] = \"Constant\";\n SymbolKind[SymbolKind[\"String\"] = 14] = \"String\";\n SymbolKind[SymbolKind[\"Number\"] = 15] = \"Number\";\n SymbolKind[SymbolKind[\"Boolean\"] = 16] = \"Boolean\";\n SymbolKind[SymbolKind[\"Array\"] = 17] = \"Array\";\n SymbolKind[SymbolKind[\"Object\"] = 18] = \"Object\";\n SymbolKind[SymbolKind[\"Key\"] = 19] = \"Key\";\n SymbolKind[SymbolKind[\"Null\"] = 20] = \"Null\";\n SymbolKind[SymbolKind[\"EnumMember\"] = 21] = \"EnumMember\";\n SymbolKind[SymbolKind[\"Struct\"] = 22] = \"Struct\";\n SymbolKind[SymbolKind[\"Event\"] = 23] = \"Event\";\n SymbolKind[SymbolKind[\"Operator\"] = 24] = \"Operator\";\n SymbolKind[SymbolKind[\"TypeParameter\"] = 25] = \"TypeParameter\";\n})(SymbolKind || (SymbolKind = {}));\nexport var SymbolTag;\n(function (SymbolTag) {\n SymbolTag[SymbolTag[\"Deprecated\"] = 1] = \"Deprecated\";\n})(SymbolTag || (SymbolTag = {}));\n/**\n * The kind of animation in which the editor's cursor should be rendered.\n */\nexport var TextEditorCursorBlinkingStyle;\n(function (TextEditorCursorBlinkingStyle) {\n /**\n * Hidden\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Hidden\"] = 0] = \"Hidden\";\n /**\n * Blinking\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Blink\"] = 1] = \"Blink\";\n /**\n * Blinking with smooth fading\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Smooth\"] = 2] = \"Smooth\";\n /**\n * Blinking with prolonged filled state and smooth fading\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Phase\"] = 3] = \"Phase\";\n /**\n * Expand collapse animation on the y axis\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Expand\"] = 4] = \"Expand\";\n /**\n * No-Blinking\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Solid\"] = 5] = \"Solid\";\n})(TextEditorCursorBlinkingStyle || (TextEditorCursorBlinkingStyle = {}));\n/**\n * The style in which the editor's cursor should be rendered.\n */\nexport var TextEditorCursorStyle;\n(function (TextEditorCursorStyle) {\n /**\n * As a vertical line (sitting between two characters).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"Line\"] = 1] = \"Line\";\n /**\n * As a block (sitting on top of a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"Block\"] = 2] = \"Block\";\n /**\n * As a horizontal line (sitting under a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"Underline\"] = 3] = \"Underline\";\n /**\n * As a thin vertical line (sitting between two characters).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"LineThin\"] = 4] = \"LineThin\";\n /**\n * As an outlined block (sitting on top of a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"BlockOutline\"] = 5] = \"BlockOutline\";\n /**\n * As a thin horizontal line (sitting under a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"UnderlineThin\"] = 6] = \"UnderlineThin\";\n})(TextEditorCursorStyle || (TextEditorCursorStyle = {}));\n/**\n * Describes the behavior of decorations when typing/editing near their edges.\n * Note: Please do not edit the values, as they very carefully match `DecorationRangeBehavior`\n */\nexport var TrackedRangeStickiness;\n(function (TrackedRangeStickiness) {\n TrackedRangeStickiness[TrackedRangeStickiness[\"AlwaysGrowsWhenTypingAtEdges\"] = 0] = \"AlwaysGrowsWhenTypingAtEdges\";\n TrackedRangeStickiness[TrackedRangeStickiness[\"NeverGrowsWhenTypingAtEdges\"] = 1] = \"NeverGrowsWhenTypingAtEdges\";\n TrackedRangeStickiness[TrackedRangeStickiness[\"GrowsOnlyWhenTypingBefore\"] = 2] = \"GrowsOnlyWhenTypingBefore\";\n TrackedRangeStickiness[TrackedRangeStickiness[\"GrowsOnlyWhenTypingAfter\"] = 3] = \"GrowsOnlyWhenTypingAfter\";\n})(TrackedRangeStickiness || (TrackedRangeStickiness = {}));\n/**\n * Describes how to indent wrapped lines.\n */\nexport var WrappingIndent;\n(function (WrappingIndent) {\n /**\n * No indentation => wrapped lines begin at column 1.\n */\n WrappingIndent[WrappingIndent[\"None\"] = 0] = \"None\";\n /**\n * Same => wrapped lines get the same indentation as the parent.\n */\n WrappingIndent[WrappingIndent[\"Same\"] = 1] = \"Same\";\n /**\n * Indent => wrapped lines get +1 indentation toward the parent.\n */\n WrappingIndent[WrappingIndent[\"Indent\"] = 2] = \"Indent\";\n /**\n * DeepIndent => wrapped lines get +2 indentation toward the parent.\n */\n WrappingIndent[WrappingIndent[\"DeepIndent\"] = 3] = \"DeepIndent\";\n})(WrappingIndent || (WrappingIndent = {}));\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Emitter } from '../../base/common/event.js';\nimport { Disposable, toDisposable } from '../../base/common/lifecycle.js';\nexport class TokenizationRegistry {\n constructor() {\n this._map = new Map();\n this._factories = new Map();\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._colorMap = null;\n }\n fire(languages) {\n this._onDidChange.fire({\n changedLanguages: languages,\n changedColorMap: false\n });\n }\n register(language, support) {\n this._map.set(language, support);\n this.fire([language]);\n return toDisposable(() => {\n if (this._map.get(language) !== support) {\n return;\n }\n this._map.delete(language);\n this.fire([language]);\n });\n }\n registerFactory(languageId, factory) {\n var _a;\n (_a = this._factories.get(languageId)) === null || _a === void 0 ? void 0 : _a.dispose();\n const myData = new TokenizationSupportFactoryData(this, languageId, factory);\n this._factories.set(languageId, myData);\n return toDisposable(() => {\n const v = this._factories.get(languageId);\n if (!v || v !== myData) {\n return;\n }\n this._factories.delete(languageId);\n v.dispose();\n });\n }\n getOrCreate(languageId) {\n return __awaiter(this, void 0, void 0, function* () {\n // check first if the support is already set\n const tokenizationSupport = this.get(languageId);\n if (tokenizationSupport) {\n return tokenizationSupport;\n }\n const factory = this._factories.get(languageId);\n if (!factory || factory.isResolved) {\n // no factory or factory.resolve already finished\n return null;\n }\n yield factory.resolve();\n return this.get(languageId);\n });\n }\n get(language) {\n return (this._map.get(language) || null);\n }\n isResolved(languageId) {\n const tokenizationSupport = this.get(languageId);\n if (tokenizationSupport) {\n return true;\n }\n const factory = this._factories.get(languageId);\n if (!factory || factory.isResolved) {\n return true;\n }\n return false;\n }\n setColorMap(colorMap) {\n this._colorMap = colorMap;\n this._onDidChange.fire({\n changedLanguages: Array.from(this._map.keys()),\n changedColorMap: true\n });\n }\n getColorMap() {\n return this._colorMap;\n }\n getDefaultBackground() {\n if (this._colorMap && this._colorMap.length > 2 /* ColorId.DefaultBackground */) {\n return this._colorMap[2 /* ColorId.DefaultBackground */];\n }\n return null;\n }\n}\nclass TokenizationSupportFactoryData extends Disposable {\n constructor(_registry, _languageId, _factory) {\n super();\n this._registry = _registry;\n this._languageId = _languageId;\n this._factory = _factory;\n this._isDisposed = false;\n this._resolvePromise = null;\n this._isResolved = false;\n }\n get isResolved() {\n return this._isResolved;\n }\n dispose() {\n this._isDisposed = true;\n super.dispose();\n }\n resolve() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this._resolvePromise) {\n this._resolvePromise = this._create();\n }\n return this._resolvePromise;\n });\n }\n _create() {\n return __awaiter(this, void 0, void 0, function* () {\n const value = yield Promise.resolve(this._factory.createTokenizationSupport());\n this._isResolved = true;\n if (value && !this._isDisposed) {\n this._register(this._registry.register(this._languageId, value));\n }\n });\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nlet isPseudo = (typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0);\nconst DEFAULT_TAG = 'i-default';\nfunction _format(message, args) {\n let result;\n if (args.length === 0) {\n result = message;\n }\n else {\n result = message.replace(/\\{(\\d+)\\}/g, (match, rest) => {\n const index = rest[0];\n const arg = args[index];\n let result = match;\n if (typeof arg === 'string') {\n result = arg;\n }\n else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {\n result = String(arg);\n }\n return result;\n });\n }\n if (isPseudo) {\n // FF3B and FF3D is the Unicode zenkaku representation for [ and ]\n result = '\\uFF3B' + result.replace(/[aouei]/g, '$&$&') + '\\uFF3D';\n }\n return result;\n}\nfunction findLanguageForModule(config, name) {\n let result = config[name];\n if (result) {\n return result;\n }\n result = config['*'];\n if (result) {\n return result;\n }\n return null;\n}\nfunction endWithSlash(path) {\n if (path.charAt(path.length - 1) === '/') {\n return path;\n }\n return path + '/';\n}\nfunction getMessagesFromTranslationsService(translationServiceUrl, language, name) {\n return __awaiter(this, void 0, void 0, function* () {\n const url = endWithSlash(translationServiceUrl) + endWithSlash(language) + 'vscode/' + endWithSlash(name);\n const res = yield fetch(url);\n if (res.ok) {\n const messages = yield res.json();\n return messages;\n }\n throw new Error(`${res.status} - ${res.statusText}`);\n });\n}\nfunction createScopedLocalize(scope) {\n return function (idx, defaultValue) {\n const restArgs = Array.prototype.slice.call(arguments, 2);\n return _format(scope[idx], restArgs);\n };\n}\nexport function localize(data, message, ...args) {\n return _format(message, args);\n}\nexport function getConfiguredDefaultLocale(_) {\n // This returns undefined because this implementation isn't used and is overwritten by the loader\n // when loaded.\n return undefined;\n}\nexport function setPseudoTranslation(value) {\n isPseudo = value;\n}\n/**\n * Invoked in a built product at run-time\n */\nexport function create(key, data) {\n var _a;\n return {\n localize: createScopedLocalize(data[key]),\n getConfiguredDefaultLocale: (_a = data.getConfiguredDefaultLocale) !== null && _a !== void 0 ? _a : ((_) => undefined)\n };\n}\n/**\n * Invoked by the loader at run-time\n */\nexport function load(name, req, load, config) {\n var _a;\n const pluginConfig = (_a = config['vs/nls']) !== null && _a !== void 0 ? _a : {};\n if (!name || name.length === 0) {\n return load({\n localize: localize,\n getConfiguredDefaultLocale: () => { var _a; return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']; }\n });\n }\n const language = pluginConfig.availableLanguages ? findLanguageForModule(pluginConfig.availableLanguages, name) : null;\n const useDefaultLanguage = language === null || language === DEFAULT_TAG;\n let suffix = '.nls';\n if (!useDefaultLanguage) {\n suffix = suffix + '.' + language;\n }\n const messagesLoaded = (messages) => {\n if (Array.isArray(messages)) {\n messages.localize = createScopedLocalize(messages);\n }\n else {\n messages.localize = createScopedLocalize(messages[name]);\n }\n messages.getConfiguredDefaultLocale = () => { var _a; return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']; };\n load(messages);\n };\n if (typeof pluginConfig.loadBundle === 'function') {\n pluginConfig.loadBundle(name, language, (err, messages) => {\n // We have an error. Load the English default strings to not fail\n if (err) {\n req([name + '.nls'], messagesLoaded);\n }\n else {\n messagesLoaded(messages);\n }\n });\n }\n else if (pluginConfig.translationServiceUrl && !useDefaultLanguage) {\n (() => __awaiter(this, void 0, void 0, function* () {\n var _b;\n try {\n const messages = yield getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, language, name);\n return messagesLoaded(messages);\n }\n catch (err) {\n // Language is already as generic as it gets, so require default messages\n if (!language.includes('-')) {\n console.error(err);\n return req([name + '.nls'], messagesLoaded);\n }\n try {\n // Since there is a dash, the language configured is a specific sub-language of the same generic language.\n // Since we were unable to load the specific language, try to load the generic language. Ex. we failed to find a\n // Swiss German (de-CH), so try to load the generic German (de) messages instead.\n const genericLanguage = language.split('-')[0];\n const messages = yield getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, genericLanguage, name);\n // We got some messages, so we configure the configuration to use the generic language for this session.\n (_b = pluginConfig.availableLanguages) !== null && _b !== void 0 ? _b : (pluginConfig.availableLanguages = {});\n pluginConfig.availableLanguages['*'] = genericLanguage;\n return messagesLoaded(messages);\n }\n catch (err) {\n console.error(err);\n return req([name + '.nls'], messagesLoaded);\n }\n }\n }))();\n }\n else {\n req([name + suffix], messagesLoaded, (err) => {\n if (suffix === '.nls') {\n console.error('Failed trying to load default language strings', err);\n return;\n }\n console.error(`Failed to load message bundle for language ${language}. Falling back to the default language:`, err);\n req([name + '.nls'], messagesLoaded);\n });\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { SimpleWorkerServer } from '../base/common/worker/simpleWorker.js';\nimport { EditorSimpleWorker } from './common/services/editorSimpleWorker.js';\nlet initialized = false;\nexport function initialize(foreignModule) {\n if (initialized) {\n return;\n }\n initialized = true;\n const simpleWorker = new SimpleWorkerServer((msg) => {\n self.postMessage(msg);\n }, (host) => new EditorSimpleWorker(host, foreignModule));\n self.onmessage = (e) => {\n simpleWorker.onmessage(e.data);\n };\n}\nself.onmessage = (e) => {\n // Ignore first message in this case and initialize if not yet initialized\n if (!initialized) {\n initialize(null);\n }\n};\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/examples.json b/dist/examples.json deleted file mode 100644 index 30cde115..00000000 --- a/dist/examples.json +++ /dev/null @@ -1 +0,0 @@ -{"path":"./src/static/examples","name":"examples","children":[{"path":"examples/ambisonics","name":"ambisonics","children":[{"path":"examples/ambisonics/fourSourcesToOcto.dsp","name":"fourSourcesToOcto.dsp","size":981,"extension":".dsp","type":"file"},{"path":"examples/ambisonics/oneSourceToStereo.dsp","name":"oneSourceToStereo.dsp","size":404,"extension":".dsp","type":"file"}],"size":1385,"type":"directory"},{"path":"examples/analysis","name":"analysis","children":[{"path":"examples/analysis/dbmeter.dsp","name":"dbmeter.dsp","size":628,"extension":".dsp","type":"file"},{"path":"examples/analysis/FFT.dsp","name":"FFT.dsp","size":874,"extension":".dsp","type":"file"},{"path":"examples/analysis/spectralLevel.dsp","name":"spectralLevel.dsp","size":233,"extension":".dsp","type":"file"},{"path":"examples/analysis/spectralTiltLab.dsp","name":"spectralTiltLab.dsp","size":668,"extension":".dsp","type":"file"},{"path":"examples/analysis/vumeter.dsp","name":"vumeter.dsp","size":545,"extension":".dsp","type":"file"}],"size":2948,"type":"directory"},{"path":"examples/bela","name":"bela","children":[{"path":"examples/bela/AdditiveSynth.dsp","name":"AdditiveSynth.dsp","size":1462,"extension":".dsp","type":"file"},{"path":"examples/bela/AdditiveSynth_Analog.dsp","name":"AdditiveSynth_Analog.dsp","size":1525,"extension":".dsp","type":"file"},{"path":"examples/bela/crossDelay2.dsp","name":"crossDelay2.dsp","size":2314,"extension":".dsp","type":"file"},{"path":"examples/bela/Faust-complement.lib","name":"Faust-complement.lib","size":2032,"extension":".lib","type":"file"},{"path":"examples/bela/FMSynth2.dsp","name":"FMSynth2.dsp","size":1956,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_Analog.dsp","name":"FMSynth2_Analog.dsp","size":1873,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_FX.dsp","name":"FMSynth2_FX.dsp","size":4569,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_FX_Analog.dsp","name":"FMSynth2_FX_Analog.dsp","size":4683,"extension":".dsp","type":"file"},{"path":"examples/bela/FXChaine2.dsp","name":"FXChaine2.dsp","size":5513,"extension":".dsp","type":"file"},{"path":"examples/bela/GrainGenerator.dsp","name":"GrainGenerator.dsp","size":3631,"extension":".dsp","type":"file"},{"path":"examples/bela/granulator.dsp","name":"granulator.dsp","size":2429,"extension":".dsp","type":"file"},{"path":"examples/bela/repeater.dsp","name":"repeater.dsp","size":2315,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleFX.dsp","name":"simpleFX.dsp","size":2434,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleFX_Analog.dsp","name":"simpleFX_Analog.dsp","size":2582,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth.dsp","name":"simpleSynth.dsp","size":2562,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_Analog.dsp","name":"simpleSynth_Analog.dsp","size":2596,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_FX.dsp","name":"simpleSynth_FX.dsp","size":5153,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_FX_Analog.dsp","name":"simpleSynth_FX_Analog.dsp","size":5350,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth.dsp","name":"WaveSynth.dsp","size":2230,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_Analog.dsp","name":"WaveSynth_Analog.dsp","size":2345,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_FX.dsp","name":"WaveSynth_FX.dsp","size":4895,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_FX_Analog.dsp","name":"WaveSynth_FX_Analog.dsp","size":5084,"extension":".dsp","type":"file"}],"size":69533,"type":"directory"},{"path":"examples/delayEcho","name":"delayEcho","children":[{"path":"examples/delayEcho/echo.dsp","name":"echo.dsp","size":462,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/quadEcho.dsp","name":"quadEcho.dsp","size":561,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/smoothDelay.dsp","name":"smoothDelay.dsp","size":825,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/stereoEcho.dsp","name":"stereoEcho.dsp","size":491,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/tapiir.dsp","name":"tapiir.dsp","size":1263,"extension":".dsp","type":"file"}],"size":3602,"type":"directory"},{"path":"examples/dynamic","name":"dynamic","children":[{"path":"examples/dynamic/compressor.dsp","name":"compressor.dsp","size":194,"extension":".dsp","type":"file"},{"path":"examples/dynamic/distortion.dsp","name":"distortion.dsp","size":192,"extension":".dsp","type":"file"},{"path":"examples/dynamic/gateCompressor.dsp","name":"gateCompressor.dsp","size":333,"extension":".dsp","type":"file"},{"path":"examples/dynamic/noiseGate.dsp","name":"noiseGate.dsp","size":182,"extension":".dsp","type":"file"},{"path":"examples/dynamic/volume.dsp","name":"volume.dsp","size":376,"extension":".dsp","type":"file"}],"size":1277,"type":"directory"},{"path":"examples/fft","name":"fft","children":[{"path":"examples/fft/fft_bandpass.dsp","name":"fft_bandpass.dsp","size":734,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_centroid.dsp","name":"fft_centroid.dsp","size":865,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_delay.dsp","name":"fft_delay.dsp","size":918,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_gain.dsp","name":"fft_gain.dsp","size":67,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_remove_phase.dsp","name":"fft_remove_phase.dsp","size":734,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_synth.dsp","name":"fft_synth.dsp","size":97,"extension":".dsp","type":"file"}],"size":3415,"type":"directory"},{"path":"examples/filtering","name":"filtering","children":[{"path":"examples/filtering/APF.dsp","name":"APF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/bandFilter.dsp","name":"bandFilter.dsp","size":1314,"extension":".dsp","type":"file"},{"path":"examples/filtering/BPF.dsp","name":"BPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/cryBaby.dsp","name":"cryBaby.dsp","size":156,"extension":".dsp","type":"file"},{"path":"examples/filtering/diodeLadder.dsp","name":"diodeLadder.dsp","size":381,"extension":".dsp","type":"file"},{"path":"examples/filtering/DNN.dsp","name":"DNN.dsp","size":806,"extension":".dsp","type":"file"},{"path":"examples/filtering/filterBank.dsp","name":"filterBank.dsp","size":177,"extension":".dsp","type":"file"},{"path":"examples/filtering/graphicEqLab.dsp","name":"graphicEqLab.dsp","size":354,"extension":".dsp","type":"file"},{"path":"examples/filtering/highShelf.dsp","name":"highShelf.dsp","size":349,"extension":".dsp","type":"file"},{"path":"examples/filtering/HPF.dsp","name":"HPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/korg35HPF.dsp","name":"korg35HPF.dsp","size":379,"extension":".dsp","type":"file"},{"path":"examples/filtering/korg35LPF.dsp","name":"korg35LPF.dsp","size":379,"extension":".dsp","type":"file"},{"path":"examples/filtering/lfBoost.dsp","name":"lfBoost.dsp","size":1348,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowBoost.dsp","name":"lowBoost.dsp","size":1478,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowCut.dsp","name":"lowCut.dsp","size":1453,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowShelf.dsp","name":"lowShelf.dsp","size":347,"extension":".dsp","type":"file"},{"path":"examples/filtering/LPF.dsp","name":"LPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogHalfLadder.dsp","name":"moogHalfLadder.dsp","size":390,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogLadder.dsp","name":"moogLadder.dsp","size":378,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogVCF.dsp","name":"moogVCF.dsp","size":153,"extension":".dsp","type":"file"},{"path":"examples/filtering/multibandFilter.dsp","name":"multibandFilter.dsp","size":561,"extension":".dsp","type":"file"},{"path":"examples/filtering/notch.dsp","name":"notch.dsp","size":341,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheim.dsp","name":"oberheim.dsp","size":457,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimBPF.dsp","name":"oberheimBPF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimBSF.dsp","name":"oberheimBSF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimHPF.dsp","name":"oberheimHPF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimLPF.dsp","name":"oberheimLPF.dsp","size":396,"extension":".dsp","type":"file"},{"path":"examples/filtering/parametricEqLab.dsp","name":"parametricEqLab.dsp","size":437,"extension":".dsp","type":"file"},{"path":"examples/filtering/parametricEqualizer.dsp","name":"parametricEqualizer.dsp","size":185,"extension":".dsp","type":"file"},{"path":"examples/filtering/peakingEQ.dsp","name":"peakingEQ.dsp","size":349,"extension":".dsp","type":"file"},{"path":"examples/filtering/peakNotch.dsp","name":"peakNotch.dsp","size":350,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrder.dsp","name":"sallenKey2ndOrder.dsp","size":481,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderBPF.dsp","name":"sallenKey2ndOrderBPF.dsp","size":430,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderHPF.dsp","name":"sallenKey2ndOrderHPF.dsp","size":429,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderLPF.dsp","name":"sallenKey2ndOrderLPF.dsp","size":429,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePole.dsp","name":"sallenKeyOnePole.dsp","size":444,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePoleHPF.dsp","name":"sallenKeyOnePoleHPF.dsp","size":390,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePoleLPF.dsp","name":"sallenKeyOnePoleLPF.dsp","size":389,"extension":".dsp","type":"file"},{"path":"examples/filtering/spectralTilt.dsp","name":"spectralTilt.dsp","size":191,"extension":".dsp","type":"file"},{"path":"examples/filtering/vcfWahLab.dsp","name":"vcfWahLab.dsp","size":504,"extension":".dsp","type":"file"},{"path":"examples/filtering/vocoder.dsp","name":"vocoder.dsp","size":226,"extension":".dsp","type":"file"},{"path":"examples/filtering/wahPedal.dsp","name":"wahPedal.dsp","size":163,"extension":".dsp","type":"file"}],"size":19533,"type":"directory"},{"path":"examples/gameaudio","name":"gameaudio","children":[{"path":"examples/gameaudio/bubble.dsp","name":"bubble.dsp","size":1038,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/rain.dsp","name":"rain.dsp","size":623,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/wind.dsp","name":"wind.dsp","size":555,"extension":".dsp","type":"file"}],"size":2216,"type":"directory"},{"path":"examples/generator","name":"generator","children":[{"path":"examples/generator/filterOsc.dsp","name":"filterOsc.dsp","size":213,"extension":".dsp","type":"file"},{"path":"examples/generator/noise.dsp","name":"noise.dsp","size":1813,"extension":".dsp","type":"file"},{"path":"examples/generator/noiseMetadata.dsp","name":"noiseMetadata.dsp","size":2356,"extension":".dsp","type":"file"},{"path":"examples/generator/osc.dsp","name":"osc.dsp","size":471,"extension":".dsp","type":"file"},{"path":"examples/generator/osci.dsp","name":"osci.dsp","size":505,"extension":".dsp","type":"file"},{"path":"examples/generator/sawtoothLab.dsp","name":"sawtoothLab.dsp","size":239,"extension":".dsp","type":"file"},{"path":"examples/generator/virtualAnalog.dsp","name":"virtualAnalog.dsp","size":228,"extension":".dsp","type":"file"},{"path":"examples/generator/virtualAnalogLab.dsp","name":"virtualAnalogLab.dsp","size":268,"extension":".dsp","type":"file"}],"size":6093,"type":"directory"},{"path":"examples/LIBRARIES","name":"LIBRARIES","children":[{"path":"examples/LIBRARIES/aanl.lib","name":"aanl.lib","size":30885,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/all.lib","name":"all.lib","size":1017,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/analyzers.lib","name":"analyzers.lib","size":32792,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/basics.lib","name":"basics.lib","size":50736,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/compressors.lib","name":"compressors.lib","size":45062,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/delays.lib","name":"delays.lib","size":14380,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/demos.lib","name":"demos.lib","size":54328,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/dx7.lib","name":"dx7.lib","size":69009,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/envelopes.lib","name":"envelopes.lib","size":10517,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/fds.lib","name":"fds.lib","size":20452,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/filters.lib","name":"filters.lib","size":103897,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/hoa.lib","name":"hoa.lib","size":13011,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/instruments.lib","name":"instruments.lib","size":9394,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/interpolators.lib","name":"interpolators.lib","size":15899,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/maths.lib","name":"maths.lib","size":20423,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/maxmsp.lib","name":"maxmsp.lib","size":7719,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/mi.lib","name":"mi.lib","size":17167,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/misceffects.lib","name":"misceffects.lib","size":21637,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/noises.lib","name":"noises.lib","size":10278,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/oscillators.lib","name":"oscillators.lib","size":46141,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/phaflangers.lib","name":"phaflangers.lib","size":9869,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/physmodels.lib","name":"physmodels.lib","size":170808,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/platform.lib","name":"platform.lib","size":2723,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/quantizers.lib","name":"quantizers.lib","size":9796,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/reducemaps.lib","name":"reducemaps.lib","size":4732,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/reverbs.lib","name":"reverbs.lib","size":18236,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/routes.lib","name":"routes.lib","size":6529,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/sf.lib","name":"sf.lib","size":1066,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/signals.lib","name":"signals.lib","size":11147,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/soundfiles.lib","name":"soundfiles.lib","size":9194,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/spats.lib","name":"spats.lib","size":5079,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/stdfaust.lib","name":"stdfaust.lib","size":1270,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/synths.lib","name":"synths.lib","size":7347,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/tonestacks.lib","name":"tonestacks.lib","size":12348,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/tubes.lib","name":"tubes.lib","size":349785,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/vaeffects.lib","name":"vaeffects.lib","size":35358,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/version.lib","name":"version.lib","size":767,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/wdmodels.lib","name":"wdmodels.lib","size":89448,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/webaudio.lib","name":"webaudio.lib","size":12002,"extension":".lib","type":"file"}],"size":1352248,"type":"directory"},{"path":"examples/misc","name":"misc","children":[{"path":"examples/misc/capture.dsp","name":"capture.dsp","size":802,"extension":".dsp","type":"file"},{"path":"examples/misc/guitarix.dsp","name":"guitarix.dsp","size":8986,"extension":".dsp","type":"file"},{"path":"examples/misc/matrix.dsp","name":"matrix.dsp","size":551,"extension":".dsp","type":"file"},{"path":"examples/misc/midiTester.dsp","name":"midiTester.dsp","size":7986,"extension":".dsp","type":"file"},{"path":"examples/misc/mixer.dsp","name":"mixer.dsp","size":667,"extension":".dsp","type":"file"},{"path":"examples/misc/switcher.dsp","name":"switcher.dsp","size":564,"extension":".dsp","type":"file"},{"path":"examples/misc/tester.dsp","name":"tester.dsp","size":1082,"extension":".dsp","type":"file"},{"path":"examples/misc/tester2.dsp","name":"tester2.dsp","size":1189,"extension":".dsp","type":"file"},{"path":"examples/misc/UITester.dsp","name":"UITester.dsp","size":2158,"extension":".dsp","type":"file"}],"size":23985,"type":"directory"},{"path":"examples/phasing","name":"phasing","children":[{"path":"examples/phasing/flanger.dsp","name":"flanger.dsp","size":188,"extension":".dsp","type":"file"},{"path":"examples/phasing/phaser.dsp","name":"phaser.dsp","size":184,"extension":".dsp","type":"file"},{"path":"examples/phasing/phaserFlangerLab.dsp","name":"phaserFlangerLab.dsp","size":395,"extension":".dsp","type":"file"}],"size":767,"type":"directory"},{"path":"examples/physicalModeling","name":"physicalModeling","children":[{"path":"examples/physicalModeling/brass.dsp","name":"brass.dsp","size":263,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/brassMIDI.dsp","name":"brassMIDI.dsp","size":290,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/churchBell.dsp","name":"churchBell.dsp","size":244,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/clarinet.dsp","name":"clarinet.dsp","size":261,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/clarinetMIDI.dsp","name":"clarinetMIDI.dsp","size":288,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/djembeMIDI.dsp","name":"djembeMIDI.dsp","size":257,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/elecGuitarMIDI.dsp","name":"elecGuitarMIDI.dsp","size":330,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/englishBell.dsp","name":"englishBell.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk","name":"faust-stk","children":[{"path":"examples/physicalModeling/faust-stk/bass.dsp","name":"bass.dsp","size":3779,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/blowBottle.dsp","name":"blowBottle.dsp","size":5036,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/bowed.dsp","name":"bowed.dsp","size":5791,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/brass.dsp","name":"brass.dsp","size":5421,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/clarinet.dsp","name":"clarinet.dsp","size":5439,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/flute.dsp","name":"flute.dsp","size":5763,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/fluteStk.dsp","name":"fluteStk.dsp","size":6147,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/glassHarmonica.dsp","name":"glassHarmonica.dsp","size":5550,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/harpsi.dsp","name":"harpsi.dsp","size":4022,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/modalBar.dsp","name":"modalBar.dsp","size":5327,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/NLFeks.dsp","name":"NLFeks.dsp","size":3140,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/NLFfm.dsp","name":"NLFfm.dsp","size":3849,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/piano.dsp","name":"piano.dsp","size":9909,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/saxophony.dsp","name":"saxophony.dsp","size":6161,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/sitar.dsp","name":"sitar.dsp","size":1747,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/tibetanBowl.dsp","name":"tibetanBowl.dsp","size":6118,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/tunedBar.dsp","name":"tunedBar.dsp","size":5350,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/uniBar.dsp","name":"uniBar.dsp","size":3872,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/voiceForm.dsp","name":"voiceForm.dsp","size":5988,"extension":".dsp","type":"file"}],"size":98409,"type":"directory"},{"path":"examples/physicalModeling/fds","name":"fds","children":[{"path":"examples/physicalModeling/fds/1dDampedWaveEquation.dsp","name":"1dDampedWaveEquation.dsp","size":1242,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fds/2dKirchhoffThinPlate.dsp","name":"2dKirchhoffThinPlate.dsp","size":2303,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fds/BowedString.dsp","name":"BowedString.dsp","size":2181,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fds/ControllableNonPhysicalString.dsp","name":"ControllableNonPhysicalString.dsp","size":3344,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fds/HammeredString.dsp","name":"HammeredString.dsp","size":2444,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fds/PianoHammeredString.dsp","name":"PianoHammeredString.dsp","size":2507,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fds/StiffString.dsp","name":"StiffString.dsp","size":1963,"extension":".dsp","type":"file"}],"size":15984,"type":"directory"},{"path":"examples/physicalModeling/flute.dsp","name":"flute.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fluteMIDI.dsp","name":"fluteMIDI.dsp","size":279,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/frenchBell.dsp","name":"frenchBell.dsp","size":249,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/germanBell.dsp","name":"germanBell.dsp","size":249,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/guitarMIDI.dsp","name":"guitarMIDI.dsp","size":258,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/karplus.dsp","name":"karplus.dsp","size":288,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/marimbaMIDI.dsp","name":"marimbaMIDI.dsp","size":336,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/modularInterpInstrMIDI.dsp","name":"modularInterpInstrMIDI.dsp","size":310,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/nylonGuitarMIDI.dsp","name":"nylonGuitarMIDI.dsp","size":268,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/russianBell.dsp","name":"russianBell.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/standardBell.dsp","name":"standardBell.dsp","size":255,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/violin.dsp","name":"violin.dsp","size":268,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/violinMIDI.dsp","name":"violinMIDI.dsp","size":257,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalBP.dsp","name":"vocalBP.dsp","size":258,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalBPMIDI.dsp","name":"vocalBPMIDI.dsp","size":286,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalFOF.dsp","name":"vocalFOF.dsp","size":233,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalFOFMIDI.dsp","name":"vocalFOFMIDI.dsp","size":261,"extension":".dsp","type":"file"}],"size":121137,"type":"directory"},{"path":"examples/pitchShifting","name":"pitchShifting","children":[{"path":"examples/pitchShifting/pitchShifter.dsp","name":"pitchShifter.dsp","size":559,"extension":".dsp","type":"file"}],"size":559,"type":"directory"},{"path":"examples/psychoacoustic","name":"psychoacoustic","children":[{"path":"examples/psychoacoustic/harmonicExciter.dsp","name":"harmonicExciter.dsp","size":379,"extension":".dsp","type":"file"}],"size":379,"type":"directory"},{"path":"examples/reverb","name":"reverb","children":[{"path":"examples/reverb/dattorro.dsp","name":"dattorro.dsp","size":189,"extension":".dsp","type":"file"},{"path":"examples/reverb/fdnRev.dsp","name":"fdnRev.dsp","size":200,"extension":".dsp","type":"file"},{"path":"examples/reverb/freeverb.dsp","name":"freeverb.dsp","size":173,"extension":".dsp","type":"file"},{"path":"examples/reverb/greyhole.dsp","name":"greyhole.dsp","size":177,"extension":".dsp","type":"file"},{"path":"examples/reverb/jprev.dsp","name":"jprev.dsp","size":168,"extension":".dsp","type":"file"},{"path":"examples/reverb/reverbDesigner.dsp","name":"reverbDesigner.dsp","size":307,"extension":".dsp","type":"file"},{"path":"examples/reverb/reverbTester.dsp","name":"reverbTester.dsp","size":205,"extension":".dsp","type":"file"},{"path":"examples/reverb/zitaRev.dsp","name":"zitaRev.dsp","size":239,"extension":".dsp","type":"file"},{"path":"examples/reverb/zitaRevFDN.dsp","name":"zitaRevFDN.dsp","size":217,"extension":".dsp","type":"file"}],"size":1875,"type":"directory"},{"path":"examples/SAM","name":"SAM","children":[{"path":"examples/SAM/16_channel_volume","name":"16_channel_volume","children":[{"path":"examples/SAM/16_channel_volume/16_channel_volume.dsp","name":"16_channel_volume.dsp","size":2244,"extension":".dsp","type":"file"},{"path":"examples/SAM/16_channel_volume/layout.dsp","name":"layout.dsp","size":574,"extension":".dsp","type":"file"}],"size":2818,"type":"directory"},{"path":"examples/SAM/chorus","name":"chorus","children":[{"path":"examples/SAM/chorus/chorus.dsp","name":"chorus.dsp","size":1384,"extension":".dsp","type":"file"},{"path":"examples/SAM/chorus/chorusForBrowser.dsp","name":"chorusForBrowser.dsp","size":8324,"extension":".dsp","type":"file"},{"path":"examples/SAM/chorus/layout2.dsp","name":"layout2.dsp","size":6963,"extension":".dsp","type":"file"}],"size":16671,"type":"directory"},{"path":"examples/SAM/echo","name":"echo","children":[{"path":"examples/SAM/echo/echo.dsp","name":"echo.dsp","size":2558,"extension":".dsp","type":"file"},{"path":"examples/SAM/echo/echoForBrowser.dsp","name":"echoForBrowser.dsp","size":9502,"extension":".dsp","type":"file"},{"path":"examples/SAM/echo/layout2.dsp","name":"layout2.dsp","size":6963,"extension":".dsp","type":"file"}],"size":19023,"type":"directory"},{"path":"examples/SAM/effects","name":"effects","children":[{"path":"examples/SAM/effects/chorus.dsp","name":"chorus.dsp","size":1387,"extension":".dsp","type":"file"},{"path":"examples/SAM/effects/echo.dsp","name":"echo.dsp","size":2560,"extension":".dsp","type":"file"},{"path":"examples/SAM/effects/effects.dsp","name":"effects.dsp","size":213,"extension":".dsp","type":"file"},{"path":"examples/SAM/effects/effectsForBrowser.dsp","name":"effectsForBrowser.dsp","size":16236,"extension":".dsp","type":"file"},{"path":"examples/SAM/effects/flanger.dsp","name":"flanger.dsp","size":1769,"extension":".dsp","type":"file"},{"path":"examples/SAM/effects/freeverb.dsp","name":"freeverb.dsp","size":3626,"extension":".dsp","type":"file"},{"path":"examples/SAM/effects/layout2.dsp","name":"layout2.dsp","size":6963,"extension":".dsp","type":"file"}],"size":32754,"type":"directory"},{"path":"examples/SAM/flanger","name":"flanger","children":[{"path":"examples/SAM/flanger/flanger.dsp","name":"flanger.dsp","size":1766,"extension":".dsp","type":"file"},{"path":"examples/SAM/flanger/flangerForBrowser.dsp","name":"flangerForBrowser.dsp","size":8706,"extension":".dsp","type":"file"},{"path":"examples/SAM/flanger/layout2.dsp","name":"layout2.dsp","size":6963,"extension":".dsp","type":"file"}],"size":17435,"type":"directory"},{"path":"examples/SAM/freeverb","name":"freeverb","children":[{"path":"examples/SAM/freeverb/freeverb.dsp","name":"freeverb.dsp","size":3625,"extension":".dsp","type":"file"},{"path":"examples/SAM/freeverb/freeverbForBrowser.dsp","name":"freeverbForBrowser.dsp","size":10561,"extension":".dsp","type":"file"},{"path":"examples/SAM/freeverb/layout2.dsp","name":"layout2.dsp","size":6963,"extension":".dsp","type":"file"}],"size":21149,"type":"directory"},{"path":"examples/SAM/sawtooth_synth","name":"sawtooth_synth","children":[{"path":"examples/SAM/sawtooth_synth/sawtooth_synth.dsp","name":"sawtooth_synth.dsp","size":379,"extension":".dsp","type":"file"}],"size":379,"type":"directory"},{"path":"examples/SAM/sine_synth","name":"sine_synth","children":[{"path":"examples/SAM/sine_synth/sine_synth.dsp","name":"sine_synth.dsp","size":295,"extension":".dsp","type":"file"}],"size":295,"type":"directory"},{"path":"examples/SAM/virtualAnalog","name":"virtualAnalog","children":[{"path":"examples/SAM/virtualAnalog/layout2.dsp","name":"layout2.dsp","size":6963,"extension":".dsp","type":"file"},{"path":"examples/SAM/virtualAnalog/virtualAnalog.dsp","name":"virtualAnalog.dsp","size":12492,"extension":".dsp","type":"file"},{"path":"examples/SAM/virtualAnalog/virtualAnalogForBrowser.dsp","name":"virtualAnalogForBrowser.dsp","size":19391,"extension":".dsp","type":"file"},{"path":"examples/SAM/virtualAnalog/virtualAnalogWithEffectsForBrowser.dsp","name":"virtualAnalogWithEffectsForBrowser.dsp","size":28601,"extension":".dsp","type":"file"}],"size":67447,"type":"directory"},{"path":"examples/SAM/volume","name":"volume","children":[{"path":"examples/SAM/volume/volume.dsp","name":"volume.dsp","size":338,"extension":".dsp","type":"file"}],"size":338,"type":"directory"}],"size":178309,"type":"directory"},{"path":"examples/smartKeyboard","name":"smartKeyboard","children":[{"path":"examples/smartKeyboard/acGuitar.dsp","name":"acGuitar.dsp","size":3902,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects","name":"associatedEffects","children":[{"path":"examples/smartKeyboard/associatedEffects/elecGuitarEffect.dsp","name":"elecGuitarEffect.dsp","size":186,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects/myEffect.dsp","name":"myEffect.dsp","size":89,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects/reverb.dsp","name":"reverb.dsp","size":89,"extension":".dsp","type":"file"}],"size":364,"type":"directory"},{"path":"examples/smartKeyboard/bells.dsp","name":"bells.dsp","size":3002,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/bowed.dsp","name":"bowed.dsp","size":3130,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/brass.dsp","name":"brass.dsp","size":3151,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/clarinet.dsp","name":"clarinet.dsp","size":5188,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/crazyGuiro.dsp","name":"crazyGuiro.dsp","size":3916,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/drums.dsp","name":"drums.dsp","size":2550,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/dubDub.dsp","name":"dubDub.dsp","size":3264,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/elecGuitar.dsp","name":"elecGuitar.dsp","size":2516,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/fm.dsp","name":"fm.dsp","size":2974,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/frog.dsp","name":"frog.dsp","size":2868,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/harp.dsp","name":"harp.dsp","size":3329,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/midiOnly.dsp","name":"midiOnly.dsp","size":2458,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/multiSynth.dsp","name":"multiSynth.dsp","size":2550,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/toy.dsp","name":"toy.dsp","size":2823,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/trumpet.dsp","name":"trumpet.dsp","size":1922,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/turenas.dsp","name":"turenas.dsp","size":4268,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/violin.dsp","name":"violin.dsp","size":3439,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/violin2.dsp","name":"violin2.dsp","size":3017,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/vocal.dsp","name":"vocal.dsp","size":1384,"extension":".dsp","type":"file"}],"size":62015,"type":"directory"},{"path":"examples/spat","name":"spat","children":[{"path":"examples/spat/panpot.dsp","name":"panpot.dsp","size":392,"extension":".dsp","type":"file"},{"path":"examples/spat/spat.dsp","name":"spat.dsp","size":695,"extension":".dsp","type":"file"}],"size":1087,"type":"directory"}],"size":1852363,"type":"directory"} \ No newline at end of file diff --git a/dist/examples/LIBRARIES/aanl.lib b/dist/examples/LIBRARIES/aanl.lib deleted file mode 100644 index 8003d617..00000000 --- a/dist/examples/LIBRARIES/aanl.lib +++ /dev/null @@ -1,858 +0,0 @@ -// ############################################################################# -// ########## Antialiased nonlinearities (aanl.lib) ########################### -// ############################################################################# -// -// This library provides aliasing-suppressed nonlinearities through first-order -// and second-order approximations of continuous-time signals, functions, -// and convolution based on antiderivatives. This technique is particularly -// effective if combined with low-factor oversampling, for example, operating -// at 96 kHz or 192 kHz sample-rate. -// -// The library contains trigonometric functions as well as other nonlinear -// functions such as bounded and unbounded saturators. -// -// Due to their limited domains or ranges, some of these functions may not -// suitable for audio nonlinear processing or waveshaping, although -// they have been included for completeness. Some other functions, -// for example, tan() and tanh(), are only available with first-order -// antialiasing due to the complexity of the antiderivative of the -// x * f(x) term, particularly because of the necessity of the dilogarithm -// function, which requires special implementation. -// -// Future improvements to this library may include an adaptive -// mechanism to set the ill-conditioned cases threshold to improve -// performance in varying cases. -// -// Note that the antialiasing functions introduce a delay in the path, -// respectively half and one-sample delay for first and second-order functions. -// -// Also note that due to division by differences, it is vital to use -// double-precision or more to reduce errors. -// -// The environment identifier for this library is "aa". After importing -// the standard libraries in Faust, the functions below can be called as: -// -// "aa.function_name". -// -// Reference: -// https://www.dafx.de/paper-archive/2016/dafxpapers/20-DAFx-16_paper_41-PN.pdf. -// -// ############################################################################# - -declare name "Antialiased nonlinearities"; -declare version "0.1"; - -ba = library("basics.lib"); -ma = library("maths.lib"); - - - -// ============================================================================= -// ========== Auxiliary Functions ============================================== -// ============================================================================= - -// ---------- Constant -------------------------------------------------------- -// -MAX = ma.INFINITY; -// ----------------------------------------------------------------------------- - -// ---------- clip; ------------------------------------------------------------ -// -clip(l, h, x) = max(l, min(h, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued sqrt() ----------------------------------------------- -// -Rsqrt(x) = sqrt(max(0.0, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued log() ------------------------------------------------ -// -Rlog(x) = log(max(ma.EPSILON, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued tan() ------------------------------------------------ -// -Rtan(x) = tan(clip(-MAX, MAX, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued acos() ----------------------------------------------- -// -Racos(x) = acos(clip(-1.0, 1.0, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued asin() ----------------------------------------------- -// -Rasin(x) = asin(clip(-1.0, 1.0, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued acosh() ---------------------------------------------- -// -Racosh(x) = ma.acosh(clip(1.0, MAX, x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued cosh() ----------------------------------------------- -// -Rcosh(x) = min(MAX, ma.cosh(x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued sinh() ----------------------------------------------- -// -Rsinh(x) = clip(-MAX, MAX, ma.sinh(x)); -// ----------------------------------------------------------------------------- - -// ---------- Real-valued atanh() ---------------------------------------------- -// -Ratanh(x) = ma.atanh(clip(-1.0 + ma.EPSILON, 1.0 - ma.EPSILON, x)); -// ----------------------------------------------------------------------------- - -// ---------- Generalised first-order ADAA function ---------------------------- -// -declare ADAA1 author "Dario Sanfilippo"; -declare ADAA1 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare ADAA1 license "LGPL v3.0 license"; -ADAA1(EPS, f, F1, x) = D1q - with { - D1q = ba.if(abs(x - x') <= EPS, ill_D1q, safe_D1q) - with { - ill_D1q = f(x_m); - safe_D1q = (F1(x) - F1(x')) / (x - x'); - x_m = .5 * (x + x'); - }; - }; -// ----------------------------------------------------------------------------- - -// ---------- Generalised second-order ADAA function --------------------------- -// -declare ADAA2 author "Dario Sanfilippo"; -declare ADAA2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare ADAA2 license "LGPL v3.0 license"; -ADAA2(EPS, f, F1, F2, x) = T1 + T2 - with { - T1 = ba.if((x - x') ^ 2.0 <= EPS, ill_T1, safe_T1) - with { - ill_T1 = .5 * f((x + 2.0 * x') / 3.0); - safe_T1 = (x * (F1(x) - F1(x')) - (F2(x) - F2(x'))) / - ((x - x') ^ 2.0); - }; - T2 = ba.if((x' - x'') ^ 2.0 <= EPS, ill_T2, safe_T2) - with { - ill_T2 = .5 * f((x'' + 2.0 * x') / 3.0); - safe_T2 = (x'' * (F1(x'') - F1(x')) - (F2(x'') - F2(x'))) / - ((x'' - x') ^ 2.0); - }; - }; -// ----------------------------------------------------------------------------- - - - -// ============================================================================= -// ========== Main functions =================================================== -// ============================================================================= - -// ----------------------------------------------------------------------------- -// ---------- Saturators ------------------------------------------------------- -// ----------------------------------------------------------------------------- -// -// These antialiased saturators perform best with high-amplitude input -// signals. If the input is only slightly saturated, hence producing -// negligible aliasing, the trivial saturator may result in a better -// overall output, as noise can be introduced by first and second ADAA -// at low amplitudes. -// -// Once determining the lowest saturation level for which the antialiased -// functions perform adequately, it might be sensible to cross-fade -// between the trivial and the antialiased saturators according to the -// amplitude profile of the input signal. -// ----------------------------------------------------------------------------- - -// ---------- (aa.)hardclip; --------------------------------------------------- -// -// First-order ADAA hard-clip. -// -// The domain of this function is ℝ; its theoretical range is [-1.0; 1.0]. -// -// #### Usage -// ``` -// _ : aa.hardclip : _; -// ``` -declare hardclip author "Dario Sanfilippo"; -declare hardclip copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare hardclip license "LGPL v3.0 license"; -hardclip(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = clip(-1.0, 1.0, x_f); - F1(x_F1) = ba.if( (x_F1 <= 1.0) & (x_F1 >= -1.0), - .5 * x_F1 ^ 2.0, - x_F1 * ma.signum(x_F1) - .5); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)hardclip2; -------------------------------------------------- -// -// Second-order ADAA hard-clip. -// -// The domain of this function is ℝ; its theoretical range is [-1.0; 1.0]. -// -// #### Usage -// ``` -// _ : aa.hardclip2 : _; -// ``` -declare hardclip2 author "Dario Sanfilippo"; -declare hardclip2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare hardclip2 license "LGPL v3.0 license"; -hardclip2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = clip(-1.0, 1.0, x_f); - F1(x_F1) = ba.if( (x_F1 <= 1.0) & (x_F1 >= -1.0), - .5 * x_F1 ^ 2.0, - x_F1 * ma.signum(x_F1) - .5); - F2(x_F2) = ba.if( (x_F2 <= 1.0) & (x_F2 >= -1.0), - (1.0 / 3.0) * x_F2 ^ 3.0, - ((.5 * x_F2 ^ 2.0) - 1.0 / 6.0) * - ma.signum(x_F2)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)cubic; ------------------------------------------------------ -// -// First-order ADAA cubic saturator. -// -// The domain of this function is ℝ; its theoretical range is -// [-2.0/3.0; 2.0/3.0]. -// -// #### Usage -// ``` -// _ : aa.cubic : _; -// ``` -declare cubic author "Dario Sanfilippo"; -declare cubic copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare cubic license "LGPL v3.0 license"; -cubic(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = ba.if( (x_f < 1.0) & (x_f > -1.0), - x_f - x_f ^ 3.0 / 3.0, - (2.0 / 3.0) * ma.signum(x_f)); - F1(x_F1) = ba.if( x_F1 <= -1.0, - x_F1 * -2.0 / 3.0, - ba.if( x_F1 >= 1.0, - x_F1 * 2.0 / 3.0, - x_F1 ^ 2.0 / 2.0 - x_F1 ^ 4.0 / 12.0)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)parabolic; -------------------------------------------------- -// -// First-order ADAA parabolic saturator. -// -// The domain of this function is ℝ; its theoretical range is [-1.0; 1.0]. -// -// #### Usage -// ``` -// _ : aa.parabolic : _; -// ``` -declare parabolic author "Dario Sanfilippo"; -declare parabolic copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare parabolic license "LGPL v3.0 license"; -parabolic(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = ba.if( abs(x_f) <= 2.0, - x_f * (1.0 - abs(x_f) / 4.0), - ma.signum(x_f)); - F1(x_F1) = ba.if( abs(x_F1) <= 2.0, - (-1.0 / 12.0) * x_F1 ^ 2.0 * - (x_F1 * ma.signum(x_F1) - 6.0), - abs(x_F1)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)parabolic2; ------------------------------------------------- -// -// Second-order ADAA parabolic saturator. -// -// The domain of this function is ℝ; its theoretical range is [-1.0; 1.0]. -// -// #### Usage -// ``` -// _ : aa.parabolic : _; -// ``` -declare parabolic2 author "Dario Sanfilippo"; -declare parabolic2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare parabolic2 license "LGPL v3.0 license"; -parabolic2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = ba.if( abs(x_f) <= 2.0, - x_f * (1.0 - abs(x_f) / 4.0), - ma.signum(x_f)); - F1(x_F1) = ba.if( abs(x_F1) <= 2.0, - (-1.0 / 12.0) * x_F1 ^ 2.0 * - (x_F1 * ma.signum(x_F1) - 6.0), - abs(x_F1)); - F2(x_F2) = ba.if( abs(x_F2) <= 2.0, - (1.0 / 48.0) * x_F2 ^ 3.0 * - (16.0 - 3.0 * x_F2 * ma.signum(x_F2)), - .5 * x_F2 ^ 2.0 * ma.signum(x_F2)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)hyperbolic; ------------------------------------------------- -// -// First-order ADAA hyperbolic saturator. -// -// The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[. -// -// #### Usage -// ``` -// _ : aa.hyperbolic : _; -// ``` -declare hyperbolic author "Dario Sanfilippo"; -declare hyperbolic copyright "Copyright (C) 2021 Dario Sanfilippo -  "; -declare hyperbolic license "LGPL v3.0 license"; -hyperbolic(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; -     f(x_f) = x_f / (1.0 + abs(x_f)); -     F1(x_F1) = abs(x_F1) - log(1.0 + abs(x_F1)); -  }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)hyperbolic2; ------------------------------------------------ -// -// Second-order ADAA hyperbolic saturator. -// -// The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[. -// -// #### Usage -// ``` -// _ : aa.hyperbolic2 : _; -// ``` -declare hyperbolic2 author "Dario Sanfilippo"; -declare hyperbolic2 copyright "Copyright (C) 2021 Dario Sanfilippo -  "; -declare hyperbolic2 license "LGPL v3.0 license"; -hyperbolic2(x) = ADAA2(EPS, f, F1, F2, x) -  with { - EPS = 1.0 / ma.SR; -     f(x_f) = x_f / (1.0 + abs(x_f)); -     F1(x_F1) = abs(x_F1) - log(1.0 + abs(x_F1)); -     F2(x_F2) = ma.signum(x_F2) * (.5 * (3.0 - 2.0 * abs(x_F2) + -       x_F2 ^ 2.0 + 2.0 * log(1.0 + abs(x_F2))) - 3.0 / 2.0) + - 3.0 / 2.0; -   }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)sinarctan; -------------------------------------------------- -// -// First-order ADAA sin(atan()) saturator. -// -// The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[. -// -// #### Usage -// ``` -// _ : aa.sinatan : _; -// ``` -declare sinarctan author "Dario Sanfilippo"; -declare sinarctan copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare sinarctan license "LGPL v3.0 license"; -sinarctan(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = x_f / sqrt(1.0 + x_f ^ 2.0); - F1(x_F1) = sqrt(x_F1 ^ 2.0 + 1.0) + const - with { - const = -1.0; // for F1(0) = 0 to minimise precision loss - }; - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)sinarctan2; ------------------------------------------------- -// -// Second-order ADAA sin(atan()) saturator. -// -// The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[. -// -// #### Usage -// ``` -// _ : aa.sinarctan2 : _; -// ``` -declare sinarctan2 author "Dario Sanfilippo"; -declare sinarctan2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare sinarctan2 license "LGPL v3.0 license"; -sinarctan2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = x_f / sqrt(1.0 + x_f ^ 2.0); - F1(x_F1) = sqrt(x_F1 ^ 2.0 + 1.0) + const - with { - const = -1.0; // for F1(0) = 0 to minimise precision loss - }; - F2(x_F2) = .5 * x_F2 * sqrt(x_F2 ^ 2.0 + 1.0) - .5 * ma.asinh(x_F2); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)tanh; ------------------------------------------------------- -// -// First-order ADAA tanh() saturator. -// -// The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[. -// -// #### Usage -// ``` -// _ : aa.tanh : _; -// ``` -declare tanh author "Dario Sanfilippo"; -declare tanh copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare tanh license "LGPL v3.0 license"; -tanh(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = ma.tanh(x_f); - F1(x_F1) = log(Rcosh(x_F1)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)arctan; ----------------------------------------------------- -// -// First-order ADAA atan(). -// -// The domain of this function is ℝ; its theoretical range is ]-π/2.0; π/2.0[. -// -// #### Usage -// ``` -// _ : aa.arctan : _; -// ``` -declare arctan author "Dario Sanfilippo"; -declare arctan copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare arctan license "LGPL v3.0 license"; -arctan(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = atan(x_f); - F1(x_F1) = x_F1 * f(x_F1) - .5 * log(x_F1 ^ 2.0 + 1.0); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)arctan2; ---------------------------------------------------- -// -// Second-order ADAA atan(). -// -// The domain of this function is ℝ; its theoretical range is ]-π/2.0; π/2.0[. -// -// #### Usage -// ``` -// _ : aa.arctan2 : _; -// ``` -declare arctan2 author "Dario Sanfilippo"; -declare arctan2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare arctan2 license "LGPL v3.0 license"; -arctan2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = atan(x_f); - F1(x_F1) = x_F1 * f(x_F1) - .5 * log(x_F1 ^ 2.0 + 1.0); - F2(x_F2) = .5 * x_F2 ^ 2.0 * f(x_F2) - x_F2 / 2.0 + .5 * f(x_F2); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)asinh; ------------------------------------------------------ -// -// First-order ADAA asinh() saturator (unbounded). -// -// The domain of this function is ℝ; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.asinh : _; -// ``` -declare asinh author "Dario Sanfilippo"; -declare asinh copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare asinh license "LGPL v3.0 license"; -asinh(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = ma.asinh(x_f); - F1(x_F1) = x_F1 * f(x_F1) - sqrt(1.0 + x_F1 ^ 2.0) + const - with { - const = 1.0; // for F1(0) = 0 to minimise precision loss - }; - - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)asinh2; ----------------------------------------------------- -// -// Second-order ADAA asinh() saturator (unbounded). -// -// The domain of this function is ℝ; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.asinh2 : _; -// ``` -declare asinh2 author "Dario Sanfilippo"; -declare asinh2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare asinh2 license "LGPL v3.0 license"; -asinh2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = ma.asinh(x_f); - F1(x_F1) = x_F1 * f(x_F1) - sqrt(1.0 + x_F1 ^ 2.0) + const - with { - const = 1.0; // for F1(0) = 0 to minimise precision loss - }; - F2(x_F2) = .25 * (2.0 * x_F2 ^ 2.0 * f(x_F2) + f(x_F2) - - sqrt(x_F2 ^ 2.0 + 1.0) * x_F2); - - }; -// ----------------------------------------------------------------------------- - - - -// ----------------------------------------------------------------------------- -// ---------- Trigonometry ----------------------------------------------------- -// ----------------------------------------------------------------------------- -// -// These functions are reliable if input signals are within their domains. -// ----------------------------------------------------------------------------- - -// ---------- (aa.)cosine; ----------------------------------------------------- -// -// First-order ADAA cos(). -// -// The domain of this function is ℝ; its theoretical range is [-1.0; 1.0]. -// -// #### Usage -// ``` -// _ : aa.cosine : _; -// ``` -declare cosine author "Dario Sanfilippo"; -declare cosine copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare cosine license "LGPL v3.0 license"; -cosine(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = cos(x_f); - F1(x_F1) = sin(x_F1); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)cosine2; ---------------------------------------------------- -// -// Second-order ADAA cos(). -// -// The domain of this function is ℝ; its theoretical range is [-1.0; 1.0]. -// -// #### Usage -// ``` -// _ : aa.cosine2 : _; -// ``` -declare cosine2 author "Dario Sanfilippo"; -declare cosine2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare cosine2 license "LGPL v3.0 license"; -cosine2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = cos(x_f); - F1(x_F1) = sin(x_F1); - F2(x_F2) = x_F2 * sin(x_F2) + cos(x_F2); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)arccos; ----------------------------------------------------- -// -// First-order ADAA acos(). -// -// The domain of this function is [-1.0; 1.0]; its theoretical range is -// [π; 0.0]. -// -// #### Usage -// ``` -// _ : aa.arccos : _; -// ``` -declare arccos author "Dario Sanfilippo"; -declare arccos copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare arccos license "LGPL v3.0 license"; -arccos(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Racos(x_f); - F1(x_F1) = x_F1 * f(x_F1) - Rsqrt(1.0 - x_F1 ^ 2.0) + const - with { - const = 1.0; // for F1(0) = 0 to minimise precision loss - }; - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)arccos2; ---------------------------------------------------- -// -// Second-order ADAA acos(). -// -// The domain of this function is [-1.0; 1.0]; its theoretical range is -// [π; 0.0]. -// -// Note that this function is not accurate for low-amplitude or low-frequency -// input signals. In that case, the first-order ADAA arccos() can be used. -// -// #### Usage -// ``` -// _ : aa.arccos2 : _; -// ``` -declare arccos2 author "Dario Sanfilippo"; -declare arccos2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare arccos2 license "LGPL v3.0 license"; -arccos2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Racos(x_f); - F1(x_F1) = x_F1 * f(x_F1) - Rsqrt(1.0 - x_F1 ^ 2.0) + const - with { - const = 1.0; // for F1(0) = 0 to minimise precision loss - }; - F2(x_F2) = .25 * (2.0 * x_F2 ^ 2.0 * f(x_F2) + Rasin(x_F2) - - Rsqrt(1.0 - x_F2 ^ 2.0)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)acosh; ------------------------------------------------------ -// -// First-order ADAA acosh(). -// -// The domain of this function is ℝ >= 1.0; its theoretical range is ℝ >= 0.0. -// -// #### Usage -// ``` -// _ : aa.acosh : _; -// ``` -declare acosh author "Dario Sanfilippo"; -declare acosh copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare acosh license "LGPL v3.0 license"; -acosh(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Racosh(x_f); - F1(x_F1) = x_F1 * f(x_F1) - Rsqrt(x_F1 - 1.0) * Rsqrt(x_F1 + 1.0); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)acosh2; ----------------------------------------------------- -// -// Second-order ADAA acosh(). -// -// The domain of this function is ℝ >= 1.0; its theoretical range is ℝ >= 0.0. -// -// Note that this function is not accurate for low-frequency input signals. -// In that case, the first-order ADAA acosh() can be used. -// -// #### Usage -// ``` -// _ : aa.acosh2 : _; -// ``` -declare acosh2 author "Dario Sanfilippo"; -declare acosh2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare acosh2 license "LGPL v3.0 license"; -acosh2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Racosh(x_f); - F1(x_F1) = x_F1 * f(x_F1) - Rsqrt(x_F1 - 1.0) * Rsqrt(x_F1 + 1.0); - F2(x_F2) = .5 * x_F2 ^ 2.0 * f(x_F2) - .25 * - Rsqrt(x_F2 - 1.0) * Rsqrt(x_F2 + 1.0) * x_F2 - - .25 * Rlog(x_F2 + Rsqrt(x_F2 - 1.0) * Rsqrt(x_F2 + 1.0)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)sine; ------------------------------------------------------- -// -// First-order ADAA sin(). -// -// The domain of this function is ℝ; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.sine : _; -// ``` -declare sine author "Dario Sanfilippo"; -declare sine copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare sine license "LGPL v3.0 license"; -sine(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = sin(x_f); - F1(x_F1) = -1.0 * cos(x_F1); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)sine2; ------------------------------------------------------ -// -// Second-order ADAA sin(). -// -// The domain of this function is ℝ; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.sine2 : _; -// ``` -declare sine2 author "Dario Sanfilippo"; -declare sine2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare sine2 license "LGPL v3.0 license"; -sine2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = sin(x_f); - F1(x_F1) = 1.0 - cos(x_F1); - F2(x_F2) = sin(x_F2) - x_F2 * cos(x_F2); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)arcsin; ----------------------------------------------------- -// -// First-order ADAA asin(). -// -// The domain of this function is [-1.0, 1.0]; its theoretical range is -// [-π/2.0; π/2.0]. -// -// #### Usage -// ``` -// _ : aa.arcsin : _; -// ``` -declare arcsin author "Dario Sanfilippo"; -declare arcsin copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare arcsin license "LGPL v3.0 license"; -arcsin(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Rasin(x_f); - F1(x_F1) = x_F1 * f(x_F1) + Rsqrt(1.0 - x_F1 ^ 2.0) + const - with { - const = -1.0; // for F1(0) = 0 to minimise precision loss - }; - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)arcsin2; ---------------------------------------------------- -// -// Second-order ADAA asin(). -// -// The domain of this function is [-1.0, 1.0]; its theoretical range is -// [-π/2.0; π/2.0]. -// -// Note that this function is not accurate for low-frequency input signals. -// In that case, the first-order ADAA asin() can be used. -// -// #### Usage -// ``` -// _ : aa.arcsin2 : _; -// ``` -declare arcsin2 author "Dario Sanfilippo"; -declare arcsin2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare arcsin2 license "LGPL v3.0 license"; -arcsin2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Rasin(x_f); - F1(x_F1) = x_F1 * f(x_F1) + Rsqrt(1.0 - x_F1 ^ 2.0) + const - with { - const = -1.0; // for F1(0) = 0 to minimise precision loss - }; - F2(x_F2) = .25 * (Rsqrt(1.0 - x_F2 ^ 2.0) * x_F2 + - (2.0 * x_F2 ^ 2.0 - 1.0) * f(x_F2)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)tangent; ---------------------------------------------------- -// -// First-order ADAA tan(). -// -// The domain of this function is [-π/2.0; π/2.0]; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.tangent : _; -// ``` -declare tangent author "Dario Sanfilippo"; -declare tangent copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare tangent license "LGPL v3.0 license"; -tangent(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Rtan(x_f); - F1(x_F1) = -1.0 * Rlog(cos(x_F1)); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)atanh; ------------------------------------------------------ -// -// First-order ADAA atanh(). -// -// The domain of this function is ]-1.0; 1.0[; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.atanh : _; -// ``` -declare atanh author "Dario Sanfilippo"; -declare atanh copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare atanh license "LGPL v3.0 license"; -atanh(x) = ADAA1(EPS, f, F1, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Ratanh(x_f); - F1(x_F1) = .5 * Rlog(1.0 - x_F1 ^ 2.0) + x_F1 * f(x_F1); - }; -// ----------------------------------------------------------------------------- - -// ---------- (aa.)atanh2; ----------------------------------------------------- -// -// Second-order ADAA atanh(). -// -// The domain of this function is ]-1.0; 1.0[; its theoretical range is ℝ. -// -// #### Usage -// ``` -// _ : aa.atanh2 : _; -// ``` -declare atanh2 author "Dario Sanfilippo"; -declare atanh2 copyright "Copyright (C) 2021 Dario Sanfilippo - "; -declare atanh2 license "LGPL v3.0 license"; -atanh2(x) = ADAA2(EPS, f, F1, F2, x) - with { - EPS = 1.0 / ma.SR; - f(x_f) = Ratanh(x_f); - F1(x_F1) = .5 * Rlog(1.0 - x_F1 ^ 2.0) + x_F1 * f(x_F1); - F2(x_F2) = .5 * x_F2 ^ 2.0 * f(x_F2) + x_F2 / 2.0 + .25 * - Rlog(1.0 - x_F2) - .25 * Rlog(1.0 + x_F2); - }; -// ----------------------------------------------------------------------------- diff --git a/dist/examples/LIBRARIES/all.lib b/dist/examples/LIBRARIES/all.lib deleted file mode 100644 index 66779430..00000000 --- a/dist/examples/LIBRARIES/all.lib +++ /dev/null @@ -1,37 +0,0 @@ -//##################################### all.lib ########################################## -// The purpose of this library is to give access to all the Faust standard libraries -// from a single point. -//######################################################################################## - -import("aanl.lib"); -import("analyzers.lib"); -import("basics.lib"); -import("compressors.lib"); -import("delays.lib"); -import("demos.lib"); -import("dx7.lib"); -import("envelopes.lib"); -import("fds.lib"); -import("filters.lib"); -import("hoa.lib"); -import("interpolators.lib"); -import("maths.lib"); -import("mi.lib"); -import("misceffects.lib"); -import("oscillators.lib"); -import("noises.lib"); -import("phaflangers.lib"); -import("physmodels.lib"); -import("quantizers.lib"); -import("reducemaps.lib"); -import("reverbs.lib"); -import("routes.lib"); -import("signals.lib"); -import("soundfiles.lib"); -import("spats.lib"); -import("synths.lib"); -import("vaeffects.lib"); -import("version.lib"); -import("wdmodels.lib"); -import("webaudio.lib"); - diff --git a/dist/examples/LIBRARIES/analyzers.lib b/dist/examples/LIBRARIES/analyzers.lib deleted file mode 100644 index 7246a9de..00000000 --- a/dist/examples/LIBRARIES/analyzers.lib +++ /dev/null @@ -1,873 +0,0 @@ -//################################ analyzers.lib ########################################## -// Analyzers library. Its official prefix is `an`. -//######################################################################################## - -ma = library("maths.lib"); -ba = library("basics.lib"); -ro = library("routes.lib"); -si = library("signals.lib"); -fi = library("filters.lib"); -an = library("analyzers.lib"); // for compatible copy/paste out of this file - -declare name "Faust Analyzer Library"; -declare version "0.1"; - -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2017 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -All MarkDown comments in this section is Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and is released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees) - -************************************************************************/ - -//==============================Amplitude Tracking======================================== -//======================================================================================== - -//------------------`(an.)abs_envelope_rect`----------------------------------- -// Absolute value average with moving-average algorithm. -// -// #### Usage -// -// ``` -// _ : abs_envelope_rect(period) : _; -// ``` -// -// Where: -// -// * `period`: sets the averaging frame in seconds -//----------------------------------------------------------------------------- -declare abs_envelope_rect author "Dario Sanfilippo and Julius O. Smith III"; -declare abs_envelope_rect copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare abs_envelope_rect license "MIT-style STK-4.3 license"; -abs_envelope_rect(period, x) = abs(x) : fi.avg_rect(period); - - -//------------------`(an.)abs_envelope_tau`------------------------------------ -// Absolute value average with one-pole lowpass and tau response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : abs_envelope_tau(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 1/e) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare abs_envelope_tau author "Dario Sanfilippo and Julius O. Smith III"; -declare abs_envelope_tau copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare abs_envelope_tau license "MIT-style STK-4.3 license"; -abs_envelope_tau(period, x) = abs(x) : fi.avg_tau(period); - - -//------------------`(an.)abs_envelope_t60`------------------------------------ -// Absolute value average with one-pole lowpass and t60 response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : abs_envelope_t60(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 60 dB) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare abs_envelope_t60 author "Dario Sanfilippo and Julius O. Smith III"; -declare abs_envelope_t60 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare abs_envelope_t60 license "MIT-style STK-4.3 license"; -abs_envelope_t60(period, x) = abs(x) : fi.avg_t60(period); - - -//------------------`(an.)abs_envelope_t19`------------------------------------ -// Absolute value average with one-pole lowpass and t19 response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : abs_envelope_t19(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 1/e^2.2) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare abs_envelope_t19 author "Dario Sanfilippo and Julius O. Smith III"; -declare abs_envelope_t19 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare abs_envelope_t19 license "MIT-style STK-4.3 license"; -abs_envelope_t19(period, x) = abs(x) : fi.avg_t19(period); - - -//---------------------------`(an.)amp_follower`--------------------------- -// Classic analog audio envelope follower with infinitely fast rise and -// exponential decay. The amplitude envelope instantaneously follows -// the absolute value going up, but then floats down exponentially. -// -// `amp_follower` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : amp_follower(rel) : _ -// ``` -// -// Where: -// -// * `rel`: release time = amplitude-envelope time-constant (sec) going down -// -// #### Reference -// -// * Musical Engineer's Handbook, Bernie Hutchins, Ithaca NY, 1975 Electronotes -// Newsletter, Bernie Hutchins -//------------------------------------------------------------ -amp_follower(rel) = abs : env with { - p = ba.tau2pole(rel); - env(x) = x * (1.0 - p) : (+ : max(x,_)) ~ *(p); -}; - -peak_envelope = amp_follower; // Synonym for more standard naming - - -//---------------------------`(an.)amp_follower_ud`--------------------------- -// Envelope follower with different up and down time-constants -// (also called a "peak detector"). -// -// #### Usage -// -// ``` -// _ : amp_follower_ud(att,rel) : _ -// ``` -// -// Where: -// -// * `att`: attack time = amplitude-envelope time constant (sec) going up -// * `rel`: release time = amplitude-envelope time constant (sec) going down -// -// #### Note -// -// We assume rel >> att. Otherwise, consider rel ~ max(rel,att). -// For audio, att is normally faster (smaller) than rel (e.g., 0.001 and 0.01). -// Use `amp_follower_ar` below to remove this restriction. -// -// #### Reference -// -// * "Digital Dynamic Range Compressor Design --- A Tutorial and Analysis", by -// Dimitrios Giannoulis, Michael Massberg, and Joshua D. Reiss -// -//------------------------------------------------------------ -amp_follower_ud(att,rel) = amp_follower(rel) : si.smooth(ba.tau2pole(att)); - - -//---------------`(an.)amp_follower_ar`---------------- -// Envelope follower with independent attack and release times. The -// release can be shorter than the attack (unlike in `amp_follower_ud` -// above). -// -// #### Usage -// -// ``` -// _ : amp_follower_ar(att,rel) : _; -// ``` -// * Author Jonatan Liljedahl, revised by RM -//--------------------------------------------------------- -amp_follower_ar(att,rel) = abs : si.lag_ud(att,rel); - - -//------------------`(an.)ms_envelope_rect`------------------------------------ -// Mean square with moving-average algorithm. -// -// #### Usage -// -// ``` -// _ : ms_envelope_rect(period) : _; -// ``` -// -// Where: -// -// * `period`: sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare ms_envelope_rect author "Dario Sanfilippo and Julius O. Smith III"; -declare ms_envelope_rect copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare ms_envelope_rect license "MIT-style STK-4.3 license"; -ms_envelope_rect(period, x) = x * x : fi.avg_rect(period); - - -//------------------`(an.)ms_envelope_tau`------------------------------------- -// Mean square average with one-pole lowpass and tau response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : ms_envelope_tau(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 1/e) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare ms_envelope_tau author "Dario Sanfilippo and Julius O. Smith III"; -declare ms_envelope_tau copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare ms_envelope_tau license "MIT-style STK-4.3 license"; -ms_envelope_tau(period, x) = x * x : fi.avg_tau(period); - - -//------------------`(an.)ms_envelope_t60`------------------------------------- -// Mean square with one-pole lowpass and t60 response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : ms_envelope_t60(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 60 dB) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare ms_envelope_t60 author "Dario Sanfilippo and Julius O. Smith III"; -declare ms_envelope_t60 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare ms_envelope_t60 license "MIT-style STK-4.3 license"; -ms_envelope_t60(period, x) = x * x : fi.avg_t60(period); - - -//------------------`(an.)ms_envelope_t19`------------------------------------- -// Mean square with one-pole lowpass and t19 response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : ms_envelope_t19(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 1/e^2.2) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare ms_envelope_t19 author "Dario Sanfilippo and Julius O. Smith III"; -declare ms_envelope_t19 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare ms_envelope_t19 license "MIT-style STK-4.3 license"; -ms_envelope_t19(period, x) = x * x : fi.avg_t19(period); - - -//------------------`(an.)rms_envelope_rect`----------------------------------- -// Root mean square with moving-average algorithm. -// -// #### Usage -// -// ``` -// _ : rms_envelope_rect(period) : _; -// ``` -// -// Where: -// -// * `period`: sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare rms_envelope_rect author "Dario Sanfilippo and Julius O. Smith III"; -declare rms_envelope_rect copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare rms_envelope_rect license "MIT-style STK-4.3 license"; -rms_envelope_rect(period, x) = ms_envelope_rect(period, x) : sqrt; - - -//------------------`(an.)rms_envelope_tau`------------------------------------ -// Root mean square with one-pole lowpass and tau response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : rms_envelope_tau(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 1/e) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare rms_envelope_tau author "Dario Sanfilippo and Julius O. Smith III"; -declare rms_envelope_tau copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare rms_envelope_tau license "MIT-style STK-4.3 license"; -rms_envelope_tau(period, x) = ms_envelope_tau(period, x) : sqrt; - - -//------------------`(an.)rms_envelope_t60`------------------------------------ -// Root mean square with one-pole lowpass and t60 response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : rms_envelope_t60(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 60 dB) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare rms_envelope_t60 author "Dario Sanfilippo and Julius O. Smith III"; -declare rms_envelope_t60 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare rms_envelope_t60 license "MIT-style STK-4.3 license"; -rms_envelope_t60(period, x) = ms_envelope_t60(period, x) : sqrt; - - -//------------------`(an.)rms_envelope_t19`------------------------------------ -// Root mean square with one-pole lowpass and t19 response. -// (See filters.lib.) -// -// #### Usage -// -// ``` -// _ : rms_envelope_t19(period) : _; -// ``` -// -// Where: -// -// * `period`: (time to decay by 1/e^2.2) sets the averaging frame in secs -//----------------------------------------------------------------------------- -declare rms_envelope_t19 author "Dario Sanfilippo and Julius O. Smith III"; -declare rms_envelope_t19 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare rms_envelope_t19 license "MIT-style STK-4.3 license"; -rms_envelope_t19(period, x) = ms_envelope_t19(period, x) : sqrt; - - -//-----------------------`(an.)zcr`-------------------------------------------- -// Zero-crossing rate (ZCR) with one-pole lowpass averaging based on the tau -// constant. It outputs an index between 0 and 1 at a desired analysis frame. -// The ZCR of a signal correlates with the noisiness [Gouyon et al. 2000] and -// the spectral centroid [Herrera-Boyer et al. 2006] of a signal. -// For sinusoidal signals, the ZCR can be multiplied by ma.SR/2 and used -// as a frequency detector. For example, it can be deployed as a -// computationally efficient adaptive mechanism for automatic Larsen -// suppression. -// -// #### Usage -// -// ``` -// _ : zcr(tau) : _; -// ``` -// -// Where: -// -// * `tau`: (time to decay by e^-1) sets the averaging frame in seconds. -declare zcr author "Dario Sanfilippo"; -declare zcr copyright "Copyright (C) 2020 Dario Sanfilippo - "; -declare zcr license "MIT-style STK-4.3 license"; -zcr(period, x) = ma.zc(x) : fi.lptau(period); - - -//=============================Spectrum-Analyzers========================================= -// Spectrum-analyzers split the input signal into a bank of parallel signals, one for -// each spectral band. They are related to the Mth-Octave Filter-Banks in `filters.lib`. -// The documentation of this library contains more details about the implementation. -// The parameters are: -// -// * `M`: number of band-slices per octave (>1) -// * `N`: total number of bands (>2) -// * `ftop` = upper bandlimit of the Mth-octave bands ( -//======================================================================================== - - -//-------------------------`(an.)mth_octave_analyzer`---------------------------- -// Octave analyzer. -// `mth_octave_analyzer[N]` are standard Faust functions. -// -// #### Usage -// ``` -// _ : mth_octave_analyzer(O,M,ftop,N) : par(i,N,_); // Oth-order Butterworth -// _ : mth_octave_analyzer6e(M,ftop,N) : par(i,N,_); // 6th-order elliptic -// ``` -// -// Also for convenience: -// -// ``` -// _ : mth_octave_analyzer3(M,ftop,N) : par(i,N,_); // 3d-order Butterworth -// _ : mth_octave_analyzer5(M,ftop,N) : par(i,N,_); // 5th-roder Butterworth -// mth_octave_analyzer_default = mth_octave_analyzer6e; -// ``` -// -// Where: -// -// * `O`: order of filter used to split each frequency band into two -// * `M`: number of band-slices per octave -// * `ftop`: highest band-split crossover frequency (e.g., 20 kHz) -// * `N`: total number of bands (including dc and Nyquist) -//------------------------------------------------------------ -mth_octave_analyzer6e(M,ftop,N) = _ <: bsplit(N-1) with { - fc(n) = ftop * 2^(float(n-N+1)/float(M)); // -3dB crossover frequencies - lp(n) = fi.lowpass6e(fc(n)); // 6th-order elliptic - see other choices above - hp(n) = fi.highpass6e(fc(n)); // (search for lowpass* and highpass*) - bsplit(0) = _; - bsplit(i) = hp(i), (lp(i) <: bsplit(i-1)); -}; - -// Butterworth analyzers may be cascaded with allpass -// delay-equalizers to make (allpass-complementary) filter banks: - -mth_octave_analyzer(O,M,ftop,N) = _ <: bsplit(N-1) with { - fc(n) = ftop * 2^(float(n-N+1)/float(M)); - lp(n) = fi.lowpass(O,fc(n)); // Order O Butterworth - hp(n) = fi.highpass(O,fc(n)); - bsplit(0) = _; - bsplit(i) = hp(i), (lp(i) <: bsplit(i-1)); -}; - -mth_octave_analyzer3(M,ftop,N) = mth_octave_analyzer(3,M,ftop,N); -mth_octave_analyzer5(M,ftop,N) = mth_octave_analyzer(5,M,ftop,N); -mth_octave_analyzer_default = mth_octave_analyzer6e; // default analyzer - - -//============================Mth-Octave Spectral Level=================================== -// Spectral Level: Display (in bar graphs) the average signal level in each spectral band. -//======================================================================================== - - -//------------------------`(an.)mth_octave_spectral_level6e`------------------------- -// Spectral level display. -// -// #### Usage: -// -// ``` -// _ : mth_octave_spectral_level6e(M,ftop,NBands,tau,dB_offset) : _; -// ``` -// -// Where: -// -// * `M`: bands per octave -// * `ftop`: lower edge frequency of top band -// * `NBands`: number of passbands (including highpass and dc bands), -// * `tau`: spectral display averaging-time (time constant) in seconds, -// * `dB_offset`: constant dB offset in all band level meters. -// -// Also for convenience: -// -// ``` -// mth_octave_spectral_level_default = mth_octave_spectral_level6e; -// spectral_level = mth_octave_spectral_level(2,10000,20); -// ``` -//------------------------------------------------------------ -mth_octave_spectral_level6e(M,ftop,N,tau,dB_offset) = _<: - _,mth_octave_analyzer6e(M,ftop,N) : - _,(display:>_):attach with { - display = par(i,N,dbmeter(i)); - dbmeter(i) = abs : si.smooth(ba.tau2pole(tau)) : max(ma.EPSILON) : ba.linear2db : +(dB_offset) : - meter(N-i-1); - meter(i) = speclevel_group(vbargraph("[%2i] [unit:dB] - [tooltip: Spectral Band Level in dB]", -50, 10)); - O = int(((N-2)/M)+0.4999); - speclevel_group(x) = hgroup("[0] CONSTANT-Q SPECTRUM ANALYZER (6E), %N bands spanning - LP, %O octaves below %ftop Hz, HP - [tooltip: See Faust's filters.lib for documentation and references]", x); -}; - -mth_octave_spectral_level_default = mth_octave_spectral_level6e; -spectral_level = mth_octave_spectral_level(2,10000,20); // simple default - - -//---------------`(an.)[third|half]_octave_[analyzer|filterbank]`---------------- -// A bunch of special cases based on the different analyzer functions described above: -// -// ``` -// third_octave_analyzer(N) = mth_octave_analyzer_default(3,10000,N); -// third_octave_filterbank(N) = mth_octave_filterbank_default(3,10000,N); -// half_octave_analyzer(N) = mth_octave_analyzer_default(2,10000,N); -// half_octave_filterbank(N) = mth_octave_filterbank_default(2,10000,N); -// octave_filterbank(N) = mth_octave_filterbank_default(1,10000,N); -// octave_analyzer(N) = mth_octave_analyzer_default(1,10000,N); -// ``` -// -// #### Usage -// -// See `mth_octave_spectral_level_demo` in `demos.lib`. -//------------------------------------------------------------ -third_octave_analyzer(N) = mth_octave_analyzer_default(3,10000,N); -third_octave_filterbank(N) = mth_octave_filterbank_default(3,10000,N); -// Third-Octave Filter-Banks have been used in audio for over a century. -// See, e.g., -// Acoustics [the book], by L. L. Beranek -// Amer. Inst. Physics for the Acoustical Soc. America, -// - -// Third-octave bands across the audio spectrum are too wide for current -// typical computer screens, so half-octave bands are the default: -half_octave_analyzer(N) = mth_octave_analyzer_default(2,10000,N); -half_octave_filterbank(N) = mth_octave_filterbank_default(2,10000,N); - -octave_filterbank(N) = mth_octave_filterbank_default(1,10000,N); -octave_analyzer(N) = mth_octave_analyzer_default(1,10000,N); - - -//===============Arbritary-Crossover Filter-Banks and Spectrum Analyzers================== -// These are similar to the Mth-octave analyzers above, except that the -// band-split frequencies are passed explicitly as arguments. -//======================================================================================== - -// ACKNOWLEDGMENT -// Technique for processing a variable number of signal arguments due -// to Yann Orlarey (as is the entire Faust framework!) - -//---------------`(an.)analyzer`-------------------------- -// Analyzer. -// -// #### Usage -// -// ``` -// _ : analyzer(O,freqs) : par(i,N,_); // No delay equalizer -// ``` -// -// Where: -// -// * `O`: band-split filter order (ODD integer required for filterbank[i]) -// * `freqs`: (fc1,fc2,...,fcNs) [in numerically ascending order], where -// Ns=N-1 is the number of octave band-splits -// (total number of bands N=Ns+1). -// -// If frequencies are listed explicitly as arguments, enclose them in parens: -// -// ``` -// _ : analyzer(3,(fc1,fc2)) : _,_,_ -// ``` -//--------------------------------------------------- -analyzer(O,lfreqs) = _ <: bsplit(nb) with -{ - nb = ba.count(lfreqs); - fc(n) = ba.take(n, lfreqs); - lp(n) = fi.lowpass(O,fc(n)); - hp(n) = fi.highpass(O,fc(n)); - bsplit(0) = _; - bsplit(i) = hp(i), (lp(i) <: bsplit(i-1)); -}; - -//================ Fast Fourier Transform (fft) and its Inverse (ifft) =================== -// Sliding FFTs that compute a rectangularly windowed FFT each sample. -//======================================================================================== - -//---------------`(an.)gortzelOpt` -------------------------- -// Optimized Goertzel filter. -// -// #### Usage -// -// ``` -// _ : goertzelOpt(freq,N) : _; -// ``` -// -// Where: -// -// * `freq`: frequency to be analyzed -// * `N`: the Goertzel block size -// -// #### Reference -// -// * -//--------------------------------------------------- -goertzelOpt(freq,N,x) = mg -with{ - mg = sqrt(eq^2 + eq'^2-eq*eq'*c) : ba.sAndH(reset0); // magnitude - cnt = ba.time%N; // counter for windowing - reset0 = cnt == (N-1); // reset when end of window - reset1 = 1-(cnt == 0); // reset when beginning of window - k = 0.5 + N*freq/ma.SR; - w = (2*ma.PI/N)*k; - c = 2*cos(w); - eq = s // equation - letrec{ - 's = c*s*reset1 - s'*reset1*reset1' + x; - }; -}; - -//---------------`(an.)gortzelComp` -------------------------- -// Complex Goertzel filter. -// -// #### Usage -// -// ``` -// _ : goertzelComp(freq,N) : _; -// ``` -// -// Where: -// -// * `freq`: frequency to be analyzed -// * `N`: the Goertzel block size -// -// #### Reference -// -// * -//--------------------------------------------------- -goertzelComp(freq,N,x) = mg -with{ - mg = sqrt(real^2 + imag^2); // magnitude - cnt = ba.time%N; // counter for windowing - reset0 = cnt == (N-1); // reset when end of window - reset1 = 1-(cnt == 0); // reset when beginning of window - k = 0.5 + N*freq/ma.SR; - w = (2*ma.PI/N)*k; - sine = sin(w); - cosine = cos(w); - c = 2*cosine; - eq = s - letrec{ - 's = c*s*reset1 - s'*reset1*reset1' + x; - }; - real = eq - eq'*cosine; - imag = eq'*sine; -}; - -//---------------`(an.)goertzel` -------------------------- -// Same as [`goertzelOpt`](#goertzelopt). -// -// #### Usage -// -// ``` -// _ : goertzel(freq,N) : _; -// ``` -// -// Where: -// -// * `freq`: frequency to be analyzed -// * `N`: the Goertzel block size -// -// #### Reference -// -// * -//--------------------------------------------------- -goertzel = goertzelOpt; - -// Undocumented utility functions used by fft and ifft: -c_magsq(N) = si.cbus(N) : par(i,N,(par(j,2,abs<:_*_):>_)) :> si.bus(N); -c_magdb(N) = si.cbus(N) : an.c_magsq(N) : par(i,N,(max(ma.EPSILON):log10:*(10.0))); -c_select_pos_freqs(2) = (_,_), (_,_); // both dc and SR/2 included with "positive frequencies" -c_select_pos_freqs(N) = si.cbus(N) : par(i,N/2+1,(_,_)),par(i,N/2-1,(!,!)) : si.cbus(N/2+1); // for complex spectra - select_pos_freqs(2) = _,_; // both dc and SR/2 included - select_pos_freqs(N) = si.bus(N) : par(i,N/2+1, _), par(i,N/2-1, !) : si. bus(N/2+1); // real power spectra etc. - -rtorv(N,x) = par(i,N,x@i); // convert real scalar signal to length N real vector -rtocv(N,x) = par(i,N,(x@i,0)); // convert real scalar signal to length N complex vector with 0 imag part -rvtocv(N) = si.bus(N), par(i,N,0) : ro.interleave(N,2); // convert real N-vector to complex with 0 imag part - -bit_reverse_selector(N,0) = 0; -bit_reverse_selector(N,i) = int(int(N)>>1)*(i&1) + bit_reverse_selector(int(N)>>1,(i>>1)); - -// decimation in time does this to the input: -bit_reverse_shuffle(N) = si.bus(N) <: par(i,N,bit_reverse_permuter(N,i)) with { - bit_reverse_permuter(N,k) = ba.selector(bit_reverse_selector(N,k),N); -}; - -c_bit_reverse_shuffle(N) = si.cbus(N) <: par(i,N,c_bit_reverse_permuter(N,i)) with { - c_bit_reverse_permuter(N,k) = ba.cselector(bit_reverse_selector(N,k),N); -}; - - -//---------------`(an.)fft` -------------------------- -// Fast Fourier Transform (FFT). -// -// #### Usage -// -// ``` -// si.cbus(N) : fft(N) : si.cbus(N); -// ``` -// -// Where: -// -// * `si.cbus(N)` is a bus of N complex signals, each specified by real and imaginary parts: -// (r0,i0), (r1,i1), (r2,i2), ... -// * `N` is the FFT size (must be a power of 2: 2,4,8,16,...) -// * `fft(N)` performs a length `N` FFT for complex signals (radix 2) -// * The output is a bank of N complex signals containing the complex spectrum over time: -// (R0, I0), (R1,I1), ... -// - The dc component is (R0,I0), where I0=0 for real input signals. -// -// FFTs of Real Signals: -// -// * To perform a sliding FFT over a real input signal, you can say -// ``` -// process = signal : an.rtocv(N) : an.fft(N); -// ``` -// where `an.rtocv` converts a real (scalar) signal to a complex vector signal having a zero imaginary part. -// -// * See `an.rfft_analyzer_c` (in `analyzers.lib`) and related functions for more detailed usage examples. -// -// * Use `an.rfft_spectral_level(N,tau,dB_offset)` to display the power spectrum of a real signal. -// -// * See `dm.fft_spectral_level_demo(N)` in `demos.lib` for an example GUI driving `an.rfft_spectral_level()`. -// -// #### Reference -// -// * [Decimation-in-time (DIT) Radix-2 FFT](https://cnx.org/contents/zmcmahhR@7/Decimation-in-time-DIT-Radix-2) -// -//--------------------------------------------------- -fft(N) = si.cbus(N) : an.c_bit_reverse_shuffle(N) : an.fftb(N); // shuffle off to the butterflies: -fftb(1) = _,_; // each complex number is represented as (real,imag) -fftb(N) = si.cbus(N) : (fftb(No2) <: (si.cbus(No2), si.cbus(No2))), (fftb(No2) - <: (si.cbus(N):twiddleOdd(N))) :> si.cbus(N) -with { - No2 = int(N)>>1; - // Half of these multiplies can go away since w(k) = - w(k+N/2), and others as well (1,j,-j,-1,...) - twiddleOdd(N) = par(k,N,si.cmul(cos(w(k)),0-sin(w(k)))) - with { - w(k) = 2.0*ma.PI*float(k)/float(N); - }; -}; - -// `rfft` -// Slow to compile: rfft(N) = si.bus(N) : an.bit_reverse_shuffle(N) : an.rvtocv(N) : an.fftb(N); -// Order of magnitude faster to compile but takes a scalar input, so too different from fft: -// rfft(N) = an.rtocv(N) : an.fft(N); - -//---------------`(an.)ifft`-------------------------- -// Inverse Fast Fourier Transform (IFFT). -// -// #### Usage -// -// ``` -// si.cbus(N) : ifft(N) : si.cbus(N); -// ``` -// -// Where: -// -// * N is the IFFT size (power of 2) -// * Input is a complex spectrum represented as interleaved real and imaginary parts: -// (R0, I0), (R1,I1), (R2,I2), ... -// * Output is a bank of N complex signals giving the complex signal in the time domain: -// (r0, i0), (r1,i1), (r2,i2), ... -//--------------------------------------------------- -ifft(N) = si.cbus(N) : an.c_bit_reverse_shuffle(N) : an.ifftb(N); // input is shuffled off to the butterflies: -ifftb(1) = _,_; -ifftb(N) = si.cbus(N) : (ifftb(No2) <: (si.cbus(No2), si.cbus(No2))), (ifftb(No2) - <: (si.cbus(N):twiddleOddConj(N))) :> si.cbus(N) : par(i,2*N,/(2.0)) -with { - No2 = int(N)>>1; - // Half of these multiplies can go away since w(k) = - w(k+N/2), and others as well (1,j,-j,-1,...) - twiddleOddConj(N) = par(k,N,si.cmul(cos(w(k)),sin(w(k)))) - with { - w(k) = 2.0*ma.PI*float(k)/float(N); - }; -}; - - -// ========== FFT Analyzers ========== -rfft_analyzer_c(N) = an.rtocv(N) : an.fft(N) : an.c_select_pos_freqs(N); // complex spectral bins 0 to N/2 -rfft_analyzer_db(N) = an.rfft_analyzer_c(N) : an.c_magdb(N/2+1); // assumes real input -rfft_analyzer_magsq(N) = an.rfft_analyzer_c(N) : an.c_magsq(N/2+1); // assumes real input - -rfft_spectral_level(N,tau,dB_offset) = _<: _, an.rfft_analyzer_db(N) : _,(display:>_):attach with { - display = par(i,N/2+1,dbmeter(i)); - dbmeter(i) = si.smooth(ba.tau2pole(tau)) : +(dB_offset) : meter(i); - meter(i) = speclevel_group(vbargraph("[%2i] [unit:dB] - [tooltip: FFT Spectral Band Level in dB]", -50, 10)); - speclevel_group(x) = hgroup("[0] FFT SPECTRUM ANALYZER, %N bands - [tooltip: fft_spectral_level in Faust's analyzers.lib]", x); -}; - -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -// TODO: Add GRAME functions here - -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ diff --git a/dist/examples/LIBRARIES/basics.lib b/dist/examples/LIBRARIES/basics.lib deleted file mode 100644 index d46c33f2..00000000 --- a/dist/examples/LIBRARIES/basics.lib +++ /dev/null @@ -1,1797 +0,0 @@ -//#################################### basics.lib ######################################## -// A library of basic elements. Its official prefix is `ba`. -//######################################################################################## -// A library of basic elements for Faust organized in 5 sections: -// -// * Conversion Tools -// * Counters and Time/Tempo Tools -// * Array Processing/Pattern Matching -// * Selectors (Conditions) -// * Other Tools (Misc) - -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ma = library("maths.lib"); -ro = library("routes.lib"); -ba = library("basics.lib"); // for compatible copy/paste out of this file -fi = library("filters.lib"); -it = library("interpolators.lib"); -si = library("signals.lib"); - -declare name "Faust Basic Element Library"; -declare version "0.1"; - -//=============================Conversion Tools=========================================== -//======================================================================================== - -//-------`(ba.)samp2sec`---------- -// Converts a number of samples to a duration in seconds. -// `samp2sec` is a standard Faust function. -// -// #### Usage -// -// ``` -// samp2sec(n) : _ -// ``` -// -// Where: -// -// * `n`: number of samples -//---------------------------- -samp2sec(n) = n/ma.SR; - - -//-------`(ba.)sec2samp`---------- -// Converts a duration in seconds to a number of samples. -// `samp2sec` is a standard Faust function. -// -// #### Usage -// -// ``` -// sec2samp(d) : _ -// ``` -// -// Where: -// -// * `d`: duration in seconds -//---------------------------- -sec2samp(d) = d*ma.SR; - - -//-------`(ba.)db2linear`---------- -// Converts a loudness in dB to a linear gain (0-1). -// `db2linear` is a standard Faust function. -// -// #### Usage -// -// ``` -// db2linear(l) : _ -// ``` -// -// Where: -// -// * `l`: loudness in dB -//----------------------------- -db2linear(l) = pow(10.0, l/20.0); - - -//-------`(ba.)linear2db`---------- -// Converts a linear gain (0-1) to a loudness in dB. -// `linear2db` is a standard Faust function. -// -// #### Usage -// -// ``` -// linear2db(g) : _ -// ``` -// -// Where: -// -// * `g`: a linear gain -//----------------------------- -linear2db(g) = 20.0*log10(g); - - -//----------`(ba.)lin2LogGain`------------------ -// Converts a linear gain (0-1) to a log gain (0-1). -// -// #### Usage -// -// ``` -// lin2LogGain(n) : _ -// ``` -//--------------------------------------------- -lin2LogGain(n) = n*n; - - -//----------`(ba.)log2LinGain`------------------ -// Converts a log gain (0-1) to a linear gain (0-1). -// -// #### Usage -// -// ``` -// log2LinGain(n) : _ -// ``` -//--------------------------------------------- -log2LinGain(n) = sqrt(n); - - -// end GRAME section -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2017 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -The MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees) - -************************************************************************/ - -//-------`(ba.)tau2pole`---------- -// Returns a real pole giving exponential decay. -// Note that t60 (time to decay 60 dB) is ~6.91 time constants. -// `tau2pole` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : smooth(tau2pole(tau)) : _ -// ``` -// -// Where: -// -// * `tau`: time-constant in seconds -//----------------------------- -// tau2pole(tau) = exp(-1.0/(tau*ma.SR)); - -tau2pole(tau) = ba.if(clipCond, 0.0, exp(-1.0/(tauCenterClipped*float(ma.SR)))) with { - clipCond = abs(tau)0, n, max(0, c-1))) ~_; - - -//----------------------------`(ba.)countup`-------------------------------- -// Starts counting up from 0 to n included. While trig is 1 the output is 0. -// The countup starts with the transition of trig from 1 to 0. At the end -// of the countup the output value will remain at n until the next trig. -// `countup` is a standard Faust function. -// -// #### Usage -// -// ``` -// countup(n,trig) : _ -// ``` -// -// Where: -// -// * `n`: the maximum count value -// * `trig`: the trigger signal (1: start at 0; 0: increase until `n`) -//----------------------------------------------------------------------------- -countup(n, trig) = \(c).(if(trig>0, 0, min(n, c+1))) ~_; - - -//--------------------`(ba.)sweep`-------------------------- -// Counts from 0 to `period-1` repeatedly, generating a -// sawtooth waveform, like os.lf_rawsaw, -// starting at 1 when `run` transitions from 0 to 1. -// Outputs zero while `run` is 0. -// -// #### Usage -// -// ``` -// sweep(period,run) : _ -// ``` -//----------------------------------------------------------------- -// Author: Jonatan Liljedahl, markdown by JOS & RM -sweep = %(int(*:max(1)))~+(1); - - -//-------`(ba.)time`---------- -// A simple timer that counts every samples from the beginning of the process. -// `time` is a standard Faust function. -// -// #### Usage -// -// ``` -// time : _ -// ``` -//------------------------ -time = (+(1)~_) - 1; - - -//-------`(ba.)ramp`---------- -// An linear ramp of 'n' samples to reach the next value -// -// #### Usage -// -// ``` -// _ : ramp(n) : _ -// ``` -// Where: -// -// * `n`: number of samples to reach the next value -//------------------------ -ramp = case { - (0) => _; - (n) => \(y,x).(if(y+1.0/n < x, y+1.0/n, if(y-1.0/n > x, y-1.0/n, x))) ~ _; -}; - - -//-------`(ba.)tempo`---------- -// Converts a tempo in BPM into a number of samples. -// -// #### Usage -// -// ``` -// tempo(t) : _ -// ``` -// -// Where: -// -// * `t`: tempo in BPM -//------------------------ -tempo(t) = (60*ma.SR)/t; - - -//-------`(ba.)period`---------- -// Basic sawtooth wave of period `p`. -// -// #### Usage -// -// ``` -// period(p) : _ -// ``` -// -// Where: -// -// * `p`: period as a number of samples -//------------------------ -// NOTE: may be this should go in oscillators.lib -period(p) = %(int(p))~+(1'); - - -//-------`(ba.)pulse`---------- -// Pulses (10000) generated at period `p`. -// -// #### Usage -// -// ``` -// pulse(p) : _ -// ``` -// -// Where: -// -// * `p`: period as a number of samples -//------------------------ -// NOTE: may be this should go in oscillators.lib -pulse(p) = period(p)==0; - - -//-------`(ba.)pulsen`---------- -// Pulses (11110000) of length `n` generated at period `p`. -// -// #### Usage -// -// ``` -// pulsen(n,p) : _ -// ``` -// -// Where: -// -// * `n`: pulse length as a number of samples -// * `p`: period as a number of samples -//------------------------ -// NOTE: may be this should go in oscillators.lib -pulsen(n,p) = period(p)= n); -}; - - -//===============================Array Processing/Pattern Matching======================== -//======================================================================================== - -//---------------------------------`(ba.)count`--------------------------------- -// Count the number of elements of list l. -// `count` is a standard Faust function. -// -// #### Usage -// -// ``` -// count(l) -// count((10,20,30,40)) -> 4 -// ``` -// -// Where: -// -// * `l`: list of elements -//----------------------------------------------------------------------------- -count((xs, xxs)) = 1 + count(xxs); -count(xx) = 1; - - -//-------------------------------`(ba.)take`----------------------------------- -// Take an element from a list. -// `take` is a standard Faust function. -// -// #### Usage -// -// ``` -// take(P,l) -// take(3,(10,20,30,40)) -> 30 -// ``` -// -// Where: -// -// * `P`: position (int, known at compile time, P > 0) -// * `l`: list of elements -//----------------------------------------------------------------------------- -take(1, (xs, xxs)) = xs; -take(1, xs) = xs; -take(nn, (xs, xxs)) = take(nn-1, xxs); - - -//----------------------------`(ba.)subseq`-------------------------------- -// Extract a part of a list. -// -// #### Usage -// -// ``` -// subseq(l, p, n) -// subseq((10,20,30,40,50,60), 1, 3) -> (20,30,40) -// subseq((10,20,30,40,50,60), 4, 1) -> 50 -// ``` -// -// Where: -// -// * `l`: list -// * `p`: start point (0: begin of list) -// * `n`: number of elements -// -// #### Note: -// -// Faust doesn't have proper lists. Lists are simulated with parallel -// compositions and there is no empty list. -//----------------------------------------------------------------------------- -subseq((head, tail), 0, 1) = head; -subseq((head, tail), 0, n) = head, subseq(tail, 0, n-1); -subseq((head, tail), p, n) = subseq(tail, p-1, n); -subseq(head, 0, n) = head; - - -//============================Function tabulation========================================= -//======================================================================================== - -//-------`(ba.)tabulate`---------- -// Tabulate an unary function on a [r0, r1] range in a table. -// The table value can then be read directly or with linear or cubic interpolation. -// -// #### Usage -// -// ``` -// tabulate(C, fun, size, r0, r1, x).(val | lin | cub) -// ``` -// -// Where: -// -// * `C`: whether to dynamically force the index in [r0, r1] range: 1 force the check, 0 deactivate it (given at compile time) -// * `fun`: unary function -// * `size`: size of the table (integer) -// * `r0`: range minimal value -// * `r1`: range maximal value -// * `x`: input value to compute using the tabulated function -// -// ``` -// tabulate(C, fun, size, r0, r1, x).val uses the value in the table -// ``` -// -// ``` -// tabulate(C, fun, size, r0, r1, x).lin uses the value in the table with linear interpolation -// ``` -// -// ``` -// tabulate(C, fun, size, r0, r1, x).cub uses the value in the table with cubic interpolation -// ``` -//-------------------------------------------- -tabulate(C, fun, size, r0, r1, x) = environment { - - // Maximum index to access - mid = size-1; - - // Create the table - wf(size) = r0 + float(ba.time)*(r1-r0)/float(mid) : fun; - - // Prepare the 'float' table read index - id = (x-r0)/(r1-r0)*mid; - - // Limit the table read index in [0, mid] if C = 1 - rid(x, 0) = x; - rid(x, 1) = max(0, min(x, mid)); - - // Tabulate an unary 'fun' function on a range [r0, r1] - val = y0 with { y0 = rdtable(size, wf(size), rid(int(id), C)); }; - - // Tabulate an unary 'fun' function on a range [r0, r1] with linear interpolation - lin = it.interpolate_linear(d,y0,y1) - with { - x0 = int(id); - x1 = x0+1; - d = id-x0; - y0 = rdtable(size, wf(size), rid(x0, C)); - y1 = rdtable(size, wf(size), rid(x1, C)); - }; - - // Tabulate an unary 'fun' function on a range [r0, r1] with cubic interpolation - cub = it.interpolate_cubic(d,y0,y1,y2,y3) - with { - x0 = x1-1; - x1 = int(id); - x2 = x1+1; - x3 = x2+1; - d = id-x1; - y0 = rdtable(size, wf(size), rid(x0, C)); - y1 = rdtable(size, wf(size), rid(x1, C)); - y2 = rdtable(size, wf(size), rid(x2, C)); - y3 = rdtable(size, wf(size), rid(x3, C)); - }; -}; - - -//============================Selectors (Conditions)====================================== -//======================================================================================== - -//-----------------------------`(ba.)if`----------------------------------- -// if-then-else implemented with a select2. WARNING: since select2 is strict (always evaluating both branches), -// the resulting if does not have the usual "lazy" semantic of the C if form, and thus cannot be used to -// protect against forbidden computations like division-by-zero for instance. -// -// #### Usage -// -// * `if(cond, then, else) : _` -// -// Where: -// -// * `cond`: condition -// * `then`: signal selected while cond is true -// * `else`: signal selected while cond is false -//----------------------------------------------------------------------------- -if(cond,then,else) = select2(cond,else,then); -// TODO: perhaps it would make more sense to have an if(a,b) and an ifelse(a,b,c)? - - -//-----------------------------`(ba.)selector`--------------------------------- -// Selects the ith input among n at compile time. -// -// #### Usage -// -// ``` -// selector(I,N) -// _,_,_,_ : selector(2,4) : _ // selects the 3rd input among 4 -// ``` -// -// Where: -// -// * `I`: input to select (int, numbered from 0, known at compile time) -// * `N`: number of inputs (int, known at compile time, N > I) -// -// There is also cselector for selecting among complex input signals of the form (real,imag). -// -//----------------------------------------------------------------------------- -selector(i,n) = par(j, n, S(i, j)) with { S(i,i) = _; S(i,j) = !; }; -cselector(i,n) = par(j, n, S(i, j)) with { S(i,i) = (_,_); S(i,j) = (!,!); }; // for complex numbers - - -//--------------------`(ba.)select2stereo`-------------------- -// Select between 2 stereo signals. -// -// #### Usage -// -// ``` -// _,_,_,_ : select2stereo(bpc) : _,_ -// ``` -// -// Where: -// -// * `bpc`: the selector switch (0/1) -//------------------------------------------------------------ -select2stereo(bpc) = ro.cross2 : select2(bpc), select2(bpc) : _,_; - - -//-----------------------------`(ba.)selectn`--------------------------------- -// Selects the ith input among N at run time. -// -// #### Usage -// -// ``` -// selectn(N,i) -// _,_,_,_ : selectn(4,2) : _ // selects the 3rd input among 4 -// ``` -// -// Where: -// -// * `N`: number of inputs (int, known at compile time, N > 0) -// * `i`: input to select (int, numbered from 0) -// -// #### Example test program -// -// ``` -// N = 64; -// process = par(n, N, (par(i,N,i) : selectn(N,n))); -// ``` -//----------------------------------------------------------------------------- -selectn(N,i) = selectnX(N,i,selector) -with { - selector(i,j,x,y) = select2((i >= j), x, y); -}; - -// The generic version with a 'sel' function to be applied on: -// - the channel index as a (possibly) fractional value -// - the next channel index as an integer value -// - the 2 signals to be selected between - -selectnX(N,i,sel) = S(N,0) -with { - S(1,offset) = _; - S(n,offset) = S(left, offset), S(right, offset+left) : sel(i, offset+left) - with { - right = int(n/2); - left = n-right; - }; -}; - - -//-----------------------------`(ba.)selectmulti`--------------------------------- -// Selects the ith circuit among N at run time (all should have the same number of inputs and outputs) -// with a crossfade. -// -// #### Usage -// -// ``` -// selectmulti(n,lgen,id) -// ``` -// -// Where: -// -// * `n`: crossfade in samples -// * `lgen`: list of circuits -// * `id`: circuit to select (int, numbered from 0) -// -// #### Example test program -// -// ``` -// process = selectmulti(ma.SR/10, ((3,9),(2,8),(5,7)), nentry("choice", 0, 0, 2, 1)); -// process = selectmulti(ma.SR/10, ((_*3,_*9),(_*2,_*8),(_*5,_*7)), nentry("choice", 0, 0, 2, 1)); -// ``` -//----------------------------------------------------------------------------- -selectmulti(n, lgen, id) = selectmultiX(ins, lgen, id) -with { - selectmultiX(0, lgen, id) = selector; // No inputs - selectmultiX(N, lgen, id) = par(i, ins, _) <: selector; // General case - - selector = lgen : ro.interleave(outs, N) : par(i, outs, selectnX(N, id, xfade)) - with { - // crossfade of 'n' samples between 'x' and 'y' channels when the channel index changes - xfade(i, j, x, y) = x*(1-xb) + y*xb with { xb = ramp(n, (i >= j)); }; - }; - - outs = outputs(take(1, lgen)); // Number of outputs of the first circuit (all should have the same value) - ins = inputs(take(1, lgen)); // Number of inputs of the first circuit (all should have the same value) - N = outputs(lgen)/outs; // Number of items in the list -}; - - -//=====================================Other============================================== -//======================================================================================== - -//----------------------------`(ba.)latch`-------------------------------- -// Latch input on positive-going transition of "clock" ("sample-and-hold"). -// -// #### Usage -// -// ``` -// _ : latch(clocksig) : _ -// ``` -// -// Where: -// -// * `clocksig`: hold trigger (0 for hold, 1 for bypass) -//------------------------------------------------------------ -latch(c,x) = x * s : + ~ *(1-s) with { s = ((c'<=0)&(c>0)); }; - - -//--------------------------`(ba.)sAndH`------------------------------- -// Sample And Hold. -// `sAndH` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : sAndH(t) : _ -// ``` -// -// Where: -// -// * `t`: hold trigger (0 for hold, 1 for bypass) -//---------------------------------------------------------------- -// Author: RM -sAndH(t) = select2(t,_,_)~_; - - -//--------------------------`(ba.)downSample`------------------------------- -// Down sample a signal. WARNING: this function doesn't change the -// rate of a signal, it just holds samples... -// `downSample` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : downSample(freq) : _ -// ``` -// -// Where: -// -// * `freq`: new rate in Hz -//---------------------------------------------------------------- -// Author: RM -downSample(freq) = sAndH(hold) -with { - hold = time%int(ma.SR/freq) == 0; -}; - - -//------------------`(ba.)peakhold`--------------------------- -// Outputs current max value above zero. -// -// #### Usage -// -// ``` -// _ : peakhold(mode) : _; -// ``` -// -// Where: -// -// `mode` means: -// 0 - Pass through. A single sample 0 trigger will work as a reset. -// 1 - Track and hold max value. -//---------------------------------------------------------------- -// TODO: author Jonatan Liljedahl, revised by RM -peakhold = (*,_:max) ~ _; - - -//------------------`(ba.)peakholder`--------------------------- -// Tracks abs peak and holds peak for 'n' samples. -// -// #### Usage -// -// ``` -// _ : peakholder(n) : _; -// ``` -// -// Where: -// -// * `n`: number of samples -//---------------------------------------------------------------- -// TODO: author Jonatan Liljedahl -peakholder(n) = peakhold2 ~ reset : (!,_) with { - reset = sweep(n) > 0; - // first out is gate that is 1 while holding last peak - peakhold2 = _,abs <: peakhold,!,_ <: >=,_,!; -}; - - -//--------------------------`(ba.)impulsify`--------------------------- -// Turns a signal into an impulse with the value of the current sample -// (0.3,0.2,0.1 becomes 0.3,0.0,0.0). This function is typically used with a -// `button` to turn its output into an impulse. `impulsify` is a standard Faust -// function. -// -// #### Usage -// -// ``` -// button("gate") : impulsify; -// ``` -//---------------------------------------------------------------- -impulsify = _ <: _,mem : - <: >(0)*_; - - -//-----------------------`(ba.)automat`------------------------------ -// Record and replay to the values the input signal in a loop. -// -// #### Usage -// -// ``` -// hslider(...) : automat(bps, size, init) : _ -// ``` -//----------------------------------------------------------------------- -automat(bps, size, init, input) = rwtable(size+1, init, windex, input, rindex) -with { - clock = beat(bps); - rindex = int(clock) : (+ : %(size)) ~ _; // each clock read the next entry of the table - windex = if(timeToRenew, rindex, size); // we ignore input unless it is time to renew - timeToRenew = int(clock) & (inputHasMoved | (input <= init)); - inputHasMoved = abs(input-input') : countfrom(int(clock)') : >(0); - countfrom(reset) = (+ : if(reset, 0, _)) ~ _; -}; - - -//-----------------`(ba.)bpf`------------------- -// bpf is an environment (a group of related definitions) that can be used to -// create break-point functions. It contains three functions: -// -// * `start(x,y)` to start a break-point function -// * `end(x,y)` to end a break-point function -// * `point(x,y)` to add intermediate points to a break-point function -// -// A minimal break-point function must contain at least a start and an end point: -// -// ``` -// f = bpf.start(x0,y0) : bpf.end(x1,y1); -// ``` -// -// A more involved break-point function can contains any number of intermediate -// points: -// -// ``` -// f = bpf.start(x0,y0) : bpf.point(x1,y1) : bpf.point(x2,y2) : bpf.end(x3,y3); -// ``` -// -// In any case the `x_{i}` must be in increasing order (for all `i`, `x_{i} < x_{i+1}`). -// For example the following definition: -// -// ``` -// f = bpf.start(x0,y0) : ... : bpf.point(xi,yi) : ... : bpf.end(xn,yn); -// ``` -// -// implements a break-point function f such that: -// -// * `f(x) = y_{0}` when `x < x_{0}` -// * `f(x) = y_{n}` when `x > x_{n}` -// * `f(x) = y_{i} + (y_{i+1}-y_{i})*(x-x_{i})/(x_{i+1}-x_{i})` when `x_{i} <= x` -// and `x < x_{i+1}` -// -// `bpf` is a standard Faust function. -//-------------------------------------------------------- -bpf = environment -{ - // Start a break-point function - start(x0,y0) = \(x).(x0,y0,x,y0); - // Add a break-point - point(x1,y1) = \(x0,y0,x,y).(x1, y1, x, if(x < x0, y, if(x < x1, y0 + (x-x0)*(y1-y0)/(x1-x0), y1))); - // End a break-point function - end(x1,y1) = \(x0,y0,x,y).(if(x < x0, y, if(x < x1, y0 + (x-x0)*(y1-y0)/(x1-x0), y1))); -}; - - -//-------------------`(ba.)listInterp`------------------------- -// Linearly interpolates between the elements of a list. -// -// #### Usage -// -// ``` -// index = 1.69; // range is 0-4 -// process = listInterp((800,400,350,450,325),index); -// ``` -// -// Where: -// -// * `index`: the index (float) to interpolate between the different values. -// The range of `index` depends on the size of the list. -//------------------------------------------------------------ -// Author: RM -listInterp(v) = - bpf.start(0,take(1,v)) : - seq(i,count(v)-2,bpf.point(i+1,take(i+2,v))) : - bpf.end(count(v)-1,take(count(v),v)); - - -//-------------------`(ba.)bypass1`------------------------- -// Takes a mono input signal, route it to `e` and bypass it if `bpc = 1`. -// When bypassed, `e` is feed with zeros so that its state is cleanup up. -// `bypass1` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : bypass1(bpc,e) : _ -// ``` -// -// Where: -// -// * `bpc`: bypass switch (0/1) -// * `e`: a mono effect -//------------------------------------------------------------ -// Author: JOS -// License: STK-4.3 -bypass1(bpc,e) = _ <: select2(bpc,(inswitch:e),_) -with { - inswitch = select2(bpc,_,0); -}; - - -//-------------------`(ba.)bypass2`------------------------- -// Takes a stereo input signal, route it to `e` and bypass it if `bpc = 1`. -// When bypassed, `e` is feed with zeros so that its state is cleanup up. -// `bypass2` is a standard Faust function. -// -// #### Usage -// -// ``` -// _,_ : bypass2(bpc,e) : _,_ -// ``` -// -// Where: -// -// * `bpc`: bypass switch (0/1) -// * `e`: a stereo effect -//------------------------------------------------------------ -// Author: JOS -// License: STK-4.3 -bypass2(bpc,e) = _,_ <: ((inswitch:e),_,_) : select2stereo(bpc) -with { - inswitch = _,_ : (select2(bpc,_,0), select2(bpc,_,0)) : _,_; -}; - - -//-------------------`(ba.)bypass1to2`------------------------- -// Bypass switch for effect `e` having mono input signal and stereo output. -// Effect `e` is bypassed if `bpc = 1`.When bypassed, `e` is feed with zeros -// so that its state is cleanup up. -// `bypass1to2` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : bypass1to2(bpc,e) : _,_ -// ``` -// -// Where: -// -// * `bpc`: bypass switch (0/1) -// * `e`: a mono-to-stereo effect -//------------------------------------------------------------ -// Author: JOS -// License: STK-4.3 -bypass1to2(bpc,e) = _ <: ((inswitch:e),_,_) : select2stereo(bpc) -with { - inswitch = select2(bpc,_,0); -}; - - -//-------------------`(ba.)bypass_fade`------------------------- -// Bypass an arbitrary (N x N) circuit with 'n' samples crossfade. -// Inputs and outputs signals are faded out when 'e' is bypassed, -// so that 'e' state is cleanup up. -// Once bypassed the effect is replaced by par(i,N,_). -// Bypassed circuits can be chained. -// -// #### Usage -// -// ``` -// _ : bypass_fade(n,b,e) : _ -// or -// _,_ : bypass_fade(n,b,e) : _,_ -// ``` -// * `n`: number of samples for the crossfade -// * `b`: bypass switch (0/1) -// * `e`: N x N circuit -// -// #### Examples -// -// ``` -// process = bypass_fade(ma.SR/10, checkbox("bypass echo"), echo); -// process = bypass_fade(ma.SR/10, checkbox("bypass reverb"), freeverb); -// ``` -//--------------------------------------------------------------- -bypass_fade(n, b, e) = par(i, ins, _) - <: (par(i, ins, *(1-xb)) : e : par(i, outs, *(1-xb))), par(i, ins, *(xb)) - :> par(i, outs, _) -with { - ins = inputs(e); - outs = outputs(e); - xb = ramp(n, b); -}; - - -//----------------------------`(ba.)toggle`------------------------------------------ -// Triggered by the change of 0 to 1, it toggles the output value -// between 0 and 1. -// -// #### Usage -// -// ``` -// _ : toggle : _ -// ``` -// #### Examples -// -// ``` -// button("toggle") : toggle : vbargraph("output", 0, 1) -// (an.amp_follower(0.1) > 0.01) : toggle : vbargraph("output", 0, 1) // takes audio input -// ``` -// -//------------------------------------------------------------------------------ -// TODO: author "Vince" -toggle = trig : loop -with { - trig(x) = (x-x') == 1; - loop = != ~ _; -}; - - -//----------------------------`(ba.)on_and_off`------------------------------------------ -// The first channel set the output to 1, the second channel to 0. -// -// #### Usage -// -// ``` -// _ , _ : on_and_off : _ -// ``` -// -// #### Example -// -// ``` -// button("on"), button("off") : on_and_off : vbargraph("output", 0, 1) -// ``` -// -//------------------------------------------------------------------------------ -// TODO: author "Vince" -on_and_off(a, b) = (a : trig) : loop(b) -with { - trig(x) = (x-x') == 1; - loop(b) = + ~ (_ >= 1) * ((b : trig) == 0); -}; - - -//-----------------------------`(ba.)selectoutn`--------------------------------- -// Route input to the output among N at run time. -// -// #### Usage -// -// ``` -// _ : selectoutn(N, i) : _,_,...N -// ``` -// -// Where: -// -// * `N`: number of outputs (int, known at compile time, N > 0) -// * `i`: output number to route to (int, numbered from 0) (i.e. slider) -// -// #### Example -// -// ``` -// process = 1 : selectoutn(3, sel) : par(i, 3, vbargraph("v.bargraph %i", 0, 1)); -// sel = hslider("volume", 0, 0, 2, 1) : int; -// ``` -//-------------------------------------------------------------------------- -// TODO: author "Vince" -selectoutn(n, s) = _ <: par(i, n, *(s==i)); - - -//=================================Sliding Reduce========================================= -// Provides various operations on the last N samples using a high order -// `slidingReduce(op,N,maxN,disabledVal,x)`` fold-like function: -// -// * `slidingSum(n)`: the sliding sum of the last n input samples, CPU-light -// * `slidingSump(n,maxn)`: the sliding sum of the last n input samples, numerically stable "forever" -// * `slidingMax(n,maxn)`: the sliding max of the last n input samples -// * `slidingMin(n,maxn)`: the sliding min of the last n input samples -// * `slidingMean(n)`: the sliding mean of the last n input samples, CPU-light -// * `slidingMeanp(n,maxn)`: the sliding mean of the last n input samples, numerically stable "forever" -// * `slidingRMS(n)`: the sliding RMS of the last n input samples, CPU-light -// * `slidingRMSp(n,maxn)`: the sliding RMS of the last n input samples, numerically stable "forever" -// -// #### Working Principle -// -// If we want the maximum of the last 8 values, we can do that as: -// -// ``` -// simpleMax(x) = -// ( -// ( -// max(x@0,x@1), -// max(x@2,x@3) -// ) :max -// ), -// ( -// ( -// max(x@4,x@5), -// max(x@6,x@7) -// ) :max -// ) -// :max; -// ``` -// -// `max(x@2,x@3)` is the same as `max(x@0,x@1)@2` but the latter re-uses a -// value we already computed,so is more efficient. Using the same trick for -// values 4 trough 7, we can write: -// -// ``` -// efficientMax(x)= -// ( -// ( -// max(x@0,x@1), -// max(x@0,x@1)@2 -// ) :max -// ), -// ( -// ( -// max(x@0,x@1), -// max(x@0,x@1)@2 -// ) :max@4 -// ) -// :max; -// ``` -// -// We can rewrite it recursively, so it becomes possible to get the maximum at -// have any number of values, as long as it's a power of 2. -// -// ``` -// recursiveMax = -// case { -// (1,x) => x; -// (N,x) => max(recursiveMax(N/2,x), recursiveMax(N/2,x)@(N/2)); -// }; -// ``` -// -// What if we want to look at a number of values that's not a power of 2? -// For each value, we will have to decide whether to use it or not. -// If N is bigger than the index of the value, we use it, otherwise we replace -// it with (`0-(ma.INFINITY)`): -// -// ``` -// variableMax(N,x) = -// max( -// max( -// ( -// (x@0 : useVal(0)), -// (x@1 : useVal(1)) -// ):max, -// ( -// (x@2 : useVal(2)), -// (x@3 : useVal(3)) -// ):max -// ), -// max( -// ( -// (x@4 : useVal(4)), -// (x@5 : useVal(5)) -// ):max, -// ( -// (x@6 : useVal(6)), -// (x@7 : useVal(7)) -// ):max -// ) -// ) -// with { -// useVal(i) = select2((N>=i) , (0-(ma.INFINITY)),_); -// }; -// ``` -// -// Now it becomes impossible to re-use any values. To fix that let's first look -// at how we'd implement it using recursiveMax, but with a fixed N that is not -// a power of 2. For example, this is how you'd do it with `N=3`: -// -// ``` -// binaryMaxThree(x) = -// ( -// recursiveMax(1,x)@0, // the first x -// recursiveMax(2,x)@1 // the second and third x -// ):max; -// ``` -// -// `N=6` -// -// ``` -// binaryMaxSix(x) = -// ( -// recursiveMax(2,x)@0, // first two -// recursiveMax(4,x)@2 // third trough sixth -// ):max; -// ``` -// -// Note that `recursiveMax(2,x)` is used at a different delay then in -// `binaryMaxThree`, since it represents 1 and 2, not 2 and 3. Each block is -// delayed the combined size of the previous blocks. -// -// `N=7` -// -// ``` -// binaryMaxSeven(x) = -// ( -// ( -// recursiveMax(1,x)@0, // first x -// recursiveMax(2,x)@1 // second and third -// ):max, -// ( -// recursiveMax(4,x)@3 // fourth trough seventh -// ) -// ):max; -// ``` -// -// To make a variable version, we need to know which powers of two are used, -// and at which delay time. -// -// Then it becomes a matter of: -// -// * lining up all the different block sizes in parallel: the first `par()` -// statement -// * delaying each the appropriate amount: `sumOfPrevBlockSizes()` -// * turning it on or off: `useVal()` -// * getting the maximum of all of them: `combine()` -// -// In Faust, we can only do that for a fixed maximum number of values: `maxN` -// -// ``` -// variableBinaryMaxN(N,maxN,x) = -// par(i,maxNrBits,recursiveMax(pow2(i),x)@sumOfPrevBlockSizes(N,maxN,i) : useVal(i)) : combine(maxNrBits) with { -// // The sum of all the sizes of the previous blocks -// sumOfPrevBlockSizes(N,maxN,0) = 0; -// sumOfPrevBlockSizes(N,maxN,i) = (subseq((allBlockSizes(N,maxN)),0,i):>_); -// allBlockSizes(N,maxN) = par(i, maxNrBits, pow2(i) * isUsed(i) ); -// maxNrBits = int2nrOfBits(maxN); -// // get the maximum of all blocks -// combine(2) = max; -// combine(N) = max(combine(N-1),_); -// // Decide wether or not to use a certain value, based on N -// useVal(i) = select2(isUsed(i), (0-(ma.INFINITY)),_); -// isUsed(i) = take(i+1, (int2bin(N,maxN))); -// }; -// ``` -//======================================================================================== -// Section contributed by Bart Brouns (bart@magnetophon.nl). -// SPDX-License-Identifier: GPL-3.0 -// Copyright (C) 2018 Bart Brouns - - -//-----------------------------`(ba.)slidingReduce`----------------------------- -// Fold-like high order function. Apply a commutative binary operation `` to -// the last `` consecutive samples of a signal ``. For example : -// `slidingReduce(max,128,128,-(ma.INFINITY))` will compute the maximum of the last -// 128 samples. The output is updated each sample, unlike reduce, where the -// output is constant for the duration of a block. -// -// #### Usage -// -// ``` -// _ : slidingReduce(op,N,maxN,disabledVal) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -// * `maxN`: the maximum number of values to process, needs to be a power of 2 -// * `op`: the operator. Needs to be a commutative one. -// * `disabledVal`: the value to use when we want to ignore a value. -// -// In other words, `op(x,disabledVal)` should equal to `x`. For example, -// `+(x,0)` equals `x` and `min(x,ma.INFINITY)` equals `x`. So if we want to -// calculate the sum, we need to give 0 as `disabledVal`, and if we want the -// minimum, we need to give `ma.INFINITY` as `disabledVal`. -//------------------------------------------------------------------------------ -slidingReduce(op,N,maxN,disabledVal,x) = - par(i,maxNrBits,fixedDelayOp(pow2(i),x)@sumOfPrevBlockSizes(N,maxN,i) - : useVal(i)) : combine(maxNrBits) -with { - - // Apply to the last values of , where is fixed - fixedDelayOp = case { - (1,x) => x; - (N,x) => op(fixedDelayOp(N/2,x), fixedDelayOp(N/2,x)@(N/2)); - }; - - // The sum of all the sizes of the previous blocks - sumOfPrevBlockSizes(N,maxN,0) = 0; - sumOfPrevBlockSizes(N,maxN,i) = (subseq((allBlockSizes(N,maxN)),0,i):>_); - allBlockSizes(N,maxN) = par(i, maxNrBits, (pow2(i)) * isUsed(i)); - maxNrBits = int2nrOfBits(maxN); - - // Apply to parallel input signals - combine(2) = op; - combine(N) = op(combine(N-1),_); - - // Decide wether or not to use a certain value, based on N - // Basically only the second is needed, - // but this version also works for N == 0 - // 'works' in this case means 'does the same as reduce' - useVal(i) = - _ <: select2( - (i==0) & (N==0), - select2(isUsed(i), disabledVal, _), - _ - ); - - // useVal(i) = - // select2(isUsed(i), disabledVal,_); - isUsed(i) = take(i+1, (int2bin(N,maxN))); - pow2(i) = 1< -; - - -//------------------------------`(ba.)slidingSump`------------------------------ -// The sliding sum of the last n input samples. -// -// It uses a lot more CPU then (ba.)slidingSum(n,maxn), but is numerically stable "forever" in return. -// -// #### Usage -// -// ``` -// _ : slidingSump(N,maxN) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -// * `maxN`: the maximum number of values to process, needs to be a power of 2 -//------------------------------------------------------------------------------ -slidingSump(n,maxn) = slidingReduce(+,n,maxn,0); - - -//----------------------------`(ba.)slidingMax`-------------------------------- -// The sliding maximum of the last n input samples. -// -// #### Usage -// -// ``` -// _ : slidingMax(N,maxN) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -// * `maxN`: the maximum number of values to process, needs to be a power of 2 -//------------------------------------------------------------------------------ -slidingMax(n,maxn) = slidingReduce(max,n,maxn,-(ma.INFINITY)); - - -//----------------------------`(ba.)slidingMin`-------------------------------- -// The sliding minimum of the last n input samples. -// -// #### Usage -// -// ``` -// _ : slidingMin(N,maxN) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -// * `maxN`: the maximum number of values to process, needs to be a power of 2 -//------------------------------------------------------------------------------ -slidingMin(n,maxn) = slidingReduce(min,n,maxn,ma.INFINITY); - - -//----------------------------`(ba.)slidingMean`------------------------------- -// The sliding mean of the last n input samples. -// -// It will eventually run into numerical trouble when there is a persistent dc component. -// If that matters in your application, use the more CPU-intensive (ba.)slidinRMSp. -// -// #### Usage -// -// ``` -// _ : slidingMean(N,maxN) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -//------------------------------------------------------------------------------ -slidingMean(n) = slidingSum(n)/n; - - -//----------------------------`(ba.)slidingMeanp`------------------------------- -// The sliding mean of the last n input samples. -// -// It uses a lot more CPU then (ba.)slidingMean(n,maxn), but is numerically stable "forever" in return. -// -// #### Usage -// -// ``` -// _ : slidingMeanp(N,maxN) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -// * `maxN`: the maximum number of values to process, needs to be a power of 2 -//------------------------------------------------------------------------------ -slidingMeanp(n,maxn) = slidingSump(n,maxn)/n; - - -//---------------------------`(ba.)slidingRMS`--------------------------------- -// The root mean square of the last n input samples. -// -// It will eventually run into numerical trouble when there is a persistent dc component. -// If that matters in your application, use the more CPU-intensive (ba.)slidinRMSp. - -// -// #### Usage -// -// ``` -// _ : slidingRMS(N) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -//------------------------------------------------------------------------------ -slidingRMS(n) = pow(2) : slidingMean(n) : sqrt; - - -//---------------------------`(ba.)slidingRMSp`--------------------------------- -// The root mean square of the last n input samples. -// -// It uses a lot more CPU then (ba.)slidingRMS(n,maxn), but is numerically stable "forever" in return. -// -// #### Usage -// -// ``` -// _ : slidingRMSp(N,maxN) : _ -// ``` -// -// Where: -// -// * `N`: the number of values to process -// * `maxN`: the maximum number of values to process, needs to be a power of 2 -//------------------------------------------------------------------------------ -slidingRMSp(n,maxn) = pow(2) : slidingMeanp(n,maxn) : sqrt; - - -//======================================================================================== -// section contributed by Bart Brouns (bart@magnetophon.nl). -// spdx-license-identifier: gpl-3.0 -// copyright (c) 2020 Bart Brouns - -//=================================Parallel Operator========================================= -// Provides various operations on N parallel inputs using a high order -// `parallelOp(op,N,x)` function: -// -// * `parallelMax(n)`: the max of n parallel inputs -// * `parallelMin(n)`: the min of n parallel inputs -// * `parallelMean(n)`: the mean of n parallel inputs -// * `parallelRMS(n)`: the RMS of n parallel inputs - -//-----------------------------`(ba.)parallelOp`----------------------------- -// Apply a commutative binary operation `` to N parallel inputs. -// -// #### usage -// -// ``` -// si.bus(n) : parallelOp(op,n) : _ -// ``` -// -// where: -// -// * `N`: the number of parallel inputs known at compile time -// * `op`: the operator which needs to be commutative -// -//------------------------------------------------------------------------------ - -parallelOp(op,1) = _; -parallelOp(op,2) = op; -parallelOp(op,n) = op(parallelOp(op,n-1)); - -//---------------------------`(ba.)parallelMax`--------------------------------- -// The maximum of N parallel inputs. -// -// #### Usage -// -// ``` -// si.bus(n) : parallelMax(n) : _ -// ``` -// -// Where: -// -// * `N`: the number of parallel inputs known at compile time -//------------------------------------------------------------------------------ -parallelMax(n) = parallelOp(max,n); - - -//---------------------------`(ba.)parallelMin`--------------------------------- -// The minimum of N parallel inputs. -// -// #### Usage -// -// ``` -// si.bus(n) : parallelMin(n) : _ -// ``` -// -// Where: -// -// * `N`: the number of parallel inputs known at compile time -//------------------------------------------------------------------------------ -parallelMin(n) = parallelOp(min,n); - - -//---------------------------`(ba.)parallelMean`--------------------------------- -// The mean of N parallel inputs. -// -// #### Usage -// -// ``` -// si.bus(n) : parallelMean(n) : _ -// ``` -// -// Where: -// -// * `N`: the number of parallel inputs known at compile time -//------------------------------------------------------------------------------ -parallelMean(n) = si.bus(n):>_/n; - - -//---------------------------`(ba.)parallelRMS`--------------------------------- -// The RMS of N parallel inputs. -// -// #### Usage -// -// ``` -// si.bus(n) : parallelRMS(n) : _ -// ``` -// -// Where: -// -// * `N`: the number of parallel inputs known at compile time -//------------------------------------------------------------------------------ -parallelRMS(n) = par(i, n, pow(2)) : parallelMean(n) : sqrt; - - -//////////////////////////////////Deprecated Functions//////////////////////////////////// -// This section implements functions that used to be in music.lib but that are now -// considered as "deprecated". -////////////////////////////////////////////////////////////////////////////////////////// - -millisec = ma.SR/1000.0; - -time1s = hslider("time", 0, 0, 1000, 0.1)*millisec; -time2s = hslider("time", 0, 0, 2000, 0.1)*millisec; -time5s = hslider("time", 0, 0, 5000, 0.1)*millisec; -time10s = hslider("time", 0, 0, 10000, 0.1)*millisec; -time21s = hslider("time", 0, 0, 21000, 0.1)*millisec; -time43s = hslider("time", 0, 0, 43000, 0.1)*millisec; diff --git a/dist/examples/LIBRARIES/compressors.lib b/dist/examples/LIBRARIES/compressors.lib deleted file mode 100644 index ecc604eb..00000000 --- a/dist/examples/LIBRARIES/compressors.lib +++ /dev/null @@ -1,971 +0,0 @@ -//#################################### compressors.lib #################################### -// A library of compressor effects. Its official prefix is `co`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2003-2016 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ba = library("basics.lib"); -si = library("signals.lib"); -an = library("analyzers.lib"); -ro = library("routes.lib"); -ma = library("maths.lib"); -it = library("interpolators.lib"); - -declare name "Faust Compressor Effect Library"; -declare version "0.1"; -//=============================Functions Reference======================================== -//======================================================================================== - -//--------------------`(co.)peak_compression_gain_mono`------------------- -// Mono dynamic range compressor gain computer. -// `peak_compression_gain_mono` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost) : _ -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust - -// Sometimes even bigger ratios are useful: -// For example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ - -// Author: Bart Brouns -// License: GPLv3 - -// note: si.lag_ud has a bug where if you compile with standard precision, -// down is 0 and prePost is 1, you go into infinite GR and stay there -peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost) = - abs:ba.bypass1(prePost,si.lag_ud(att,rel)) : ba.linear2db : gain_computer(strength,thresh,knee):ba.bypass1((prePost*-1)+1,si.lag_ud(rel,att)) : ba.db2linear -with { - gain_computer(strength,thresh,knee,level) = - select3((level>(thresh-(knee/2)))+(level>(thresh+(knee/2))), - 0, - ((level-thresh+(knee/2)):pow(2)/(2*knee)), - (level-thresh)) : max(0)*-strength; -}; - - -//--------------------`(co.)peak_compression_gain_N_chan`------------------- -// N channel dynamic range compressor gain computer. -// `peak_compression_gain_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -// generalise compression gains for N channels. -// first we define a mono version: -peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,1) = - peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost); - -// The actual N-channel version: -// Calculate the maximum gain reduction of N channels, -// and then crossfade between that and each channel's own gain reduction, -// to link/unlink channels -peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) = - par(i, N, peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost)) - <:(si.bus(N),(ba.parallelMin(N)<:si.bus(N))):ro.interleave(N,2):par(i,N,(it.interpolate_linear(link))); - - -//--------------------`(co.)FFcompressor_N_chan`------------------- -// feed forward N channel dynamic range compressor. -// `FFcompressor_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : FFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `meter`: a gain reduction meter. It can be implemented like so: -// meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -// feed forward compressor -FFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) = - (si.bus(N) <: - (peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N),si.bus(N)) - ) - :(ro.interleave(N,2):par(i,N,meter*_)); - -//--------------------`(co.)FBcompressor_N_chan`------------------- -// feed back N channel dynamic range compressor. -// `FBcompressor_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : FBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `meter`: a gain reduction meter. It can be implemented like so: -// meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; -// or it can be omitted by defining 'meter = _'. -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -FBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) = - ( - (peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N),si.bus(N)) - :(ro.interleave(N,2):par(i,N,meter*_)) - )~si.bus(N); - -//--------------------`(co.)FFFBcompressor_N_chan`------------------- -// feed forward / feed back N channel dynamic range compressor. -// the feedback part has a much higher strength, so they end up sounding similar -// `FFFBcompressor_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : FFFBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `FFFB`: fade between feed forward (0) and feed back (1) compression. -// * `meter`: a gain reduction meter. It can be implemented like so: -// meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -FBFFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) = - si.bus(N) <: si.bus(N*2): - ( - (( - (par(i, 2, peak_compression_gain_N_chan(strength*(1+((i==0)*2)),thresh,att,rel,knee,prePost,link,N)):ro.interleave(N,2):par(i, N, it.interpolate_linear(FBFF))) - ,si.bus(N)) - :(ro.interleave(N,2):par(i,N,meter*_)) - )~si.bus(N) - ); - - -//--------------------`(co.)RMS_compression_gain_mono`------------------- -// Mono RMS dynamic range compressor gain computer. -// `RMS_compression_gain_mono` is a standard Faust function -// -// #### Usage -// -// ``` -// _ : RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost) : _ -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost) = - RMS(rel): ba.bypass1(prePost,si.lag_ud(att,0)) : ba.linear2db : gain_computer(strength,thresh,knee) : ba.bypass1((prePost*-1)+1,si.lag_ud(0,att)) : ba.db2linear -with { - gain_computer(strength,thresh,knee,level) = - select3((level>(thresh-(knee/2)))+(level>(thresh+(knee/2))), - 0, - ((level-thresh+(knee/2)):pow(2)/(2*knee)), - (level-thresh) - ) : max(0)*-strength; - RMS(time) = ba.slidingRMS(s) with { s = ba.sec2samp(time):int:max(1); }; -}; - -//--------------------`(co.)RMS_compression_gain_N_chan`------------------- -// RMS N channel dynamic range compressor gain computer. -// `RMS_compression_gain_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,1) = - RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost); - -RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) = - par(i, N, RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost)) - <:(si.bus(N),(ba.parallelMin(N)<:si.bus(N))):ro.interleave(N,2):par(i,N,(it.interpolate_linear(link))); - - -//--------------------`(co.)RMS_FFFBcompressor_N_chan`------------------- -// RMS feed forward / feed back N channel dynamic range compressor. -// the feedback part has a much higher strength, so they end up sounding similar -// `RMS_FFFBcompressor_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : RMS_FFFBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// * `prePost`: places the level detector either at the input or after the gain computer; -// this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `FFFB`: fade between feed forward (0) and feed back (1) compression. -// * `meter`: a gain reduction meter. It can be implemented like so: -// meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// to save CPU we cheat a bit, in a similar way as in the original libs: -// instead of crosfading between two sets of gain calculators as above, -// we take the abs of the audio from both the FF and FB, and crossfade between those, -// and feed that into one set of gain calculators -// again the strength is much higher when in FB mode, but implemented differently - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -RMS_FBFFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) = - si.bus(N) <: si.bus(N*2): - ( - ( - ( - (ro.interleave(N,2):par(i, N*2, abs) :par(i, N, it.interpolate_linear(FBFF)) : RMS_compression_gain_N_chan(strength*(1+(((FBFF*-1)+1)*1)),thresh,att,rel,knee,prePost,link,N)) - ,si.bus(N) - ) - :(ro.interleave(N,2):par(i,N,meter*_)) - )~si.bus(N) - ); - - -//--------------------`(co.)RMS_FBcompressor_peak_limiter_N_chan`------------------- -// N channel RMS feed back compressor into peak limiter feeding back into the FB compressor. -// By combining them this way, they complement each other optimally: -// The RMS compressor doesn't have to deal with the peaks, -// and the peak limiter get's spared from the steady state signal. -// the feedback part has a much higher strength, so they end up sounding similar -// `RMS_FBcompressor_peak_limiter_N_chan` is a standard Faust function. -// -// #### Usage -// -// ``` -// si.bus(N) : RMS_FBcompressor_peak_limiter_N_chan(strength,thresh,threshLim,att,rel,knee,link,meter,N) : si.bus(N) -// ``` -// -// Where: -// -// * `strength`: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression) -// * `thresh`: dB level threshold above which compression kicks in -// * `threshLim`: dB level threshold above which the brick wall limiter kicks in -// * `att`: attack time = time constant (sec) when level & compression going up -// this is also used as the release time of the limiter -// * `rel`: release time = time constant (sec) coming out of compression -// * `knee`: a gradual increase in gain reduction around the threshold: -// Below thresh-(knee/2) there is no gain reduction, -// above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. -// the limiter uses a knee half this size -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `meter`: a gain reduction meter. It can be implemented like so: -// meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; -// * `N`: the number of channels of the compressor - -// It uses a strength parameter instead of the traditional ratio, in order to be able to -// function as a hard limiter. -// For that you'd need a ratio of infinity:1, and you cannot express that in Faust. - -// Sometimes even bigger ratios are useful: -// for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -// and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. - -// #### References -// -// * -// * Digital Dynamic Range Compressor Design -// A Tutorial and Analysis -// DIMITRIOS GIANNOULIS (Dimitrios.Giannoulis@eecs.qmul.ac.uk) -// MICHAEL MASSBERG (michael@massberg.org) -// AND JOSHUA D. REISS (josh.reiss@eecs.qmul.ac.uk) -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 - -RMS_FBcompressor_peak_limiter_N_chan(strength,thresh,threshLim,att,rel,knee,link,meter,N) = - ( - ( - ( - (RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,0,link,N)) - ,si.bus(N) - ):(ro.interleave(N,2):par(i,N,meter*_)) - ):FFcompressor_N_chan(1,threshLim,0,att:min(rel),knee*0.5,0,link,meter,N) - )~si.bus(N); - - -//=============================Original versions section============================= -// The functions in this section are largely superseded by the limiters above, but we -// retain them for backward compatibility and for situations in which a more permissive, -// MIT-style license is required. -//======================================================================================== - -//=============================Functions Reference======================================== -//======================================================================================== - -//--------------------`(co.)compressor_lad_mono`------------------- -// Mono dynamic range compressor with lookahead delay. -// `compressor_lad_mono` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : compressor_lad_mono(lad,ratio,thresh,att,rel) : _ -// ``` -// -// Where: -// -// * `lad`: lookahead delay in seconds (nonnegative) - gets rounded to nearest sample. -// The effective attack time is a good setting. -// * `ratio`: compression ratio (1 = no compression, >1 means compression) -// Ratios: 4 is moderate compression, 8 is strong compression, -// 12 is mild limiting, and 20 is pretty hard limiting at the threshold. -// * `thresh`: dB level threshold above which compression kicks in (0 dB = max level) -// * `att`: attack time = time constant (sec) when level & compression are going up -// * `rel`: release time = time constant (sec) coming out of compression -// -// #### References -// -// * -// * -// * Albert Graef's "faust2pd"/examples/synth/compressor_.dsp -// * More features: -//------------------------------------------------------------ -declare compressor_lad_mono author "Julius O. Smith III"; -declare compressor_lad_mono copyright - "Copyright (C) 2014-2020 by Julius O. Smith III "; -declare compressor_lad_mono license "MIT-style STK-4.3 license"; -compressor_lad_mono(lad,ratio,thresh,att,rel,x) - = x@max(0,floor(0.5+ma.SR*lad)) * compression_gain_mono(ratio,thresh,att,rel,x); - -//--------------------`(co.)compressor_mono`------------------- -// Mono dynamic range compressors. -// `compressor_mono` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : compressor_mono(ratio,thresh,att,rel) : _ -// ``` -// -// Where: -// -// * `ratio`: compression ratio (1 = no compression, >1 means compression) -// Ratios: 4 is moderate compression, 8 is strong compression, -// 12 is mild limiting, and 20 is pretty hard limiting at the threshold. -// * `thresh`: dB level threshold above which compression kicks in (0 dB = max level) -// * `att`: attack time = time constant (sec) when level & compression are going up -// * `rel`: release time = time constant (sec) coming out of compression -// -// #### References -// -// * -// * -// * Albert Graef's "faust2pd"/examples/synth/compressor_.dsp -// * More features: -//------------------------------------------------------------ -declare compressor_mono author "Julius O. Smith III"; -declare compressor_mono copyright - "Copyright (C) 2014-2020 by Julius O. Smith III "; -declare compressor_mono license "MIT-style STK-4.3 license"; -compressor_mono = compressor_lad_mono(0); - -//--------------------`(co.)compressor_stereo`------------------- -// Stereo dynamic range compressors. -// -// #### Usage -// -// ``` -// _,_ : compressor_stereo(ratio,thresh,att,rel) : _,_ -// ``` -// -// Where: -// -// * `ratio`: compression ratio (1 = no compression, >1 means compression) -// * `thresh`: dB level threshold above which compression kicks in (0 dB = max level) -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// -// #### References -// -// * -// * -// * Albert Graef's "faust2pd"/examples/synth/compressor_.dsp -// * More features: -//------------------------------------------------------------ -declare compressor_stereo author "Julius O. Smith III"; -declare compressor_stereo copyright - "Copyright (C) 2014-2020 by Julius O. Smith III "; -declare compressor_stereo license "MIT-style STK-4.3 license"; -compressor_stereo(ratio,thresh,att,rel,x,y) = cgm*x, cgm*y with { - cgm = compression_gain_mono(ratio,thresh,att,rel,abs(x)+abs(y)); -}; - -//--------------------`(co.)compression_gain_mono`------------------- -// Compression-gain calculation for dynamic range compressors. -// -// #### Usage -// -// ``` -// _ : compression_gain_mono(ratio,thresh,att,rel) : _ -// ``` -// -// Where: -// -// * `ratio`: compression ratio (1 = no compression, >1 means compression) -// * `thresh`: dB level threshold above which compression kicks in (0 dB = max level) -// * `att`: attack time = time constant (sec) when level & compression going up -// * `rel`: release time = time constant (sec) coming out of compression -// -// #### References -// -// * -// * -// * Albert Graef's "faust2pd"/examples/synth/compressor_.dsp -// * More features: -//------------------------------------------------------------ -declare compression_gain_mono author "Julius O. Smith III"; -declare compression_gain_mono copyright - "Copyright (C) 2014-2020 by Julius O. Smith III "; -declare compression_gain_mono license "MIT-style STK-4.3 license"; -compression_gain_mono(ratio,thresh,att,rel) = - an.amp_follower_ar(att,rel) : ba.linear2db : outminusindb(ratio,thresh) : - kneesmooth(att) : ba.db2linear -with { - // kneesmooth(att) installs a "knee" in the dynamic-range compression, - // where knee smoothness is set equal to half that of the compression-attack. - // A general 'knee' parameter could be used instead of tying it to att/2: - kneesmooth(att) = si.smooth(ba.tau2pole(att/2.0)); - // compression gain in dB: - outminusindb(ratio,thresh,level) = max(level-thresh,0.0) * (1.0/max(ma.EPSILON,float(ratio))-1.0); - // Note: "float(ratio)" REQUIRED when ratio is an integer > 1! -}; - -//----------------`(co.)limiter_1176_R4_mono`---------------------- -// A limiter guards against hard-clipping. It can be -// implemented as a compressor having a high threshold (near the -// clipping level), fast attack, and high ratio. Since -// the compression ratio is so high, some knee smoothing is -// desirable (for softer limiting). This example is intended -// to get you started using compressors as limiters, so all -// parameters are hardwired here to nominal values. -// Ratio: 4 (moderate compression) -// See compressor_mono() comments for a guide to other choices. -// Mike Shipley likes this (lowest) setting on the 1176. -// (Grammy award-winning mixer for Queen, Tom Petty, etc.) -// Thresh: -6 dB, meaning 4:1 compression begins at amplitude 1/2. -// Att: 800 MICROseconds (Note: scaled by ratio in the 1176) -// The 1176 range is said to be 20-800 microseconds. -// Faster attack gives "more bite" (e.g. on vocals), -// and makes hard-clipping less likely on fast overloads. -// Rel: 0.5 s (Note: scaled by ratio in the 1176) -// The 1176 range is said to be 50-1100 ms. -// The 1176 also has a "bright, clear eq effect" (use filters.lib if desired). -// `limiter_1176_R4_mono` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : limiter_1176_R4_mono : _; -// ``` -// -// #### Reference: -// -// -//------------------------------------------------------------ -declare limiter_1176_R4_mono author "Julius O. Smith III"; -declare limiter_1176_R4_mono copyright - "Copyright (C) 2014-2020 by Julius O. Smith III "; -declare limiter_1176_R4_mono license "MIT-style STK-4.3 license"; -limiter_1176_R4_mono = compressor_mono(4,-6,0.0008,0.5); - -//-------------------`(co.)limiter_1176_R4_stereo`--------------------- -// A limiter guards against hard-clipping. It can be -// implemented as a compressor having a high threshold (near the -// clipping level), fast attack and release, and high ratio. Since -// the ratio is so high, some knee smoothing is -// desirable ("soft limiting"). This example is intended -// to get you started using compressor_* as a limiter, so all -// parameters are hardwired to nominal values here. -// Ratios: 4 (moderate compression), 8 (severe compression), -// 12 (mild limiting), or 20 to 1 (hard limiting) -// Att: 20-800 MICROseconds (Note: scaled by ratio in the 1176) -// Rel: 50-1100 ms (Note: scaled by ratio in the 1176) -// Mike Shipley likes 4:1 (Grammy-winning mixer for Queen, Tom Petty, etc.) -// Faster attack gives "more bite" (e.g. on vocals) -// He hears a bright, clear eq effect as well (not implemented here) -// -// #### Usage -// -// ``` -// _,_ : limiter_1176_R4_stereo : _,_; -// ``` -// -// #### Reference: -// -// -//------------------------------------------------------------ -declare limiter_1176_R4_stereo author "Julius O. Smith III"; -declare limiter_1176_R4_stereo copyright - "Copyright (C) 2014-2020 by Julius O. Smith III "; -declare limiter_1176_R4_stereo license "MIT-style STK-4.3 license"; -limiter_1176_R4_stereo = compressor_stereo(4,-6,0.0008,0.5); - -//-----------------------`(co.)limiter_lad_N`--------------------------------- -// N-channel lookahead limiter inspired by IOhannes Zmölnig's post, which is -// in turn based on the thesis by Peter Falkner "Entwicklung eines digitalen -// Stereo-Limiters mit Hilfe des Signalprozessors DSP56001". -// This version of the limiter uses a peak-holder with smoothed -// attack and release based on tau time constant filters. -// -// It is also possible to use a time constant that is 2*PI*tau by dividing -// the attack and release times by 2*PI. This time constant allows for -// the amplitude profile to reach 1 - e^(-2pi) of the final -// peak after the attack time. The input path can be delayed by the same -// amount as the attack time to synchronise input and amplitude profile, -// realising a system that is particularly effective as a colourless -// (ideally) brickwall limiter. -// -// Note that the effectiveness of the ceiling settings are dependent on -// the other parameters, especially the time constant used for the -// smoothing filters and the lookahead delay. -// -// Similarly, the colourless characteristics are also dependent on attack, -// hold, and release times. Since fluctuations above ~15 Hz are -// perceived as timbral effects, [Vassilakis and Kendall 2010] it is -// reasonable to set the attack time to 1/15 seconds for a smooth amplitude -// modulation. On the other hand, the hold time can be set to the -// peak-to-peak period of the expected lowest frequency in the signal, -// which allows for minimal distortion of the low frequencies. The -// release time can then provide a perceptually linear and gradual gain -// increase determined by the user for any specific application. -// -// The scaling factor for all the channels is determined by the loudest peak -// between them all, so that amplitude ratios between the signals are kept. -// -// #### Usage -// -// ``` -// si.bus(N) : limiter_lad_N(N, LD, ceiling, attack, hold, release) : -// si.bus(N); -// ``` -// -// Where: -// -// * `N` is the number of channels, known at compile-time. -// * `LD` is the lookahead delay in seconds, known at compile-time. -// * `ceiling` is the linear amplitude output limit. -// * `attack` is the attack time in seconds. -// * `hold` is the hold time in seconds. -// * `release` is the release time in seconds. -// -// Example for a stereo limiter: limiter_lad_N(2, .01, 1, .01, .1, 1); -// -// #### Reference: -// -// . -//------------------------------------------------------------------------------ -declare limiter_lad_N author "Dario Sanfilippo"; -declare limiter_lad_N copyright "Copyright (C) 2020 Dario Sanfilippo - "; -declare limiter_lad_N license "GPLv3 license"; -limiter_lad_N(N, LD, ceiling, attack, hold, release) = - si.bus(N) <: par(i, N, @ (LD * ma.SR)), - (scaling <: si.bus(N)) : ro.interleave(N, 2) : par(i, N, *) - with { - scaling = ceiling / max(amp_profile, ma.EPSILON) : min(1); - amp_profile = par(i, N, abs) : maxN(N) : ba.peakholder(hold * ma.SR) : - att_smooth(attack) : rel_smooth(release); - att_smooth(time, in) = si.smooth(ba.tau2pole(time), in); - rel_smooth(time, in) = an.peak_envelope(time, in); - maxN(1) = _; - maxN(2) = max; - maxN(N) = max(maxN(N - 1)); - }; - -//-------------`(co.)limiter_lad_mono`---------------------------------------- -// -// Specialised case of limiter_lad_N: mono limiter. -// -// #### Usage -// -// ``` -// _ : limiter_lad_mono(LD, ceiling, attack, hold, release) : _; -// ``` -// -// Where: -// -// * `LD` is the lookahead delay in seconds, known at compile-time. -// * `ceiling` is the linear amplitude output limit. -// * `attack` is the attack time in seconds. -// * `hold` is the hold time in seconds. -// * `release` is the release time in seconds. -// -// #### Reference: -// -// . -declare limiter_lad_mono author "Dario Sanfilippo"; -declare limiter_lad_mono copyright "Copyright (C) 2020 Dario Sanfilippo - "; -declare limiter_lad_mono license "GPLv3 license"; -limiter_lad_mono(LD) = limiter_lad_N(1, LD); - -//-------------`(co.)limiter_lad_stereo`-------------------------------------- -// -// Specialised case of limiter_lad_N: stereo limiter. -// -// #### Usage -// -// ``` -// _ , _ : limiter_lad_stereo(LD, ceiling, attack, hold, release) : _ , _; -// ``` -// -// Where: -// -// * `LD` is the lookahead delay in seconds, known at compile-time. -// * `ceiling` is the linear amplitude output limit. -// * `attack` is the attack time in seconds. -// * `hold` is the hold time in seconds. -// * `release` is the release time in seconds. -// -// #### Reference: -// -// . -declare limiter_lad_stereo author "Dario Sanfilippo"; -declare limiter_lad_stereo copyright "Copyright (C) 2020 Dario Sanfilippo - "; -declare limiter_lad_stereo license "GPLv3 license"; -limiter_lad_stereo(LD) = limiter_lad_N(2, LD); - -//-------------`(co.)limiter_lad_quad`---------------------------------------- -// -// Specialised case of limiter_lad_N: quadraphonic limiter. -// -// #### Usage -// -// ``` -// si.bus(4) : limiter_lad_quad(LD, ceiling, attack, hold, release) : -// si.bus(4); -// ``` -// -// Where: -// -// * `LD` is the lookahead delay in seconds, known at compile-time. -// * `ceiling` is the linear amplitude output limit. -// * `attack` is the attack time in seconds. -// * `hold` is the hold time in seconds. -// * `release` is the release time in seconds. -// -// #### Reference: -// -// . -declare limiter_lad_quad author "Dario Sanfilippo"; -declare limiter_lad_quad copyright "Copyright (C) 2020 Dario Sanfilippo - "; -declare limiter_lad_quad license "GPLv3 license"; -limiter_lad_quad(LD) = limiter_lad_N(4, LD); - -//-------------`(co.)limiter_lad_bw`----------------------------------------- -// -// Specialised case of limiter_lad_N and ready-to-use unit-amplitude mono -// limiting function. This implementation, in particular, uses 2pi*tau -// time constant filters for attack and release smoothing with -// synchronised input and gain signals. -// -// This function's best application is to be used as a brickwall limiter with -// the least colouring artefacts while keeping a not-so-slow release curve. -// Tests have shown that, given a pop song with 60 dB of amplification -// and a 0-dB-ceiling, the loudest peak recorded was ~0.38 dB. -// -// #### Usage -// -// ``` -// _ : limiter_lad_bw : _; -// ``` -// -// #### Reference: -// -// . -declare limiter_lad_bw author "Dario Sanfilippo"; -declare limiter_lad_bw copyright "Copyright (C) 2020 Dario Sanfilippo - "; -declare limiter_lad_bw license "GPLv3 license"; -limiter_lad_bw = limiter_lad_mono(.01, 1, .01 / twopi, .1, 1 / twopi) - with { - twopi = 2 * ma.PI; - }; diff --git a/dist/examples/LIBRARIES/delays.lib b/dist/examples/LIBRARIES/delays.lib deleted file mode 100644 index 4801ae5a..00000000 --- a/dist/examples/LIBRARIES/delays.lib +++ /dev/null @@ -1,386 +0,0 @@ - -//#################################### delays.lib ######################################### -// This library contains a collection of delay functions. Its official prefix is `de`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2003-2016 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ma = library("maths.lib"); -ba = library("basics.lib"); -si = library("signals.lib"); -fi = library("filters.lib"); - - -declare name "Faust Delay Library"; -declare version "0.1"; - -//==================================Basic Delay Functions================================= -//======================================================================================== - -//-------`(de.)delay`---------- -// Simple `d` samples delay where `n` is the maximum delay length as a number of -// samples. Unlike the `@` delay operator, here the delay signal `d` is explicitly -// bounded to the interval [0..n]. The consequence is that delay will compile even -// if the interval of d can't be computed by the compiler. -// `delay` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : delay(n,d) : _ -// ``` -// -// Where: -// -// * `n`: the max delay length in samples -// * `d`: the delay length as a number of samples (integer) -//----------------------------- -// TODO: add MBH np2 -delay(n,d,x) = x @ min(n, max(0,d)); - - -//-------`(de.)fdelay`---------- -// Simple `d` samples fractional delay based on 2 interpolated delay lines where `n` is -// the maximum delay length as a number of samples. - -// `fdelay` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : fdelay(n,d) : _ -// ``` -// -// Where: -// -// * `n`: the max delay length in samples -// * `d`: the delay length as a number of samples (float) -//----------------------------- -fdelay(n,d,x) = delay(n+1,int(d),x)*(1 - ma.frac(d)) + delay(n+1,int(d)+1,x)*ma.frac(d); - - -//--------------------------`(de.)sdelay`---------------------------- -// s(mooth)delay: a mono delay that doesn't click and doesn't -// transpose when the delay time is changed. -// -// #### Usage -// -// ``` -// _ : sdelay(n,it,dt) : _ -// ``` -// -// Where : -// -// * `n`: the max delay length in samples -// * `it`: interpolation time (in samples) for example 1024 -// * `dt`: delay time (in samples) -//-------------------------------------------------------------------------- -sdelay(n, it, dt) = ctrl(it,dt),_ : ddi(n) -with { - // ddi(n,i,d0,d1) - // DDI (Double Delay with Interpolation) : the input signal is sent to two - // delay lines. The outputs of these delay lines are crossfaded with - // an interpolation stage. By acting on this interpolation value one - // can move smoothly from one delay to another. When is 0 we can - // freely change the delay time of line 1, when it is 1 we can freely change - // the delay time of line 0. - // - // = maximal delay in samples - // = interpolation value between 0 and 1 used to crossfade the outputs of the - // two delay lines (0.0: first delay line, 1.0: second delay line) - // = delay time of delay line 0 in samples between 0 and -1 - // = delay time of delay line 1 in samples between 0 and -1 - // < > = the input signal we want to delay - ddi(n, i, d0, d1) = _ <: delay(n,d0), delay(n,d1) : si.interpolate(i); - - // ctrl(it,dt) - // Control logic for a Double Delay with Interpolation according to two - // - // USAGE : ctrl(it,dt) - // where : - // an interpolation time (in samples, for example 256) - //
a delay time (in samples) - // - // ctrl produces 3 outputs : an interpolation value and two delay - // times and . These signals are used to control a ddi (Double Delay with Interpolation). - // The principle is to detect changes in the input delay time dt, then to - // change the delay time of the delay line currently unused and then by a - // smooth crossfade to remove the first delay line and activate the second one. - // - // The control logic has an internal state controlled by 4 elements - // : the interpolation variation (0, 1/it, -1/it) - // : the interpolation value (between 0 and 1) - // : the delay time of line 0 - // : the delay time of line 1 - // - // Please note that the last stage (!,_,_,_) cut because it is only - // used internally. - ctrl(it, dt) = \(v,ip,d0,d1).((nv, nip, nd0, nd1) - with { - // interpolation variation - nv = ba.if (v!=0.0, // if variation we are interpolating - ba.if ((ip>0.0) & (ip<1.0), v, 0), // should we continue or not ? - ba.if ((ip==0.0) & (dt!=d0), 1.0/it, // if true xfade from dl0 to dl1 - ba.if ((ip==1.0) & (dt!=d1), -1.0/it, // if true xfade from dl1 to dl0 - 0))); // nothing to change - // interpolation value - nip = ip+nv : min(1.0) : max(0.0); - - // update delay time of line 0 if needed - nd0 = ba.if ((ip >= 1.0) & (d1!=dt), dt, d0); - - // update delay time of line 0 if needed - nd1 = ba.if ((ip <= 0.0) & (d0!=dt), dt, d1); - }) ~ (_,_,_,_) : (!,_,_,_); -}; - - -// ----------`(de.)prime_power_delays`----------- -// Prime Power Delay Line Lengths. -// -// #### Usage -// -// ``` -// si.bus(N) : prime_power_delays(N,pathmin,pathmax) : si.bus(N); -// ``` -// -// Where: -// -// * `N`: positive integer up to 16 (for higher powers of 2, extend 'primes' array below) -// * `pathmin`: minimum acoustic ray length in the reverberator (in meters) -// * `pathmax`: maximum acoustic ray length (meters) - think "room size" -// -// #### Reference -// -// -//------------------------------------------------------------ -// TODO: author JOS, revised by RM -prime_power_delays(N,pathmin,pathmax) = par(i,N,delayvals(i)) with { - Np = 16; - primes = 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53; - prime(n) = primes : ba.selector(n,Np); // math.lib - - // Prime Power Bounds [matlab: floor(log(maxdel)./log(primes(53)))] - maxdel = 8192; // more than 63 meters at 44100 samples/sec & 343 m/s - ppbs = 13,8,5,4, 3,3,3,3, 2,2,2,2, 2,2,2,2; // 8192 is enough for all - ppb(i) = ba.take(i+1,ppbs); - - // Approximate desired delay-line lengths using powers of distinct primes: - c = 343; // soundspeed in m/s at 20 degrees C for dry air - dmin = ma.SR*pathmin/c; - dmax = ma.SR*pathmax/c; - dl(i) = dmin * (dmax/dmin)^(i/float(N-1)); // desired delay in samples - ppwr(i) = floor(0.5+log(dl(i))/log(prime(i))); // best prime power - delayvals(i) = prime(i)^ppwr(i); // each delay a power of a distinct prime -}; - - -//===============================Lagrange Interpolation=================================== -//======================================================================================== - -//----------------------`(de.)fdelaylti` and `(de.)fdelayltv`------------------------- -// Fractional delay line using Lagrange interpolation. -// -// #### Usage -// -// ``` -// _ : fdelaylt[i|v](order, maxdelay, delay, inputsignal) : _ -// ``` -// -// Where `order=1,2,3,...` is the order of the Lagrange interpolation polynomial. -// -// `fdelaylti` is most efficient, but designed for constant/slowly-varying delay. -// `fdelayltv` is more expensive and more robust when the delay varies rapidly. -// -// NOTE: The requested delay should not be less than `(order-1)/2`. -// -// #### References -// -// * -// - [fixed-delay case](https://ccrma.stanford.edu/~jos/Interpolation/Efficient_Time_Invariant_Lagrange_Interpolation.html) -// - [variable-delay case](https://ccrma.stanford.edu/~jos/Interpolation/Time_Varying_Lagrange_Interpolation.html) -// * Timo I. Laakso et al., "Splitting the Unit Delay - Tools for Fractional -// Delay Filter Design", IEEE Signal Processing Magazine, -// vol. 13, no. 1, pp. 30-60, Jan 1996. -// * Philippe Depalle and Stephan Tassart, "Fractional Delay Lines using -// Lagrange Interpolators", ICMC Proceedings, pp. 341-343, 1996. -//------------------------------------------------------------ -// TODO: author JOS, revised by RM -fdelaylti(N,n,d,x) = delay(n,id,x) <: seq(i,N,section(i)) : !,_ -with { - o = (N-1.00001)/2; // offset to ~center FIR interpolator - dmo = d - o; // assumed nonnegative [d > (N-1)/2] - id = int(dmo); - fd = o + ma.frac(dmo); - section(i,x,y) = (x-x') * c(i) <: _,+(y); - c(i) = (i - fd)/(i+1); -}; - -fdelayltv(N,n,d,x) = sum(i, N+1, delay(n,id+i,x) * h(N,fd,i)) -with { - o = (N-1.00001)/2; // ~center FIR interpolator - dmo = d - o; // assumed >=0 [d > (N-1)/2] - id = int(dmo); - fd = o + ma.frac(dmo); - h(N,d,n) = facs1(N,d,n) * facs2(N,d,n); - facs1(N,d,n) = select2(n,1,prod(k,max(1,n),select2(k -//======================================================================================== - -//----------------`(de.)fdelay[n]a`------------- -// Delay lines interpolated using Thiran allpass interpolation. -// -// #### Usage -// -// ``` -// _ : fdelay[N]a(maxdelay, delay, inputsignal) : _ -// ``` -// -// (exactly like `fdelay`) -// -// Where: -// -// * `N`=1,2,3, or 4 is the order of the Thiran interpolation filter, -// and the delay argument is at least N - 1/2. -// -// #### Note -// -// The interpolated delay should not be less than `N - 1/2`. -// (The allpass delay ranges from `N - 1/2` to `N + 1/2`.) -// This constraint can be alleviated by altering the code, -// but be aware that allpass filters approach zero delay -// by means of pole-zero cancellations. -// The delay range `[N-1/2`,`N+1/2]` is not optimal. What is? -// -// Delay arguments too small will produce an UNSTABLE allpass! -// -// Because allpass interpolation is recursive, it is not as robust -// as Lagrange interpolation under time-varying conditions -// (You may hear clicks when changing the delay rapidly.) -// -// First-order allpass interpolation, delay d in [0.5,1.5] -//------------------------------------------------------------ -// TODO: author JOS, revised by RM -fdelay1a(n,d,x) = delay(n,id,x) : fi.tf1(eta,1,eta) -with { - o = 0.49999; // offset to make life easy for allpass - dmo = d - o; // assumed nonnegative - id = int(dmo); - fd = o + ma.frac(dmo); - eta = (1-fd)/(1+fd); // allpass coefficient -}; - -// second-order allpass delay in [1.5,2.5] -fdelay2a(n,d,x) = delay(n,id,x) : fi.tf2(a2,a1,1,a1,a2) -with { - o = 1.49999; - dmo = d - o; // delay range is [order-1/2, order+1/2] - id = int(dmo); - fd = o + ma.frac(dmo); - a1o2 = (2-fd)/(1+fd); // share some terms (the compiler does this anyway) - a1 = 2*a1o2; - a2 = a1o2*(1-fd)/(2+fd); -}; - -// third-order allpass delay in [2.5,3.5] -// delay d should be at least 2.5 -fdelay3a(n,d,x) = delay(n,id,x) : fi.iir((a3,a2,a1,1),(a1,a2,a3)) -with { - o = 2.49999; - dmo = d - o; - id = int(dmo); - fd = o + ma.frac(dmo); - a1o3 = (3-fd)/(1+fd); - a2o3 = a1o3*(2-fd)/(2+fd); - a1 = 3*a1o3; - a2 = 3*a2o3; - a3 = a2o3*(1-fd)/(3+fd); -}; - -// fourth-order allpass delay in [3.5,4.5] -// delay d should be at least 3.5 -fdelay4a(n,d,x) = delay(n,id,x) : fi.iir((a4,a3,a2,a1,1),(a1,a2,a3,a4)) -with { - o = 3.49999; - dmo = d - o; - id = int(dmo); - fd = o + ma.frac(dmo); - a1o4 = (4-fd)/(1+fd); - a2o6 = a1o4*(3-fd)/(2+fd); - a3o4 = a2o6*(2-fd)/(3+fd); - a1 = 4*a1o4; - a2 = 6*a2o6; - a3 = 4*a3o4; - a4 = a3o4*(1-fd)/(4+fd); -}; - -//////////////////////////////////Deprecated Functions//////////////////////////////////// -// This section implements functions that used to be in music.lib but that are now -// considered as "deprecated". -////////////////////////////////////////////////////////////////////////////////////////// - -delay1s(d) = delay(65536,d); -delay2s(d) = delay(131072,d); -delay5s(d) = delay(262144,d); -delay10s(d) = delay(524288,d); -delay21s(d) = delay(1048576,d); -delay43s(d) = delay(2097152,d); - -fdelay1s(d) = fdelay(65536,d); -fdelay2s(d) = fdelay(131072,d); -fdelay5s(d) = fdelay(262144,d); -fdelay10s(d) = fdelay(524288,d); -fdelay21s(d) = fdelay(1048576,d); -fdelay43s(d) = fdelay(2097152,d); diff --git a/dist/examples/LIBRARIES/demos.lib b/dist/examples/LIBRARIES/demos.lib deleted file mode 100644 index 0b40c7cb..00000000 --- a/dist/examples/LIBRARIES/demos.lib +++ /dev/null @@ -1,1344 +0,0 @@ -//#################################### demos.lib ########################################## -// This library contains a set of demo functions based on examples located in the -// `/examples` folder. Its official prefix is `dm`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ma = library("maths.lib"); -ba = library("basics.lib"); -de = library("delays.lib"); -si = library("signals.lib"); -an = library("analyzers.lib"); -fi = library("filters.lib"); -os = library("oscillators.lib"); -no = library("noises.lib"); -ef = library("misceffects.lib"); -co = library("compressors.lib"); -ve = library("vaeffects.lib"); -pf = library("phaflangers.lib"); -re = library("reverbs.lib"); -en = library("envelopes.lib"); - -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2019 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -MarkDown comments in this section are Copyright 2016-2019 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ - -//====================================Analyzers=========================================== -//======================================================================================== - -//----------------------`(dm.)mth_octave_spectral_level_demo`---------------------- -// Demonstrate mth_octave_spectral_level in a standalone GUI. -// -// #### Usage -// ``` -// _ : mth_octave_spectral_level_demo(BandsPerOctave); -// _ : spectral_level_demo : _; // 2/3 octave -// ``` -//------------------------------------------------------------ -// Coauthor: Yann Orlarey -mth_octave_spectral_level_demo(BPO) = an.mth_octave_spectral_level_default(M,ftop,N,tau,dB_offset) -with{ - M = BPO; - ftop = 16000; - Noct = 10; // number of octaves down from ftop - // Lowest band-edge is at ftop*2^(-Noct+2) = 62.5 Hz when ftop=16 kHz: - N = int(Noct*M); // without 'int()', segmentation fault observed for M=1.67 - ctl_group(x) = hgroup("[1] SPECTRUM ANALYZER CONTROLS", x); - tau = ctl_group(hslider("[0] Level Averaging Time [unit:ms] [scale:log] - [tooltip: band-level averaging time in milliseconds]", - 100,1,10000,1)) * 0.001; - dB_offset = ctl_group(hslider("[1] Level dB Offset [unit:dB] - [tooltip: Level offset in decibels]", - 50,-50,100,1)); -}; - -spectral_level_demo = mth_octave_spectral_level_demo(1.5); // 2/3 octave - - -//======================================Filters=========================================== -//======================================================================================== - -//--------------------------`(dm.)parametric_eq_demo`------------------------------ -// A parametric equalizer application. -// -// #### Usage: -// -// ``` -// _ : parametric_eq_demo : _ ; -// ``` -//------------------------------------------------------------ -parametric_eq_demo = fi.low_shelf(LL,FL) : fi.peak_eq(LP,FP,BP) : fi.high_shelf(LH,FH) -with{ - eq_group(x) = hgroup("[0] PARAMETRIC EQ SECTIONS [tooltip: See Faust's filters.lib - for info and pointers]",x); - ls_group(x) = eq_group(vgroup("[1] Low Shelf",x)); - - LL = ls_group(hslider("[0] Low Boost|Cut [unit:dB] [style:knob] - [tooltip: Amount of low-frequency boost or cut in decibels]",0,-40,40,0.1)); - FL = ls_group(hslider("[1] Transition Frequency [unit:Hz] [style:knob] [scale:log] - [tooltip: Transition-frequency from boost (cut) to unity gain]",200,1,5000,1)); - - pq_group(x) = eq_group(vgroup("[2] Peaking Equalizer[tooltip: Parametric Equalizer - sections from filters.lib]",x)); - LP = pq_group(hslider("[0] Peak Boost|Cut [unit:dB] [style:knob][tooltip: Amount of - local boost or cut in decibels]",0,-40,40,0.1)); - FP = pq_group(hslider("[1] Peak Frequency [unit:PK] [style:knob] [tooltip: Peak - Frequency in Piano Key (PK) units (A440 = 49PK)]",49,1,100,1)) : si.smooth(0.999) - : ba.pianokey2hz; - Q = pq_group(hslider("[2] Peak Q [style:knob] [scale:log] [tooltip: Quality factor - (Q) of the peak = center-frequency/bandwidth]",40,1,1000,0.1)); - - BP = FP/Q; - - hs_group(x) = eq_group(vgroup("[3] High Shelf [tooltip: A high shelf provides a boost - or cut above some frequency]",x)); - LH = hs_group(hslider("[0] High Boost|Cut [unit:dB] [style:knob] [tooltip: Amount of - high-frequency boost or cut in decibels]",0,-40,40,.1)); - FH = hs_group(hslider("[1] Transition Frequency [unit:Hz] [style:knob] [scale:log] - [tooltip: Transition-frequency from boost (cut) to unity gain]",8000,20,10000,1)); -}; - - -//-------------------`(dm.)spectral_tilt_demo`----------------------- -// A spectral tilt application. -// -// #### Usage -// -// ``` -// _ : spectral_tilt_demo(N) : _ ; -// ``` -// -// Where: -// -// * `N`: filter order (integer) -// -// All other parameters interactive -//------------------------------------------------------------ -spectral_tilt_demo(N) = fi.spectral_tilt(O,f0,bw,alpha) -with{ - O = N; - alpha = hslider("[1] Slope of Spectral Tilt across Band",-1/2,-1,1,0.001); - f0 = hslider("[2] Band Start Frequency [unit:Hz]",100,20,10000,1); - bw = hslider("[3] Band Width [unit:Hz]",5000,100,10000,1); -}; - - -//---------`(dm.)mth_octave_filterbank_demo` and `(dm.)filterbank_demo`------------- -// Graphic Equalizer: Each filter-bank output signal routes through a fader. -// -// #### Usage -// -// ``` -// _ : mth_octave_filterbank_demo(M) : _ -// _ : filterbank_demo : _ -// ``` -// -// Where: -// -// * `N`: number of bands per octave -//-------------------------------------------------------------- -mth_octave_filterbank_demo(O) = bp1(bp,mthoctavefilterbankdemo) -with{ - M = O; - bp1 = ba.bypass1; - mofb_group(x) = vgroup("CONSTANT-Q FILTER BANK (Butterworth dyadic tree) - [tooltip: See Faust's filters.lib for documentation and references]", x); - bypass_group(x) = mofb_group(hgroup("[0]", x)); - slider_group(x) = mofb_group(hgroup("[1]", x)); - - N = 10*M; // total number of bands (highpass band, octave-bands, dc band) - ftop = 10000; - mthoctavefilterbankdemo = chan; - chan = fi.mth_octave_filterbank_default(M,ftop,N) : sum(i,N,(*(ba.db2linear(fader(N-i))))); - fader(i) = slider_group(vslider("Band%2i [unit:dB] [tooltip: Bandpass filter - gain in dB]", -10, -70, 10, 0.1)) : si.smoo; - bp = bypass_group(checkbox("[0] Bypass - [tooltip: When this is checked, the filter-bank has no effect]")); -}; - -filterbank_demo = mth_octave_filterbank_demo(1); // octave-bands = default - - -//======================================Effects=========================================== -//======================================================================================== - -//---------------------------`(dm.)cubicnl_demo`-------------------------- -// Distortion demo application. -// -// #### Usage: -// -// ``` -// _ : cubicnl_demo : _; -// ``` -//------------------------------------------------------------ -cubicnl_demo = ba.bypass1(bp, ef.cubicnl_nodc(drive:si.smoo,offset:si.smoo)) -with{ - cnl_group(x) = vgroup("CUBIC NONLINEARITY cubicnl [tooltip: Reference: - https://ccrma.stanford.edu/~jos/pasp/Cubic_Soft_Clipper.html]", x); - bp = cnl_group(checkbox("[0] Bypass [tooltip: When this is checked, the - nonlinearity has no effect]")); - drive = cnl_group(hslider("[1] Drive [tooltip: Amount of distortion]", - 0, 0, 1, 0.01)); - offset = cnl_group(hslider("[2] Offset [tooltip: Brings in even harmonics]", - 0, 0, 1, 0.01)); -}; - - -//----------------------------`(dm.)gate_demo`------------------------- -// Gate demo application. -// -// #### Usage -// -// ``` -// _,_ : gate_demo : _,_; -// ``` -//------------------------------------------------------------ -gate_demo = ba.bypass2(gbp,gate_stereo_demo) -with{ - gate_group(x) = vgroup("GATE [tooltip: Reference: - http://en.wikipedia.org/wiki/Noise_gate]", x); - meter_group(x) = gate_group(hgroup("[0]", x)); - knob_group(x) = gate_group(hgroup("[1]", x)); - - gbp = meter_group(checkbox("[0] Bypass [tooltip: When this is checked, - the gate has no effect]")); - - gateview = ef.gate_gain_mono(gatethr,gateatt,gatehold,gaterel) : ba.linear2db : - meter_group(hbargraph("[1] Gate Gain [unit:dB] [tooltip: Current gain of the - gate in dB]", -50,+10)); // [style:led] - - gate_stereo_demo(x,y) = attach(x,gateview(abs(x)+abs(y))),y : - ef.gate_stereo(gatethr,gateatt,gatehold,gaterel); - - gatethr = knob_group(hslider("[1] Threshold [unit:dB] [style:knob] [tooltip: When - the signal level falls below the Threshold (expressed in dB), the signal is - muted]", -30, -120, 0, 0.1)); - - gateatt = knob_group(hslider("[2] Attack [unit:us] [style:knob] [scale:log] - [tooltip: Time constant in MICROseconds (1/e smoothing time) for the gate - gain to go (exponentially) from 0 (muted) to 1 (unmuted)]", - 10, 10, 10000, 1)) : *(0.000001) : max(1.0/float(ma.SR)); - - gatehold = knob_group(hslider("[3] Hold [unit:ms] [style:knob] [scale:log] - [tooltip: Time in ms to keep the gate open (no muting) after the signal - level falls below the Threshold]", 200, 1, 1000, 1)) : *(0.001) : - max(1.0/float(ma.SR)); - - gaterel = knob_group(hslider("[4] Release [unit:ms] [style:knob] [scale:log] - [tooltip: Time constant in ms (1/e smoothing time) for the gain to go - (exponentially) from 1 (unmuted) to 0 (muted)]", - 100, 1, 1000, 1)) : *(0.001) : max(1.0/float(ma.SR)); -}; - - -//----------------------------`(dm.)compressor_demo`------------------------- -// Compressor demo application. -// -// #### Usage -// -// ``` -// _,_ : compressor_demo : _,_; -// ``` -//------------------------------------------------------------ -compressor_demo = ba.bypass2(cbp,compressor_stereo_demo) -with{ - comp_group(x) = vgroup("COMPRESSOR [tooltip: Reference: - http://en.wikipedia.org/wiki/Dynamic_range_compression]", x); - - meter_group(x) = comp_group(hgroup("[0]", x)); - knob_group(x) = comp_group(hgroup("[1]", x)); - - cbp = meter_group(checkbox("[0] Bypass [tooltip: When this is checked, the compressor - has no effect]")); - gainview = co.compression_gain_mono(ratio,threshold,attack,release) : ba.linear2db : - meter_group(hbargraph("[1] Compressor Gain [unit:dB] [tooltip: Current gain of - the compressor in dB]",-50,+10)); - - displaygain = _,_ <: _,_,(abs,abs:+) : _,_,gainview : _,attach; - - compressor_stereo_demo = - displaygain(co.compressor_stereo(ratio,threshold,attack,release)) : - *(makeupgain), *(makeupgain); - - ctl_group(x) = knob_group(hgroup("[3] Compression Control", x)); - - ratio = ctl_group(hslider("[0] Ratio [style:knob] - [tooltip: A compression Ratio of N means that for each N dB increase in input - signal level above Threshold, the output level goes up 1 dB]", - 5, 1, 20, 0.1)); - - threshold = ctl_group(hslider("[1] Threshold [unit:dB] [style:knob] - [tooltip: When the signal level exceeds the Threshold (in dB), its level - is compressed according to the Ratio]", - -30, -100, 10, 0.1)); - - env_group(x) = knob_group(hgroup("[4] Compression Response", x)); - - attack = env_group(hslider("[1] Attack [unit:ms] [style:knob] [scale:log] - [tooltip: Time constant in ms (1/e smoothing time) for the compression gain - to approach (exponentially) a new lower target level (the compression - `kicking in')]", 50, 1, 1000, 0.1)) : *(0.001) : max(1/ma.SR); - - release = env_group(hslider("[2] Release [unit:ms] [style: knob] [scale:log] - [tooltip: Time constant in ms (1/e smoothing time) for the compression gain - to approach (exponentially) a new higher target level (the compression - 'releasing')]", 500, 1, 1000, 0.1)) : *(0.001) : max(1/ma.SR); - - makeupgain = comp_group(hslider("[5] Makeup Gain [unit:dB] - [tooltip: The compressed-signal output level is increased by this amount - (in dB) to make up for the level lost due to compression]", - 40, -96, 96, 0.1)) : ba.db2linear; -}; - - -//-------------------------`(dm.)moog_vcf_demo`--------------------------- -// Illustrate and compare all three Moog VCF implementations above. -// -// #### Usage -// -// ``` -// _ : moog_vcf_demo : _; -// ``` -//------------------------------------------------------------ -moog_vcf_demo = ba.bypass1(bp,vcf) -with{ - mvcf_group(x) = hgroup("MOOG VCF (Voltage Controlled Filter) [tooltip: See Faust's - vaeffects.lib for info and references]",x); - cb_group(x) = mvcf_group(hgroup("[0]",x)); - - bp = cb_group(checkbox("[0] Bypass [tooltip: When this is checked, the Moog VCF - has no effect]")); - archsw = cb_group(checkbox("[1] Use Biquads [tooltip: Select moog_vcf_2b (two-biquad) - implementation, instead of the default moog_vcf (analog style) implementation]")); - bqsw = cb_group(checkbox("[2] Normalized Ladders [tooltip: If using biquads, make - them normalized ladders (moog_vcf_2bn)]")); - - freq = mvcf_group(hslider("[1] Corner Frequency [unit:PK] [tooltip: The VCF resonates - at the corner frequency (specified in PianoKey (PK) units, with A440 = 49 PK). - The VCF response is flat below the corner frequency, and rolls off -24 dB per - octave above.]", - 25, 1, 88, 0.01) : ba.pianokey2hz) : si.smoo; - - res = mvcf_group(hslider("[2] Corner Resonance [style:knob] [tooltip: Amount of - resonance near VCF corner frequency (specified between 0 and 1)]", 0.9, 0, 1, 0.01)); - - outgain = mvcf_group(hslider("[3] VCF Output Level [unit:dB] [style:knob] [tooltip: - output level in decibels]", 5, -60, 20, 0.1)) : ba.db2linear : si.smoo; - - vcfbq = _ <: select2(bqsw, ve.moog_vcf_2b(res,freq), ve.moog_vcf_2bn(res,freq)); - vcfarch = _ <: select2(archsw, ve.moog_vcf(res^4,freq), vcfbq); - vcf = vcfarch : *(outgain); -}; - - -//-------------------------`(dm.)wah4_demo`--------------------------- -// Wah pedal application. -// -// #### Usage -// -// ``` -// _ : wah4_demo : _; -// ``` -//------------------------------------------------------------ -wah4_demo = ba.bypass1(bp, ve.wah4(fr)) -with{ - wah4_group(x) = hgroup("WAH4 [tooltip: Fourth-order wah effect made using moog_vcf]", x); - bp = wah4_group(checkbox("[0] Bypass [tooltip: When this is checked, the wah pedal has - no effect]")); - fr = wah4_group(hslider("[1] Resonance Frequency [scale:log] [tooltip: wah resonance - frequency in Hz]", 200,100,2000,1)); - // Avoid dc with the moog_vcf (amplitude too high when freq comes up from dc) - // Also, avoid very high resonance frequencies (e.g., 5kHz or above). -}; - - -//-------------------------`(dm.)crybaby_demo`--------------------------- -// Crybaby effect application. -// -// #### Usage -// -// ``` -// _ : crybaby_demo : _ ; -// ``` -//------------------------------------------------------------ -crybaby_demo = ba.bypass1(bp, ve.crybaby(wah)) -with{ - crybaby_group(x) = hgroup("CRYBABY [tooltip: Reference: - https://ccrma.stanford.edu/~jos/pasp/vegf.html]", x); - bp = crybaby_group(checkbox("[0] Bypass [tooltip: When this is checked, the wah - pedal has no effect]")); - wah = crybaby_group(hslider("[1] Wah parameter [tooltip: wah pedal angle between - 0 (rocked back) and 1 (rocked forward)]",0.8,0,1,0.01)); -}; - - -//-------------------------`(dm.)flanger_demo`--------------------------- -// Flanger effect application. -// -// #### Usage -// -// ``` -// _,_ : flanger_demo : _,_; -// ``` -//------------------------------------------------------------ -flanger_demo = ba.bypass2(fbp,flanger_stereo_demo) -with{ - flanger_group(x) = vgroup("FLANGER - [tooltip: Reference: https://ccrma.stanford.edu/~jos/pasp/Flanging.html]", x); - meter_group(x) = flanger_group(hgroup("[0]", x)); - ctl_group(x) = flanger_group(hgroup("[1]", x)); - del_group(x) = flanger_group(hgroup("[2] Delay Controls", x)); - lvl_group(x) = flanger_group(hgroup("[3]", x)); - - fbp = meter_group(checkbox("[0] Bypass [tooltip: When this is checked, the flanger - has no effect]")); - invert = meter_group(checkbox("[1] Invert Flange Sum")); - - // FIXME: This should be an amplitude-response display: - flangeview = lfor(freq) + lfol(freq) : meter_group(hbargraph("[2] Flange LFO - [style: led] [tooltip: Display sum of flange delays]", -1.5,+1.5)); - - flanger_stereo_demo(x,y) = attach(x,flangeview),y : - *(level),*(level) : pf.flanger_stereo(dmax,curdel1,curdel2,depth,fb,invert); - - lfol = os.oscrs; - lfor = os.oscrc; - - dmax = 2048; - dflange = 0.001 * ma.SR * - del_group(hslider("[1] Flange Delay [unit:ms] [style:knob]", 10, 0, 20, 0.001)); - odflange = 0.001 * ma.SR * - del_group(hslider("[2] Delay Offset [unit:ms] [style:knob]", 1, 0, 20, 0.001)); - freq = ctl_group(hslider("[1] Speed [unit:Hz] [style:knob]", 0.5, 0, 10, 0.01)); - depth = ctl_group(hslider("[2] Depth [style:knob]", 1, 0, 1, 0.001)); - fb = ctl_group(hslider("[3] Feedback [style:knob]", 0, -0.999, 0.999, 0.001)); - level = lvl_group(hslider("Flanger Output Level [unit:dB]", 0, -60, 10, 0.1)) : - ba.db2linear; - curdel1 = odflange+dflange*(1 + lfol(freq))/2; - curdel2 = odflange+dflange*(1 + lfor(freq))/2; -}; - - -//-------------------------`(dm.)phaser2_demo`--------------------------- -// Phaser effect demo application. -// -// #### Usage -// -// ``` -// _,_ : phaser2_demo : _,_; -// ``` -//------------------------------------------------------------ -phaser2_demo = ba.bypass2(pbp,phaser2_stereo_demo) -with{ - phaser2_group(x) = vgroup("PHASER2 [tooltip: Reference: - https://ccrma.stanford.edu/~jos/pasp/Flanging.html]", x); - meter_group(x) = phaser2_group(hgroup("[0]", x)); - ctl_group(x) = phaser2_group(hgroup("[1]", x)); - nch_group(x) = phaser2_group(hgroup("[2]", x)); - lvl_group(x) = phaser2_group(hgroup("[3]", x)); - - pbp = meter_group(checkbox("[0] Bypass [tooltip: When this is checked, the phaser - has no effect]")); - invert = meter_group(checkbox("[1] Invert Internal Phaser Sum")); - vibr = meter_group(checkbox("[2] Vibrato Mode")); // In this mode you can hear any "Doppler" - - // FIXME: This should be an amplitude-response display: - // flangeview = phaser2_amp_resp : meter_group(hspectrumview("[2] Phaser Amplitude Response", 0,1)); - // phaser2_stereo_demo(x,y) = attach(x,flangeview),y : ... - - phaser2_stereo_demo = *(level),*(level) : - pf.phaser2_stereo(Notches,width,frqmin,fratio,frqmax,speed,mdepth,fb,invert); - - Notches = 4; // Compile-time parameter: 2 is typical for analog phaser stomp-boxes - - // FIXME: Add tooltips - speed = ctl_group(hslider("[1] Speed [unit:Hz] [style:knob]", 0.5, 0, 10, 0.001)); - depth = ctl_group(hslider("[2] Notch Depth (Intensity) [style:knob]", 1, 0, 1, 0.001)); - fb = ctl_group(hslider("[3] Feedback Gain [style:knob]", 0, -0.999, 0.999, 0.001)); - - width = nch_group(hslider("[1] Notch width [unit:Hz] [style:knob] [scale:log]", - 1000, 10, 5000, 1)); - frqmin = nch_group(hslider("[2] Min Notch1 Freq [unit:Hz] [style:knob] [scale:log]", - 100, 20, 5000, 1)); - frqmax = nch_group(hslider("[3] Max Notch1 Freq [unit:Hz] [style:knob] [scale:log]", - 800, 20, 10000, 1)) : max(frqmin); - fratio = nch_group(hslider("[4] Notch Freq Ratio: NotchFreq(n+1)/NotchFreq(n) [style:knob]", - 1.5, 1.1, 4, 0.001)); - - level = lvl_group(hslider("Phaser Output Level [unit:dB]", 0, -60, 10, 0.1)) : - ba.db2linear; - - mdepth = select2(vibr,depth,2); // Improve "ease of use" -}; - -//----------------------------`(dm.)freeverb_demo`------------------------- -// Freeverb demo application. -// -// #### Usage -// -// ``` -// _,_ : freeverb_demo : _,_; -// ``` -//------------------------------------------------------------ -// Author: Romain Michon -// License: LGPL -freeverb_demo = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ -with{ - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - parameters(x) = hgroup("Freeverb",x); - knobGroup(x) = parameters(vgroup("[0]",x)); - damping = knobGroup(vslider("[0] Damp [style: knob] [tooltip: Somehow control the - density of the reverb.]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR); - combfeed = knobGroup(vslider("[1] RoomSize [style: knob] [tooltip: The room size - between 0 and 1 with 1 for the largest room.]", 0.5, 0, 1, 0.025)*scaleroom* - origSR/ma.SR + offsetroom); - spatSpread = knobGroup(vslider("[2] Stereo Spread [style: knob] [tooltip: Spatial - spread between 0 and 1 with 1 for maximum spread.]",0.5,0,1,0.01)*46*ma.SR/origSR - : int); - g = parameters(vslider("[1] Wet [tooltip: The amount of reverb applied to the signal - between 0 and 1 with 1 for the maximum amount of reverb.]", 0.3333, 0, 1, 0.025)); -}; - -//---------------------`(dm.)stereo_reverb_tester`-------------------- -// Handy test inputs for reverberator demos below. -// -// #### Usage -// -// ``` -// _ : stereo_reverb_tester : _ -// ``` -//------------------------------------------------------------ -stereo_reverb_tester(revin_group,x,y) = reverb_tester(_) -with { - reverb_tester(revin_group,x,y) = inx,iny with { - ck_group(x) = revin_group(vgroup("[1] Input Config",x)); - mutegain = 1 - ck_group(checkbox("[1] Mute Ext Inputs - [tooltip: When this is checked, the stereo external audio inputs are - disabled (good for hearing the impulse response or pink-noise response alone)]")); - pinkin = ck_group(checkbox("[2] Pink Noise - [tooltip: Pink Noise (or 1/f noise) is Constant-Q Noise (useful for adjusting - the EQ sections)]")); - - imp_group(x) = revin_group(hgroup("[2] Impulse Selection",x)); - pulseL = imp_group(button("[1] Left - [tooltip: Send impulse into LEFT channel]")) : ba.impulsify; - pulseC = imp_group(button("[2] Center - [tooltip: Send impulse into LEFT and RIGHT channels]")) : ba.impulsify; - pulseR = imp_group(button("[3] Right - [tooltip: Send impulse into RIGHT channel]")) : ba.impulsify; - - inx = x*mutegain + (pulseL+pulseC) + pn; - iny = y*mutegain + (pulseR+pulseC) + pn; - pn = 0.1*pinkin*no.pink_noise; - }; -}; - - -//-------------------------`(dm.)fdnrev0_demo`--------------------------- -// A reverb application using `fdnrev0`. -// -// #### Usage -// -// ``` -// _,_ : fdnrev0_demo(N,NB,BBSO) : _,_ -// ``` -// -// Where: -// -// * `n`: Feedback Delay Network (FDN) order / number of delay lines used = -// order of feedback matrix / 2, 4, 8, or 16 [extend primes array below for -// 32, 64, ...] -// * `nb`: Number of frequency bands / Number of (nearly) independent T60 controls -// / Integer 3 or greater -// * `bbso` = Butterworth band-split order / order of lowpass/highpass bandsplit -// used at each crossover freq / odd positive integer -//------------------------------------------------------------ -fdnrev0_demo(N,NB,BBSO) = stereo_reverb_tester(revin_group) - <: re.fdnrev0(MAXDELAY,delays,BBSO,freqs,durs,loopgainmax,nonl) - :> *(gain),*(gain) -with{ - MAXDELAY = 8192; // sync w delays and prime_power_delays above - defdurs = (8.4,6.5,5.0,3.8,2.7); // NB default durations (sec) - deffreqs = (500,1000,2000,4000); // NB-1 default crossover frequencies (Hz) - deflens = (56.3,63.0); // 2 default min and max path lengths - - fdn_group(x) = vgroup("FEEDBACK DELAY NETWORK (FDN) REVERBERATOR, ORDER 16 - [tooltip: See Faust's reverbs.lib for documentation and references]", x); - - freq_group(x) = fdn_group(vgroup("[1] Band Crossover Frequencies", x)); - t60_group(x) = fdn_group(hgroup("[2] Band Decay Times (T60)", x)); - path_group(x) = fdn_group(vgroup("[3] Room Dimensions", x)); - revin_group(x) = fdn_group(hgroup("[4] Input Controls", x)); - nonl_group(x) = revin_group(vgroup("[4] Nonlinearity",x)); - quench_group(x) = revin_group(vgroup("[3] Reverb State",x)); - - nonl = nonl_group(hslider("[style:knob] [tooltip: nonlinear mode coupling]", - 0, -0.999, 0.999, 0.001)); - loopgainmax = 1.0-0.5*quench_group(button("[1] Quench - [tooltip: Hold down 'Quench' to clear the reverberator]")); - - pathmin = path_group(hslider("[1] min acoustic ray length [unit:m] [scale:log] - [tooltip: This length (in meters) determines the shortest delay-line used in the FDN - reverberator. Think of it as the shortest wall-to-wall separation in the room.]", - 46, 0.1, 63, 0.1)); - pathmax = path_group(hslider("[2] max acoustic ray length [unit:m] [scale:log] - [tooltip: This length (in meters) determines the longest delay-line used in the - FDN reverberator. Think of it as the largest wall-to-wall separation in the room.]", - 63, 0.1, 63, 0.1)); - - durvals(i) = t60_group(vslider("[%i] %i [unit:s] [scale:log][tooltip: T60 is the 60dB - decay-time in seconds. For concert halls, an overall reverberation time (T60) near - 1.9 seconds is typical [Beranek 2004]. Here we may set T60 independently in each - frequency band. In real rooms, higher frequency bands generally decay faster due - to absorption and scattering.]",ba.take(i+1,defdurs), 0.1, 100, 0.1)); - durs = par(i,NB,durvals(NB-1-i)); - - freqvals(i) = freq_group(hslider("[%i] Band %i upper edge in Hz [unit:Hz] [scale:log] - [tooltip: Each delay-line signal is split into frequency-bands for separate - decay-time control in each band]",ba.take(i+1,deffreqs), 100, 10000, 1)); - freqs = par(i,NB-1,freqvals(i)); - - delays = de.prime_power_delays(N,pathmin,pathmax); - - gain = hslider("[3] Output Level (dB) [unit:dB][tooltip: Output scale factor]", - -40, -70, 20, 0.1) : ba.db2linear; - // (can cause infinite loop:) with { db2linear(x) = pow(10, x/20.0); }; -}; - - - -//---------------------------`(dm.)zita_rev_fdn_demo`------------------------------ -// Reverb demo application based on `zita_rev_fdn`. -// -// #### Usage -// -// ``` -// si.bus(8) : zita_rev_fdn_demo : si.bus(8) -// ``` -//------------------------------------------------------------ -zita_rev_fdn_demo = re.zita_rev_fdn(f1,f2,t60dc,t60m,fsmax) -with{ - fsmax = 48000.0; - fdn_group(x) = hgroup("Zita_Rev Internal FDN Reverb [tooltip: ~ Zita_Rev's internal - 8x8 Feedback Delay Network (FDN) & Schroeder allpass-comb reverberator. See - Faust's reverbs.lib for documentation and references]",x); - t60dc = fdn_group(vslider("[1] Low RT60 [unit:s] [style:knob][style:knob] - [tooltip: T60 = time (in seconds) to decay 60dB in low-frequency band]", - 3, 1, 8, 0.1)); - f1 = fdn_group(vslider("[2] LF X [unit:Hz] [style:knob] [scale:log] - [tooltip: Crossover frequency (Hz) separating low and middle frequencies]", - 200, 50, 1000, 1)); - t60m = fdn_group(vslider("[3] Mid RT60 [unit:s] [style:knob] [scale:log] - [tooltip: T60 = time (in seconds) to decay 60dB in middle band]", - 2, 1, 8, 0.1)); - f2 = fdn_group(vslider("[4] HF Damping [unit:Hz] [style:knob] [scale:log] - [tooltip: Frequency (Hz) at which the high-frequency T60 is half the middle-band's T60]", - 6000, 1500, 0.49*fsmax, 1)); -}; - -//---------------------------`(dm.)zita_light`------------------------------ -// Light version of `dm.zita_rev1` with only 2 UI elements. -// -// #### Usage -// -// ``` -// _,_ : zita_light : _,_ -// ``` -//------------------------------------------------------------ -zita_light = hgroup("Zita Light",(_,_ <: re.zita_rev1_stereo(rdel,f1,f2,t60dc,t60m,fsmax),_,_ : - out_eq,_,_ : dry_wet : out_level)) -with{ - fsmax = 48000.0; // highest sampling rate that will be used - rdel = 60; - f1 = 200; - t60dc = 3; - t60m = 2; - f2 = 6000; - out_eq = pareq_stereo(eq1f,eq1l,eq1q) : pareq_stereo(eq2f,eq2l,eq2q); - pareq_stereo(eqf,eql,Q) = fi.peak_eq_rm(eql,eqf,tpbt), fi.peak_eq_rm(eql,eqf,tpbt) - with { - tpbt = wcT/sqrt(max(0,g)); // tan(PI*B/SR), B bw in Hz (Q^2 ~ g/4) - wcT = 2*ma.PI*eqf/ma.SR; // peak frequency in rad/sample - g = ba.db2linear(eql); // peak gain - }; - eq1f = 315; - eq1l = 0; - eq1q = 3; - eq2f = 1500; - eq2l = 0; - eq2q = 3; - dry_wet(x,y) = *(wet) + dry*x, *(wet) + dry*y - with { - wet = 0.5*(drywet+1.0); - dry = 1.0-wet; - }; - drywet = vslider("[1] Dry/Wet Mix [style:knob] [tooltip: -1 = dry, 1 = wet]", - 0,-1.0,1.0,0.01) : si.smoo; - gain = vslider("[2] Level [unit:dB] [style:knob] [tooltip: Output scale - factor]", -6, -70, 40, 0.1) : ba.db2linear : si.smoo; - out_level = *(gain),*(gain); -}; - -//----------------------------------`(dm.)zita_rev1`------------------------------ -// Example GUI for `zita_rev1_stereo` (mostly following the Linux `zita-rev1` GUI). -// -// Only the dry/wet and output level parameters are "dezippered" here. If -// parameters are to be varied in real time, use `smooth(0.999)` or the like -// in the same way. -// -// #### Usage -// -// ``` -// _,_ : zita_rev1 : _,_ -// ``` -// -// #### Reference -// -// -//------------------------------------------------------------ -zita_rev1 = _,_ <: re.zita_rev1_stereo(rdel,f1,f2,t60dc,t60m,fsmax),_,_ : out_eq,_,_ : - dry_wet : out_level -with{ - fsmax = 48000.0; // highest sampling rate that will be used - - fdn_group(x) = hgroup( - "[0] Zita_Rev1 [tooltip: ~ ZITA REV1 FEEDBACK DELAY NETWORK (FDN) & SCHROEDER - ALLPASS-COMB REVERBERATOR (8x8). See Faust's reverbs.lib for documentation and - references]", x); - - in_group(x) = fdn_group(hgroup("[1] Input", x)); - - rdel = in_group(vslider("[1] In Delay [unit:ms] [style:knob] [tooltip: Delay in ms - before reverberation begins]",60,20,100,1)); - - freq_group(x) = fdn_group(hgroup("[2] Decay Times in Bands (see tooltips)", x)); - - f1 = freq_group(vslider("[1] LF X [unit:Hz] [style:knob] [scale:log] [tooltip: - Crossover frequency (Hz) separating low and middle frequencies]", 200, 50, 1000, 1)); - - t60dc = freq_group(vslider("[2] Low RT60 [unit:s] [style:knob] [scale:log] - [style:knob] [tooltip: T60 = time (in seconds) to decay 60dB in low-frequency band]", - 3, 1, 8, 0.1)); - - t60m = freq_group(vslider("[3] Mid RT60 [unit:s] [style:knob] [scale:log] [tooltip: - T60 = time (in seconds) to decay 60dB in middle band]",2, 1, 8, 0.1)); - - f2 = freq_group(vslider("[4] HF Damping [unit:Hz] [style:knob] [scale:log] - [tooltip: Frequency (Hz) at which the high-frequency T60 is half the middle-band's T60]", - 6000, 1500, 0.49*fsmax, 1)); - - out_eq = pareq_stereo(eq1f,eq1l,eq1q) : pareq_stereo(eq2f,eq2l,eq2q); - // Zolzer style peaking eq (not used in zita-rev1) (filters.lib): - // pareq_stereo(eqf,eql,Q) = peak_eq(eql,eqf,eqf/Q), peak_eq(eql,eqf,eqf/Q); - // Regalia-Mitra peaking eq with "Q" hard-wired near sqrt(g)/2 (filters.lib): - pareq_stereo(eqf,eql,Q) = fi.peak_eq_rm(eql,eqf,tpbt), fi.peak_eq_rm(eql,eqf,tpbt) - with { - tpbt = wcT/sqrt(max(0,g)); // tan(PI*B/SR), B bw in Hz (Q^2 ~ g/4) - wcT = 2*ma.PI*eqf/ma.SR; // peak frequency in rad/sample - g = ba.db2linear(eql); // peak gain - }; - - eq1_group(x) = fdn_group(hgroup("[3] RM Peaking Equalizer 1", x)); - - eq1f = eq1_group(vslider("[1] Eq1 Freq [unit:Hz] [style:knob] [scale:log] [tooltip: - Center-frequency of second-order Regalia-Mitra peaking equalizer section 1]", - 315, 40, 2500, 1)); - - eq1l = eq1_group(vslider("[2] Eq1 Level [unit:dB] [style:knob] [tooltip: Peak level - in dB of second-order Regalia-Mitra peaking equalizer section 1]", 0, -15, 15, 0.1)); - - eq1q = eq1_group(vslider("[3] Eq1 Q [style:knob] [tooltip: Q = centerFrequency/bandwidth - of second-order peaking equalizer section 1]", 3, 0.1, 10, 0.1)); - - eq2_group(x) = fdn_group(hgroup("[4] RM Peaking Equalizer 2", x)); - - eq2f = eq2_group(vslider("[1] Eq2 Freq [unit:Hz] [style:knob] [scale:log] [tooltip: - Center-frequency of second-order Regalia-Mitra peaking equalizer section 2]", - 1500, 160, 10000, 1)); - - eq2l = eq2_group(vslider("[2] Eq2 Level [unit:dB] [style:knob] [tooltip: Peak level - in dB of second-order Regalia-Mitra peaking equalizer section 2]", 0, -15, 15, 0.1)); - - eq2q = eq2_group(vslider("[3] Eq2 Q [style:knob] [tooltip: Q = centerFrequency/bandwidth - of second-order peaking equalizer section 2]", 3, 0.1, 10, 0.1)); - - out_group(x) = fdn_group(hgroup("[5] Output", x)); - - dry_wet(x,y) = *(wet) + dry*x, *(wet) + dry*y with { - wet = 0.5*(drywet+1.0); - dry = 1.0-wet; - }; - - drywet = out_group(vslider("[1] Dry/Wet Mix [style:knob] [tooltip: -1 = dry, 1 = wet]", - 0, -1.0, 1.0, 0.01)) : si.smoo; - - out_level = *(gain),*(gain); - - gain = out_group(vslider("[2] Level [unit:dB] [style:knob] [tooltip: Output scale - factor]", -20, -70, 40, 0.1)) : ba.db2linear : si.smoo; -}; - - -//====================================Generators========================================== -//======================================================================================== - -//--------------------------`(dm.)sawtooth_demo`--------------------------- -// An application demonstrating the different sawtooth oscillators of Faust. -// -// #### Usage -// -// ``` -// sawtooth_demo : _ -// ``` -//------------------------------------------------------------ -sawtooth_demo = signal -with{ - osc_group(x) = vgroup("[0] SAWTOOTH OSCILLATOR [tooltip: See Faust's oscillators.lib - for documentation and references]",x); - knob_group(x) = osc_group(hgroup("[1]", x)); - ampdb = knob_group(vslider("[1] Amplitude [unit:dB] [style:knob] [tooltip: Sawtooth - waveform amplitude]",-20,-120,10,0.1)); - amp = ampdb : ba.db2linear : si.smoo; - freq = knob_group(vslider("[2] Frequency [unit:PK] [style:knob] [tooltip: Sawtooth - frequency as a Piano Key (PK) number (A440 = key 49)]",49,1,88,0.01) : ba.pianokey2hz); - detune1 = 1 + 0.01 * knob_group( - vslider("[3] Detuning 1 [unit:%%] [style:knob] [tooltip: Percentage frequency-shift - up or down for second oscillator]",-0.1,-10,10,0.01)); - detune2 = 1 + 0.01 * knob_group(vslider("[4] Detuning 2 [unit:%%] [style:knob] [tooltip: - Percentage frequency-shift up or down for third detuned oscillator]",+0.1,-10,10,0.01)); - portamento = knob_group(vslider("[5] Portamento [unit:sec] [style:knob] [scale:log] - [tooltip: Portamento (frequency-glide) time-constant in seconds]",0.1,0.001,10,0.001)); - sfreq = freq : si.smooth(ba.tau2pole(portamento)); - saworder = knob_group(nentry("[6] Saw Order [tooltip: Order of sawtootn aliasing - suppression]",2,1,os.MAX_SAW_ORDER,1)); - sawchoice = _ <: par(i,os.MAX_SAW_ORDER,os.sawN(i+1)) : - ba.selectn(int(os.MAX_SAW_ORDER), int(saworder-1)); // when max is pwr of 2 - tone = (amp/3) * (sawchoice(sfreq) + sawchoice(sfreq*detune1) + sawchoice(sfreq*detune2)); - signal = amp * select2(ei, select2(ss, tone, white_or_pink_noise), _); - white_or_pink_noise = select2(wp,no.noise,no.pink_noise); - checkbox_group(x) = knob_group(vgroup("[7] Alternate Signals",x)); - ss = checkbox_group(checkbox("[0] Noise (White or Pink - uses only Amplitude control on - the left)")); - wp = checkbox_group(checkbox("[1] Pink instead of White Noise (also called 1/f Noise) - [tooltip: Pink Noise (or 1/f noise) is Constant-Q Noise, meaning that it has the - same total power in every octave]")); - ei = checkbox_group(checkbox("[2] External Signal Input (overrides Sawtooth/Noise - selection above)")); -}; - - -//----------------------`(dm.)virtual_analog_oscillator_demo`---------------------- -// Virtual analog oscillator demo application. -// -// #### Usage -// -// ``` -// virtual_analog_oscillator_demo : _ -// ``` -//------------------------------------------------------------ -virtual_analog_oscillator_demo = signal -with{ - osc_group(x) = vgroup("[0] VIRTUAL ANALOG OSCILLATORS - [tooltip: See Faust's oscillators.lib for documentation and references]",x); - - // Signals - sawchoice = _ <: - // When MAX_SAW_ORDER is a power of 2: - par(i,os.MAX_SAW_ORDER,os.sawN(i+1)) : ba.selectn(int(os.MAX_SAW_ORDER), int(saworder-1)); - // When MAX_SAW_ORDER is NOT a power of 2: - // (par(i,MAX_SAW_ORDER,sawN(i+1)), par(j,MAX_SAW_ORDER_NEXTPOW2-MAX_SAW_ORDER,_)) - // : selectn(MAX_SAW_ORDER_NEXTPOW2, saworder-1); - saw = (amp/3) * - (sawchoice(sfreq) + sawchoice(sfreq*detune1) + sawchoice(sfreq*detune2)); - sq = (amp/3) * - (os.square(sfreq) + os.square(sfreq*detune1) + os.square(sfreq*detune2)); - tri = (amp/3) * - (os.triangle(sfreq) + os.triangle(sfreq*detune1) + os.triangle(sfreq*detune2)); - pt = (amp/3) * (os.pulsetrain(sfreq,ptd) - + os.pulsetrain(sfreq*detune1,ptd) - + os.pulsetrain(sfreq*detune2,ptd)); - ptN = (amp/3) * (os.pulsetrainN(N,sfreq,ptd) - + os.pulsetrainN(N,sfreq*detune1,ptd) - + os.pulsetrainN(N,sfreq*detune2,ptd)) with { N=3; }; - pn = amp * no.pink_noise; - - signal = ssaw*saw + ssq*sq + stri*tri - + spt*((ssptN*ptN)+(1-ssptN)*pt) - + spn*pn + sei*_; - - // Signal controls: - signal_group(x) = osc_group(hgroup("[0] Signal Levels",x)); - ssaw = signal_group(vslider("[0] Sawtooth [style:vslider]",1,0,1,0.01)); - - pt_group(x) = signal_group(vgroup("[1] Pulse Train",x)); - ssptN = pt_group(checkbox("[0] Order 3 - [tooltip: When checked, use 3rd-order aliasing suppression (up from 2) - See if you can hear a difference with the freq high and swept]")); - spt = pt_group(vslider("[1] [style:vslider]",0,0,1,0.01)); - ptd = pt_group(vslider("[2] Duty Cycle [style:knob]",0.5,0,1,0.01)) - : si.smooth(0.99); - - ssq = signal_group(vslider("[2] Square [style:vslider]",0,0,1,0.01)); - stri = signal_group(vslider("[3] Triangle [style:vslider]",0,0,1,0.01)); - spn = signal_group(vslider( - "[4] Pink Noise [style:vslider][tooltip: Pink Noise (or 1/f noise) is - Constant-Q Noise, meaning that it has the same total power in every octave - (uses only amplitude controls)]",0,0,1,0.01)); - sei = signal_group(vslider("[5] Ext Input [style:vslider]",0,0,1,0.01)); - - // Signal Parameters - knob_group(x) = osc_group(hgroup("[1] Signal Parameters", x)); - af_group(x) = knob_group(vgroup("[0]", x)); - ampdb = af_group(hslider("[1] Mix Amplitude [unit:dB] [style:hslider] - [tooltip: Sawtooth waveform amplitude]",-20,-120,10,0.1)); - amp = ampdb : ba.db2linear : si.smoo; - freq = af_group(hslider("[2] Frequency [unit:PK] [style:hslider] [tooltip: Sawtooth - frequency as a Piano Key (PK) number (A440 = key 49)]",49,1,88,0.01) : ba.pianokey2hz); - - detune1 = 1 - 0.01 * knob_group( - vslider("[3] Detuning 1 [unit:%%] [style:knob] - [tooltip: Percentage frequency-shift up or down for second oscillator]", - -0.1,-10,10,0.01)); - detune2 = 1 + 0.01 * knob_group( - vslider("[4] Detuning 2 [unit:%%] [style:knob] - [tooltip: Percentage frequency-shift up or down for third detuned oscillator]", - +0.1,-10,10,0.01)); - portamento = knob_group( - vslider("[5] Portamento [unit:sec] [style:knob] [scale:log] - [tooltip: Portamento (frequency-glide) time-constant in seconds]", - 0.1,0.001,10,0.001)); - saworder = knob_group(nentry("[6] Saw Order [tooltip: Order of sawtooth aliasing - suppression]",2,1,os.MAX_SAW_ORDER,1)); - sfreq = freq : si.smooth(ba.tau2pole(portamento)); -}; - - -//--------------------------`(dm.)oscrs_demo` --------------------------- -// Simple application demoing filter based oscillators. -// -// #### Usage -// -// ``` -// oscrs_demo : _ -// ``` -//------------------------------------------------------------------- -oscrs_demo = signal -with{ - osc_group(x) = vgroup("[0] SINE WAVE OSCILLATOR oscrs [tooltip: Sine oscillator based - on 2D vector rotation]",x); - ampdb = osc_group(hslider("[1] Amplitude [unit:dB] [tooltip: Sawtooth waveform - amplitude]",-20,-120,10,0.1)); - amp = ampdb : ba.db2linear : si.smoo; - freq = osc_group( - hslider("[2] Frequency [unit:PK] - [tooltip: Sine wave frequency as a Piano Key (PK) number (A440 = 49 PK)]", - 49,1,88,0.01) : ba.pianokey2hz); - portamento = osc_group( - hslider("[3] Portamento [unit:sec] [scale:log] - [tooltip: Portamento (frequency-glide) time-constant in seconds]", - 0.1,0.001,10,0.001)); - sfreq = freq : si.smooth(ba.tau2pole(portamento)); - signal = amp * os.oscrs(sfreq); -}; - -oscr_demo = oscrs_demo; // synonym - - -//--------------------------`(dm.)velvet_noise_demo`--------------------------- -// Listen to velvet_noise! -// -// #### Usage -// -// ``` -// velvet_noise_demo : _ -// ``` -//------------------------------------------------------------------- - -velvet_noise_demo = vn -with{ - amp = hslider("Amp [unit:dB]",-10,-70,10,0.1) : ba.db2linear; - f0 = 10.0, hslider("Freq [unit:log10(Hz)]",3,0,4,0.001) : pow; - vn = no.velvet_noise(amp,f0); -}; - - -//--------------------------`(dm.)latch_demo`--------------------------- -// Illustrate latch operation -// -// #### Usage -// -// ``` -// echo 'import("stdfaust.lib");' > latch_demo.dsp -// echo 'process = dm.latch_demo;' >> latch_demo.dsp -// faust2octave latch_demo.dsp -// Octave:1> plot(faustout); -// ``` -//------------------------------------------------------------------- -latch_demo = x, c, ba.latch(c,x) // plot(faustout) after faust2octave -with{ - f = float(ma.SR)/1000.0; - x = os.oscr(f); - c = 0.5 * os.oscrs(5*f); // sample 5 times per period -}; - - -//--------------------------`(dm.)envelopes_demo`--------------------------- -// Illustrate various envelopes overlaid, including their gate * 1.1. -// -// #### Usage -// -// ``` -// echo 'import("stdfaust.lib");' > envelopes_demo.dsp -// echo 'process = dm.envelopes_demo;' >> envelopes_demo.dsp -// faust2octave envelopes_demo.dsp -// Octave:1> plot(faustout); -// ``` -//------------------------------------------------------------------- -envelopes_demo = gate <: _*1.1,envSE,envAR,envARFE,envARE,envASR,envADSR,envADSRE -with{ - gate = (1-(1@500)) + 0.5*(1@750-(1@1700)); // retrigger at 1/2 amp - envSE = en.smoothEnvelope(attSec/6.91); // uses time-constant not t60 - envAR = en.ar(attSec,relT60); - envARFE = en.arfe(attSec,relT60,0.25); - envARE = en.are(attSec,relT60); - envASR = en.asr(attSec,susLvl,relT60); - envADSR = en.adsr(attSec,decT60,susLvl,relT60); - envADSRE = en.adsre(attSec,decT60,susLvl,relT60); - attSec=0.002; // 2 ms attack time - decT60=0.010; // 10 ms decay-to-sustain time - susLvl=0.80; // Sustain level = 0.8 - relT60=0.010; // 10 ms release (decay-to-zero) time -}; - -//-------------------`(dm.)fft_spectral_level_demo`------------------ -// Make a real-time spectrum analyzer using FFT from analyzers.lib -// -// #### Usage -// -// ``` -// echo 'import("stdfaust.lib");' > fft_spectral_level_demo.dsp -// echo 'process = dm.fft_spectral_level_demo;' >> fft_spectral_level_demo.dsp -// Mac: -// faust2caqt fft_spectral_level_demo.dsp -// open fft_spectral_level_demo.app -// Linux GTK: -// faust2jack fft_spectral_level_demo.dsp -// ./fft_spectral_level_demo -// Linux QT: -// faust2jaqt fft_spectral_level_demo.dsp -// ./fft_spectral_level_demo -// ``` -//------------------------------------------------------------------- -fft_spectral_level_demo(N) = an.rfft_spectral_level(N,tau,dB_offset) -with{ - ctl_group(x) = hgroup("[1] FFT SPECTRUM ANALYZER CONTROLS", x); - tau = ctl_group(hslider("[0] Level Averaging Time [unit:ms] [scale:log] - [tooltip: band-level averaging time in milliseconds]", - 100,1,10000,1)) * 0.001; - dB_offset = ctl_group(hslider("[1] Level dB Offset [unit:dB] - [tooltip: Level offset in decibels]", - 50,-50,100,1)); -}; - -//-----------------`(dm.)reverse_echo_demo(nChans)`---------------- -// Multichannel echo effect with reverse delays -// -// #### Usage -// -// ``` -// echo 'import("stdfaust.lib");' > reverse_echo_demo.dsp -// echo 'nChans = 3; // Any integer > 1 should work here' >> reverse_echo_demo.dsp -// echo 'process = dm.reverse_echo_demo(nChans);' >> reverse_echo_demo.dsp -// Mac: -// faust2caqt reverse_echo_demo.dsp -// open reverse_echo_demo.app -// Linux GTK: -// faust2jack reverse_echo_demo.dsp -// ./reverse_echo_demo -// Linux QT: -// faust2jaqt reverse_echo_demo.dsp -// ./reverse_echo_demo -// Etc. -// ``` -//------------------------------------------------------------------- -reverse_echo_demo(nChans) = ef.reverseEchoN(nChans,delMax) : ef.uniformPanToStereo(nChans) -with { - delMax = 2^int(nentry("Log2(Delay)",15,5,16,1)); // delay line length -}; - -//------------------------`(dm.)pospass_demo`------------------------ -// Use Positive-Pass Filter pospass() to frequency-shift a sine tone. -// First, a real sinusoid is converted to its analytic-signal form -// using pospass() to filter out its negative frequency component. -// Next, it is multiplied by a modulating complex sinusoid at the -// shifting frequency to create the frequency-shifted result. -// The real and imaginary parts are output to channels 1 & 2. -// For a more interesting frequency-shifting example, check the -// "Use Mic" checkbox to replace the input sinusoid by mic input. -// Note that frequency shifting is not the same as frequency scaling. -// A frequency-shifted harmonic signal is usually not harmonic. -// Very small frequency shifts give interesting chirp effects when -// there is feedback around the frequency shifter. -// -// #### Usage -// -// ``` -// echo 'import("stdfaust.lib");' > pospass_demo.dsp -// echo 'process = dm.pospass_demo;' >> pospass_demo.dsp -// Mac: -// faust2caqt pospass_demo.dsp -// open pospass_demo.app -// Linux GTK: -// faust2jack pospass_demo.dsp -// ./pospass_demo -// Linux QT: -// faust2jaqt pospass_demo.dsp -// ./pospass_demo -// Etc. -// ``` -//------------------------------------------------------------------- -pospass_demo(x) = analytic_signal, modulator : si.cmul with { - N = 6; // pospass filter order - fc = ma.SR/(2*N); // guard-band for filter roll-off - octavesShift = hslider("Frequency Shift in octaves away from SR/16", - -2,-7,3,0.001) : si.smooth(0.999); - in_select = checkbox("Use Mic"); - sine_tone = os.oscrs(f0); - f0 = ma.SR/16.0; // original frequency to be shifted - fn = f0 * 2.0^octavesShift; // modulated frequency - df = fn - f0; // frequency-shift as a difference - input = select2(in_select, sine_tone, x); - analytic_signal = input : fi.pospass6e(fc); // filter out neg freqs - //analytic_signal = os.oscrs(f0) : fi.pospass(N,fc); // Butterworth case - modulator = os.oscrq(df) : si.cconj; // complex modulation sinusoid - // modulator(n) = exp(sqrt(-1) * 2 * ma.PI * df * n / ma.SR) // if complex ok -}; - -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -// TODO: Add GRAME functions here - -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ - -//-------------------------------`(dm.)exciter`------------------------------- -// Psychoacoustic harmonic exciter, with GUI. -// -// #### Usage -// -// ``` -// _ : exciter : _ -// ``` -// -// #### References -// -// * -// * -//------------------------------------------------------------------------------------- -// Authors: PPriyanka Shekar and Julius O. Smith III -// License: STK-4.3 -// Markdown: Romain Michon -//------------------------------------------------------------------------------------- -exciter = _ <: (fi.highpass(2, fc) : compressor : pregain : harmonicCreator : - postgain), _ : balance -with{ - // TODO: rewrite to use the standard compressor from compressors.lib - compressor = ba.bypass1(cbp,compressorMono) - with{ - comp_group(x) = vgroup("COMPRESSOR [tooltip: Reference: - http://en.wikipedia.org/wiki/Dynamic_range_compression]", x); - - meter_group(x) = comp_group(hgroup("[0]", x)); - knob_group(x) = comp_group(hgroup("[1]", x)); - - cbp = meter_group(checkbox("[0] Bypass [tooltip: When this is checked, - the compressor has no effect]")); - - gainview = co.compression_gain_mono(ratio,threshold,attack,release) : ba.linear2db - : meter_group(hbargraph("[1] Compressor Gain [unit:dB] [tooltip: Current gain - of the compressor in dB]",-50,+10)); - - displaygain = _ <: _,abs : _,gainview : attach; - - compressorMono = displaygain(co.compressor_mono(ratio,threshold,attack,release)); - - ctl_group(x) = knob_group(hgroup("[3] Compression Control", x)); - - ratio = ctl_group(hslider("[0] Ratio [style:knob] [tooltip: A compression Ratio - of N means that for each N dB increase in input signal level above Threshold, the - output level goes up 1 dB]", 5, 1, 20, 0.1)); - - threshold = ctl_group(hslider("[1] Threshold [unit:dB] [style:knob] [tooltip: - When the signal level exceeds the Threshold (in dB), its level is compressed - according to the Ratio]", -30, -100, 10, 0.1)); - - env_group(x) = knob_group(hgroup("[4] Compression Response", x)); - - attack = env_group(hslider("[1] Attack [unit:ms] [style:knob] [tooltip: - Time constant in ms (1/e smoothing time) for the compression gain to approach - (exponentially) a new lower target level (the compression `kicking in')]", - 50, 0, 500, 0.1)) : *(0.001) : max(1/ma.SR); - - release = env_group(hslider("[2] Release [unit:ms] [style: knob] [tooltip: - Time constant in ms (1/e smoothing time) for the compression gain to approach - (exponentially) a new higher target level (the compression 'releasing')]", - 500, 0, 1000, 0.1)) : *(0.001) : max(1/ma.SR); - }; - - //Exciter GUI controls - ex_group(x) = hgroup("EXCITER [tooltip: Reference: Patent US4150253 A]", x); - - //Highpass - selectable cutoff frequency - fc = ex_group(hslider("[0] Cutoff Frequency [unit:Hz] [style:knob] [scale:log] - [tooltip: Cutoff frequency for highpassed components to be excited]", - 5000, 1000, 10000, 100)); - - //Pre-distortion gain - selectable percentage of harmonics - ph = ex_group(hslider("[1] Harmonics [unit:percent] [style:knob] [tooltip: - Percentage of harmonics generated]", 20, 0, 200, 1)) / 100; - pregain = * (ph); - - // TODO: same thing: why doesn't this use cubicnl? - //Asymmetric cubic soft clipper - harmonicCreator(x) = x <: cubDist1, cubDist2, cubDist3 :> _; - cubDist1(x) = (x < 0) * x; - cubDist2(x) = (x >= 0) * (x <= 1) * (x - x ^ 3 / 3); - cubDist3(x) = (x > 1) * 2/3; - - //Post-distortion gain - undoes effect of pre-gain - postgain = * (1/ph); - - //Balance - selectable dry/wet mix - ml = ex_group(hslider("[2] Mix [style:knob] [tooltip: Dry/Wet mix of original signal - to excited signal]", 0.50, 0.00, 1.00, 0.01)); - balance = (_ * ml), (_ * (1.0 - ml)) :> _; -}; - - -//----------------------------`(dm.)vocoder_demo`------------------------- -// Use example of the vocoder function where an impulse train is used -// as excitation. -// -// #### Usage -// -// ``` -// _ : vocoder_demo : _; -// ``` -//------------------------------------------------------------ -// Author: Romain Michon -// License: LGPL -vocoder_demo = hgroup("My Vocoder",_,os.lf_imptrain(freq)*gain : - ve.vocoder(bands,att,rel,BWRatio) <: _,_) -with{ - bands = 32; - vocoderGroup(x) = vgroup("Vocoder",x); - att = vocoderGroup(hslider("[0] Attack [style:knob] [tooltip: Attack time in seconds]", - 5,0.1,100,0.1)*0.001); - rel = vocoderGroup(hslider("[1] Release [style:knob] [tooltip: Release time in seconds]", - 5,0.1,100,0.1)*0.001); - BWRatio = vocoderGroup(hslider("[2] BW [style:knob] [tooltip: Coefficient to adjust the - bandwidth of each band]",0.5,0.1,2,0.001)); - excitGroup(x) = vgroup("Excitation",x); - freq = excitGroup(hslider("[0] Freq [style:knob]",330,50,2000,0.1)); - gain = excitGroup(vslider("[1] Gain",0.5,0,1,0.01) : si.smoo); -}; - -// end further contributions section diff --git a/dist/examples/LIBRARIES/dx7.lib b/dist/examples/LIBRARIES/dx7.lib deleted file mode 100644 index 0a3e3010..00000000 --- a/dist/examples/LIBRARIES/dx7.lib +++ /dev/null @@ -1,1031 +0,0 @@ -//#################################### dx7.lib ######################################### -// Yamaha DX7 emulation library. Its official prefix is `dx`. -//######################################################################################## -// Yamaha DX7 emulation library. The various functions available in this library -// are used by the libraries generated from `.syx` DX7 preset files. This -// toolkit was greatly inspired by the CSOUND DX7 emulation package: -// . -// -// This library and its related tools are under development. Use it at your -// own risk! -//############################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -/* -TODO: - * LFO not implemented yet - * The whole system needs some tuning -*/ - -ba = library("basics.lib"); -en = library("envelopes.lib"); -ma = library("maths.lib"); -os = library("oscillators.lib"); - -//----------------------`(dx.)dx7_ampf`-------------------------- -// DX7 amplitude conversion function. 3 versions of this function -// are available: -// -// * `dx7_amp_bpf`: BPF version (same as in the CSOUND toolkit) -// * `dx7_amp_func`: estimated mathematical equivalent of `dx7_amp_bpf` -// * `dx7_ampf`: default (sugar for `dx7_amp_func`) -// -// #### Usage: -// -// ``` -// dx7AmpPreset : dx7_ampf_bpf : _ -// ``` -// -// Where: -// -// * `dx7AmpPreset`: DX7 amplitude value (0-99) -//---------------------------------------------------------- -// CSOUND function implemented as a BPF -// Corresponds to F2 in the CSOUND implementation. -dx7_amp_bpf = ba.bpf.start(0,0) : seq(i,14,ba.bpf.point(xPoints(i)+1,yPoints(i))) : ba.bpf.end(127,1) -with{ - xPoints(n) = ba.take(n+1,(9,19,29,39,49,59,64,69,74,79,84,89,94,98)); - yPoints(n) = ba.take(n+1,(0.000227445,0.000985595,0.002350265,0.005989386,0.014253222,0.033813495,0.052312358,0.080970432,0.124260804,0.190447309,0.295223654,0.457088704,0.70227445,1)); -}; -// Function estimated from the CSOUND function (default) -dx7_amp_func = min(98)/98 : pow(_,8); -dx7_ampf = dx7_amp_func; - -//----------------------`(dx.)dx7_egraterisef`-------------------------- -// DX7 envelope generator rise conversion function. 3 versions of this function -// are available: -// -// * `dx7_egraterise_bpf`: BPF version (same as in the CSOUND toolkit) -// * `dx7_egraterise_func`: estimated mathematical equivalent of `dx7_egraterise_bpf` -// * `dx7_egraterisef`: default (sugar for `dx7_egraterise_func`) -// -// #### Usage: -// -// ``` -// dx7envelopeRise : dx7_egraterisef : _ -// ``` -// -// Where: -// -// * `dx7envelopeRise`: DX7 envelope rise value (0-99) -//---------------------------------------------------------- -// CSOUND function implemented as a BPF -// Corresponds to F4 in the CSOUND implementation. -dx7_egraterise_bpf = ba.bpf.start(0,38) : seq(i,24,ba.bpf.point(xPoints(i)+1,yPoints(i))) : ba.bpf.end(127,0.003) -with{ - xPoints(n) = ba.take(n+1,(4,9,14,19,24,29,34,42,45,48,51,54,60,66,68,71,74,77, - 80,83,86,89,92,95)); - yPoints(n) = ba.take(n+1,(22.8,12,7.5,4.8,2.7,1.8,1.3,.737,.615, - .505,.409,.321,.080,.055,.032,.024,.018,.014,.011,.008,.008, - .007,.005,.003)); -}; -// Function estimated from the CSOUND function (default) -dx7_egraterise_func = 38*pow((127-_)/127,12) : max(0.003); -dx7_egraterisef = dx7_egraterise_func; - -//----------------------`(dx.)dx7_egraterisepercf`-------------------------- -// DX7 envelope generator percussive rise conversion function. 3 versions of -// this function are available: -// -// * `dx7_egrateriseperc_bpf`: BPF version (same as in the CSOUND toolkit) -// * `dx7_egrateriseperc_func`: estimated mathematical equivalent of `dx7_egrateriseperc_bpf` -// * `dx7_egraterisepercf`: default (sugar for `dx7_egrateriseperc_func`) -// -// #### Usage: -// -// ``` -// dx7envelopePercRise : dx7_egraterisepercf : _ -// ``` -// -// Where: -// -// * `dx7envelopePercRise`: DX7 envelope percussive rise value (0-99) -//---------------------------------------------------------- -// CSOUND function implemented as a BPF -// Corresponds to F5 in the CSOUND implementation. -dx7_egrateriseperc_bpf = ba.bpf.start(0,0.00001) : seq(i,10,ba.bpf.point(xPoints(i)+1,yPoints(i))) : ba.bpf.end(127,1) -with{ - xPoints(n) = ba.take(n+1,(30,34,39,49,59,69,79,89,94,98)); - yPoints(n) = ba.take(n+1,(0.00001,0.02,0.06,0.14,0.24,0.35,0.5,0.7,0.86,1)); -}; -// Function estimated from the CSOUND function (default) -dx7_egrateriseperc_func = >=(30)*min(_-30,68)/68 : pow(_,1.8); -dx7_egraterisepercf = dx7_egrateriseperc_func; - -//----------------------`(dx.)dx7_egratedecayf`-------------------------- -// DX7 envelope generator decay conversion function. 3 versions of -// this function are available: -// -// * `dx7_egratedecay_bpf`: BPF version (same as in the CSOUND toolkit) -// * `dx7_egratedecay_func`: estimated mathematical equivalent of `dx7_egratedecay_bpf` -// * `dx7_egratedecayf`: default (sugar for `dx7_egratedecay_func`) -// -// #### Usage: -// -// ``` -// dx7envelopeDecay : dx7_egratedecayf : _ -// ``` -// -// Where: -// -// * `dx7envelopeDecay`: DX7 envelope decay value (0-99) -//---------------------------------------------------------- -// CSOUND function implemented as a BPF -// Corresponds to F6 in the CSOUND implementation. -dx7_egratedecay_bpf = ba.bpf.start(0,318) : seq(i,23,ba.bpf.point(xPoints(i)+1,yPoints(i))) : ba.bpf.end(127,.008) -with{ - xPoints(n) = ba.take(n+1,(3,7,12,17,22,27,32,40,43,49,52,55,58,63,66,69,72,75, - 78,81,84,87,90)); - yPoints(n) = ba.take(n+1,(181,115,63,39.7,20,11.2,7,5.66,3.98,1.99, - 1.34,.99,.71,.41,.15,.081,.068,.047,.037,.025,.02,.013,.008)); -}; -// Function estimated from the CSOUND function (default) -dx7_egratedecay_func = 318*pow((127-_)/127,12.6) : max(0.008); -dx7_egratedecayf = dx7_egratedecay_func; - -//----------------------`(dx.)dx7_egratedecaypercf`-------------------------- -// DX7 envelope generator percussive decay conversion function. 3 versions of -// this function are available: -// -// * `dx7_egratedecayperc_bpf`: BPF version (same as in the CSOUND toolkit) -// * `dx7_egratedecayperc_func`: estimated mathematical equivalent of `dx7_egratedecayperc_bpf` -// * `dx7_egratedecaypercf`: default (sugar for `dx7_egratedecayperc_func`) -// -// #### Usage: -// -// ``` -// dx7envelopePercDecay : dx7_egratedecaypercf : _ -// ``` -// -// Where: -// -// * `dx7envelopePercDecay`: DX7 envelope decay value (0-99) -//---------------------------------------------------------- -// CSOUND function implemented as a BPF -// Corresponds to F7 in the CSOUND implementation. -dx7_egratedecayperc_bpf = ba.bpf.start(0,0.00001) : seq(i,10,ba.bpf.point(xPoints(i),yPoints(i))) : ba.bpf.end(127,1) -with{ - xPoints(n) = ba.take(n+1,(10,20,30,40,50,60,70,80,90,99)); - yPoints(n) = ba.take(n+1,(0.25,0.35,0.43,0.52,0.59,0.7,0.77,0.84,0.92,1)); -}; -// Function estimated from the CSOUND function (default) -dx7_egratedecayperc_func = min(99)/99 : pow(_,0.7); -dx7_egratedecaypercf = dx7_egratedecayperc_func; - -//----------------------`(dx.)dx7_eglv2peakf`-------------------------- -// DX7 envelope level to peak conversion function. 3 versions of -// this function are available: -// -// * `dx7_eglv2peak_bpf`: BPF version (same as in the CSOUND toolkit) -// * `dx7_eglv2peak_func`: estimated mathematical equivalent of `dx7_eglv2peak_bpf` -// * `dx7_eglv2peakf`: default (sugar for `dx7_eglv2peak_func`) -// -// #### Usage: -// -// ``` -// dx7Level : dx7_eglv2peakf : _ -// ``` -// -// Where: -// -// * `dx7Level`: DX7 level value (0-99) -//----------------------------------------------------------- -// CSOUND function implemented as a BPF -// Corresponds to F8 in the CSOUND implementation. -dx7_eglv2peak_bpf = ba.bpf.start(0,0) : seq(i,14,ba.bpf.point(xPoints(i)+1,yPoints(i))) : ba.bpf.end(127,2.08795) -with{ - xPoints(n) = ba.take(n+1,(9,19,29,39,49,59,64,59,74,79,84,89,94,98)); - yPoints(n) = ba.take(n+1,(0.000477,0.002,0.00493,0.01257,0.02992,0.07098,0.10981,0.16997,0.260855,0.39979,0.61974,0.95954,1.47425,2.08795)); -}; -// Function estimated from the CSOUND function (default) -dx7_eglv2peak_func = min(98)/98 : pow(_,8) : *(2.08795); -dx7_eglv2peakf = dx7_eglv2peak_func; - -//----------------------`(dx.)dx7_velsensf`-------------------------- -// DX7 velocity sensitivity conversion function. -// -// #### Usage: -// -// ``` -// dx7Velocity : dx7_velsensf : _ -// ``` -// -// Where: -// -// * `dx7Velocity`: DX7 level value (0-8) -//----------------------------------------------------------- -// Corresponds to F10 in the CSOUND implementation -dx7_velsensf = /(8); - -//----------------------`(dx.)dx7_fdbkscalef`-------------------------- -// DX7 feedback scaling conversion function. -// -// #### Usage: -// -// ``` -// dx7Feedback : dx7_fdbkscalef : _ -// ``` -// -// Where: -// -// * `dx7Feedback`: DX7 feedback value -//----------------------------------------------------------- -// Corresponds to F11 in the CSOUND implementation -dx7_fdbkscalef = *(0.875); - -//------------------------------`(dx.)dx7_op`--------------------------- -// DX7 Operator. Implements a phase-modulable sine wave oscillator connected -// to a DX7 envelope generator. -// -// #### Usage: -// -// ``` -// dx7_op(freq,phaseMod,outLev,R1,R2,R3,R4,L1,L2,L3,L4,keyVel,rateScale,type,gain,gate) : _ -// ``` -// -// Where: -// -// * `freq`: frequency of the oscillator -// * `phaseMod`: phase deviation (-1 - 1) -// * `outLev`: preset output level (0-99) -// * `R1`: preset envelope rate 1 (0-99) -// * `R2`: preset envelope rate 2 (0-99) -// * `R3`: preset envelope rate 3 (0-99) -// * `R4`: preset envelope rate 4 (0-99) -// * `L1`: preset envelope level 1 (0-99) -// * `L2`: preset envelope level 2 (0-99) -// * `L3`: preset envelope level 3 (0-99) -// * `L4`: preset envelope level 4 (0-99) -// * `keyVel`: preset key velocity sensitivity (0-99) -// * `rateScale`: preset envelope rate scale -// * `type`: preset operator type -// * `gain`: general gain -// * `gate`: trigger signal -//----------------------------------------------------------------- -dx7_op(freq,phaseMod,outLev,R1,R2,R3,R4,L1,L2,L3,L4,keyVel,rateScale,type,gain,gate) = -(en.dx7envelope(egr1,egr2,egr3,egr4,egl1,egl2,egl3,egl4,gate) : envTable)*sineWave -with{ - tablesize = 1 << 16; - // phase modulation, not freq modulation - sineWave = rdtable(tablesize, os.sinwaveform(tablesize), ma.modulo(int(os.phasor(tablesize,freq) + phaseMod*tablesize),tablesize)); - amp = outLev/99; // the corresponding "CSOUND table" has just been hardcoded here - // computing levels - vFac = keyVel : dx7_velsensf; - egl1 = L1*amp <: *(1-vFac) + *(vFac*gain); - egl2 = L2*amp <: *(1-vFac) + *(vFac*gain); - egl3 = L3*amp <: *(1-vFac) + *(vFac*gain); - egl4 = L4*amp <: *(1-vFac) + *(vFac*gain); - // computing rates - rs = (freq : ba.hz2midikey)-21 : /(105)*6*rateScale; - egr1 = R1+rs : min(99) <: - select2(egl1>egl4,dx7_egratedecayf,dx7_egraterisef) <: - *(egl4 <: select2(egl1>egl4,dx7_egratedecaypercf,dx7_egraterisepercf)), - *(egl1 <: select2(egl1>egl4,dx7_egratedecaypercf,dx7_egraterisepercf)) : - - : abs : max(0.001); - egr2 = R2+rs : min(99) <: - select2(egl2>egl1,dx7_egratedecayf,dx7_egraterisef) <: - *(egl2 <: select2(egl2>egl1,dx7_egratedecaypercf,dx7_egraterisepercf)), - *(egl1 <: select2(egl2>egl1,dx7_egratedecaypercf,dx7_egraterisepercf)) : - - : abs : max(0.001); - egr3 = R3+rs : min(99) <: - select2(egl3>egl2,dx7_egratedecayf,dx7_egraterisef) <: - *(egl2 <: select2(egl3>egl2,dx7_egratedecaypercf,dx7_egraterisepercf)), - *(egl3 <: select2(egl3>egl2,dx7_egratedecaypercf,dx7_egraterisepercf)) : - - : abs : max(0.001); - egr4 = R4+rs : min(99) <: - select2(egl3<=egl4,dx7_egratedecayf,dx7_egraterisef) <: - *(egl3 <: select2(egl3<=egl4,dx7_egratedecaypercf,dx7_egraterisepercf)), - *(egl4 <: select2(egl3<=egl4,dx7_egratedecaypercf,dx7_egraterisepercf)) : - - : abs : max(0.001); - envTable = _ <: select2(type,dx7_eglv2peakf,dx7_ampf); -}; - -//------------------------------`(dx.)dx7_algo`--------------------------- -// DX7 algorithms. Implements the 32 DX7 algorithms (a quick Google search -// should give your more details on this). Each algorithm uses 6 operators. -// -// #### Usage: -// -// ``` -// dx7_algo(algN,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) : _ -// ``` -// -// Where: -// -// * `algN`: algorithm number (0-31, should be an int...) -// * `egR1`: preset envelope rates 1 (a list of 6 values between 0-99) -// * `egR2`: preset envelope rates 2 (a list of 6 values between 0-99) -// * `egR3`: preset envelope rates 3 (a list of 6 values between 0-99) -// * `egR4`: preset envelope rates 4 (a list of 6 values between 0-99) -// * `egL1`: preset envelope levels 1 (a list of 6 values between 0-99) -// * `egL2`: preset envelope levels 2 (a list of 6 values between 0-99) -// * `egL3`: preset envelope levels 3 (a list of 6 values between 0-99) -// * `egL4`: preset envelope levels 4 (a list of 6 values between 0-99) -// * `outLev`: preset output levels (a list of 6 values between 0-99) -// * `keyVel`: preset key velocity sensitivities (a list of 6 values between 0-99) -// * `ampModSens`: preset amplitude sensitivities (a list of 6 values between 0-99) -// * `opMode`: preset operator mode (a list of 6 values between 0-1) -// * `opFreq`: preset operator frequencies (a list of 6 values between 0-99) -// * `opDetune`: preset operator detuning (a list of 6 values between 0-99) -// * `opRateScale`: preset operator rate scale (a list of 6 values between 0-99) -// * `feedback`: preset operator feedback (a list of 6 values between 0-99) -// * `lfoDelay`: preset LFO delay (a list of 6 values between 0-99) -// * `lfoDepth`: preset LFO depth (a list of 6 values between 0-99) -// * `lfoSpeed`: preset LFO speed (a list of 6 values between 0-99) -// * `freq`: fundamental frequency -// * `gain`: general gain -// * `gate`: trigger signal -//----------------------------------------------------------------- - -// Alg 1 -// NOTE: the .2 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(0,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op6~*(feedback*.2) : op5 : op4 : op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 2 -// NOTE: the .2 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(1,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2~*(feedback*.2) : op1),(op6 : op5 : op4 : op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 3 -// Note: weird rand and delay implemented in the csound orchestra and not -// really sure why... -dx7_algo(2,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op3 : op2 : op1),(op6~*(feedback) : op5 : op4) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 4 -dx7_algo(3,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op3 : op2 : op1),(op6 : op5 : op4)~*(feedback) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 5 -// NOTE: the .1 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(4,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op4 : op3),(op6~*(feedback*.1) : op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 6 -dx7_algo(5,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op4 : op3),(op6 : op5)~*(feedback) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 7 -dx7_algo(6,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op4,(op6~*(feedback) : op5) :> op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 8 -// NOTE: the .1 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(7,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op4~*(feedback*.1),(op6 : op5) :> op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 9 -// NOTE: the .4 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(8,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2~*(feedback*.4) : op1),(op4,(op6 : op5) :> op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 10 -// NOTE: the .2 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(9,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op5,op6 :> op4),(op3~*(feedback*.2) : op2 : op1) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 11 -// NOTE: the .2 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(10,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op5,op6~*(feedback*.2) :> op4),(op3 : op2 : op1) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 12 -// NOTE: the .2 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(11,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op4,op5,op6 :> op3),(op2~*(feedback*.2) : op1) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 13 -dx7_algo(12,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op4,op5,op6~*(feedback) :> op3),(op2 : op1) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 14 -dx7_algo(13,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op5,op6~*(feedback) :> op4 : op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 15 -// NOTE: the .4 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(14,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2~*(feedback*.4) : op1),(op5,op6 :> op4 : op3) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 16 -dx7_algo(15,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op2,(op4 : op3),(op6~*(feedback) : op5) :> op1 -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 17 -// NOTE: the .5 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(16,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op2~*(feedback*.5),(op4 : op3),(op6 : op5) :> op1 -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 18 -dx7_algo(17,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op2,op3~*(feedback),(op6 : op5 : op4) :> op1 -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 19 -// NOTE: the .4 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(18,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op3 : op2 : op1),(op6~*(feedback*.4) <: op4,op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 20 -dx7_algo(19,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op3~*(feedback) <: op1,op2),(op5,op6 :> op4) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 21 -dx7_algo(20,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op3~*(feedback) <: op1,op2),(op6 <: op4,op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 22 -// NOTE: the .1 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(21,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op6~*(feedback*.1) <: op3,op4,op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 23 -dx7_algo(22,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,(op3 : op2),(op6~*(feedback) <: op4,op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 24 -// NOTE: the .6 for feedback was hardcoded in the csound orchestra, not sure why -// we need it -dx7_algo(23,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,op2,(op6~*(feedback*.6) <: op3,op4,op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 25 -dx7_algo(24,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,op2,op3,(op6~*(feedback) <: op4,op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 26 -dx7_algo(25,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,(op3 : op2),(op5,op6~*(feedback) :> op4) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 27 -dx7_algo(26,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,(op3~*(feedback) : op2),(op5,op6 :> op4) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),1,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,_,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 28 -dx7_algo(27,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -(op2 : op1),(op5~*(feedback) : op4 : op3),op6 :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),0,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),1,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,_,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 29 -dx7_algo(28,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,op2,(op4 : op3),(op6~*(feedback) : op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 30 -dx7_algo(29,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,op2,(op5~*(feedback) : op4 : op3),op6 :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),0,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),1,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,_,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),1,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,_,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 31 -dx7_algo(30,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,op2,op3,op4,(op6~*(feedback) : op5) :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,_,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),1,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,_,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -// Alg 32 -dx7_algo(31,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) = -op1,op2,op3,op4,op5,op6 :> _ -with{ - op6Freq = select2(opMode(5),opFreq(5)*freq,opFreq(5)) + opDetune(5)/4; - op6 = dx7_op(op6Freq,0,outLevel(5),egR1(5),egR2(5),egR3(5),egR4(5),egL1(5),egL2(5),egL3(5),egL4(5),keyVelSens(5),opRateScale(5),0,gain,gate); - op5Freq = select2(opMode(4),opFreq(4)*freq,opFreq(4)) + opDetune(4)/4; - op5 = dx7_op(op5Freq,0,outLevel(4),egR1(4),egR2(4),egR3(4),egR4(4),egL1(4),egL2(4),egL3(4),egL4(4),keyVelSens(4),opRateScale(4),0,gain,gate); - op4Freq = select2(opMode(3),opFreq(3)*freq,opFreq(3)) + opDetune(3)/4; - op4 = dx7_op(op4Freq,0,outLevel(3),egR1(3),egR2(3),egR3(3),egR4(3),egL1(3),egL2(3),egL3(3),egL4(3),keyVelSens(3),opRateScale(3),0,gain,gate); - op3Freq = select2(opMode(2),opFreq(2)*freq,opFreq(2)) + opDetune(2)/4; - op3 = dx7_op(op3Freq,0,outLevel(2),egR1(2),egR2(2),egR3(2),egR4(2),egL1(2),egL2(2),egL3(2),egL4(2),keyVelSens(2),opRateScale(2),0,gain,gate); - op2Freq = select2(opMode(1),opFreq(1)*freq,opFreq(1)) + opDetune(1)/4; - op2 = dx7_op(op2Freq,0,outLevel(1),egR1(1),egR2(1),egR3(1),egR4(1),egL1(1),egL2(1),egL3(1),egL4(1),keyVelSens(1),opRateScale(1),0,gain,gate); - op1Freq = select2(opMode(0),opFreq(0)*freq,opFreq(0)) + opDetune(0)/4; - op1 = dx7_op(op1Freq,0,outLevel(0),egR1(0),egR2(0),egR3(0),egR4(0),egL1(0),egL2(0),egL3(0),egL4(0),keyVelSens(0),opRateScale(0),0,gain,gate); -}; - -//------------------------------`(dx.)dx7_ui`--------------------------- -// Generic DX7 function where all parameters are controllable using UI elements. -// The `master-with-mute` branch must be used for this function to work... -// This function is MIDI-compatible. -// -// #### Usage -// -// ``` -// dx7_ui : _ -// ``` -//----------------------------------------------------------------- -dx7_ui = -par(i,32,dx7_algo(i,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) : control(algorithm == i)) :> _ -with{ - algorithm = nentry("h:dx7/v:global/[0]algorithm",0,0,31,1) : int; - feedback = nentry("h:dx7/v:global/[1]feedback",0,0,99,1) : dx7_fdbkscalef/(2*ma.PI); - lfoDelay = nentry("h:dx7/v:global/[2]lfoDelay",0,0,99,1); - lfoDepth = nentry("h:dx7/v:global/[3]lfoDepth",0,0,99,1); - lfoSpeed = nentry("h:dx7/v:global/[4]lfoSpeed",0,0,99,1); - freq = hslider("h:dx7/v:global/[5]freq",400,50,1000,0.01); - gain = hslider("h:dx7/v:global/[6]gain",0.8,0,1,0.01); - gate = button("h:dx7/v:global/[7]gate"); - egR1UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[0]egR1",90,0,99,1)); - egR1(n) = ba.take(n+1,egR1UI); - egR2UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[1]egR2",90,0,99,1)); - egR2(n) = ba.take(n+1,egR2UI); - egR3UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[2]egR3",90,0,99,1)); - egR3(n) = ba.take(n+1,egR3UI); - egR4UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[3]egR4",90,0,99,1)); - egR4(n) = ba.take(n+1,egR4UI); - egL1UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[4]egL1",0,0,99,1)); - egL1(n) = ba.take(n+1,egL1UI); - egL2UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[5]egL2",90,0,99,1)); - egL2(n) = ba.take(n+1,egL2UI); - egL3UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[6]egL3",90,0,99,1)); - egL3(n) = ba.take(n+1,egL3UI); - egL4UI = par(i,6,nentry("h:dx7/v:[%i]op%i/[7]egL4",0,0,99,1)); - egL4(n) = ba.take(n+1,egL4UI); - outLevelUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[8]level",95,0,99,1)); - outLevel(n) = ba.take(n+1,outLevelUI); - keyVelSensUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[9]keyVelSens",1,0,8,1)); - keyVelSens(n) = ba.take(n+1,keyVelSensUI); - ampModSensUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[10]ampModSens",0,0,99,1)); - ampModSens(n) = ba.take(n+1,ampModSensUI); - opModeUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[11]opMode",0,0,1,1)); - opMode(n) = ba.take(n+1,opModeUI); - opFreqUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[12]opFreq",1.0,0.0,2.0,0.01)); - opFreq(n) = ba.take(n+1,opFreqUI); - opDetuneUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[13]opDetune",1,-10,10,1)); - opDetune(n) = ba.take(n+1,opDetuneUI); - opRateScaleUI = par(i,6,nentry("h:dx7/v:[%i]op%i/[14]opRateScale",0,0,10,1)); - opRateScale(n) = ba.take(n+1,opRateScaleUI); -}; diff --git a/dist/examples/LIBRARIES/envelopes.lib b/dist/examples/LIBRARIES/envelopes.lib deleted file mode 100644 index 87e03c4d..00000000 --- a/dist/examples/LIBRARIES/envelopes.lib +++ /dev/null @@ -1,366 +0,0 @@ -//################################ envelopes.lib ########################################## -// This library contains a collection of envelope generators. Its official prefix is `en`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Faust Envelope Library"; -declare version "0.1"; -declare author "GRAME"; -declare copyright "GRAME"; -declare license "LGPL with exception"; - -ma = library("maths.lib"); -ba = library("basics.lib"); -si = library("signals.lib"); - -//=============================Functions Reference======================================== -//======================================================================================== - -//------------------------`(en.)smoothEnvelope`------------------------ -// An envelope with an exponential attack and release. -// `smoothEnvelope` is a standard Faust function. -// -// #### Usage -// -// ``` -// smoothEnvelope(ar,t) : _ -// ``` -// -// * `ar`: attack and release duration (s) -// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered -// when `t=0`) -//---------------------------------------------------------------- -// Author: RM -smoothEnvelope(ar,t) = t : si.smooth(ba.tau2pole(ar)); - - -//-----------------------`(en.)ar`-------------------------- -// AR (Attack, Release) envelope generator (useful to create percussion envelopes). -// `ar` is a standard Faust function. -// -// #### Usage -// -// ``` -// ar(at,rt,t) : _ -// ``` -// -// Where: -// -// * `at`: attack (sec) -// * `rt`: release (sec) -// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered -// when `t=0`) -//----------------------------------------------------- -declare ar author "Yann Orlarey, Stéphane Letz"; -ar(at,rt,gate) = AR : max(0) -with { - - // Durations in samples - an = max(1, at*ma.SR); - rn = max(1, rt*ma.SR); - - // Deltas per samples - adelta = 1/an; - rdelta = 1/rn; - - // Attack time (starts at gate upfront and raises infinitely) - atime = (raise*reset + upfront) ~ _ - with { - upfront = gate > gate'; - reset = gate <= gate'; - raise(x) = (x + (x > 0)); - }; - - // Attack curve - A = atime * adelta; - - // Release curve - D0 = 1 + an * rdelta; - D = D0 - atime * rdelta; - - // AR part - AR = min(A, D); - -}; - - -//------------------------`(en.)arfe`---------------------- -// ARFE (Attack and Release-to-Final-value Exponentially) envelope generator. -// Approximately equal to smoothEnvelope(Attack/6.91) when Attack == Release. -// -// #### Usage -// -// ``` -// arfe(a,r,f,t) : _ -// ``` -// -// Where: -// -// * `a`, `r`: attack (sec), release (sec) -// * `f`: final value to approach upon release (such as 0) -// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered -// when `t=0`) -//----------------------------------------------------- -// Author: JOS -// License: STK-4.3 -arfe(attT60,relT60,fv,gate) = envelope with { - ugate = gate>0; - target = select2(ugate, fv, float(gate)); - t60 = select2(ugate, relT60, attT60); - pole = ba.tau2pole(t60/6.91); - envelope = target : si.smooth(pole); -}; - - -//------------------------`(en.)are`---------------------- -// ARE (Attack, Release) envelope generator with Exponential segments. -// Approximately equal to smoothEnvelope(Attack/6.91) when Attack == Release. -// -// #### Usage -// -// ``` -// are(a,r,t) : _ -// ``` -// -// Where: -// -// * `a`: attack (sec) -// * `r`: release (sec) -// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered -// when `t=0`) -//----------------------------------------------------- -// Author: JOS -// License: STK-4.3 -are(attT60,relT60,gate) = arfe(attT60,relT60,0,gate); - - -//------------------------`(en.)asr`---------------------- -// ASR (Attack, Sustain, Release) envelope generator. -// `asr` is a standard Faust function. -// -// #### Usage -// -// ``` -// asr(at,sl,rt,t) : _ -// ``` -// -// Where: -// -// * `at`: attack (sec) -// * `sl`: sustain level (between 0..1) -// * `r`: release (sec) -// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered -// when `t=0`) -//----------------------------------------------------- -declare asr author "Yann Orlarey, Stéphane Letz"; -asr(at,sl,rt,gate) = AS - R : max(0) -with { - - // Durations in samples - an = max(1, at*ma.SR); - rn = max(1, rt*ma.SR); - - // Deltas per samples - adelta = sl/an; - rdelta = sl/rn; - - // Attack time (starts when gate changes and raises until gate == 0) - atime = +(gate) ~ *(gate' >= gate); - - // Attack curve - A = atime * adelta; - - // AS part - AS = min(A, sl); - - // Release time starts when gate is 0 - rtime = (+(1) : *(gate == 0)) ~ _; - - // Release curve starts when gate is 0 with the current value of the envelope - R = rtime * rdelta; - -}; - - -//------------------------`(en.)adsr`---------------------- -// ADSR (Attack, Decay, Sustain, Release) envelope generator. -// `adsr` is a standard Faust function. -// -// #### Usage -// -// ``` -// adsr(at,dt,sl,rt,gate) : _ -// ``` -// -// Where: -// -// * `at`: attack time (sec) -// * `dt`: decay time (sec) -// * `sl`: sustain level (between 0..1) -// * `rt`: release time (sec) -// * `gate`: trigger signal (attack is triggered when `gate>0`, release is triggered -// when `gate=0`) -//----------------------------------------------------- -declare adsr author "Yann Orlarey"; -adsr(at,dt,sl,rt,gate) = ADS - R : max(0) -with { - - // Durations in samples - an = max(1, at*ma.SR); - dn = max(1, dt*ma.SR); - rn = max(1, rt*ma.SR); - - // Deltas per samples - adelta = 1/an; - ddelta = (1-sl)/dn; - rdelta = sl/rn; - - // Attack time (starts when gate changes and raises until gate == 0) - atime = +(gate) ~ *(gate' >= gate); - - // Attack curve - A = atime * adelta; - - // Decay curve - D0 = 1 + an * ddelta; - D = D0 - atime * ddelta; - - // ADS part - ADS = min(A, max(D, sl)); - - // Release time starts when gate is 0 - rtime = (+(1) : *(gate == 0)) ~ _; - - // Release curve starts when gate is 0 with the current value of the envelope - R = rtime * rdelta; - -}; - - -//------------------------`(en.)adsre`---------------------- -// ADSRE (Attack, Decay, Sustain, Release) envelope generator with Exponential -// segments. -// -// #### Usage -// -// ``` -// adsre(a,d,s,r,g) : _ -// ``` -// -// Where: -// -// * `a`: attack (sec) -// * `d`: decay (sec) -// * `s`: sustain (fraction of `t`: 0-1) -// * `r`: release (sec) -// * `g`: gate signal: -// attack is triggered when `g` goes from zero to positive, -// release is triggered when `g` returns to 0 -//----------------------------------------------------- -// Author: JOS -// License: STK-4.3 -adsre(attT60,decT60,susLvl,relT60,gate) = envelope with { - ugate = gate>0; - samps = ugate : +~(*(ugate)); // ramp time in samples - attSamps = int(attT60 * ma.SR); - // if attSamps==0, go straight into the decay phase - attPhase = (samps0`, release is triggered -// when `t=0`) -//----------------------------------------------------- -// Author: JOS -// License: STK-4.3 -asre(attT60,susLvl,relT60,gate) = envelope with { - ugate = gate>0; - target = select2(ugate, 0.0, (susLvl)*float(ugate)); - t60 = select2(ugate, relT60, attT60); - pole = ba.tau2pole(t60/6.91); - envelope = target : si.smooth(pole); -}; - - -//----------------------`(en.)dx7envelope`---------------------- -// DX7 operator envelope generator with 4 independent rates and levels. It is -// essentially a 4 points BPF. -// -// #### Usage -// -// ``` -// dx7_envelope(R1,R2,R3,R4,L1,L2,L3,L4,t) : _ -// ``` -// -// Where: -// -// * `RN`: rates in seconds -// * `LN`: levels (0-1) -// * `t`: trigger signal -//----------------------------------------------------- -// Author: RM -dx7envelope(R1,R2,R3,R4,L1,L2,L3,L4,t) = up*on : ba.sAndH(on) : down -with { - on = t>0; - off = t==0; - rs1 = R1*ma.SR; - rs2 = R2*ma.SR; - rs3 = R3*ma.SR; - rs4 = R4*ma.SR; - up = ba.countup(rs1+rs2+rs3,off) : ba.bpf.start(0,L4) : ba.bpf.point(rs1,L1) : - ba.bpf.point(rs1+rs2,L2) : ba.bpf.end(rs1+rs2+rs3,L3); - down = _,ba.countup(rs4,on) : ba.bpf.start(0) : ba.bpf.end(rs4,L4); -}; diff --git a/dist/examples/LIBRARIES/fds.lib b/dist/examples/LIBRARIES/fds.lib deleted file mode 100644 index 258793f4..00000000 --- a/dist/examples/LIBRARIES/fds.lib +++ /dev/null @@ -1,530 +0,0 @@ -//############################# fds.lib ###################################### - -// This library allows to build linear, explicit finite difference schemes -// physical models in 1 or 2 dimensions using an approach based on the cellular -// automata formalism. Its official prefix is `fd`. -// In order to use the library, one needs to discretize the linear partial -// differential equation of the desired system both at boundaries and in-between -// them, thus obtaining a set of explicit recursion relations. Each one -// of these will provide, for each spatial point the scalar coefficients to be -// multiplied by the states of the current and past neighbour points. -// Coefficients need to be stacked in parallel in order to form a coefficients -// matrix for each point in the mesh. It is necessary to provide one matrix for -// coefficients matrices are defined, they need to be placed in parallel and -// ordered following the desired mesh structure (i.e., coefficients for the top -// left boundaries will come first, while bottom right boundaries will come -// last), to form a *coefficients scheme*, which can be used with the library -// functions. - -// ## Sources - -// Here are listed some works on finite difference schemes and cellular -// automata thet were the basis for the implementation of this library -// -// * S. Bilbao, Numerical Sound Synthesis.Chichester, UK: John Wiley Sons, -// Ltd, 2009 - -// * P. Narbel, "Qualitative and quantitative cellular automata from -// differential equations," Lecture Notes in Computer Science, vol. 4173, -// pp. 112–121, 10 2006 - -// * X.-S. Yang and Y. Young, Cellular Automata, PDEs, and Pattern Formation. -// Chapman & Hall/CRC, 092005, ch. 18, pp. 271–282. -//############################################################################# - -ba = library("basics.lib"); -si = library("signals.lib"); -ma = library("maths.lib"); - -declare name "Faust Finite Difference Schemes Library"; -declare version "0.0"; -declare author "Riccardo Russo"; -declare author "Romain Michon"; - -/* -TODO: - - In case of big 2-D meshes the generated c++ code is too long, making the - compiler crash. Consider introducing data structures support. - - Implement a way to set nonzero initial conditions. - - It would be nice to set the length of a mesh directly in meters and not - in points. - - Cubic interpolators. -*/ - -//===============================Model Construction============================= -// Once the coefficients scheme is defined, the user can simply call one of -// these functions to obtain a fully working physical model. They expect to -// receive a force input signal for each mesh point and output the state of each -// point. Interpolation operators can be used to drive external forces to the -// desired points, and to get the signal only from a certain area of the mesh. -//============================================================================== - -//--------------------------------`(fd.)model1D`------------------------------- -// This function can be used to obtain a physical model in 1 dimension. -// Takes a force input signal for each point and outputs the state of each -// point. -// -// #### Usage -// -// ``` -// si.bus(points) : model1D(points,R,T,scheme) : si.bus(points) -// ``` -// -// Where: -// -// * `points`: size of the mesh in points -// * `R`: neighbourhood radius, indicates how many side points are needed (i.e. -// if R=1 the mesh depends on one point on the left and one on the right) -// * `T`: time coefficient, indicates how much steps back in time are needed (i. -// e. if T=1 the maximum delay needed for a neighbour state is 1 sample) -// * `scheme`: coefficients scheme -//------------------------------------------------------------------------------ -model1D(points,R,T,scheme) = - (route1D(points,R,T,scheme) : buildScheme1D(points,R,T)) ~ si.bus(points); - -//--------------------------------`(fd.)model2D`------------------------------- -// This function can be used to obtain a physical model in 2 dimension. -// Takes a force input signal for each point and outputs the state of each -// point. -// IMPORTANT: 2D models with more than 30x20 points might crash the c++ -// compiler. 2D models need to be compiled with the command line compiler, -// the online one presents some issues. -// -// #### Usage -// -// ``` -// si.bus(pointsX*pointsY) : model2D(pointsX,pointsY,R,T,scheme) : -// si.bus(pointsX*pointsY) -// ``` -// -// Where: -// -// * `pointsX`: horizontal size of the mesh in points -// * `pointsY`: vertical size of the mesh in points -// * `R`: neighbourhood radius, indicates how many side points are needed (i.e. -// if R=1 the mesh depends on one point on the left and one on the right) -// * `T`: time coefficient, indicates how much steps back in time are needed (i. -// e. if T=1 the maximum delay needed for a neighbour state is 1 sample) -// * `scheme`: coefficients scheme -//------------------------------------------------------------------------------ -model2D(pointsX,pointsY,R,T,scheme) = - (route2D(pointsX,pointsY,R,T,scheme) : - buildScheme2D(pointsX,pointsY,R,T)) ~ si.bus(pointsX*pointsY); - -//===============================Interpolation================================= -// Interpolation functions can be used to drive the input signals to the -// correct mesh points, or to get the output signal from the -// desired points. All the interpolation functions allow to change the -// input/output points at run time. In general, all these functions get in -// input a number of connections, and output the same number of connections, -// where each signal is multiplied by zero except the ones specified by the -// arguments. -//============================================================================== - -//-----------------------------`(fd.)stairsInterp1D`--------------------------- -// Stairs interpolator in 1 dimension. Takes a number of signals and outputs -// the same number of signals, where each one is multiplied by zero except the -// one specified by the argument. This can vary at run time (i.e. a slider), -// but must be an integer. -// -// #### Usage -// -// ``` -// si.bus(points) : stairsInterp1D(points,point) : si.bus(points) -// ``` -// -// Where: -// -// * `points`: total number of points in the mesh -// * `point`: number of the desired nonzero signal -//------------------------------------------------------------------------------ -stairsInterp1D(points,point) = par(i,points,_*select2(i==point,0,1)); - -//-----------------------------`(fd.)stairsInterp2D`--------------------------- -// Stairs interpolator in 2 dimensions. Similar to the 1-D version. -// -// #### Usage -// -// ``` -// si.bus(pointsX*pointsY) : stairsInterp2D(pointsX,pointsY,pointX,pointY) : -// si.bus(pointsX*pointsY) -// ``` -// -// Where: -// -// * `pointsX`: total number of points in the X direction -// * `pointsY`: total number of points in the Y direction -// * `pointX`: horizontal index of the desired nonzero signal -// * `pointY`: vertical index of the desired nonzero signal -//------------------------------------------------------------------------------ -stairsInterp2D(pointsX,pointsY,pointX,pointY) = - par(i,pointsX, - par(j,pointsY,_*select2((i==pointX) & (j==pointY),0,1))); - -//-----------------------------`(fd.)linInterp1D`--------------------------- -// Linear interpolator in 1 dimension. Takes a number of signals and outputs -// the same number of signals, where each one is multiplied by zero except two -// signals around a floating point index. This is essentially a Faust -// implementation of the $J(x_i)$ operator, not scaled by the spatial step. -// (see Stefan Bilbao's book, Numerical Sound Synthesis). The index can vary -// at run time. -// -// #### Usage -// -// ``` -// si.bus(points) : linInterp1D(points,point) : si.bus(points) -// ``` -// -// Where: -// -// * `points`: total number of points in the mesh -// * `point`: floating point index -//------------------------------------------------------------------------------ -linInterp1D(points,point) = par(i,points,_*select2( - i==int(point), select2(i==int(point+1),0,fraction),(1-fraction))) -with -{ - fraction = ma.frac(point); -}; - -//-----------------------------`(fd.)linInterp2D`--------------------------- -// Linear interpolator in 2 dimensions. Similar to the 1 D version. -// -// #### Usage -// -// ``` -// si.bus(pointsX*pointsY) : linInterp2D(pointsX,pointsY,pointX,pointY) : -// si.bus(pointsX*pointsY) -// ``` -// -// Where: -// -// * `pointsX`: total number of points in the X direction -// * `pointsY`: total number of points in the Y direction -// * `pointX`: horizontal float index -// * `pointY`: vertical float index -//------------------------------------------------------------------------------ -linInterp2D(pointsX,pointsY,pointX,pointY) = -par(i,pointsX, - par(j,pointsY,_* - select2((i==intX) & (j==intY), - select2((i==(intX+1)) & (j==intY), - select2((i==intX) & (j==(intY+1)), - select2((i==(intX+1)) & (j==(intY+1)), - 0, - fractionX*fractionY), - (1-fractionX)*fractionY), - fractionX*(1-fractionY)), - (1-fractionX)*(1-fractionY)))) -with -{ - fractionX = ma.frac(pointX); - fractionY = ma.frac(pointY); - intX = int(pointX); - intY = int(pointY); -}; - -//---------------------------`(fd.)stairsInterp1DOut`-------------------------- -// Stairs interpolator in 1 dimension. Similar to stairsInterp1D, except it -// outputs only the desired signal. -// -// #### Usage -// -// ``` -// si.bus(points) : stairsInterp1DOut(points,point) : _ -// ``` -// -// Where: -// -// * `points`: total number of points in the mesh -// * `point`: number of the desired nonzero signal -//------------------------------------------------------------------------------ -stairsInterp1DOut(points,point) = ba.selectn(points,point); - -//---------------------------`(fd.)stairsInterp2DOut`-------------------------- -// Stairs interpolator in 2 dimensions which outputs only one signal. -// -// #### Usage -// -// ``` -// si.bus(pointsX*pointsY) : stairsInterp2DOut(pointsX,pointsY,pointX,pointY) : _ -// ``` -// -// Where: -// -// * `pointsX`: total number of points in the X direction -// * `pointsY`: total number of points in the Y direction -// * `pointX`: horizontal index of the desired nonzero signal -// * `pointY`: vertical index of the desired nonzero signal -//------------------------------------------------------------------------------ -stairsInterp2DOut(pointsX,pointsY,pointX,pointY) = - ba.selectn(pointsX*pointsY,pointY+pointX*Y); - -//---------------------------`(fd.)linInterp1DOut`-------------------------- -// Linear interpolator in 1 dimension. Similar to stairsInterp1D, except it -// sums each output signal and provides only one output value. -// -// #### Usage -// -// ``` -// si.bus(points) : linInterp1DOut(points,point) : _ -// ``` -// -// Where: -// -// * `points`: total number of points in the mesh -// * `point`: floating point index -//------------------------------------------------------------------------------ -linInterp1DOut(points,point) = linInterp1D(points,point):>_; - -//---------------------------`(fd.)stairsInterp2DOut`-------------------------- -// Linear interpolator in 2 dimensions which outputs only one signal. -// -// #### Usage -// -// ``` -// si.bus(pointsX*pointsY) : linInterp2DOut(pointsX,pointsY,pointX,pointY) : _ -// ``` -// -// Where: -// -// * `pointsX`: total number of points in the X direction -// * `pointsY`: total number of points in the Y direction -// * `pointX`: horizontal float index -// * `pointY`: vertical float index -//------------------------------------------------------------------------------ -linInterp2DOut(pointsX,pointsY,pointX,pointY) = - linInterp2D(pointsX,pointsY,pointX,pointY):>_; - -//====================================Routing================================== -// The routing functions are used internally by the model building functions, -// but can also be taken separately. These functions route the forces, the -// coefficients scheme and the neighbours’ signals into the correct scheme -// points and take as input, in this order: the coefficients block, the -// feedback signals and the forces. In output they provide, in order, for each -// scheme point: the force signal, the coefficient matrices and the neighbours’ -// signals. These functions are based on the Faust route primitive. -//============================================================================== - -//---------------------------------`(fd.)route1D`------------------------------ -// Routing function for 1 dimensional schemes. -// -// #### Usage -// -// ``` -// si.bus((2*R+1)*(T+1)*points),si.bus(points*2) : route1D(points, R, T) : -// si.bus((1 + ((2*R+1)*(T+1)) + (2*R+1))*points) -// ``` -// -// Where: -// -// * `points`: total number of points in the mesh -// * `R`: neighbourhood radius -// * `T`: time coefficient -//------------------------------------------------------------------------------ -route1D(points, R, T) = route(points*2+points*nCoeffs, points*nInputs, - par(x, points, connections(x))) -with -{ - connections(x) = par(k,nCoeffs,x*nCoeffs+k+1,C(x,k+1)), - P(x) + points, C(x,0), - par(i, nNeighbors, P(x),C(x-R+i,nInputs-1-i)); - - P(x) = x+1 + nCoeffs*points; - C(x,count) = (1 + count + (x*nInputs)) * (x>=0) * (x=0) * (x=0) * (y_ -with -{ - nNeighbors = (2*R+1)^D; - routing = - route(nNeighbors*(T+1)+nNeighbors+1,2*nNeighbors*(T+1)+1, - (1,1), - par(t,T+1, - par(i,nNeighbors,i+t*nNeighbors+2,2*(i+t*nNeighbors)+3, - i+nNeighbors*(T+1)+2,2*(i+t*nNeighbors)+2))); - operations = _,par(t,T+1, - par(i,nNeighbors,(_@t),_:*)); -}; - -//------------------------------`(fd.)buildScheme1D`--------------------------- -// This function is used to stack in parallel several schemePoint functions in -// 1 dimension, according to the number of points. -// -// #### Usage -// -// ``` -// si.bus((1 + ((2*R+1)*(T+1)) + (2*R+1))*points) : buildScheme1D(points,R,T) : -// si.bus(points) -// ``` -// -// Where: -// -// * `points`: total number of points in the mesh -// * `R`: neighbourhood radius -// * `T`: time coefficient -//------------------------------------------------------------------------------ -buildScheme1D(points,R,T) = - par (x, points,schemePoint(R,T,1)); - -//------------------------------`(fd.)buildScheme2D`--------------------------- -// This function is used to stack in parallel several schemePoint functions in -// 2 dimensions, according to the number of points in the X and Y directions. -// -// #### Usage -// -// ``` -// si.bus((1 + ((2*R+1)^2*(T+1)) + (2*R+1)^2)*pointsX*pointsY) : -// buildScheme2D(pointsX,pointsY,R,T) : si.bus(pointsX*pointsY) -// ``` -// -// Where: -// -// * `pointsX`: total number of points in the X direction -// * `pointsY`: total number of points in the Y direction -// * `R`: neighbourhood radius -// * `T`: time coefficient -//------------------------------------------------------------------------------ -buildScheme2D(pointsX,pointsY,R,T) = - par (x, pointsX, - par(y,pointsY, schemePoint(R,T,2))); - -//================================Interaction Models============================ -// Here are defined two physically based interaction algorithms: a hammer and -// a bow. These functions need to be coupled to the mesh pde, in the point -// where the interaction happens: to do so, the mesh output signals can be fed -// back and driven into the force block using the interpolation operators. -// The latters can be also used to drive the single force output signal to the -// correct scheme points. -//============================================================================== - -//---------------------------------`(fd.)hammer`------------------------------- -// Implementation of a nonlinear collision model. The hammer is essentially a -// finite difference scheme of a linear damped oscillator, which is coupled -// with the mesh through the collision model (see Stefan Bilbao's book, -// Numerical Sound Synthesis). -// -// #### Usage -// -// ``` -// _ :hammer(coeff,omega0Sqr,sigma0,kH,alpha,k,offset,fIn) : _ -// ``` -// -// Where: -// -// * `coeff`: output force scaling coefficient -// * `omega0Sqr`: squared angular frequency of the hammer oscillator -// * `sigma0`: damping coefficient of the hammer oscillator -// * `kH`: hammer stiffness coefficient -// * `alpha`: nonlinearity parameter -// * `k`: time sampling step (the same as for the mesh) -// * `offset`: distance between the string and the hammer at rest in meters -// * `fIn`: hammer excitation signal (i.e. a button) -//------------------------------------------------------------------------------ -hammer(coeff,omega0Sqr,sigma0,kH,alpha,k,offset,fIn) = - (hammerForce<:hammerModel(fIn,k,offset,_),_)~_:!,_*coeff -with -{ - hammerModel(in,k,offset) = - (_,_,_*forceCoeff,in :> _) ~ (_ <: A*_,B*_') :_-offset; - hammerForce(uh,u)=select2((uh-u)>0,0,((uh-u)^alpha)*(-kH)); - A = (2-omega0Sqr^2*k^2)/(1+sigma0*k); - B = (-1)*(1-sigma0*k)/(1+sigma0*k); - forceCoeff = k^2/(1+sigma0*k); -}; - -//---------------------------------`(fd.)bow`------------------------------- -// Implementation of a nonlinear friction based interaction model that induces -// Helmholtz motion. (see Stefan Bilbao's book, Numerical Sound Synthesis). -// -// #### Usage -// -// ``` -// _ :bow(coeff,alpha,k,vb) : _ -// ``` -// -// Where: -// -// * `coeff`: output force scaling coefficient -// * `alpha`: nonlinearity parameter -// * `k`: time sampling step (the same as for the mesh) -// * `vb`: bow velocity [m/s] -//------------------------------------------------------------------------------ -bow(coeff,alpha,k,vb) = _:phi*(-coeff) -with -{ - phi(u) = 1.41*alpha*dVel(u)*exp(-alpha*dVel(u)*dVel(u)+0.5); - dVel(x) = select2(vb==0,(x-x')/k - vb,0); -}; diff --git a/dist/examples/LIBRARIES/filters.lib b/dist/examples/LIBRARIES/filters.lib deleted file mode 100644 index ff779f32..00000000 --- a/dist/examples/LIBRARIES/filters.lib +++ /dev/null @@ -1,2821 +0,0 @@ -//##################################### filters.lib ######################################## -// Faust Filters library. Its official prefix is `fi`. -// -// The Filters library is organized into 19 sections: -// -// * Basic Filters -// * Comb Filters -// * Direct-Form Digital Filter Sections -// * Direct-Form Second-Order Biquad Sections -// * Ladder/Lattice Digital Filters -// * Useful Special Cases -// * Ladder/Lattice Allpass Filters -// * Digital Filter Sections Specified as Analog Filter Sections -// * Simple Resonator Filters -// * Butterworth Lowpass/Highpass Filters -// * Special Filter-Bank Delay-Equalizing Allpass Filters -// * Elliptic (Cauer) Lowpass Filters -// * Elliptic Highpass Filters -// * Butterworth Bandpass/Bandstop Filters -// * Elliptic Bandpass Filters -// * Parametric Equalizers (Shelf, Peaking) -// * Mth-Octave Filter-Banks -// * Arbitrary-Crossover Filter-Banks and Spectrum Analyzers -// * SVF filters -// -//######################################################################################## - -// NOTE ABOUT LICENSES: -// Each function in this library has its own license. Licenses are declared -// before each function. Corresponding license terms can be found at the -// bottom of this file or in the Faust libraries documentation. - -ma = library("maths.lib"); -ba = library("basics.lib"); -ro = library("routes.lib"); -de = library("delays.lib"); -an = library("analyzers.lib"); -ef = library("misceffects.lib"); -si = library("signals.lib"); -fi = library("filters.lib"); // for compatible copy/paste out of this file - -declare name "Faust Filters Library"; -declare version "0.3"; - -//===============================Basic Filters============================================ -//======================================================================================== - -//----------------------`(fi.)zero`-------------------------- -// One zero filter. Difference equation: \(y(n) = x(n) - zx(n-1)\). -// -// #### Usage -// -// ``` -// _ : zero(z) : _ -// ``` -// -// Where: -// -// * `z`: location of zero along real axis in z-plane -// -// #### Reference -// -//---------------------------------------------------------- -declare zero author "Julius O. Smith III"; -declare zero copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare zero license "MIT-style STK-4.3 license"; -zero(z) = _ <: _,mem : _,*(z) : -; - -//------------------------`(fi.)pole`--------------------------- -// One pole filter. Could also be called a "leaky integrator". -// Difference equation: \(y(n) = x(n) + py(n-1)\). -// -// #### Usage -// -// ``` -// _ : pole(p) : _ -// ``` -// -// Where: -// -// * `p`: pole location = feedback coefficient -// -// #### Reference -// -//------------------------------------------------------------ -declare pole author "Julius O. Smith III"; -declare pole copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare pole license "MIT-style STK-4.3 license"; -pole(p) = + ~ *(p); - -//----------------------`(fi.)integrator`-------------------------- -// Same as `pole(1)` [implemented separately for block-diagram clarity]. -//------------------------------------------------------------ -declare integrator author "Julius O. Smith III"; -declare integrator copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare integrator license "MIT-style STK-4.3 license"; -integrator = + ~ _; - -//-------------------`(fi.)dcblockerat`----------------------- -// DC blocker with configurable break frequency. -// The amplitude response is substantially flat above \(fb\), -// and sloped at about +6 dB/octave below \(fb\). -// Derived from the analog transfer function -// \(H(s) = \frac{s}{(s + 2 \pi fb)}\) -// (which can be seen as a 1st-order Butterworth highpass filter) -// by the low-frequency-matching bilinear transform method -// (i.e., the standard frequency-scaling constant 2*SR). -// -// #### Usage -// -// ``` -// _ : dcblockerat(fb) : _ -// ``` -// -// Where: -// -// * `fb`: "break frequency" in Hz, i.e., -3 dB gain frequency. -// -// #### Reference -// -//------------------------------------------------------------ -declare dcblockerat author "Julius O. Smith III"; -declare dcblockerat copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare dcblockerat license "MIT-style STK-4.3 license"; -dcblockerat(fb) = *(b0) : zero(1) : pole(p) -with { - wn = ma.PI*fb/ma.SR; - b0 = 1.0 / (1 + wn); - p = (1 - wn) * b0; -}; - -//----------------------`(fi.)dcblocker`-------------------------- -// DC blocker. Default dc blocker has -3dB point near 35 Hz (at 44.1 kHz) -// and high-frequency gain near 1.0025 (due to no scaling). -// `dcblocker` is as standard Faust function. -// -// #### Usage -// -// ``` -// _ : dcblocker : _ -// ``` -//------------------------------------------------------------ -declare dcblocker author "Julius O. Smith III"; -declare dcblocker copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare dcblocker license "MIT-style STK-4.3 license"; -dcblocker = zero(1) : pole(0.995); - -//----------------------------`(fi.)lptN`-------------------------------------- -// One-pole lowpass filter with arbitrary dis/charging factors set in dB and -// times set in seconds. -// -// #### Usage -// -// ``` -// _ : lptN(N, tN) : _ -// ``` -// -// Where: -// -// * `N`: is the attenuation factor in dB -// * `tN`: is the filter period in seconds, that is, the time for the -// impulse response to decay by `N` dB -// -// #### Reference -// -// -declare lptN author "Julius O. Smith III"; -declare lptN copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lptN license "MIT-style STK-4.3 license"; -lptN(N, tN, x) = x : si.smooth(ba.tau2pole(tN / log(10.0^(float(N)/20.0)))); -// Special cases of lptN -lptau(tN, x) = lptN(8.6858896381, tN, x); // Tau time constant, i.e., 1/e atten. after tN secs -lpt60(tN, x) = lptN(60, tN, x); // T60 constant, i.e., 1/1000 atten. after tN secs -lpt19(tN, x) = lptN(19, tN, x); // T19 constant, i.e., 1/e^2.2 atten. after tN secs - -//=======================================Comb Filters===================================== -//======================================================================================== - -//------`(fi.)ff_comb`-------- -// Feed-Forward Comb Filter. Note that `ff_comb` requires integer delays -// (uses `delay` internally). -// `ff_comb` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : ff_comb(maxdel,intdel,b0,bM) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (integer) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `b0`: gain applied to delay-line input -// * `bM`: gain applied to delay-line output and then summed with input -// -// #### Reference -// -//------------------------------------------------------------ -declare ff_comb author "Julius O. Smith III"; -declare ff_comb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare ff_comb license "MIT-style STK-4.3 license"; -ff_comb(maxdel,M,b0,bM) = _ <: *(b0), bM * de.delay(maxdel,M) : +; - -//------`(fi.)ff_fcomb`-------- -// Feed-Forward Comb Filter. Note that `ff_fcomb` takes floating-point delays -// (uses `fdelay` internally). -// `ff_fcomb` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : ff_fcomb(maxdel,del,b0,bM) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (integer) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `b0`: gain applied to delay-line input -// * `bM`: gain applied to delay-line output and then summed with input -// -// #### Reference -// -//------------------------------------------------------------ -declare ff_fcomb author "Julius O. Smith III"; -declare ff_fcomb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare ff_fcomb license "MIT-style STK-4.3 license"; -ff_fcomb(maxdel,M,b0,bM) = _ <: *(b0), bM * de.fdelay(maxdel,M) : +; - -//-----------`(fi.)ffcombfilter`------------------- -// Typical special case of `ff_comb()` where: `b0 = 1`. -//------------------------------------------------------------ -declare ff_combfilter author "Julius O. Smith III"; -declare ff_combfilter copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare ff_combfilter license "MIT-style STK-4.3 license"; -ffcombfilter(maxdel,del,g) = ff_comb(maxdel,del,1,g); - - -//-----------------------`(fi.)fb_comb`----------------------- -// Feed-Back Comb Filter (integer delay). -// -// #### Usage -// -// ``` -// _ : fb_comb(maxdel,intdel,b0,aN) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (integer) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `b0`: gain applied to delay-line input and forwarded to output -// * `aN`: minus the gain applied to delay-line output before summing with the input -// and feeding to the delay line -// -// #### Reference -// -//------------------------------------------------------------ -declare fb_comb author "Julius O. Smith III"; -declare fb_comb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare fb_comb license "MIT-style STK-4.3 license"; -fb_comb(maxdel,N,b0,aN) = (+ <: de.delay(maxdel,N-1),_) ~ *(-aN) : !,*(b0) : mem; - - -//-----------------------`(fi.)fb_fcomb`----------------------- -// Feed-Back Comb Filter (floating point delay). -// -// #### Usage -// -// ``` -// _ : fb_fcomb(maxdel,del,b0,aN) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (integer) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `b0`: gain applied to delay-line input and forwarded to output -// * `aN`: minus the gain applied to delay-line output before summing with the input -// and feeding to the delay line -// -// #### Reference -// -//------------------------------------------------------------ -declare fb_fcomb author "Julius O. Smith III"; -declare fb_fcomb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare fb_fcomb license "MIT-style STK-4.3 license"; -fb_fcomb(maxdel,N,b0,aN) = (+ <: de.fdelay(maxdel,float(N)-1.0),_) ~ *(-aN) : !,*(b0) : mem; - -//-----------------------`(fi.)rev1`----------------------- -// Special case of `fb_comb` (`rev1(maxdel,N,g)`). -// The "rev1 section" dates back to the 1960s in computer-music reverberation. -// See the `jcrev` and `brassrev` in `reverbs.lib` for usage examples. -//------------------------------------------------------------ -declare rev1 author "Julius O. Smith III"; -declare rev1 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare rev1 license "MIT-style STK-4.3 license"; -rev1(maxdel,N,g) = fb_comb (maxdel,N,1,-g); - -//-----`(fi.)fbcombfilter` and `(fi.)ffbcombfilter`------------ -// Other special cases of Feed-Back Comb Filter. -// -// #### Usage -// -// ``` -// _ : fbcombfilter(maxdel,intdel,g) : _ -// _ : ffbcombfilter(maxdel,del,g) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (integer) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `g`: feedback gain -// -// #### Reference -// -//------------------------------------------------------------ -declare fbcombfilter author "Julius O. Smith III"; -declare fbcombfilter copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare fbcombfilter license "MIT-style STK-4.3 license"; -fbcombfilter(maxdel,intdel,g) = (+ : de.delay(maxdel,intdel)) ~ *(g); - -declare ffbcombfilter author "Julius O. Smith III"; -declare ffbcombfilter copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare ffbcombfilter license "MIT-style STK-4.3 license"; -ffbcombfilter(maxdel,del,g) = (+ : de.fdelay(maxdel,del)) ~ *(g); - - -//-------------------`(fi.)allpass_comb`----------------- -// Schroeder Allpass Comb Filter. Note that: -// -// ``` -// allpass_comb(maxlen,len,aN) = ff_comb(maxlen,len,aN,1) : fb_comb(maxlen,len-1,1,aN); -// ``` -// -// which is a direct-form-1 implementation, requiring two delay lines. -// The implementation here is direct-form-2 requiring only one delay line. -// -// #### Usage -// -// ``` -// _ : allpass_comb(maxdel,intdel,aN) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (integer) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `aN`: minus the feedback gain -// -// #### References -// * -// * -// * -//------------------------------------------------------------ -declare allpass_comb author "Julius O. Smith III"; -declare allpass_comb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpass_comb license "MIT-style STK-4.3 license"; -allpass_comb(maxdel,N,aN) = (+ <: de.delay(maxdel,N-1),*(aN)) ~ *(-aN) : mem,_ : +; - - -//-------------------`(fi.)allpass_fcomb`----------------- -// Schroeder Allpass Comb Filter. Note that: -// -// ``` -// allpass_comb(maxlen,len,aN) = ff_comb(maxlen,len,aN,1) : fb_comb(maxlen,len-1,1,aN); -// ``` -// -// which is a direct-form-1 implementation, requiring two delay lines. -// The implementation here is direct-form-2 requiring only one delay line. -// -// `allpass_fcomb` is a standard Faust library. -// -// #### Usage -// -// ``` -// _ : allpass_comb(maxdel,intdel,aN) : _ -// _ : allpass_fcomb(maxdel,del,aN) : _ -// ``` -// -// Where: -// -// * `maxdel`: maximum delay (a power of 2) -// * `intdel`: current (float) comb-filter delay between 0 and maxdel -// * `del`: current (float) comb-filter delay between 0 and maxdel -// * `aN`: minus the feedback gain -// -// #### References -// * -// * -// * -//------------------------------------------------------------ -declare allpass_fcomb author "Julius O. Smith III"; -declare allpass_fcomb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpass_fcomb license "MIT-style STK-4.3 license"; -allpass_fcomb(maxdel,N,aN) = (+ <: de.fdelay(maxdel,N-1),*(aN)) ~ *(-aN) : mem,_ : +; - - -//-----------------------`(fi.)rev2`----------------------- -// Special case of `allpass_comb` (`rev2(maxlen,len,g)`). -// The "rev2 section" dates back to the 1960s in computer-music reverberation. -// See the `jcrev` and `brassrev` in `reverbs.lib` for usage examples. -//------------------------------------------------------------ -declare rev2 author "Julius O. Smith III"; -declare rev2 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare rev2 license "MIT-style STK-4.3 license"; -rev2(maxlen,len,g) = allpass_comb(maxlen,len,-g); - -//-------------------`(fi.)allpass_fcomb5` and `(fi.)allpass_fcomb1a`----------------- -// Same as `allpass_fcomb` but use `fdelay5` and `fdelay1a` internally -// (Interpolation helps - look at an fft of faust2octave on -// -// ``` -// `1-1' <: allpass_fcomb(1024,10.5,0.95), allpass_fcomb5(1024,10.5,0.95);`). -// ``` -//------------------------------------------------------------ -declare allpass_fcomb5 author "Julius O. Smith III"; -declare allpass_fcomb5 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpass_fcomb5 license "MIT-style STK-4.3 license"; -allpass_fcomb5(maxdel,N,aN) = (+ <: de.fdelay5(maxdel,N-1),*(aN)) ~ *(-aN) : mem,_ : +; - -declare allpass_fcomb1a author "Julius O. Smith III"; -declare allpass_fcomb1a copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpass_fcomb1a license "MIT-style STK-4.3 license"; -allpass_fcomb1a(maxdel,N,aN) = (+ <: de.fdelay1a(maxdel,N-1),*(aN)) ~ *(-aN) : mem,_ : +; - - -//========================Direct-Form Digital Filter Sections============================= -//======================================================================================== - -// Specified by transfer-function polynomials B(z)/A(z) as in matlab - -//----------------------------`(fi.)iir`------------------------------- -// Nth-order Infinite-Impulse-Response (IIR) digital filter, -// implemented in terms of the Transfer-Function (TF) coefficients. -// Such filter structures are termed "direct form". -// -// `iir` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : iir(bcoeffs,acoeffs) : _ -// ``` -// -// Where: -// -// * `bcoeffs`: (b0,b1,...,b_order) = TF numerator coefficients -// * `acoeffs`: (a1,...,a_order) = TF denominator coeffs (a0=1) -// -// #### Reference -// -//------------------------------------------------------------ -declare iir author "Julius O. Smith III"; -declare iir copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare iir license "MIT-style STK-4.3 license"; -iir(bv,av) = ma.sub ~ fir(av) : fir(bv); - -//-----------------------------`(fi.)fir`--------------------------------- -// FIR filter (convolution of FIR filter coefficients with a signal). -// -// #### Usage -// -// ``` -// _ : fir(bv) : _ -// ``` -// -// `fir` is standard Faust function. -// -// Where: -// -// * `bv` = b0,b1,...,bn is a parallel bank of coefficient signals. -// -// #### Note -// -// `bv` is processed using pattern-matching at compile time, -// so it must have this normal form (parallel signals). -// -// #### Example -// -// Smoothing white noise with a five-point moving average: -// -// ``` -// bv = .2,.2,.2,.2,.2; -// process = noise : fir(bv); -// ``` -// -// Equivalent (note double parens): -// -// ``` -// process = noise : fir((.2,.2,.2,.2,.2)); -// ``` -//------------------------------------------------------------ -//fir(bv) = conv(bv); -declare fir author "Julius O. Smith III"; -declare fir copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare fir license "MIT-style STK-4.3 license"; -fir((b0,bv)) = _ <: *(b0), R(1,bv) :> _ with { - R(n,(bn,bv)) = (@(n):*(bn)), R(n+1,bv); - R(n, bn) = (@(n):*(bn)); }; -fir(b0) = *(b0); - -//---------------`(fi.)conv` and `(fi.)convN`------------------------------- -// Convolution of input signal with given coefficients. -// -// #### Usage -// -// ``` -// _ : conv((k1,k2,k3,...,kN)) : _; // Argument = one signal bank -// _ : convN(N,(k1,k2,k3,...)) : _; // Useful when N < count((k1,...)) -// ``` -//------------------------------------------------------------ -//convN(N,kv,x) = sum(i,N,take(i+1,kv) * x@i); // take() defined in math.lib - -declare convN author "Julius O. Smith III"; -declare convN copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare convN license "MIT-style STK-4.3 license"; -convN(N,kv) = sum(i,N, @(i)*take(i+1,kv)); // take() defined in math.lib -//conv(kv,x) = sum(i,count(kv),take(i+1,kv) * x@i); // count() from math.lib - -declare conv author "Julius O. Smith III"; -declare conv copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare conv license "MIT-style STK-4.3 license"; -conv(kv) = fir(kv); - -//----------------`(fi.)tf1`, `(fi.)tf2` and `(fi.)tf3`---------------------- -// tfN = N'th-order direct-form digital filter. -// -// #### Usage -// -// ``` -// _ : tf1(b0,b1,a1) : _ -// _ : tf2(b0,b1,b2,a1,a2) : _ -// _ : tf3(b0,b1,b2,b3,a1,a2,a3) : _ -// ``` -// -// Where: -// -// * `a`: the poles -// * `b`: the zeros -// -// #### Reference -// -//------------------------------------------------------------ -declare tf1 author "Julius O. Smith III"; -declare tf1 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf1 license "MIT-style STK-4.3 license"; -tf1(b0,b1,a1) = _ <: *(b0), (mem : *(b1)) :> + ~ *(0-a1); - -declare tf2 author "Julius O. Smith III"; -declare tf2 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf2 license "MIT-style STK-4.3 license"; -tf2(b0,b1,b2,a1,a2) = iir((b0,b1,b2),(a1,a2)); -// tf2 is a variant of tf22 below with duplicated mems - -declare tf3 author "Julius O. Smith III"; -declare tf3 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf3 license "MIT-style STK-4.3 license"; -tf3(b0,b1,b2,b3,a1,a2,a3) = iir((b0,b1,b2,b3),(a1,a2,a3)); - -// "Original" version for music.lib. This is here for comparison but people should -// use tf2 instead -TF2(b0,b1,b2,a1,a2) = sub ~ conv2(a1,a2) : conv3(b0,b1,b2) -with { - conv3(k0,k1,k2,x) = k0*x + k1*x' + k2*x''; - conv2(k0,k1,x) = k0*x + k1*x'; - sub(x,y) = y-x; -}; - -//------------`(fi.)notchw`-------------- -// Simple notch filter based on a biquad (`tf2`). -// `notchw` is a standard Faust function. -// -// #### Usage: -// -// ``` -// _ : notchw(width,freq) : _ -// ``` -// -// Where: -// -// * `width`: "notch width" in Hz (approximate) -// * `freq`: "notch frequency" in Hz -// -// #### Reference -// -//------------------------------------------------------------ -declare notchw author "Julius O. Smith III"; -declare notchw copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare notchw license "MIT-style STK-4.3 license"; -notchw(width,freq) = tf2(b0,b1,b2,a1,a2) -with { - fb = 0.5*width; // First design a dcblockerat(width/2) - wn = ma.PI*fb/ma.SR; - b0db = 1.0 / (1 + wn); - p = (1 - wn) * b0db; // This is our pole radius. - // Now place unit-circle zeros at desired angles: - tn = 2*ma.PI*freq/ma.SR; - a2 = p * p; - a2p1 = 1+a2; - a1 = -a2p1*cos(tn); - b1 = a1; - b0 = 0.5*a2p1; - b2 = b0; -}; - -//======================Direct-Form Second-Order Biquad Sections========================== -// Direct-Form Second-Order Biquad Sections -// -// #### Reference -// -//======================================================================================== - -//----------------`(fi.)tf21`, `(fi.)tf22`, `(fi.)tf22t` and `(fi.)tf21t`---------------------- -// tfN = N'th-order direct-form digital filter where: -// -// * `tf21` is tf2, direct-form 1 -// * `tf22` is tf2, direct-form 2 -// * `tf22t` is tf2, direct-form 2 transposed -// * `tf21t` is tf2, direct-form 1 transposed -// -// #### Usage -// -// ``` -// _ : tf21(b0,b1,b2,a1,a2) : _ -// _ : tf22(b0,b1,b2,a1,a2) : _ -// _ : tf22t(b0,b1,b2,a1,a2) : _ -// _ : tf21t(b0,b1,b2,a1,a2) : _ -// ``` -// -// Where: -// -// * `a`: the poles -// * `b`: the zeros -// -// #### Reference -// -//------------------------------------------------------------ -declare tf21 author "Julius O. Smith III"; -declare tf21 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf21 license "MIT-style STK-4.3 license"; -tf21(b0,b1,b2,a1,a2) = // tf2, direct-form 1: - _ <:(mem<:((mem:*(b2)),*(b1))),*(b0) :>_ - : ((_,_,_:>_) ~(_<:*(-a1),(mem:*(-a2)))); - -declare tf22 author "Julius O. Smith III"; -declare tf22 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf22 license "MIT-style STK-4.3 license"; -tf22(b0,b1,b2,a1,a2) = // tf2, direct-form 2: - _ : (((_,_,_:>_)~*(-a1)<:mem,*(b0))~*(-a2)) - : (_<:mem,*(b1)),_ : *(b2),_,_ :> _; - -declare tf22t author "Julius O. Smith III"; -declare tf22t copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf22t license "MIT-style STK-4.3 license"; -tf22t(b0,b1,b2,a1,a2) = // tf2, direct-form 2 transposed: - _ : (_,_,(_ <: *(b2)',*(b1)',*(b0)) - : _,+',_,_ :> _)~*(-a1)~*(-a2) : _; - -declare tf21t author "Julius O. Smith III"; -declare tf21t copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf21t license "MIT-style STK-4.3 license"; -tf21t(b0,b1,b2,a1,a2) = // tf2, direct-form 1 transposed: - tf22t(1,0,0,a1,a2) : tf22t(b0,b1,b2,0,0); // or write it out if you want - -//=========================== Ladder/Lattice Digital Filters ============================= -// Ladder and lattice digital filters generally have superior numerical -// properties relative to direct-form digital filters. They can be derived -// from digital waveguide filters, which gives them a physical interpretation. - -// #### Reference -// * F. Itakura and S. Saito: "Digital Filtering Techniques for Speech Analysis and Synthesis", -// 7th Int. Cong. Acoustics, Budapest, 25 C 1, 1971. -// * J. D. Markel and A. H. Gray: Linear Prediction of Speech, New York: Springer Verlag, 1976. -// * -//======================================================================================== - -//-------------------------------`(fi.)av2sv`----------------------------------- -// Compute reflection coefficients sv from transfer-function denominator av. -// -// #### Usage -// -// ``` -// sv = av2sv(av) -// ``` -// -// Where: -// -// * `av`: parallel signal bank `a1,...,aN` -// * `sv`: parallel signal bank `s1,...,sN` -// -// where `ro = ith` reflection coefficient, and -// `ai` = coefficient of `z^(-i)` in the filter -// transfer-function denominator `A(z)`. -// -// #### Reference -// -// (where reflection coefficients are denoted by k rather than s). -//------------------------------------------------------------ -declare av2sv author "Julius O. Smith III"; -declare av2sv copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare av2sv license "MIT-style STK-4.3 license"; -av2sv(av) = par(i,M,s(i+1)) with { - M = ba.count(av); - s(m) = sr(M-m+1); // m=1..M - sr(m) = Ari(m,M-m+1); // s_{M-1-m} - Ari(m,i) = ba.take(i+1,Ar(m-1)); - //step-down recursion for lattice/ladder digital filters: - Ar(0) = (1,av); // Ar(m) is order M-m (i.e. "reverse-indexed") - Ar(m) = 1,par(i,M-m, (Ari(m,i+1) - sr(m)*Ari(m,M-m-i))/(1-sr(m)*sr(m))); -}; - -//----------------------------`(fi.)bvav2nuv`-------------------------------- -// Compute lattice tap coefficients from transfer-function coefficients. -// -// #### Usage -// -// ``` -// nuv = bvav2nuv(bv,av) -// ``` -// -// Where: -// -// * `av`: parallel signal bank `a1,...,aN` -// * `bv`: parallel signal bank `b0,b1,...,aN` -// * `nuv`: parallel signal bank `nu1,...,nuN` -// -// where `nui` is the i'th tap coefficient, -// `bi` is the coefficient of `z^(-i)` in the filter numerator, -// `ai` is the coefficient of `z^(-i)` in the filter denominator -//------------------------------------------------------------ -declare bvav2nuv author "Julius O. Smith III"; -declare bvav2nuv copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare bvav2nuv license "MIT-style STK-4.3 license"; -bvav2nuv(bv,av) = par(m,M+1,nu(m)) with { - M = ba.count(av); - nu(m) = ba.take(m+1,Pr(M-m)); // m=0..M - // lattice/ladder tap parameters: - Pr(0) = bv; // Pr(m) is order M-m, 'r' means "reversed" - Pr(m) = par(i,M-m+1, (Pri(m,i) - nu(M-m+1)*Ari(m,M-m-i+1))); - Pri(m,i) = ba.take(i+1,Pr(m-1)); - Ari(m,i) = ba.take(i+1,Ar(m-1)); - //step-down recursion for lattice/ladder digital filters: - Ar(0) = (1,av); // Ar(m) is order M-m (recursion index must start at constant) - Ar(m) = 1,par(i,M-m, (Ari(m,i+1) - sr(m)*Ari(m,M-m-i))/(1-sr(m)*sr(m))); - sr(m) = Ari(m,M-m+1); // s_{M-1-m} -}; - -//--------------------`(fi.)iir_lat2`----------------------- -// Two-multiply latice IIR filter of arbitrary order. -// -// #### Usage -// -// ``` -// _ : iir_lat2(bv,av) : _ -// ``` -// -// Where: -// -// * bv: zeros as a bank of parallel signals -// * av: poles as a bank of parallel signals -//------------------------------------------------------------ -declare iir_lat2 author "Julius O. Smith III"; -declare iir_lat2 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare iir_lat2 license "MIT-style STK-4.3 license"; -iir_lat2(bv,av) = allpassnt(M,sv) : sum(i,M+1,*(ba.take(M-i+1,tg))) -with { - M = ba.count(av); - sv = av2sv(av); // sv = vector of sin(theta) reflection coefficients - tg = bvav2nuv(bv,av); // tg = vector of tap gains -}; - -//-----------------------`(fi.)allpassnt`-------------------------- -// Two-multiply lattice allpass (nested order-1 direct-form-ii allpasses). -// -// #### Usage -// -// ``` -// _ : allpassnt(n,sv) : _ -// ``` -// -// Where: -// -// * `n`: the order of the filter -// * `sv`: the reflection coefficients (-1 1) -//------------------------------------------------------------ -declare allpassnt author "Julius O. Smith III"; -declare allpassnt copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassnt license "MIT-style STK-4.3 license"; -allpassnt(0,sv) = _; -allpassnt(n,sv) = _ : ((+ <: (allpassnt(n-1,sv),*(s)))~*(-s)) : fsec(n) -with { - fsec(1) = ro.crossnn(1) : _, (_<:mem,_) : +,_; - fsec(n) = ro.crossn1(n) : _, (_<:mem,_),par(i,n-1,_) : +, par(i,n,_); - innertaps(n) = par(i,n,_); - s = ba.take(n,sv); // reflection coefficient s = sin(theta) -}; - -//--------------------`(fi.)iir_kl`----------------------- -// Kelly-Lochbaum ladder IIR filter of arbitrary order. -// -// #### Usage -// -// ``` -// _ : iir_kl(bv,av) : _ -// ``` -// -// Where: -// -// * bv: zeros as a bank of parallel signals -// * av: poles as a bank of parallel signals -//------------------------------------------------------------ -declare iir_kl author "Julius O. Smith III"; -declare iir_kl copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare iir_kl license "MIT-style STK-4.3 license"; -iir_kl(bv,av) = allpassnklt(M,sv) : sum(i,M+1,*(tghr(i))) -with { - M = ba.count(av); - sv = av2sv(av); // sv = vector of sin(theta) reflection coefficients - tg = bvav2nuv(bv,av); // tg = vector of tap gains for 2mul case - tgr(i) = ba.take(M+1-i,tg); - tghr(n) = tgr(n)/pi(n); - pi(0) = 1; - pi(n) = pi(n-1)*(1+ba.take(M-n+1,sv)); // all sign parameters '+' -}; - -//-----------------------`(fi.)allpassnklt`-------------------------- -// Kelly-Lochbaum ladder allpass. -// -// #### Usage: -// -// ``` -// _ : allpassklt(n,sv) : _ -// ``` -// -// Where: -// -// * `n`: the order of the filter -// * `sv`: the reflection coefficients (-1 1) -//------------------------------------------------------------ -declare allpassnklt author "Julius O. Smith III"; -declare allpassnklt copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassnklt license "MIT-style STK-4.3 license"; -allpassnklt(0,sv) = _; -allpassnklt(n,sv) = _ <: *(s),(*(1+s) : (+ - : allpassnklt(n-1,sv))~(*(-s))) : fsec(n) -with { - fsec(1) = _, (_<:mem*(1-s),_) : sumandtaps(n); - fsec(n) = _, (_<:mem*(1-s),_), par(i,n-1,_) : sumandtaps(n); - s = ba.take(n,sv); - sumandtaps(n) = +,par(i,n,_); -}; - -//--------------------`(fi.)iir_lat1`----------------------- -// One-multiply latice IIR filter of arbitrary order. -// -// #### Usage -// -// ``` -// _ : iir_lat1(bv,av) : _ -// ``` -// -// Where: -// -// * bv: zeros as a bank of parallel signals -// * av: poles as a bank of parallel signals -//------------------------------------------------------------ -declare iir_lat1 author "Julius O. Smith III"; -declare iir_lat1 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare iir_lat1 license "MIT-style STK-4.3 license"; -iir_lat1(bv,av) = allpassn1mt(M,sv) : sum(i,M+1,*(tghr(i+1))) -with { - M = ba.count(av); - sv = av2sv(av); // sv = vector of sin(theta) reflection coefficients - tg = bvav2nuv(bv,av); // tg = vector of tap gains - tgr(i) = ba.take(M+2-i,tg); // i=1..M+1 (for "takability") - tghr(n) = tgr(n)/pi(n); - pi(1) = 1; - pi(n) = pi(n-1)*(1+ba.take(M-n+2,sv)); // all sign parameters '+' -}; - -//-----------------------`(fi.)allpassn1mt`-------------------------- -// One-multiply lattice allpass with tap lines. -// -// #### Usage -// -// ``` -// _ : allpassn1mt(N,sv) : _ -// ``` -// -// Where: -// -// * `N`: the order of the filter (fixed at compile time) -// * `sv`: the reflection coefficients (-1 1) -//------------------------------------------------------------ -declare allpassn1mt author "Julius O. Smith III"; -declare allpassn1mt copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassn1mt license "MIT-style STK-4.3 license"; -allpassn1mt(0,sv) = _; -allpassn1mt(n,sv) = _ <: _,_ : ((+:*(s) <: _,_),_ : _,+ : ro.crossnn(1) - : allpassn1mt(n-1,sv),_)~(*(-1)) : fsec(n) -with { - fsec(1) = ro.crossnn(1) : _, (_<:mem,_) : +,_; - fsec(n) = ro.crossn1(n) : _, (_<:mem,_),par(i,n-1,_) : +, par(i,n,_); - innertaps(n) = par(i,n,_); - s = ba.take(n,sv); // reflection coefficient s = sin(theta) -}; - -//-------------------------------`(fi.)iir_nl`------------------------- -// Normalized ladder filter of arbitrary order. -// -// #### Usage -// -// ``` -// _ : iir_nl(bv,av) : _ -// ``` -// -// Where: -// -// * bv: zeros as a bank of parallel signals -// * av: poles as a bank of parallel signals -// -// #### References -// * J. D. Markel and A. H. Gray, Linear Prediction of Speech, New York: Springer Verlag, 1976. -// * -//------------------------------------------------------------ -declare iir_nl author "Julius O. Smith III"; -declare iir_nl copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare iir_nl license "MIT-style STK-4.3 license"; -iir_nl(bv,av) = allpassnnlt(M,sv) : sum(i,M+1,*(tghr(i))) -with { - M = ba.count(av); - sv = av2sv(av); // sv = vector of sin(theta) reflection coefficients - tg = bvav2nuv(bv,av); // tg = vector of tap gains for 2mul case - tgr(i) = ba.take(M+1-i,tg); - tghr(n) = tgr(n)/pi(n); - pi(0) = 1; - s(n) = ba.take(M-n+1,sv); // reflection coefficient = sin(theta) - c(n) = sqrt(max(0,1-s(n)*s(n))); // compiler crashes on sqrt(-) - pi(n) = pi(n-1)*c(n); -}; - -//-------------------------------`(fi.)allpassnnlt`------------------------- -// Normalized ladder allpass filter of arbitrary order. -// -// #### Usage: -// -// ``` -// _ : allpassnnlt(N,sv) : _ -// ``` -// -// Where: -// -// * `N`: the order of the filter (fixed at compile time) -// * `sv`: the reflection coefficients (-1,1) -// -// #### References -// * J. D. Markel and A. H. Gray, Linear Prediction of Speech, New York: Springer Verlag, 1976. -// * -//------------------------------------------------------------ -declare allpassnnlt author "Julius O. Smith III"; -declare allpassnnlt copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassnnlt license "MIT-style STK-4.3 license"; -allpassnnlt(0,sv) = _; -allpassnnlt(n,scl*(sv)) = allpassnnlt(n,par(i,count(sv),scl*(sv(i)))); -allpassnnlt(n,sv) = _ <: *(s),(*(c) : (+ - : allpassnnlt(n-1,sv))~(*(-s))) : fsec(n) -with { - fsec(1) = _, (_<:mem*(c),_) : sumandtaps(n); - fsec(n) = _, (_<:mem*(c),_), par(i,n-1,_) : sumandtaps(n); - s = ba.take(n,sv); - c = sqrt(max(0,1-s*s)); - sumandtaps(n) = +,par(i,n,_); -}; - -//=============================Useful Special Cases======================================= -//======================================================================================== - -//--------------------------------`(fi.)tf2np`------------------------------------ -// Biquad based on a stable second-order Normalized Ladder Filter -// (more robust to modulation than `tf2` and protected against instability). -// -// #### Usage -// -// ``` -// _ : tf2np(b0,b1,b2,a1,a2) : _ -// ``` -// -// Where: -// -// * `a`: the poles -// * `b`: the zeros -//------------------------------------------------------------ -declare tf2np author "Julius O. Smith III"; -declare tf2np copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf2np license "MIT-style STK-4.3 license"; -tf2np(b0,b1,b2,a1,a2) = allpassnnlt(M,sv) : sum(i,M+1,*(tghr(i))) -with { - smax = 1.0-ma.EPSILON; // maximum reflection-coefficient magnitude allowed - s2 = max(-smax, min(smax,a2)); // Project both reflection-coefficients - s1 = max(-smax, min(smax,a1/(1+a2))); // into the defined stability-region. - sv = (s1,s2); // vector of sin(theta) reflection coefficients - M = 2; - nu(2) = b2; - nu(1) = b1 - b2*a1; - nu(0) = (b0-b2*a2) - nu(1)*s1; - tg = (nu(0),nu(1),nu(2)); - tgr(i) = ba.take(M+1-i,tg); // vector of tap gains for 2mul case - tghr(n) = tgr(n)/pi(n); // apply pi parameters for NLF case - pi(0) = 1; - s(n) = ba.take(M-n+1,sv); - c(n) = sqrt(1-s(n)*s(n)); - pi(n) = pi(n-1)*c(n); -}; - -//-----------------------------`(fi.)wgr`--------------------------------- -// Second-order transformer-normalized digital waveguide resonator. -// -// #### Usage -// -// ``` -// _ : wgr(f,r) : _ -// ``` -// -// Where: -// -// * `f`: resonance frequency (Hz) -// * `r`: loss factor for exponential decay (set to 1 to make a numerically stable oscillator) -// -// #### References -// * -// * -//------------------------------------------------------------ -declare wgr author "Julius O. Smith III"; -declare wgr copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare wgr license "MIT-style STK-4.3 license"; -wgr(f,r,x) = (*(G),_<:_,((+:*(C))<:_,_),_:+,_,_:+(x),-) ~ cross : _,*(0-gi) -with { - C = cos(2*ma.PI*f/ma.SR); - gi = sqrt(max(0,(1+C)/(1-C))); // compensate amplitude (only needed when - G = r*(1-1' + gi')/gi; // frequency changes substantially) - cross = _,_ <: !,_,_,!; -}; - -//-----------------------------`(fi.)nlf2`-------------------------------- -// Second order normalized digital waveguide resonator. -// -// #### Usage -// -// ``` -// _ : nlf2(f,r) : _ -// ``` -// -// Where: -// -// * `f`: resonance frequency (Hz) -// * `r`: loss factor for exponential decay (set to 1 to make a sinusoidal oscillator) -// -// #### Reference -// -//------------------------------------------------------------ -declare nlf2 author "Julius O. Smith III"; -declare nlf2 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare nlf2 license "MIT-style STK-4.3 license"; -nlf2(f,r,x) = ((_<:_,_),(_<:_,_) : (*(s),*(c),*(c),*(0-s)) :> - (*(r),+(x))) ~ cross -with { - th = 2*ma.PI*f/ma.SR; - c = cos(th); - s = sin(th); - cross = _,_ <: !,_,_,!; -}; - - -//------------`(fi.)apnl`--------------- -// Passive Nonlinear Allpass based on Pierce switching springs idea. -// Switch between allpass coefficient `a1` and `a2` at signal zero crossings. -// -// #### Usage -// -// ``` -// _ : apnl(a1,a2) : _ -// ``` -// -// Where: -// -// * `a1` and `a2`: allpass coefficients -// -// #### Reference -// * "A Passive Nonlinear Digital Filter Design ..." by John R. Pierce and Scott -// A. Van Duyne, JASA, vol. 101, no. 2, pp. 1120-1126, 1997 -//------------------------------------------------------------ -declare apnl author "Julius O. Smith III"; -declare apnl copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare apnl license "MIT-style STK-4.3 license"; -apnl(a1,a2,x) = nonLinFilter -with { - condition = _>0; - nonLinFilter = (x - _ <: _*(condition*a1 + (1-condition)*a2),_')~_ :> +; -}; - - -//============================Ladder/Lattice Allpass Filters============================== -// An allpass filter has gain 1 at every frequency, but variable phase. -// Ladder/lattice allpass filters are specified by reflection coefficients. -// They are defined here as nested allpass filters, hence the names allpassn*. -// -// #### References -// * -// * -// * Linear Prediction of Speech, Markel and Gray, Springer Verlag, 1976 -//======================================================================================== - -//---------------`(fi.)allpassn`----------------- -// Two-multiply lattice - each section is two multiply-adds. -// -// #### Usage: -// -// ``` -// _ : allpassn(n,sv) : _ -// ``` -// #### Where: -// -// * `n`: the order of the filter -// * `sv`: the reflection coefficients (-1 1) -// -// #### References -// * J. O. Smith and R. Michon, "Nonlinear Allpass Ladder Filters in FAUST", in -// Proceedings of the 14th International Conference on Digital Audio Effects -// (DAFx-11), Paris, France, September 19-23, 2011. -//---------------------------------------------- -declare allpassn author "Julius O. Smith III and Romain Michon"; -declare allpassn copyright "Copyright (C) 2003-2019 by Julius O. Smith III and Romain Michon "; -declare allpassn license "MIT-style STK-4.3 license"; -allpassn(0,sv) = _; -allpassn(n,sv) = _ <: ((+ <: (allpassn(n-1,sv)),*(s))~(*(-s))) : _',_ :+ -with { s = ba.take(n,sv); }; - -//---------------`(fi.)allpassnn`----------------- -// Normalized form - four multiplies and two adds per section, -// but coefficients can be time varying and nonlinear without -// "parametric amplification" (modulation of signal energy). -// -// #### Usage: -// -// ``` -// _ : allpassnn(n,tv) : _ -// ``` -// -// Where: -// -// * `n`: the order of the filter -// * `tv`: the reflection coefficients (-PI PI) -//---------------------------------------------- -// power-normalized (reflection coefficients s = sin(t)): -declare allpassnn author "Julius O. Smith III"; -declare allpassnn copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassnn license "MIT-style STK-4.3 license"; -allpassnn(0,tv) = _; -allpassnn(n,tv) = _ <: *(s), (*(c) : (+ - : allpassnn(n-1,tv))~(*(-s))) : _, mem*c : + -with { c = cos(ba.take(n,tv)); s = sin(ba.take(n,tv)); }; - -//---------------`(fi.)allpasskl`----------------- -// Kelly-Lochbaum form - four multiplies and two adds per -// section, but all signals have an immediate physical -// interpretation as traveling pressure waves, etc. -// -// #### Usage: -// -// ``` -// _ : allpassnkl(n,sv) : _ -// ``` -// -// Where: -// -// * `n`: the order of the filter -// * `sv`: the reflection coefficients (-1 1) -//---------------------------------------------- -// Kelly-Lochbaum: -declare allpassnnkl author "Julius O. Smith III"; -declare allpassnnkl copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassnnkl license "MIT-style STK-4.3 license"; -allpassnkl(0,sv) = _; -allpassnkl(n,sv) = _ <: *(s),(*(1+s) : (+ - : allpassnkl(n-1,sv))~(*(-s))) : _, mem*(1-s) : + -with { s = ba.take(n,sv); }; - -//---------------`(fi.)allpass1m`----------------- -// One-multiply form - one multiply and three adds per section. -// Normally the most efficient in special-purpose hardware. -// -// #### Usage: -// -// ``` -// _ : allpassn1m(n,sv) : _ -// ``` -// -// Where: -// -// * `n`: the order of the filter -// * `sv`: the reflection coefficients (-1 1) -//---------------------------------------------- -// one-multiply: -declare allpassn1m author "Julius O. Smith III"; -declare allpassn1m copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare allpassn1m license "MIT-style STK-4.3 license"; -allpassn1m(0,sv) = _; -allpassn1m(n,sv) = _ <: _,_ : ((+:*(s) <: _,_),_ : _,+ : cross - : allpassn1m(n-1,sv),_)~(*(-1)) : _',_ : + -with { s = ba.take(n,sv); cross = _,_ <: !,_,_,!; }; - -//===========Digital Filter Sections Specified as Analog Filter Sections================== -//======================================================================================== - -//-------------------------`(fi.)tf2s` and `(fi.)tf2snp`-------------------------------- -// Second-order direct-form digital filter, -// specified by ANALOG transfer-function polynomials B(s)/A(s), -// and a frequency-scaling parameter. Digitization via the -// bilinear transform is built in. -// -// #### Usage -// -// ``` -// _ : tf2s(b2,b1,b0,a1,a0,w1) : _ -// ``` -// Where: -// -// ``` -// b2 s^2 + b1 s + b0 -// H(s) = -------------------- -// s^2 + a1 s + a0 -// ``` -// -// and `w1` is the desired digital frequency (in radians/second) -// corresponding to analog frequency 1 rad/sec (i.e., `s = j`). -// -// #### Example -// -// A second-order ANALOG Butterworth lowpass filter, -// normalized to have cutoff frequency at 1 rad/sec, -// has transfer function: -// -// ``` -// 1 -// H(s) = ----------------- -// s^2 + a1 s + 1 -// ``` -// -// where `a1 = sqrt(2)`. Therefore, a DIGITAL Butterworth lowpass -// cutting off at `SR/4` is specified as `tf2s(0,0,1,sqrt(2),1,PI*SR/2);` -// -// #### Method -// -// Bilinear transform scaled for exact mapping of w1. -// -// #### Reference -// -//---------------------------------------------- -declare tf2s author "Julius O. Smith III"; -declare tf2s copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf2s license "MIT-style STK-4.3 license"; -tf2s(b2,b1,b0,a1,a0,w1) = tf2(b0d,b1d,b2d,a1d,a2d) -with { - c = 1/tan(w1*0.5/ma.SR); // bilinear-transform scale-factor - csq = c*c; - d = a0 + a1 * c + csq; - b0d = (b0 + b1 * c + b2 * csq)/d; - b1d = 2 * (b0 - b2 * csq)/d; - b2d = (b0 - b1 * c + b2 * csq)/d; - a1d = 2 * (a0 - csq)/d; - a2d = (a0 - a1*c + csq)/d; -}; - -// tf2snp = tf2s but using a protected normalized ladder filter for tf2: -tf2snp(b2,b1,b0,a1,a0,w1) = tf2np(b0d,b1d,b2d,a1d,a2d) -with { - c = 1/tan(w1*0.5/ma.SR); // bilinear-transform scale-factor - csq = c*c; - d = a0 + a1 * c + csq; - b0d = (b0 + b1 * c + b2 * csq)/d; - b1d = 2 * (b0 - b2 * csq)/d; - b2d = (b0 - b1 * c + b2 * csq)/d; - a1d = 2 * (a0 - csq)/d; - a2d = (a0 - a1*c + csq)/d; -}; - -//-----------------------------`(fi.)tf3slf`------------------------------- -// Analogous to tf2s above, but third order, and using the typical -// low-frequency-matching bilinear-transform constant 2/T ("lf" series) -// instead of the specific-frequency-matching value used in tf2s and tf1s. -// Note the lack of a "w1" argument. -// -// #### Usage -// -// ``` -// _ : tf3slf(b3,b2,b1,b0,a3,a2,a1,a0) : _ -// ``` -//---------------------------------------------- -declare tf3slf author "Julius O. Smith III"; -declare tf3slf copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf3slf license "MIT-style STK-4.3 license"; -tf3slf(b3,b2,b1,b0,a3,a2,a1,a0) = tf3(b0d,b1d,b2d,b3d,a1d,a2d,a3d) with { - c = 2.0 * ma.SR; // bilinear-transform scale-factor ("lf" case) - csq = c*c; - cc = csq*c; - // Thank you maxima: - b3d = (b3*c^3-b2*c^2+b1*c-b0)/d; - b2d = (-3*b3*c^3+b2*c^2+b1*c-3*b0)/d; - b1d = (3*b3*c^3+b2*c^2-b1*c-3*b0)/d; - b0d = (-b3*c^3-b2*c^2-b1*c-b0)/d; - a3d = (a3*c^3-a2*c^2+a1*c-a0)/d; - a2d = (-3*a3*c^3+a2*c^2+a1*c-3*a0)/d; - a1d = (3*a3*c^3+a2*c^2-a1*c-3*a0)/d; - d = (-a3*c^3-a2*c^2-a1*c-a0); -}; - -//-----------------------------`(fi.)tf1s`-------------------------------- -// First-order direct-form digital filter, -// specified by ANALOG transfer-function polynomials B(s)/A(s), -// and a frequency-scaling parameter. -// -// #### Usage -// -// ``` -// tf1s(b1,b0,a0,w1) -// ``` -// Where: -// -// b1 s + b0 -// H(s) = ---------- -// s + a0 -// -// and `w1` is the desired digital frequency (in radians/second) -// corresponding to analog frequency 1 rad/sec (i.e., `s = j`). -// -// #### Example -// A first-order ANALOG Butterworth lowpass filter, -// normalized to have cutoff frequency at 1 rad/sec, -// has transfer function: -// -// 1 -// H(s) = ------- -// s + 1 -// -// so `b0 = a0 = 1` and `b1 = 0`. Therefore, a DIGITAL first-order -// Butterworth lowpass with gain -3dB at `SR/4` is specified as -// -// ``` -// tf1s(0,1,1,PI*SR/2); // digital half-band order 1 Butterworth -// ``` -// -// #### Method -// -// Bilinear transform scaled for exact mapping of w1. -// -// #### Reference -// -//---------------------------------------------- -declare tf1s author "Julius O. Smith III"; -declare tf1s copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf1s license "MIT-style STK-4.3 license"; -tf1s(b1,b0,a0,w1) = tf1(b0d,b1d,a1d) -with { - c = 1/tan(w1*0.5/ma.SR); // bilinear-transform scale-factor - d = a0 + c; - b1d = (b0 - b1*c) / d; - b0d = (b0 + b1*c) / d; - a1d = (a0 - c) / d; -}; - -//-----------------------------`(fi.)tf2sb`-------------------------------- -// Bandpass mapping of `tf2s`: In addition to a frequency-scaling parameter -// `w1` (set to HALF the desired passband width in rad/sec), -// there is a desired center-frequency parameter wc (also in rad/s). -// Thus, `tf2sb` implements a fourth-order digital bandpass filter section -// specified by the coefficients of a second-order analog lowpass prototype -// section. Such sections can be combined in series for higher orders. -// The order of mappings is (1) frequency scaling (to set lowpass cutoff w1), -// (2) bandpass mapping to wc, then (3) the bilinear transform, with the -// usual scale parameter `2*SR`. Algebra carried out in maxima and pasted here. -// -// #### Usage -// -// ``` -// _ : tf2sb(b2,b1,b0,a1,a0,w1,wc) : _ -// ``` -//---------------------------------------------- -declare tf2sb author "Julius O. Smith III"; -declare tf2sb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf2sb license "MIT-style STK-4.3 license"; -tf2sb(b2,b1,b0,a1,a0,w1,wc) = - iir((b0d/a0d,b1d/a0d,b2d/a0d,b3d/a0d,b4d/a0d),(a1d/a0d,a2d/a0d,a3d/a0d,a4d/a0d)) with { - T = 1.0/float(ma.SR); - b0d = (4*b0*w1^2+8*b2*wc^2)*T^2+8*b1*w1*T+16*b2; - b1d = 4*b2*wc^4*T^4+4*b1*wc^2*w1*T^3-16*b1*w1*T-64*b2; - b2d = 6*b2*wc^4*T^4+(-8*b0*w1^2-16*b2*wc^2)*T^2+96*b2; - b3d = 4*b2*wc^4*T^4-4*b1*wc^2*w1*T^3+16*b1*w1*T-64*b2; - b4d = (b2*wc^4*T^4-2*b1*wc^2*w1*T^3+(4*b0*w1^2+8*b2*wc^2)*T^2-8*b1*w1*T+16*b2) - + b2*wc^4*T^4+2*b1*wc^2*w1*T^3; - a0d = wc^4*T^4+2*a1*wc^2*w1*T^3+(4*a0*w1^2+8*wc^2)*T^2+8*a1*w1*T+16; - a1d = 4*wc^4*T^4+4*a1*wc^2*w1*T^3-16*a1*w1*T-64; - a2d = 6*wc^4*T^4+(-8*a0*w1^2-16*wc^2)*T^2+96; - a3d = 4*wc^4*T^4-4*a1*wc^2*w1*T^3+16*a1*w1*T-64; - a4d = wc^4*T^4-2*a1*wc^2*w1*T^3+(4*a0*w1^2+8*wc^2)*T^2-8*a1*w1*T+16; -}; - -//-----------------------------`(fi.)tf1sb`-------------------------------- -// First-to-second-order lowpass-to-bandpass section mapping, -// analogous to tf2sb above. -// -// #### Usage -// -// ``` -// _ : tf1sb(b1,b0,a0,w1,wc) : _ -// ``` -//---------------------------------------------- -declare tf1sb author "Julius O. Smith III"; -declare tf1sb copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare tf1sb license "MIT-style STK-4.3 license"; -tf1sb(b1,b0,a0,w1,wc) = tf2(b0d/a0d,b1d/a0d,b2d/a0d,a1d/a0d,a2d/a0d) with { - T = 1.0/float(ma.SR); - a0d = wc^2*T^2+2*a0*w1*T+4; - b0d = b1*wc^2*T^2 +2*b0*w1*T+4*b1; - b1d = 2*b1*wc^2*T^2-8*b1; - b2d = b1*wc^2*T^2-2*b0*w1*T+4*b1; - a1d = 2*wc^2*T^2-8; - a2d = wc^2*T^2-2*a0*w1*T+4; -}; - -//==============================Simple Resonator Filters================================== -//======================================================================================== - -//------------------`(fi.)resonlp`----------------- -// Simple resonant lowpass filter based on `tf2s` (virtual analog). -// `resonlp` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : resonlp(fc,Q,gain) : _ -// _ : resonhp(fc,Q,gain) : _ -// _ : resonbp(fc,Q,gain) : _ -// -// ``` -// -// Where: -// -// * `fc`: center frequency (Hz) -// * `Q`: q -// * `gain`: gain (0-1) -//--------------------------------------------------------------------- -// resonlp = 2nd-order lowpass with corner resonance: -declare resonlp author "Julius O. Smith III"; -declare resonlp copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare resonlp license "MIT-style STK-4.3 license"; -resonlp(fc,Q,gain) = tf2s(b2,b1,b0,a1,a0,wc) -with { - wc = 2*ma.PI*fc; - a1 = 1/Q; - a0 = 1; - b2 = 0; - b1 = 0; - b0 = gain; -}; - - -//------------------`(fi.)resonhp`----------------- -// Simple resonant highpass filters based on `tf2s` (virtual analog). -// `resonhp` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : resonlp(fc,Q,gain) : _ -// _ : resonhp(fc,Q,gain) : _ -// _ : resonbp(fc,Q,gain) : _ -// -// ``` -// -// Where: -// -// * `fc`: center frequency (Hz) -// * `Q`: q -// * `gain`: gain (0-1) -//--------------------------------------------------------------------- -// resonhp = 2nd-order highpass with corner resonance: -declare resonhp author "Julius O. Smith III"; -declare resonhp copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare resonhp license "MIT-style STK-4.3 license"; -resonhp(fc,Q,gain,x) = gain*x-resonlp(fc,Q,gain,x); - - -//------------------`(fi.)resonbp`----------------- -// Simple resonant bandpass filters based on `tf2s` (virtual analog). -// `resonbp` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : resonlp(fc,Q,gain) : _ -// _ : resonhp(fc,Q,gain) : _ -// _ : resonbp(fc,Q,gain) : _ -// -// ``` -// -// Where: -// -// * `fc`: center frequency (Hz) -// * `Q`: q -// * `gain`: gain (0-1) -//--------------------------------------------------------------------- -// resonbp = 2nd-order bandpass -declare resonbp author "Julius O. Smith III"; -declare resonbp copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare resonbp license "MIT-style STK-4.3 license"; -resonbp(fc,Q,gain) = tf2s(b2,b1,b0,a1,a0,wc) -with { - wc = 2*ma.PI*fc; - a1 = 1/Q; - a0 = 1; - b2 = 0; - b1 = gain; - b0 = 0; -}; - - -//======================Butterworth Lowpass/Highpass Filters============================== -//======================================================================================== - -//----------------`(fi.)lowpass`-------------------- -// Nth-order Butterworth lowpass filter. -// `lowpass` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : lowpass(N,fc) : _ -// ``` -// -// Where: -// -// * `N`: filter order (number of poles) [nonnegative constant integer] -// * `fc`: desired cut-off frequency (-3dB frequency) in Hz -// -// #### References -// * -// * `butter` function in Octave `("[z,p,g] = butter(N,1,'s');")` -//------------------------------ -declare lowpass author "Julius O. Smith III"; -declare lowpass copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lowpass license "MIT-style STK-4.3 license"; -lowpass(N,fc) = lowpass0_highpass1(0,N,fc); - - -//----------------`(fi.)highpass`-------------------- -// Nth-order Butterworth highpass filters. -// `highpass` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : highpass(N,fc) : _ -// ``` -// -// Where: -// -// * `N`: filter order (number of poles) [nonnegative constant integer] -// * `fc`: desired cut-off frequency (-3dB frequency) in Hz -// -// #### References -// * -// * `butter` function in Octave `("[z,p,g] = butter(N,1,'s');")` -//------------------------------ -declare highpass author "Julius O. Smith III"; -declare highpass copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare higpass license "MIT-style STK-4.3 license"; -highpass(N,fc) = lowpass0_highpass1(1,N,fc); - - -//-------------`(fi.)lowpass0_highpass1`-------------- -declare lowpass0_highpass1 author "Julius O. Smith III"; -declare lowpass0_highpass1 "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lowpass0_highpass1 "MIT-style STK-4.3 license"; -lowpass0_highpass1(s,N,fc) = lphpr(s,N,N,fc) -with { - lphpr(s,0,N,fc) = _; - lphpr(s,1,N,fc) = tf1s(s,1-s,1,2*ma.PI*fc); - lphpr(s,O,N,fc) = lphpr(s,(O-2),N,fc) : tf2s(s,0,1-s,a1s,1,w1) with { - parity = N % 2; - S = (O-parity)/2; // current section number - a1s = -2*cos((ma.PI)*-1 + (1-parity)*ma.PI/(2*N) + (S-1+parity)*ma.PI/N); - w1 = 2*ma.PI*fc; - }; -}; - - -//================Special Filter-Bank Delay-Equalizing Allpass Filters==================== -// These special allpass filters are needed by filterbank et al. below. -// They are equivalent to (`lowpass(N,fc)` +|- `highpass(N,fc))/2`, but with -// canceling pole-zero pairs removed (which occurs for odd N). -//======================================================================================== - -//--------------------`(fi.)lowpass_plus`|`minus_highpass`---------------- -declare highpass_plus_lowpass author "Julius O. Smith III"; -declare highpass_plus_lowpass copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass_plus_lowpass license "MIT-style STK-4.3 license"; -highpass_plus_lowpass(1,fc) = _; -highpass_plus_lowpass(3,fc) = tf2s(1,-1,1,1,1,w1) with { w1 = 2*ma.PI*fc; }; -highpass_plus_lowpass(5,fc) = tf2s(1,-a11,1,a11,1,w1) -with { - a11 = 1.618033988749895; - w1 = 2*ma.PI*fc; -}; -// Catch-all definitions for generality - even order is done: -highpass_plus_lowpass(N,fc) = _ <: switch_odd_even(N%2,N,fc) with { - switch_odd_even(0,N,fc) = highpass_plus_lowpass_even(N,fc); - switch_odd_even(1,N,fc) = highpass_plus_lowpass_odd(N,fc); -}; - -declare highpass_minus_lowpass author "Julius O. Smith III"; -declare highpass_minus_lowpass copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass_minus_lowpass license "MIT-style STK-4.3 license"; -highpass_minus_lowpass(3,fc) = tf1s(-1,1,1,w1) with { w1 = 2*ma.PI*fc; }; -highpass_minus_lowpass(5,fc) = tf1s(1,-1,1,w1) : tf2s(1,-a12,1,a12,1,w1) -with { - a12 = 0.618033988749895; - w1 = 2*ma.PI*fc; -}; -// Catch-all definitions for generality - even order is done: -highpass_minus_lowpass(N,fc) = _ <: switch_odd_even(N%2,N,fc) with { - switch_odd_even(0,N,fc) = highpass_minus_lowpass_even(N,fc); - switch_odd_even(1,N,fc) = highpass_minus_lowpass_odd(N,fc); -}; - -declare highpass_plus_lowpass_even author "Julius O. Smith III"; -declare highpass_plus_lowpass_even copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass_plus_lowpass_even license "MIT-style STK-4.3 license"; -highpass_plus_lowpass_even(N,fc) = highpass(N,fc) + lowpass(N,fc); - -declare highpass_minus_lowpass_even author "Julius O. Smith III"; -declare highpass_minus_lowpass_even copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass_plus_lowpass_even license "MIT-style STK-4.3 license"; -highpass_minus_lowpass_even(N,fc) = highpass(N,fc) - lowpass(N,fc); - -declare highpass_plus_lowpass_odd author "Julius O. Smith III"; -declare highpass_plus_lowpass_odd copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass_plus_lowpass_odd license "MIT-style STK-4.3 license"; -// FIXME: Rewrite the following, as for orders 3 and 5 above, -// to eliminate pole-zero cancellations: -highpass_plus_lowpass_odd(N,fc) = highpass(N,fc) + lowpass(N,fc); - -declare highpass_minus_lowpass_odd author "Julius O. Smith III"; -declare highpass_minus_lowpass_odd copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass_plus_lowpass_odd license "MIT-style STK-4.3 license"; -// FIXME: Rewrite the following, as for orders 3 and 5 above, -// to eliminate pole-zero cancellations: -highpass_minus_lowpass_odd(N,fc) = highpass(N,fc) - lowpass(N,fc); - - -//==========================Elliptic (Cauer) Lowpass Filters============================== -// Elliptic (Cauer) Lowpass Filters -// -// #### References -// * -// * functions `ncauer` and `ellip` in Octave. -//======================================================================================== - -//-----------------------------`(fi.)lowpass3e`----------------------------- -// Third-order Elliptic (Cauer) lowpass filter. -// -// #### Usage -// -// ``` -// _ : lowpass3e(fc) : _ -// ``` -// -// Where: -// -// * `fc`: -3dB frequency in Hz -// -// #### Design -// -// For spectral band-slice level display (see `octave_analyzer3e`): -// -// ``` -// [z,p,g] = ncauer(Rp,Rs,3); % analog zeros, poles, and gain, where -// Rp = 60 % dB ripple in stopband -// Rs = 0.2 % dB ripple in passband -// ``` -//--------------------------------------------------------------------- -declare lowpass3e author "Julius O. Smith III"; -declare lowpass3e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lowpass3e license "MIT-style STK-4.3 license"; -lowpass3e(fc) = tf2s(b21,b11,b01,a11,a01,w1) : tf1s(0,1,a02,w1) -with { - a11 = 0.802636764161030; // format long; poly(p(1:2)) % in octave - a01 = 1.412270893774204; - a02 = 0.822445908998816; // poly(p(3)) % in octave - b21 = 0.019809144837789; // poly(z) - b11 = 0; - b01 = 1.161516418982696; - w1 = 2*ma.PI*fc; -}; - -//-----------------------------`(fi.)lowpass6e`----------------------------- -// Sixth-order Elliptic/Cauer lowpass filter. -// -// #### Usage -// -// ``` -// _ : lowpass6e(fc) : _ -// ``` -// -// Where: -// -// * `fc`: -3dB frequency in Hz -// -// #### Design -// -// For spectral band-slice level display (see octave_analyzer6e): -// -// ``` -// [z,p,g] = ncauer(Rp,Rs,6); % analog zeros, poles, and gain, where -// Rp = 80 % dB ripple in stopband -// Rs = 0.2 % dB ripple in passband -// ``` -//---------------------------------------------------------------------- -declare lowpass6e author "Julius O. Smith III"; -declare lowpass6e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lowpass6e license "MIT-style STK-4.3 license"; -lowpass6e(fc) = - tf2s(b21,b11,b01,a11,a01,w1) : - tf2s(b22,b12,b02,a12,a02,w1) : - tf2s(b23,b13,b03,a13,a03,w1) -with { - b21 = 0.000099999997055; - a21 = 1; - b11 = 0; - a11 = 0.782413046821645; - b01 = 0.000433227200555; - a01 = 0.245291508706160; - b22 = 1; - a22 = 1; - b12 = 0; - a12 = 0.512478641889141; - b02 = 7.621731298870603; - a02 = 0.689621364484675; - b23 = 1; - a23 = 1; - b13 = 0; - a13 = 0.168404871113589; - b03 = 53.536152954556727; - a03 = 1.069358407707312; - w1 = 2*ma.PI*fc; -}; - - -//=========================Elliptic Highpass Filters====================================== -//======================================================================================== - -//-----------------------------`(fi.)highpass3e`----------------------------- -// Third-order Elliptic (Cauer) highpass filter. Inversion of `lowpass3e` wrt unit -// circle in s plane (s <- 1/s) -// -// #### Usage -// -// ``` -// _ : highpass3e(fc) : _ -// ``` -// -// Where: -// -// * `fc`: -3dB frequency in Hz -//------------------------------------------------------------------------- -declare highpass3e author "Julius O. Smith III"; -declare highpass3e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass3e license "MIT-style STK-4.3 license"; -highpass3e(fc) = tf2s(b01/a01,b11/a01,b21/a01,a11/a01,1/a01,w1) : - tf1s(1/a02,0,1/a02,w1) -with { - a11 = 0.802636764161030; - a01 = 1.412270893774204; - a02 = 0.822445908998816; - b21 = 0.019809144837789; - b11 = 0; - b01 = 1.161516418982696; - w1 = 2*ma.PI*fc; -}; - -//-----------------------------`(fi.)highpass6e`----------------------------- -// Sixth-order Elliptic/Cauer highpass filter. Inversion of lowpass3e wrt unit -// circle in s plane (s <- 1/s) -// -// #### Usage -// -// ``` -// _ : highpass6e(fc) : _ -// ``` -// -// Where: -// -// * `fc`: -3dB frequency in Hz -//------------------------------------------------------------------------- -declare highpass6e author "Julius O. Smith III"; -declare highpass6e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highpass6e license "MIT-style STK-4.3 license"; -highpass6e(fc) = - tf2s(b01/a01,b11/a01,b21/a01,a11/a01,1/a01,w1) : - tf2s(b02/a02,b12/a02,b22/a02,a12/a02,1/a02,w1) : - tf2s(b03/a03,b13/a03,b23/a03,a13/a03,1/a03,w1) -with { - b21 = 0.000099999997055; - a21 = 1; - b11 = 0; - a11 = 0.782413046821645; - b01 = 0.000433227200555; - a01 = 0.245291508706160; - b22 = 1; - a22 = 1; - b12 = 0; - a12 = 0.512478641889141; - b02 = 7.621731298870603; - a02 = 0.689621364484675; - b23 = 1; - a23 = 1; - b13 = 0; - a13 = 0.168404871113589; - b03 = 53.536152954556727; - a03 = 1.069358407707312; - w1 = 2*ma.PI*fc; -}; - - -//========================Butterworth Bandpass/Bandstop Filters=========================== -//======================================================================================== - -//--------------------`(fi.)bandpass`---------------- -// Order 2*Nh Butterworth bandpass filter made using the transformation -// `s <- s + wc^2/s` on `lowpass(Nh)`, where `wc` is the desired bandpass center -// frequency. The `lowpass(Nh)` cutoff `w1` is half the desired bandpass width. -// `bandpass` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : bandpass(Nh,fl,fu) : _ -// ``` -// -// Where: -// -// * `Nh`: HALF the desired bandpass order (which is therefore even) -// * `fl`: lower -3dB frequency in Hz -// * `fu`: upper -3dB frequency in Hz -// Thus, the passband width is `fu-fl`, -// and its center frequency is `(fl+fu)/2`. -// -// #### Reference -// -//------------------------------------------------------------------------- -declare bandpass author "Julius O. Smith III"; -declare bandpass copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare bandpass license "MIT-style STK-4.3 license"; -bandpass(Nh,fl,fu) = bandpass0_bandstop1(0,Nh,fl,fu); - - -//--------------------`(fi.)bandstop`---------------- -// Order 2*Nh Butterworth bandstop filter made using the transformation -// `s <- s + wc^2/s` on `highpass(Nh)`, where `wc` is the desired bandpass center -// frequency. The `highpass(Nh)` cutoff `w1` is half the desired bandpass width. -// `bandstop` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : bandstop(Nh,fl,fu) : _ -// ``` -// Where: -// -// * `Nh`: HALF the desired bandstop order (which is therefore even) -// * `fl`: lower -3dB frequency in Hz -// * `fu`: upper -3dB frequency in Hz -// Thus, the passband (stopband) width is `fu-fl`, -// and its center frequency is `(fl+fu)/2`. -// -// #### Reference -// -//------------------------------------------------------------------------- -declare bandstop author "Julius O. Smith III"; -declare bandstop copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare bandstop license "MIT-style STK-4.3 license"; -bandstop(Nh,fl,fu) = bandpass0_bandstop1(1,Nh,fl,fu); - -declare bandpass0_bandstop1 author "Julius O. Smith III"; -declare bandpass0_bandstop1 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare bandpass0_bandstop1 license "MIT-style STK-4.3 license"; -bandpass0_bandstop1(s,Nh,fl,fu) = bpbsr(s,Nh,Nh,fl,fu) -with { - wl = 2*ma.PI*fl; // digital (z-plane) lower passband edge - wu = 2*ma.PI*fu; // digital (z-plane) upper passband edge - - c = 2.0*ma.SR; // bilinear transform scaling used in tf2sb, tf1sb - wla = c*tan(wl/c); // analog (s-plane) lower cutoff - wua = c*tan(wu/c); // analog (s-plane) upper cutoff - - wc = sqrt(wla*wua); // s-plane center frequency - w1 = wua - wc^2/wua; // s-plane lowpass prototype cutoff - - bpbsr(s,0,Nh,fl,fu) = _; - bpbsr(s,1,Nh,fl,fu) = tf1sb(s,1-s,1,w1,wc); - bpbsr(s,O,Nh,fl,fu) = bpbsr(s,O-2,Nh,fl,fu) : tf2sb(s,0,(1-s),a1s,1,w1,wc) - with { - parity = Nh % 2; - S = (O-parity)/2; // current section number - a1s = -2*cos(-1*ma.PI + (1-parity)*ma.PI/(2*Nh) + (S-1+parity)*ma.PI/Nh); - }; -}; - - -//===========================Elliptic Bandpass Filters==================================== -//======================================================================================== - -//---------------------`(fi.)bandpass6e`----------------------------- -// Order 12 elliptic bandpass filter analogous to `bandpass(6)`. -//-------------------------------------------------------------- -declare bandpass6e author "Julius O. Smith III"; -declare bandpass6e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare bandpass6e license "MIT-style STK-4.3 license"; -bandpass6e(fl,fu) = tf2sb(b21,b11,b01,a11,a01,w1,wc) : tf1sb(0,1,a02,w1,wc) -with { - a11 = 0.802636764161030; // In octave: format long; poly(p(1:2)) - a01 = 1.412270893774204; - a02 = 0.822445908998816; // poly(p(3)) - b21 = 0.019809144837789; // poly(z) - b11 = 0; - b01 = 1.161516418982696; - - wl = 2*ma.PI*fl; // digital (z-plane) lower passband edge - wu = 2*ma.PI*fu; // digital (z-plane) upper passband edge - - c = 2.0*ma.SR; // bilinear transform scaling used in tf2sb, tf1sb - wla = c*tan(wl/c); // analog (s-plane) lower cutoff - wua = c*tan(wu/c); // analog (s-plane) upper cutoff - - wc = sqrt(wla*wua); // s-plane center frequency - w1 = wua - wc^2/wua; // s-plane lowpass cutoff -}; - -//----------------------`(fi.)bandpass12e`--------------------------- -// Order 24 elliptic bandpass filter analogous to `bandpass(6)`. -//-------------------------------------------------------------- -declare bandpass12e author "Julius O. Smith III"; -declare bandpass12e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare bandpass12e license "MIT-style STK-4.3 license"; -bandpass12e(fl,fu) = - tf2sb(b21,b11,b01,a11,a01,w1,wc) : - tf2sb(b22,b12,b02,a12,a02,w1,wc) : - tf2sb(b23,b13,b03,a13,a03,w1,wc) -with { // octave script output: - b21 = 0.000099999997055; - a21 = 1; - b11 = 0; - a11 = 0.782413046821645; - b01 = 0.000433227200555; - a01 = 0.245291508706160; - b22 = 1; - a22 = 1; - b12 = 0; - a12 = 0.512478641889141; - b02 = 7.621731298870603; - a02 = 0.689621364484675; - b23 = 1; - a23 = 1; - b13 = 0; - a13 = 0.168404871113589; - b03 = 53.536152954556727; - a03 = 1.069358407707312; - - wl = 2*ma.PI*fl; // digital (z-plane) lower passband edge - wu = 2*ma.PI*fu; // digital (z-plane) upper passband edge - - c = 2.0*ma.SR; // bilinear transform scaling used in tf2sb, tf1sb - wla = c*tan(wl/c); // analog (s-plane) lower cutoff - wua = c*tan(wu/c); // analog (s-plane) upper cutoff - - wc = sqrt(wla*wua); // s-plane center frequency - w1 = wua - wc^2/wua; // s-plane lowpass cutoff -}; - -//------------------------`(fi.)pospass`--------------------------- -// Positive-Pass Filter (single-side-band filter) -// -// #### Usage -// -// ``` -// _ : pospass(N,fc) : _,_ -// ``` -// -// where -// -// * `N`: filter order (Butterworth bandpass for positive frequencies). -// * `fc`: lower bandpass cutoff frequency in Hz. -// - Highpass cutoff frequency at ma.SR/2 - fc Hz. -// -// #### Example -// -// * See dm.pospass_demo -// * Look at frequency response: -// -// #### Method -// -// A filter passing only positive frequencies can be made from a -// half-band lowpass by modulating it up to the positive-frequency range. -// Equivalently, down-modulate the input signal using a complex sinusoid at -SR/4 Hz, -// lowpass it with a half-band filter, and modulate back up by SR/4 Hz. -// In Faust/math notation: -// pospass(N) = \(\ast(e^{-j\frac{\pi}{2}n}) : \mbox{lowpass(N,SR/4)} : \ast(e^{j\frac{\pi}{2}n})\) -// -// An approximation to the Hilbert transform is given by the -// imaginary output signal: -// -// ``` -// hilbert(N) = pospass(N) : !,*(2); -// ``` -// -// #### References -// * -// * -// * -//------------------------------------------------------------ -declare pospass author "Julius O. Smith III"; -declare pospass copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare pospass license "MIT-style STK-4.3 license"; -pospass(N,fc) = fi.pospass0(lpf) with { - fcs = ma.SR/4 - fc; // Upper lowpass cutoff = (SR/2 - fc) - SR/4 - lpf = fi.lowpass(N,fcs); // Butterworth lowpass -}; - -declare pospass6e author "Julius O. Smith III"; -declare pospass6e copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare pospass6e license "MIT-style STK-4.3 license"; -pospass6e(fc) = fi.pospass0(lpf) with { - lpf = fi.lowpass6e(ma.SR/4 - fc); // Elliptic lowpass, order 6 -}; - -declare pospass0 author "Julius O. Smith III"; -declare pospass0 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare pospass0 license "MIT-style STK-4.3 license"; -pospass0(lpf) = unmodulate : lpf, lpf : modulate with { - c = 1-1' : +~(*(-1):mem); // complex sinusoid rotating at SR/4 - s = c'; // ||: 0, 1, 0, -1 :|| - unmodulate = _ <: *(c),*(-s); // subtract SR/4 from all input frequencies - modulate(x,y) = c*x-s*y, c*y + s*x; // add SR/4 to all frequencies -}; - - -//=================Parametric Equalizers (Shelf, Peaking)================================= -// Parametric Equalizers (Shelf, Peaking). -// -// #### References -// * -// * -// * Digital Audio Signal Processing, Udo Zolzer, Wiley, 1999, p. 124 -// * -// * -// * maxmsp.lib in the Faust distribution -// * bandfilter.dsp in the faust2pd distribution -//======================================================================================== - -//----------------------`(fi.)low_shelf`---------------------- -// First-order "low shelf" filter (gain boost|cut between dc and some frequency) -// `low_shelf` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : lowshelf(N,L0,fx) : _ -// _ : low_shelf(L0,fx) : _ // default case (order 3) -// _ : lowshelf_other_freq(N,L0,fx) : _ -// ``` -// -// Where: -// * `N`: filter order 1, 3, 5, ... (odd only). (default should be 3) -// * `L0`: desired level (dB) between dc and fx (boost `L0>0` or cut `L0<0`) -// * `fx`: -3dB frequency of lowpass band (`L0>0`) or upper band (`L0<0`) -// (see "SHELF SHAPE" below). -// -// The gain at SR/2 is constrained to be 1. -// The generalization to arbitrary odd orders is based on the well known -// fact that odd-order Butterworth band-splits are allpass-complementary -// (see filterbank documentation below for references). -// -// #### Shelf Shape -// The magnitude frequency response is approximately piecewise-linear -// on a log-log plot ("BODE PLOT"). The Bode "stick diagram" approximation -// L(lf) is easy to state in dB versus dB-frequency lf = dB(f): -// -// * L0 > 0: -// * L(lf) = L0, f between 0 and fx = 1st corner frequency; -// * L(lf) = L0 - N * (lf - lfx), f between fx and f2 = 2nd corner frequency; -// * L(lf) = 0, lf > lf2. -// * lf2 = lfx + L0/N = dB-frequency at which level gets back to 0 dB. -// * L0 < 0: -// * L(lf) = L0, f between 0 and f1 = 1st corner frequency; -// * L(lf) = - N * (lfx - lf), f between f1 and lfx = 2nd corner frequency; -// * L(lf) = 0, lf > lfx. -// * lf1 = lfx + L0/N = dB-frequency at which level goes up from L0. -// -// See `lowshelf_other_freq`. -//-------------------------------------------------------------- -declare lowshelf author "Julius O. Smith III"; -declare lowshelf copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lowshelf license "MIT-style STK-4.3 license"; -lowshelf(N,L0,fx) = filterbank(N,(fx)) : _, *(ba.db2linear(L0)) :> _; - -// Special cases and optimization: -declare low_shelf author "Julius O. Smith III"; -declare low_shelf copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare low_shelf license "MIT-style STK-4.3 license"; -low_shelf = lowshelf(3); // default = 3rd order Butterworth - -declare low_shelf1 author "Julius O. Smith III"; -declare low_shelf1 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare low_shelf1 license "MIT-style STK-4.3 license"; -low_shelf1(L0,fx,x) = x + (ba.db2linear(L0)-1)*lowpass(1,fx,x); // optimized - -declare low_shelf1_l author "Julius O. Smith III"; -declare low_shelf1_l copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare low_shelf1_l license "MIT-style STK-4.3 license"; -low_shelf1_l(G0,fx,x) = x + (G0-1)*lowpass(1,fx,x); // optimized - -declare lowshelf_other_freq author "Julius O. Smith III"; -declare lowshelf_other_freq copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare lowshelf_other_freq license "MIT-style STK-4.3 license"; -lowshelf_other_freq(N, L0, fx) = ba.db2linear(ba.linear2db(fx) + L0/N); // convenience - -//-------------`(fi.)high_shelf`-------------- -// First-order "high shelf" filter (gain boost|cut above some frequency). -// `high_shelf` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : highshelf(N,Lpi,fx) : _ -// _ : high_shelf(L0,fx) : _ // default case (order 3) -// _ : highshelf_other_freq(N,Lpi,fx) : _ -// ``` -// -// Where: -// -// * `N`: filter order 1, 3, 5, ... (odd only). -// * `Lpi`: desired level (dB) between fx and SR/2 (boost Lpi>0 or cut Lpi<0) -// * `fx`: -3dB frequency of highpass band (L0>0) or lower band (L0<0) -// (Use highshelf_other_freq() below to find the other one.) -// -// The gain at dc is constrained to be 1. -// See `lowshelf` documentation above for more details on shelf shape. -//-------------------------------------------------------------- -declare highshelf author "Julius O. Smith III"; -declare highshelf copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highshelf license "MIT-style STK-4.3 license"; -highshelf(N,Lpi,fx) = filterbank(N,(fx)) : *(ba.db2linear(Lpi)), _ :> _; -// Special cases and optimization: -high_shelf = highshelf(3); // default = 3rd order Butterworth - -declare high_shelf1 author "Julius O. Smith III"; -declare high_shelf1 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare high_shelf1 license "MIT-style STK-4.3 license"; -high_shelf1(Lpi,fx,x) = x + (ba.db2linear(Lpi)-1)*highpass(1,fx,x); // optimized - -declare high_shelf1_l author "Julius O. Smith III"; -declare high_shelf1_l copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare high_shelf1_l license "MIT-style STK-4.3 license"; -high_shelf1_l(Gpi,fx,x) = x + (Gpi-1)*highpass(1,fx,x); //optimized - -// shelf transitions between frequency fx and this one: -declare highshelf_other_freq author "Julius O. Smith III"; -declare highshelf_other_freq copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare highshelf_other_freq license "MIT-style STK-4.3 license"; -highshelf_other_freq(N, Lpi, fx) = ba.db2linear(ba.linear2db(fx) - Lpi/N); - - -//-------------------`(fi.)peak_eq`------------------------------ -// Second order "peaking equalizer" section (gain boost or cut near some frequency) -// Also called a "parametric equalizer" section. -// `peak_eq` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : peak_eq(Lfx,fx,B) : _; -// ``` -// -// Where: -// -// * `Lfx`: level (dB) at fx (boost Lfx>0 or cut Lfx<0) -// * `fx`: peak frequency (Hz) -// * `B`: bandwidth (B) of peak in Hz -//-------------------------------------------------------------- -declare peak_eq author "Julius O. Smith III"; -declare peak_eq copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare peak_eq license "MIT-style STK-4.3 license"; -peak_eq(Lfx,fx,B) = tf2s(1,b1s,1,a1s,1,wx) with { - T = float(1.0/ma.SR); - Bw = B*T/sin(wx*T); // prewarp s-bandwidth for more accuracy in z-plane - a1 = ma.PI*Bw; - b1 = g*a1; - g = ba.db2linear(abs(Lfx)); - b1s = select2(Lfx>0,a1,b1); // When Lfx>0, pole dominates bandwidth - a1s = select2(Lfx>0,b1,a1); // When Lfx<0, zero dominates - wx = 2*ma.PI*fx; -}; - -//--------------------`(fi.)peak_eq_cq`---------------------------- -// Constant-Q second order peaking equalizer section. -// -// #### Usage -// -// ``` -// _ : peak_eq_cq(Lfx,fx,Q) : _; -// ``` -// -// Where: -// -// * `Lfx`: level (dB) at fx -// * `fx`: boost or cut frequency (Hz) -// * `Q`: "Quality factor" = fx/B where B = bandwidth of peak in Hz -//------------------------------------------------------------ -declare peak_eq_cq author "Julius O. Smith III"; -declare peak_eq_cq copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare peak_eq_cq license "MIT-style STK-4.3 license"; -peak_eq_cq(Lfx,fx,Q) = peak_eq(Lfx,fx,fx/Q); - -//-------------------`(fi.)peak_eq_rm`-------------------------- -// Regalia-Mitra second order peaking equalizer section. -// -// #### Usage -// -// ``` -// _ : peak_eq_rm(Lfx,fx,tanPiBT) : _; -// ``` -// -// Where: -// -// * `Lfx`: level (dB) at fx -// * `fx`: boost or cut frequency (Hz) -// * `tanPiBT`: `tan(PI*B/SR)`, where B = -3dB bandwidth (Hz) when 10^(Lfx/20) = 0 -// ~ PI*B/SR for narrow bandwidths B -// -// #### Reference -// P.A. Regalia, S.K. Mitra, and P.P. Vaidyanathan, -// "The Digital All-Pass Filter: A Versatile Signal Processing Building Block" -// Proceedings of the IEEE, 76(1):19-37, Jan. 1988. (See pp. 29-30.) -//------------------------------------------------------------ -declare peak_eq_rm author "Julius O. Smith III"; -declare peak_eq_rm copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare peak_eq_rm license "MIT-style STK-4.3 license"; -peak_eq_rm(Lfx,fx,tanPiBT) = _ <: _,A,_ : +,- : *(0.5),*(K/2.0) : + with { - A = tf2(k2, k1*(1+k2), 1, k1*(1+k2), k2) <: _,_; // allpass - k1 = 0.0 - cos(2.0*ma.PI*fx/ma.SR); - k2 = (1.0 - tanPiBT)/(1.0 + tanPiBT); - K = ba.db2linear(Lfx); -}; - - -//---------------------`(fi.)spectral_tilt`------------------------- -// Spectral tilt filter, providing an arbitrary spectral rolloff factor -// alpha in (-1,1), where -// -1 corresponds to one pole (-6 dB per octave), and -// +1 corresponds to one zero (+6 dB per octave). -// In other words, alpha is the slope of the ln magnitude versus ln frequency. -// For a "pinking filter" (e.g., to generate 1/f noise from white noise), -// set alpha to -1/2. -// -// #### Usage -// -// ``` -// _ : spectral_tilt(N,f0,bw,alpha) : _ -// ``` -// Where: -// -// * `N`: desired integer filter order (fixed at compile time) -// * `f0`: lower frequency limit for desired roll-off band > 0 -// * `bw`: bandwidth of desired roll-off band -// * `alpha`: slope of roll-off desired in nepers per neper, -// between -1 and 1 (ln mag / ln radian freq) -// -// #### Examples -// See `spectral_tilt_demo`. -// -// #### Reference -// J.O. Smith and H.F. Smith, -// "Closed Form Fractional Integration and Differentiation via Real Exponentially Spaced Pole-Zero Pairs", -// arXiv.org publication arXiv:1606.06154 [cs.CE], June 7, 2016, -// -//------------------------------------------------------------ -declare spectral_tilt author "Julius O. Smith III"; -declare spectral_tilt copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare spectral_tilt license "MIT-style STK-4.3 license"; -spectral_tilt(N,f0,bw,alpha) = seq(i,N,sec(i)) with { - sec(i) = g * tf1s(b1,b0,a0,1) with { - g = a0/b0; // unity dc-gain scaling - b1 = 1.0; - b0 = mzh(i); - a0 = mph(i); - mzh(i) = prewarp(mz(i),ma.SR,w0); // prewarping for bilinear transform - mph(i) = prewarp(mp(i),ma.SR,w0); - prewarp(w,SR,wp) = wp * tan(w*T/2) / tan(wp*T/2) with { T = 1/ma.SR; }; - mz(i) = w0 * r ^ (-alpha+i); // minus zero i in s plane - mp(i) = w0 * r ^ i; // minus pole i in s plane - f0p = max(f0,ma.EPSILON); // cannot go to zero - w0 = 2 * ma.PI * f0p; // radian frequency of first pole - f1 = f0p + bw; // upper band limit - r = (f1/f0p)^(1.0/float(N-1)); // pole ratio (2 => octave spacing) - }; -}; - - -//----------------------`(fi.)levelfilter`---------------------- -// Dynamic level lowpass filter. -// `levelfilter` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : levelfilter(L,freq) : _ -// ``` -// -// Where: -// -// * `L`: desired level (in dB) at Nyquist limit (SR/2), e.g., -60 -// * `freq`: corner frequency (-3dB point) usually set to fundamental freq -// * `N`: Number of filters in series where L = L/N -// -// #### Reference -// -//------------------------------------------------------------ -declare levelfilter author "Julius O. Smith III"; -declare levelfilter copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare levelfilter license "MIT-style STK-4.3 license"; -levelfilter(L,freq,x) = (L * L0 * x) + ((1.0-L) * lp2out(x)) -with { - L0 = pow(L,1/3); - Lw = ma.PI*freq/ma.SR; // = w1 T / 2 - Lgain = Lw / (1.0 + Lw); - Lpole2 = (1.0 - Lw) / (1.0 + Lw); - lp2out = *(Lgain) : + ~ *(Lpole2); -}; - - -//----------------------`(fi.)levelfilterN`---------------------- -// Dynamic level lowpass filter. -// -// #### Usage -// -// ``` -// _ : levelfilterN(N,freq,L) : _ -// ``` -// -// Where: -// -// * `L`: desired level (in dB) at Nyquist limit (SR/2), e.g., -60 -// * `freq`: corner frequency (-3dB point) usually set to fundamental freq -// * `N`: Number of filters in series where L = L/N -// -// #### Reference -// -//------------------------------------------------------------ -declare levelfilterN author "Julius O. Smith III"; -declare levelfilterN copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare levelfilterN license "MIT-style STK-4.3 license"; -levelfilterN(N,freq,L) = seq(i,N,levelfilter((L/N),freq)); - - -//=================================Mth-Octave Filter-Banks================================ -// Mth-octave filter-banks split the input signal into a bank of parallel signals, one -// for each spectral band. They are related to the Mth-Octave Spectrum-Analyzers in -// `analysis.lib`. -// The documentation of this library contains more details about the implementation. -// The parameters are: -// -// * `M`: number of band-slices per octave (>1) -// * `N`: total number of bands (>2) -// * `ftop`: upper bandlimit of the Mth-octave bands ( -//======================================================================================== - -//------------------------`(fi.)mth_octave_filterbank[n]`------------------------- -// Allpass-complementary filter banks based on Butterworth band-splitting. -// For Butterworth band-splits, the needed delay equalizer is easily found. -// -// #### Usage -// -// ``` -// _ : mth_octave_filterbank(O,M,ftop,N) : par(i,N,_); // Oth-order -// _ : mth_octave_filterbank_alt(O,M,ftop,N) : par(i,N,_); // dc-inverted version -// ``` -// -// Also for convenience: -// -// ``` -// _ : mth_octave_filterbank3(M,ftop,N) : par(i,N,_); // 3rd-order Butterworth -// _ : mth_octave_filterbank5(M,ftop,N) : par(i,N,_); // 5th-order Butterworth -// mth_octave_filterbank_default = mth_octave_filterbank5; -// ``` -// -// Where: -// -// * `O`: order of filter used to split each frequency band into two -// * `M`: number of band-slices per octave -// * `ftop`: highest band-split crossover frequency (e.g., 20 kHz) -// * `N`: total number of bands (including dc and Nyquist) -//------------------------------------------------------------ -declare mth_octave_filterbank author "Julius O. Smith III"; -declare mth_octave_filterbank copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare mth_octave_filterbank license "MIT-style STK-4.3 license"; -mth_octave_filterbank(O,M,ftop,N) = an.mth_octave_analyzer(O,M,ftop,N) : delayeq(N) -with { - fc(n) = ftop * 2^(float(n-N+1)/float(M)); // -3dB crossover frequencies - ap(n) = highpass_plus_lowpass(O,fc(n)); // delay-equalizing allpass - delayeq(N) = par(i,N-2,apchain(i+1)), _, _; - apchain(i) = seq(j,N-1-i,ap(j+1)); -}; - -// dc-inverted version. This reduces the delay-equalizer order for odd O. - // Negating the input signal makes the dc band noninverting -// and all higher bands sign-inverted (if preferred). -declare mth_octave_filterbank_alt author "Julius O. Smith III"; -declare mth_octave_filterbank_alt copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare mth_octave_filterbank_alt license "MIT-style STK-4.3 license"; -mth_octave_filterbank_alt(O,M,ftop,N) = an.mth_octave_analyzer(O,M,ftop,N) : delayeqi(O,N) -with { - fc(n) = ftop * 2^(float(n-N+1)/float(M)); // -3dB crossover frequencies - ap(n) = highpass_minus_lowpass(O,fc(n)); // half the order of 'plus' case - delayeqi(N) = par(i,N-2,apchain(i+1)), _, *(-1.0); - apchain(i) = seq(j,N-1-i,ap(j+1)); -}; - -// Note that even-order cases require complex coefficients. -// See Vaidyanathan 1993 and papers cited there for more info. -declare mth_octave_filterbank3 author "Julius O. Smith III"; -declare mth_octave_filterbank3 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare mth_octave_filterbank3 license "MIT-style STK-4.3 license"; -mth_octave_filterbank3(M,ftop,N) = mth_octave_filterbank_alt(3,M,ftop,N); - -declare mth_octave_filterbank5 author "Julius O. Smith III"; -declare mth_octave_filterbank5 copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare mth_octave_filterbank5 license "MIT-style STK-4.3 license"; -mth_octave_filterbank5(M,ftop,N) = mth_octave_filterbank(5,M,ftop,N); - -declare mth_octave_filterbank_default author "Julius O. Smith III"; -declare mth_octave_filterbank_default copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare mth_octave_filterbank_default license "MIT-style STK-4.3 license"; -mth_octave_filterbank_default = mth_octave_filterbank5; - - -//===============Arbitrary-Crossover Filter-Banks and Spectrum Analyzers================== -// These are similar to the Mth-octave analyzers above, except that the -// band-split frequencies are passed explicitly as arguments. -//======================================================================================== - -// ACKNOWLEDGMENT -// Technique for processing a variable number of signal arguments due -// to Yann Orlarey (as is the entire Faust framework!) - -//---------------`(fi.)filterbank`-------------------------- -// Filter bank. -// `filterbank` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : filterbank (O,freqs) : par(i,N,_); // Butterworth band-splits -// ``` -// Where: -// -// * `O`: band-split filter order (ODD integer required for filterbank[i]) -// * `freqs`: (fc1,fc2,...,fcNs) [in numerically ascending order], where -// Ns=N-1 is the number of octave band-splits -// (total number of bands N=Ns+1). -// -// If frequencies are listed explicitly as arguments, enclose them in parens: -// -// ``` -// _ : filterbank(3,(fc1,fc2)) : _,_,_ -// ``` -//--------------------------------------------------- -declare filterbank author "Julius O. Smith III"; -declare filterbank copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare filterbank license "MIT-style STK-4.3 license"; -filterbank(O,lfreqs) = an.analyzer(O,lfreqs) : delayeq(nb) -with { - nb = ba.count(lfreqs); - fc(n) = ba.take(n, lfreqs); - ap(n) = highpass_plus_lowpass(O,fc(n)); - delayeq(1) = _,_; // par(i,0,...) does not fly - delayeq(nb) = par(i,nb-1,apchain(nb-1-i)),_,_; - apchain(0) = _; - apchain(i) = ap(i) : apchain(i-1); -}; - -//-----------------`(fi.)filterbanki`---------------------- -// Inverted-dc filter bank. -// -// #### Usage -// -// ``` -// _ : filterbanki(O,freqs) : par(i,N,_); // Inverted-dc version -// ``` -// -// Where: -// -// * `O`: band-split filter order (ODD integer required for `filterbank[i]`) -// * `freqs`: (fc1,fc2,...,fcNs) [in numerically ascending order], where -// Ns=N-1 is the number of octave band-splits -// (total number of bands N=Ns+1). -// -// If frequencies are listed explicitly as arguments, enclose them in parens: -// -// ``` -// _ : filterbanki(3,(fc1,fc2)) : _,_,_ -// ``` -//--------------------------------------------------- -declare filterbanki author "Julius O. Smith III"; -declare filterbanki copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare filterbanki license "MIT-style STK-4.3 license"; -filterbanki(O,lfreqs) = _ <: bsplit(nb) -with { - nb = ba.count(lfreqs); - fc(n) = ba.take(n, lfreqs); - lp(n) = lowpass(O,fc(n)); - hp(n) = highpass(O,fc(n)); - ap(n) = highpass_minus_lowpass(O,fc(n)); - bsplit(0) = *(-1.0); - bsplit(i) = (hp(i) : delayeq(i-1)), (lp(i) <: bsplit(i-1)); - delayeq(0) = _; // moving the *(-1) here inverts all outputs BUT dc - delayeq(i) = ap(i) : delayeq(i-1); -}; - - -//===============SVF Filters========================================================= -// #### References -// Solving the continuous SVF equations using trapezoidal integration -// -//======================================================================================== - -//-----------------`(fi.)svf`---------------------- -// An environment with `lp`, `bp`, `hp`, `notch`, `peak`, `ap`, `bell`, `ls`, `hs` SVF based filters. -// All filters have `freq` and `Q` parameters, the `bell`, `ls`, `hs` ones also have a `gain` third parameter. -// -// #### Usage -// -// ``` -// _ : svf.xx(freq, Q, [gain]) : _ -// ``` -// -// Where: -// -// * `freq`: cut frequency -// * `Q`: quality factor -// * `[gain]`: gain in dB -// -/// ``` -//--------------------------------------------------- -declare svf author "Oleg Nesterov"; -declare svf copyright "Copyright (C) 2020 Oleg Nesterov "; -declare svf license "MIT-style STK-4.3 license"; - -svf = environment { - - // Internal implementation - svf(T,F,Q,G) = tick ~ (_,_) : !,!,si.dot(3, mix) - with { - tick(ic1eq, ic2eq, v0) = - 2*v1 - ic1eq, - 2*v2 - ic2eq, - v0, v1, v2 - with { - v1 = ic1eq + g *(v0-ic2eq) : /(1 + g*(g+k)); - v2 = ic2eq + g * v1; - }; - - A = pow(10.0, G/40.0); - - g = tan(F * ma.PI/ma.SR) : case { - (7) => /(sqrt(A)); - (8) => *(sqrt(A)); - (t) => _; - } (T); - - k = case { - (6) => 1/(Q*A); - (t) => 1/Q; - } (T); - - mix = case { - (0) => 0, 0, 1; - (1) => 0, 1, 0; - (2) => 1, -k, -1; - (3) => 1, -k, 0; - (4) => 1, -k, -2; - (5) => 1, -2*k, 0; - (6) => 1, k*(A*A-1), 0; - (7) => 1, k*(A-1), A*A-1; - (8) => A*A, k*(1-A)*A, 1-A*A; - } (T); - }; - - // External API - lp(f,q) = svf(0, f, q, 0); - bp(f,q) = svf(1, f, q, 0); - hp(f,q) = svf(2, f, q, 0); - notch(f,q) = svf(3, f, q, 0); - peak(f,q) = svf(4, f, q, 0); - ap(f,q) = svf(5, f, q, 0); - bell(f,q,g) = svf(6, f, q, g); - ls(f,q,g) = svf(7, f, q, g); - hs(f,q,g) = svf(8, f, q, g); -}; - - -//============================Averaging Functions============================== -//============================================================================= -// -// These are a set of samplerate independent averaging functions based on -// moving-average and one-pole filters with specific response characteristics. - -//----------------------------`(fi.)avg_rect`---------------------------------- -// Moving average. -// -// #### Usage -// -// ``` -// _ : avg_rect(period) : _ -// ``` -// -// Where: -// -// * `period` is the averaging frame in seconds -//----------------------------------------------------------------------------- -declare avg_rect author "Dario Sanfilippo and Julius O. Smith III"; -declare avg_rect copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare avg_rect license "MIT-style STK-4.3 license"; -avg_rect(period, x) = x : ba.slidingMean(rint(period * ma.SR)); - - -//----------------------------(fi.)avg_tau------------------------------------- -// Averaging function based on a one-pole filter and the tau response time. -// Tau represents the effective length of the one-pole impulse response, -// that is, tau is the integral of the filter's impulse response. This -// response is slower to reach the final value but has less ripples in -// non-steady signals. -// -// #### Usage -// -// ``` -// _ avg_tau(period) : _ -// ``` -// -// Where: -// -// * `period` is the time, in seconds, for the system to decay by 1/e, -// or to reach 1-1/e of its final value. -// -// #### Reference -// -// -//----------------------------------------------------------------------------- -declare avg_tau author "Dario Sanfilippo and Julius O. Smith III"; -declare avg_tau copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare avg_tau license "MIT-style STK-4.3 license"; -avg_tau(period, x) = fi.lptau(period, x); - - -//----------------------------(fi.)avg_t60------------------------------------- -// Averaging function based on a one-pole filter and the t60 response time. -// This response is particularly useful when the system is required to -// reach the final value after about `period` seconds. -// -// #### Usage -// -// ``` -// _ avg_t60(period) : _ -// ``` -// -// Where: -// -// * `period` is the time, in seconds, for the system to decay by 1/1000, -// or to reach 1-1/1000 of its final value. -// -// #### Reference -// -// -//----------------------------------------------------------------------------- -declare avg_t60 author "Dario Sanfilippo and Julius O. Smith III"; -declare avg_t60 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare avg_t60 license "MIT-style STK-4.3 license"; -avg_t60(period, x) = fi.lpt60(period, x); - - -//----------------------------(fi.)avg_t19------------------------------------- -// Averaging function based on a one-pole filter and the t19 response time. -// This response is close to the moving-average algorithm as it roughly reaches -// the final value after `period` seconds and shows about the same -// oscillations for non-steady signals. -// -// #### Usage -// -// ``` -// _ avg_t19(period) : _ -// ``` -// -// Where: -// -// * `period` is the time, in seconds, for the system to decay by 1/e^2.2, -// or to reach 1-1/e^2.2 of its final value. -// -// #### Reference -// Zölzer, U. (2008). Digital audio signal processing (Vol. 9). New York: Wiley. -//----------------------------------------------------------------------------- -declare avg_t19 author "Dario Sanfilippo and Julius O. Smith III"; -declare avg_t19 copyright "Copyright (C) 2020 Dario Sanfilippo - and - 2003-2020 by Julius O. Smith III "; -declare avg_t19 license "MIT-style STK-4.3 license"; -avg_t19(period, x) = fi.lpt19(period, x); - - -/******************************************************************************* -# Licenses - -## STK 4.3 License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -Any person wishing to distribute modifications to the Software is asked to send -the modifications to the original developer so that they can be incorporated -into the canonical version. For software copyrighted by Julius O. Smith III, -email your modifications to . This is, however, not a -binding provision of this license. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- - -## LGPL License - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU Lesser General Public License as published by the Free -Software Foundation; either version 2.1 of the License, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with the GNU C Library; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -*******************************************************************************/ diff --git a/dist/examples/LIBRARIES/hoa.lib b/dist/examples/LIBRARIES/hoa.lib deleted file mode 100644 index 998faf8e..00000000 --- a/dist/examples/LIBRARIES/hoa.lib +++ /dev/null @@ -1,425 +0,0 @@ -//################################### hoa.lib ############################################ -// Faust library for high order ambisonic. Its official prefix is `ho`. -//######################################################################################## - -/************************************************************************ - ************************************************************************ -FAUST library file -Copyright (C) 2003-2012 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. - - ************************************************************************ - ************************************************************************/ - -declare name "High Order Ambisonics library"; -declare author "Pierre Guillot"; -declare author "Eliott Paris"; -declare author "Julien Colafrancesco"; -declare author "Wargreen"; -declare copyright "2012-2013 Guillot, Paris, Colafrancesco, CICM labex art H2H, U. Paris 8, 2019 Wargreen"; - -ma = library("maths.lib"); -si = library("signals.lib"); - -//============================Encoding/decoding Functions================================= -//======================================================================================== - -//----------------------`(ho.)encoder`--------------------------------- -// Ambisonic encoder. Encodes a signal in the circular harmonics domain -// depending on an order of decomposition and an angle. -// -// #### Usage -// -// ``` -// encoder(n, x, a) : _ -// ``` -// -// Where: -// -// * `n`: the order -// * `x`: the signal -// * `a`: the angle -//---------------------------------------------------------------- -encoder(0, x, a) = x; -encoder(n, x, a) = encoder(n-1, x, a), x*sin(n*a), x*cos(n*a); - - -//--------------------------`(ho.)decoder`-------------------------------- -// Decodes an ambisonics sound field for a circular array of loudspeakers. -// -// #### Usage -// -// ``` -// _ : decoder(n, p) : _ -// ``` -// -// Where: -// -// * `n`: the order -// * `p`: the number of speakers -// -// #### Note -// -// Number of loudspeakers must be greater or equal to 2n+1. It's preferable -// to use 2n+2 loudspeakers. -//------------------------------------------------------------------- -decoder(n, p) = par(i, 2*n+1, _) <: par(i, p, speaker(n, 2*ma.PI*i/p)) -with { - speaker(n,a) = /(2), par(i, 2*n, _), encoder(n,2/(2*n+1),a) : si.dot(2*n+1); -}; - - -//-----------------------`(ho.)decoderStereo`------------------------ -// Decodes an ambisonic sound field for stereophonic configuration. -// An "home made" ambisonic decoder for stereophonic restitution -// (30° - 330°) : Sound field lose energy around 180°. You should -// use `inPhase` optimization with ponctual sources. -// #### Usage -// -// ``` -// _ : decoderStereo(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//-------------------------------------------------------------- -decoderStereo(n) = decoder(n, p) <: (par(i, 2*n+2, gainLeft(360 * i / p)) :> _), - (par(i, 2*n+2, gainRight(360 * i / p)) :> _) -with { - p = 2*n+2; - - gainLeft(a) = _ * sin(ratio_minus + ratio_cortex) - with { - ratio_minus = ma.PI*.5 * abs((30 + a) / 60 * ((a <= 30)) + (a - 330) / 60 * (a >= 330)); - ratio_cortex= ma.PI*.5 * abs((120 + a) / 150 * (a > 30) * (a <= 180)); - }; - - gainRight(a) = _ * sin(ratio_minus + ratio_cortex) - with { - ratio_minus = ma.PI*.5 * abs((390 - a) / 60 * (a >= 330) + (30 - a) / 60 * (a <= 30)); - ratio_cortex= ma.PI*.5 * abs((180 - a) / 150 * (a < 330) * (a >= 180)); - }; -}; - - -//============================Optimization Functions====================================== -// Functions to weight the circular harmonics signals depending to the -// ambisonics optimization. -// It can be `basic` for no optimization, `maxRe` or `inPhase`. -//======================================================================================== - - -//----------------`(ho.)optimBasic`------------------------- -// The basic optimization has no effect and should be used for a perfect -// circle of loudspeakers with one listener at the perfect center loudspeakers -// array. -// -// #### Usage -// -// ``` -// _ : optimBasic(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//----------------------------------------------------- -optimBasic(n) = par(i, 2*n+1, _); - - -//----------------`(ho.)optimMaxRe`------------------------- -// The maxRe optimization optimizes energy vector. It should be used for an -// auditory confined in the center of the loudspeakers array. -// -// #### Usage -// -// ``` -// _ : optimMaxRe(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//----------------------------------------------------- -optimMaxRe(n) = par(i, 2*n+1, optim(i, n, _)) - with { - optim(i, n, _)= _ * cos(indexabs / (2*n+1) * ma.PI) - with { - numberOfharmonics = 2 *n + 1; - indexabs = (int)((i - 1) / 2 + 1); - }; -}; - - -//----------------`(ho.)optimInPhase`------------------------- -// The inPhase Optimization optimizes energy vector and put all loudspeakers signals -// in phase. It should be used for an auditory. -// -// #### Usage -// -// ``` -// _ : optimInPhase(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//----------------------------------------------------- -optimInPhase(n) = par(i, 2*n+1, optim(i, n, _)) -with { - optim(i, n, _)= _ * (fact(n)^2.) / (fact(n+indexabs) * fact(n-indexabs)) - with { - indexabs = (int)((i - 1) / 2 + 1); - fact(0) = 1; - fact(n) = n * fact(n-1); - }; -}; - - -//----------------`(ho.)wider`------------------------- -// Can be used to wide the diffusion of a localized sound. The order -// depending signals are weighted and appear in a logarithmic way to -// have linear changes. -// -// #### Usage -// -// ``` -// _ : wider(n,w) : _ -// ``` -// -// Where: -// -// * `n`: the order -// * `w`: the width value between 0 - 1 -//----------------------------------------------------- -wider(n, w) = par(i, 2*n+1, perform(n, w, i, _)) -with { - perform(n, w, i, _) = _ * (log(n+1) * (1 - w) + 1) * clipweight - with { - clipweight = weighter(n, w, i) * (weighter(n, w, i) > 0) * (weighter(n, w, i) <= 1) + (weighter(n, w, i) > 1) - with { - weighter(n, w, 0) = 1.; - weighter(n, w, i) = (((w * log(n+1)) - log(indexabs)) / (log(indexabs+1) - log(indexabs))) - with { - indexabs = (int)((i - 1) / 2 + 1); - }; - }; - }; -}; - - -//----------------`(ho.)map`------------------------- -// It simulates the distance of the source by applying a gain -// on the signal and a wider processing on the soundfield. -// -// #### Usage -// -// ``` -// map(n, x, r, a) -// ``` -// -// Where: -// -// * `n`: the order -// * `x`: the signal -// * `r`: the radius -// * `a`: the angle in radian -//----------------------------------------------------- -map(n, x, r, a) = encoder(n, x * volume(r), a) : wider(n, ouverture(r)) -with { - volume(r) = 1. / (r * r * (r > 1) + (r <= 1)); - ouverture(r) = r * (r < 1) + (r >= 1); -}; - - -//----------------`(ho.)rotate`------------------------- -// Rotates the sound field. -// -// #### Usage -// -// ``` -// _ : rotate(n, a) : _ -// ``` -// -// Where: -// -// * `n`: the order -// * `a`: the angle in radian -//----------------------------------------------------- -rotate(n, a) = par(i, 2*n+1, _) <: par(i, 2*n+1, rotation(i, a)) -with { - rotation(i, a) = (par(j, 2*n+1, gain1(i, j, a)), par(j, 2*n+1, gain2(i, j, a)), par(j, 2*n+1, gain3(i, j, a)) :> _) - with { - indexabs = (int)((i - 1) / 2 + 1); - gain1(i, j, a) = _ * cos(a * indexabs) * (j == i); - gain2(i, j, a) = _ * sin(a * indexabs) * (j-1 == i) * (j != 0) * (i%2 == 1); - gain3(i, j, a) = (_ * sin(a * indexabs)) * (j+1 == i) * (j != 0) * (i%2 == 0) * (-1); - }; -}; - - -//============================3D Functions================================================ -//======================================================================================== - -//----------------------`(ho.)encoder3D`--------------------------------- -// Ambisonic encoder. Encodes a signal in the circular harmonics domain -// depending on an order of decomposition, an angle and an elevation. -// -// #### Usage -// -// ``` -// encoder3D(n, x, a, e) : _ -// ``` -// -// Where: -// -// * `n`: the order -// * `x`: the signal -// * `a`: the angle -// * `e`: the elevation -//---------------------------------------------------------------- - -encoder3D(N, x, theta, phi) = par(i, (N+1) * (N+1), x * y(degree(i), order(i), theta, phi)) -with { - // The degree l of the harmonic[l, m] - degree(index) = int(sqrt(index)); - // The order m of the harmonic[l, m] - order(index) = int(index - int(degree(index) * int(degree(index) + 1))); - - // The spherical harmonics - y(l, m, theta, phi) = e(m, theta) * k(l, m) * p(l, m, cos(phi + ma.PI * 0.5)) - with { - // The associated Legendre polynomial - // If l = 0 => p = 1 - // If l = m => p = -1 * (2 * (l-1) + 1) * sqrt(1 - cphi*cphi) * p(l-1, l-1, cphi) - // If l = m+1 => p = phi * (2 * (l-1) + 1) * p(l-1, l-1, cphi) - // Else => p = (cphi * (2 * (l-1) + 1) * p(l-1, abs(m), cphi) - ((l-1) + abs(m)) * p(l-2, abs(m), cphi)) / ((l-1) - abs(m) + 1) - p(l, m, cphi) = pcalcul(((l != 0) & (l == abs(m))) + ((l != 0) & (l == abs(m)+1)) * 2 + ((l != 0) & (l != abs(m)) & (l != abs(m)+1)) * 3, l, m, cphi) - with { - pcalcul(0, l, m, cphi) = 1; - pcalcul(1, l, m, cphi) = -1 * (2 * (l-1) + 1) * sqrt(1 - cphi*cphi) * p(l-1, l-1, cphi); - pcalcul(2, l, m, cphi) = cphi * (2 * (l-1) + 1) * p(l-1, l-1, cphi); - pcalcul(s, l, m, cphi) = (cphi * (2 * (l-1) + 1) * p(l-1, abs(m), cphi) - ((l-1) + abs(m)) * p(l-2, abs(m), cphi)) / ((l-1) - abs(m) + 1); - }; - - // The exponential imaginary - // If m > 0 => e^i*m*theta = cos(m * theta) - // If m < 0 => e^i*m*theta = sin(-m * theta) - // If m = 0 => e^i*m*theta = 1 - e(m, theta) = ecalcul((m > 0) * 2 + (m < 0), m, theta) - with { - ecalcul(2, m, theta) = cos(m * theta); - ecalcul(1, m, theta) = sin(abs(m) * theta); - ecalcul(s, m, theta) = 1; - }; - - // The normalization - // If m = 0 => k(l, m) = 1 - // If m != 0 => k(l, m) = sqrt((l - abs(m))! / l + abs(m))!) * sqrt(2) - k(l, m) = kcalcul((m != 0), l, m) - with { - kcalcul(0, l, m) = 1; - kcalcul(1, l, m) = sqrt(fact(l - abs(m)) / fact(l + abs(m))) * sqrt(2) - with { - fact(0) = 1; - fact(n) = n * fact(n-1); - }; - }; - }; -}; - - -//----------------`(ho.)optimBasic3D`------------------------- -// The basic optimization has no effect and should be used for a perfect -// sphere of loudspeakers with one listener at the perfect center loudspeakers -// array. -// -// #### Usage -// -// ``` -// _ : optimBasic3D(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//----------------------------------------------------- - -optimBasic3D(N) = par(i, (N+1) * (N+1), _); - - -//----------------`(ho.)optimMaxRe3D`------------------------- -// The maxRe optimization optimize energy vector. It should be used for an -// auditory confined in the center of the loudspeakers array. -// -// #### Usage -// -// ``` -// _ : optimMaxRe3D(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//----------------------------------------------------- - -optimMaxRe3D(N) = par(i, (N+1) * (N+1), MaxRe(N, degree(i), _)) -with { - // The degree l of the harmonic[l, m] - degree(index) = int(sqrt(index)); - MaxRe(N, l, _)= _ * cos(l / (2*N+2) * ma.PI); -}; - - -//----------------`(ho.)optimInPhase3D`------------------------- -// The inPhase Optimization optimizes energy vector and put all loudspeakers signals -// in phase. It should be used for an auditory. -// -// #### Usage -// -// ``` -// _ : optimInPhase3D(n) : _ -// ``` -// -// Where: -// -// * `n`: the order -//----------------------------------------------------- - -optimInPhase3D(N) = par(i, (N+1) * (N+1), InPhase(N, degree(i), _)) -with { - // The degree l of the harmonic[l, m] - degree(index) = int(sqrt(index)); - InPhase(N, l, _)= _ * (fact(N) * fact(N)) / (fact(N - l) * fact(N + l)) - with { - fact(0) = 1; - fact(n) = n * fact(n-1); - }; -}; - - diff --git a/dist/examples/LIBRARIES/instruments.lib b/dist/examples/LIBRARIES/instruments.lib deleted file mode 100644 index 89c0bca5..00000000 --- a/dist/examples/LIBRARIES/instruments.lib +++ /dev/null @@ -1,262 +0,0 @@ -//instruments.lib - Faust function of various types useful for building physical model instruments - -declare name "Faust-STK Tools Library"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); - -no = library("noises.lib"); -en = library("envelopes.lib"); -ma = library("maths.lib"); -ba = library("basics.lib"); -de = library("delays.lib"); -si = library("signals.lib"); -fi = library("filters.lib"); -os = library("oscillators.lib"); -re = library("reverbs.lib"); - -//========================= ENVELOPE GENERATORS =============================== - -//----------------------- VIBRATO ENVELOPE ---------------------------- -// 4 phases envelope to control vibrato gain -// -// USAGE: -// _ : *(envVibrato(b,a,s,r,t)) : _ -// where -// b = beginning duration (silence) in seconds -// a = attack duration in seconds -// s = sustain as a percentage of the amplitude to be modified -// r = release duration in seconds -// t = trigger signal - -envVibrato(b,a,s,r,t) = env ~ (_,_,_) : (!,!,_) // the 3 'state' signals are fed back - with { - env(p2,cnt,y) = - (t>0) & (p2|(y>=1)), - (cnt + 1)*(t>0), // counter for the first step "b" - (y + p1*p3*u*(s/100) - p4*w*y)*((p4==0)|(y>=eps)) // y = envelop signal - //*(y>=eps) // cut off tails to prevent denormals - with { - p1 = (p2==0) & (t>0) & (y<1) & (cnt>(b*ma.SR)); // p1 = attack phase - p3 = 1-(cnt<(nb)); // p3 = beginning phase - p4 = (t<=0) & (y>0); // p4 = release phase - // #samples in attack, release, must be >0 - nb = ma.SR*b+(b==0.0) ; na = ma.SR*a+(a==0.0); nr = ma.SR*r+(r==0.0); - // attack and (-60dB) release rates - z = s+(s==0.0)*ba.db2linear(-60); - u = 1/na; w = 1-1/pow(z*ba.db2linear(60), 1/nr); - // values below this threshold are considered zero in the release phase - eps = ba.db2linear(-120); - }; - }; - -//----------------------- ASYMPT60 ---------------------------- -// Envelope generator which asymptotically approaches a target value. -// -// USAGE: -// asympT60(value,trgt,T60,trig) : _ -// where -// value = starting value -// trgt = target value -// T60 = ramping time -// trig = trigger signal - -asympT60(value,trgt,T60,trig) = (_*factor + constant)~_ - with { - cntSample = *(trig) + 1~_ : -(1); - attDur = float(2); - cndFirst = ((cntSample < attDur) & (trig > 0)); - target = value*cndFirst + trgt*(cndFirst < 1); - factorAtt = exp(-7/attDur); - factorT60 = exp(-7/(T60*float(ma.SR))); - factor = factorAtt*((cntSample < attDur) & (trig > 0)) + - ((cntSample >= attDur) | (trig < 1))*factorT60; - constant = (1 - factor)*target; - }; - -//========================= TABLES =============================== - -//----------------------- CLIPPING FUNCTION ---------------------------- -// Positive and negative clipping functions. -// -// USAGE: -// _ : saturationPos : _ -// _ : saturationNeg : _ -// _ : saturationPos : saturationNeg : _ - -saturationPos(x) = x <: (_>1),(_<=1 : *(x)) :> +; -saturationNeg(x) = x <: (_<-1),(_>=-1 : *(x)) :> *(-1) + _; - -//----------------------- BOW TABLE ---------------------------- -// Simple bow table. -// -// USAGE: -// index : bow(offset,slope) : _ -// where -// 0 <= index <= 1 - -bow(offset,slope) = pow(abs(sample) + 0.75, -4) : saturationPos - with { - sample(y) = (y + offset)*slope; - }; - -//----------------------- REED TABLE ---------------------------- -// Simple reed table to be used with waveguide models of clarinet, saxophone, etc. -// -// USAGE: -// _ : reed(offset,slope) : _ -// where -// offset = offset between 0 and 1 -// slope = slope between 0 and 1 -// REFERENCE: -// - -reed(offset,slope) = reedTable : saturationPos : saturationNeg - with { - reedTable = offset + (slope*_); - }; - -//========================= FILTERS =============================== - -//----------------------- ONE POLE ---------------------------- - -onePole(b0,a1,x) = (b0*x - a1*_)~_; - -//----------------------- ONE POLE SWEPT ---------------------------- - -onePoleSwep(a1,x) = (1 + a1)*x - a1*x'; - -//----------------------- POLE ZERO ---------------------------- - -poleZero(b0,b1,a1,x) = (b0*x + b1*x' - a1*_)~_; - -//----------------------- ONE ZEROS ---------------------------- -// Simple One zero and One zero recursive filters -// -// USAGE: -// _ : oneZero0(b0,b1) : _ -// _ : oneZero1(b0,b1) : _ -// REFERENCE: -// - -oneZero0(b0,b1,x) = (*(b1) + x*b0)~_; -oneZero1(b0,b1,x) = (x'*b1 + x*b0); - -//----------------------- BANDPASS FILTER WITH CONSTANT UNITY PEAK GAIN BASED ON A BIQUAD ---------------------------- - -bandPass(resonance,radius) = fi.TF2(b0,b1,b2,a1,a2) - with { - a2 = radius*radius; - a1 = -2*radius*cos(ma.PI*2*resonance/ma.SR); - b0 = 0.5-0.5*a2; - b1 = 0; - b2 = -b0; - }; - -//----------------------- BANDPASS FILTER BASED ON A BIQUAD ---------------------------- -// Band pass filter using a biquad (TF2 is declared in filter.lib) -// -// USAGE: -// _ : bandPassH(resonance,radius) : _ -// where -// resonance = center frequency -// radius = radius - -bandPassH(resonance,radius) = fi.TF2(b0,b1,b2,a1,a2) - with { - a2 = radius*radius; - a1 = -2*radius*cos(ma.PI*2*resonance/ma.SR); - b0 = 1; - b1 = 0; - b2 = 0; - }; - -//----------------------- FLUE JET NON-LINEAR FUNCTION ---------------------------- -// Jet Table: flue jet non-linear function, computed by a polynomial calculation - -jetTable(x) = x <: _*(_*_-1) : saturationPos : saturationNeg; - -//----------------------- NON LINEAR MODULATOR ---------------------------- -// nonLinearModulator adapts the function allpassnn from filter.lib for using it with waveguide instruments (see the corresponding DAFx paper: (Faust-STK: a Set of Linear and Nonlinear Physical Models for the Faust Programming Language) for more details). -// -// USAGE: -// _ : nonLinearModulator(nonlinearity,env,freq,typeMod,freqMod,order) : _ -// where -// nonlinearity = nonlinearity coefficient between 0 and 1 -// env = input to connect any kind of envelope -// freq = current tone frequency -// typeMod = if 0: theta is modulated by the incoming signal; -// if 1: theta is modulated by the averaged incoming signal; -// if 2: theta is modulated by the squared incoming signal; -// if 3: theta is modulated by a sine wave of frequency freqMod; -// if 4: theta is modulated by a sine wave of frequency freq; -// freqMod = frequency of the sine wave modulation -// order = order of the filter - -nonLinearModulator(nonlinearity,env,freq,typeMod,freqMod,order) = - //theta is modulated by a sine wave - _ <: nonLinearFilterOsc*(typeMod >= 3), - //theta is modulated by the incoming signal - (_ <: nonLinearFilterSig*nonlinearity,_*(1 - nonlinearity) :> +)*(typeMod < 3) - :> + - with { - //which frequency to use for the sine wave oscillator? - freqOscMod = (typeMod == 4)*freq + (typeMod != 4)*freqMod; - - //the incoming signal is scaled and the envelope is applied - tsignorm(x) = nonlinearity*ma.PI*x*env; - tsigsquared(x) = nonlinearity*ma.PI*x*x*env; //incoming signal is squared - tsigav(x) = nonlinearity*ma.PI*((x + x')/2)*env; //incoming signal is averaged with its previous sample - - //select which version of the incoming signal of theta to use - tsig(x) = tsignorm(x)*(typeMod == 0) + tsigav(x)*(typeMod == 1) - + tsigsquared(x)*(typeMod == 2); - - //theta is modulated by a sine wave generator - tosc = nonlinearity*ma.PI*os.osc(freqOscMod)*env; - - //incoming signal is sent to the nonlinear passive allpass ladder filter - nonLinearFilterSig(x) = x <: fi.allpassnn(order,(par(i,order,tsig(x)))); - nonLinearFilterOsc = _ <: fi.allpassnn(order,(par(i,order,tosc))); - }; - -//========================= TOOLS =============================== - -//----------------------- STEREOIZER ---------------------------- -// This function takes a mono input signal and spacialize it in stereo -// in function of the period duration of the tone being played. -// -// USAGE: -// _ : stereo(periodDuration) : _,_ -// where -// periodDuration = period duration of the tone being played in number of samples -// REFERENCE: -// - -stereoizer(periodDuration) = _ <: _,widthdelay : stereopanner - with { - W = hslider("v:Spat/spatial width", 0.5, 0, 1, 0.01); - A = hslider("v:Spat/pan angle", 0.6, 0, 1, 0.01); - widthdelay = de.delay(4096,W*periodDuration/2); - stereopanner = _,_ : *(1.0-A), *(A); - }; - -//----------------------- INSTRREVERB ---------------------------- -// GUI for zita_rev1_stereo from reverbs.lib -// -// USAGE: -// _,_ : instrRerveb - -instrReverb = _,_ <: *(reverbGain),*(reverbGain),*(1 - reverbGain),*(1 - reverbGain) : -re.zita_rev1_stereo(rdel,f1,f2,t60dc,t60m,fsmax),_,_ <: _,!,_,!,!,_,!,_ : +,+ - with { - reverbGain = hslider("v:Reverb/reverbGain",0.137,0,1,0.01) : si.smoo; - roomSize = hslider("v:Reverb/roomSize",0.72,0.01,2,0.01); - rdel = 20; - f1 = 200; - f2 = 6000; - t60dc = roomSize*3; - t60m = roomSize*2; - fsmax = 48000; - }; diff --git a/dist/examples/LIBRARIES/interpolators.lib b/dist/examples/LIBRARIES/interpolators.lib deleted file mode 100644 index 0c3fe03c..00000000 --- a/dist/examples/LIBRARIES/interpolators.lib +++ /dev/null @@ -1,431 +0,0 @@ -//#################################### interpolators.lib ######################################## -// A library to handle interpolation. Its official prefix is `it`. -// -// This library provides several basic interpolation functions as well as interpolators -// taking a `gen` circuit of N outputs producing values to be interpolated, triggered -// by a `idv` read index signal. Two points and four points interpolations are implemented. -// -// The `idv` parameter is to be used as a read index. In float (= singleprecision) mode, -// a technique based on 2 signals with the pure integer index and a fractional part in the [0,1] -// range is used to avoid accumulating errors. In -double (= doubleprecision)/-quad (= quadprecision) modes, -// a standard implementation with a single fractional index signal is used. -// Three functions `int_part`, `frac_part` and `mak_idv` are available to manipule the read index signal. -// -// Use-case with `waveform`. Here the signal given to `interpolator_XXX` uses the `idv` model. -// -// ``` -// waveform_interpolator(wf, step, interp) = interp(gen, idv) -// with { -// gen(idx) = wf, (idx:max(0):min(size-1)) : rdtable with { size = wf:(_,!); }; /* waveform size */ -// index = (+(step)~_)-step; /* starting from 0 */ -// idv = it.make_idv(index); /* build the signal for interpolation in a generic way */ -// }; -// -// waveform_linear(wf, step) = waveform_interpolator(wf, step, it.interpolator_linear); -// waveform_cosine(wf, step) = waveform_interpolator(wf, step, it.interpolator_cosine); -// waveform_cubic(wf, step) = waveform_interpolator(wf, step, it.interpolator_cubic); -// -// waveform_interp(wf, step, selector) = waveform_interpolator(wf, step, interp_select(selector)) -// with { -// /* adapts the argument order */ -// interp_select(sel, gen, idv) = it.interpolator_select(gen, idv, sel); -// }; -// -// waveform and index -// waveform_interpolator1(wf, idv, interp) = interp(gen, idv) -// with { -// gen(idx) = wf, (idx:max(0):min(size-1)) : rdtable with { size = wf:(_,!); }; /* waveform size */ -// }; -// -// waveform_linear1(wf, idv) = waveform_interpolator1(wf, idv, it.interpolator_linear); -// waveform_cosine1(wf, idv) = waveform_interpolator1(wf, idv, it.interpolator_cosine); -// waveform_cubic1(wf, idv) = waveform_interpolator1(wf, idv, it.interpolator_cubic); -// -// waveform_interp1(wf, idv, selector) = waveform_interpolator1(wf, idv, interp_select(selector)) -// with { -// /* adapts the argument order */ -// interp_select(sel, gen, idv) = it.interpolator_select(gen, idv, sel); -// }; -// ``` -// -// Some tests here: -// -// ``` -// wf = waveform {0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 50.0, 40.0, 30.0, 20.0, 10.0, 0.0}; -// -// process = waveform_linear(wf, step), waveform_cosine(wf, step), waveform_cubic(wf, step) with { step = 0.25; }; -// -// process = waveform_interp(wf, 0.25, nentry("algo", 0, 0, 3, 1)); -// -// process = waveform_interp1(wf, idv, nentry("algo", 0, 0, 3, 1)) -// with { -// step = 0.1; -// idv_aux = (+(step)~_)-step; /* starting from 0 */ -// idv = it.make_idv(idv_aux); /* build the signal for interpolation in a generic way */ -// }; -// -// /* Test linear interpolation between 2 samples with a `(idx,dv)` signal built using a waveform */ -// linear_test = (idx,dv), it.interpolator_linear(gen, (idx,dv)) -// with { -// /* signal to interpolate (only 2 points here) */ -// gen(id) = waveform {3.0, -1.0}, (id:max(0)) : rdtable; -// dv = waveform {0.0, 0.25, 0.50, 0.75, 1.0}, index : rdtable; -// idx = 0; -// /* test index signal */ -// index = (+(1)~_)-1; /* starting from 0 */ -// }; -// -// /* Test cosine interpolation between 2 samples with a `(idx,dv)` signal built using a waveform */ -// cosine_test = (idx,dv), it.interpolator_cosine(gen, (idx,dv)) -// with { -// /* signal to interpolate (only 2 points here) */ -// gen(id) = waveform {3.0, -1.0}, (id:max(0)) : rdtable; -// dv = waveform {0.0, 0.25, 0.50, 0.75, 1.0}, index : rdtable; -// idx = 0; -// /* test index signal */ -// index = (+(1)~_)-1; /* starting from 0 */ -// }; -// -// /* Test cubic interpolation between 4 samples with a `(idx,dv)` signal built using a waveform */ -// cubic_test = (idx,dv), it.interpolator_cubic(gen, (idx,dv)) -// with { -// /* signal to interpolate (only 4 points here) */ -// gen(id) = waveform {-1.0, 2.0, 1.0, 4.0}, (id:max(0)) : rdtable; -// dv = waveform {0.0, 0.25, 0.50, 0.75, 1.0}, index : rdtable; -// idx = 0; -// /* test index signal */ -// index = (+(1)~_)-1; /* starting from 0 */ -// }; -// ``` -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2019-2020 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Faust Interpolator Library"; -declare version "0.3"; - -ba = library("basics.lib"); -ro = library("routes.lib"); -ma = library("maths.lib"); - -reset(trig) = (trig-trig') <= 0; - -// The following 3 functions allow to adapt a 'single signal' fractional idv in this [idx, dv] model. - -singleprecision int_part(idv) = idv : _,!; -singleprecision frac_part(idv) = idv : !,_; -singleprecision make_idv(id) = int(id), ma.frac(id); - -// Infinite raising index -singleprecision raise(trig, step, length) = id, dv -letrec { - 'id = (id + int(step) + int(dv + ma.frac(step))) * reset(trig); - 'dv = ma.frac(dv + ma.frac(step)) * reset(trig); -}; - -// Modulo based raising index -singleprecision raise_modulo(trig, step, length) = id, dv -letrec { - 'id = fmod(id + int(step) + int(dv + ma.frac(step)), length) * reset(trig); - 'dv = ma.frac(dv + ma.frac(step)) * reset(trig); -}; - -// Decreasing index starting at 'length' -singleprecision decrease(trig, step, length) = raise(trig, -step, length) : (+(length), _); - -// Modulo decreasing index starting at 'length' -singleprecision decrease_modulo(trig, step, length) = raise_modulo(trig, -step, length) : (+(length), _); - -// The following 3 functions allow to adapt a 'single signal' fractional idv in this [idx, dv] model. - -doubleprecision quadprecision int_part(idv) = int(idv); -doubleprecision quadprecision frac_part(idv) = ma.frac(idv); -doubleprecision quadprecision make_idv(id) = id; - -// Infinite raising index -doubleprecision quadprecision raise(trig, step, length) = idv -letrec { - 'idv = (idv + step) * reset(trig); -}; - -// Modulo based raising index -doubleprecision quadprecision raise_modulo(trig, step, length) = idv -letrec { - 'idv = fmod(idv + step, length) * reset(trig); -}; - -// Decreasing index starting at 'length' -doubleprecision quadprecision decrease(trig, step, length) = raise(trig, -step, length) + length; - -// Modulo decreasing index starting at 'length' -doubleprecision quadprecision decrease_modulo(trig, step, length) = raise_modulo(trig, -step, length) + length; - -//=========================Two points interpolation functions============================= -//======================================================================================== - -//-------`(it.)interpolate_linear`---------- -// Linear interpolation between 2 values. -// -// #### Usage -// -// ``` -// interpolate_linear(dv,v0,v1) : _ -// ``` -// -// Where: -// -// * `dv`: in the fractional value in [0..1] range -// * `v0`: is the first value -// * `v1`: is the second value -// -// -// #### Reference: -// -// -// -//-------------------------------------------- - -interpolate_linear(dv,v0,v1) = v0 + dv*(v1-v0); // (faster than v0*(1-dv)+v1*dv which is currently not optimized...) - - -//-------`(it.)interpolate_cosine`---------- -// Cosine interpolation between 2 values. -// -// #### Usage -// -// ``` -// interpolate_cosine(dv,v0,v1) : _ -// ``` -// -// Where: -// -// * `dv`: in the fractional value in [0..1] range -// * `v0`: is the first value -// * `v1`: is the second value -// -// -// #### Reference: -// -// -// -//-------------------------------------------- - -interpolate_cosine(dv,v0,v1) = v0 + a2*(v1-v0) with { a2 = 0.5 * (1.0 - cos(dv*ma.PI)); }; - - -//=========================Four points interpolation functions============================ -//======================================================================================== - -//-------`(it.)interpolate_cubic`---------- -// Cubic interpolation between 4 values. -// -// #### Usage -// -// ``` -// interpolate_cubic(dv,v0,v1,v2,v3) : _ -// ``` -// -// Where: -// -// * `dv`: in the fractional value in [0..1] range -// * `v0`: is the first value -// * `v1`: is the second value -// * `v2`: is the third value -// * `v3`: is the fourth value -// -// -// #### Reference: -// -// -// -//-------------------------------------------- - -interpolate_cubic(dv,v0,v1,v2,v3) - = v1 + 0.5*dv*(v2 - v0 + dv*(2.0*v0 - 5.0*v1 + 4.0*v2 - v3 + dv*(3.0*(v1 - v2) + v3 - v0))); - - -//=========================Two points interpolators======================================= -//======================================================================================== - -//-------`(it.)interpolator_two_points`---------- -// Generic interpolator on two points (current and next index), assuming an increasing index. -// -// #### Usage -// -// ``` -// interpolator_two_points(gen, idv, interpolate_two_points) : _,_... (equal to N = outputs(gen)) -// ``` -// -// Where: -// -// * `gen`: a circuit with an 'idv' reader input that produces N outputs -// * `idv`: a fractional read index expressed as a float value, or a (int,frac) pair -// * `interpolate_two_points`: a two points interpolation function -// -//-------------------------------------------- - -interpolator_two_points(gen, idv, interpolate_two_points) = (gen(id0), gen(id1)) - : ro.interleave(outputs(gen), 2) - : par(i, outputs(gen), interpolate_two_points(dv)) -with { - id0 = int_part(idv); // index integer part - id1 = id0 + 1; // next index - dv = frac_part(idv); // index fractional part in [0..1] -}; - - -//-------`(it.)interpolator_linear`---------- -// Linear interpolator for a 'gen' circuit triggered by an 'idv' input to generate values. -// -// #### Usage -// -// ``` -// interpolator_linear(gen, idv) : _,_... (equal to N = outputs(gen)) -// ``` -// -// Where: -// -// * `gen`: a circuit with an 'idv' reader input that produces N outputs -// * `idv`: a fractional read index expressed as a float value, or a (int,frac) pair -// -//-------------------------------------------- - -interpolator_linear(gen, idv) = interpolator_two_points(gen, idv, interpolate_linear); - - -//-------`(it.)interpolator_cosine`---------- -// Cosine interpolator for a 'gen' circuit triggered by an 'idv' input to generate values. -// -// #### Usage -// -// ``` -// interpolator_cosine(gen, idv) : _,_... (equal to N = outputs(gen)) -// ``` -// -// Where: -// -// * `gen`: a circuit with an 'idv' reader input that produces N outputs -// * `idv`: a fractional read index expressed as a float value, or a (int,frac) pair -// -//-------------------------------------------- - -interpolator_cosine(gen, idv) = interpolator_two_points(gen, idv, interpolate_cosine); - - -// To be used in 'interpolator_select' -interpolator_null(gen, idv) = interpolator_two_points(gen, idv, \(dv,v0,v1).(v0)); - - -//=========================Four points interpolators====================================== -//======================================================================================== - -//-------`(it.)interpolator_two_points`---------- -// Generic interpolator on interpolator_four_points points (previous, current and two next indexes), assuming an increasing index. -// -// #### Usage -// -// ``` -// interpolator_four_points(gen, idv, interpolate_four_points) : _,_... (equal to N = outputs(gen)) -// ``` -// -// Where: -// -// * `gen`: a circuit with an 'idv' reader input that produces N outputs -// * `idv`: a fractional read index expressed as a float value, or a (int,frac) pair -// * `interpolate_four_points`: a four points interpolation function -// -//-------------------------------------------- - -interpolator_four_points(gen, idv, interpolate_four_points) = (gen(id0), gen(id1), gen(id2), gen(id3)) - : ro.interleave(outputs(gen), 4) - : par(i, outputs(gen), interpolate_four_points(dv)) -with { - id0 = id1 - 1; // previous index - id1 = int_part(idv); // index integer part - id2 = id1 + 1; // next index - id3 = id2 + 1; // next index - dv = frac_part(idv); // index fractional part in [0..1] -}; - - -//-------`(it.)interpolator_cubic`---------- -// Cubic interpolator for a 'gen' circuit triggered by an 'idv' input to generate values -// -// #### Usage -// -// ``` -// interpolator_cubic(gen, idv) : _,_... (equal to N = outputs(gen)) -// ``` -// -// Where: -// -// * `gen`: a circuit with an 'idv' reader input that produces N outputs -// * `idv`: a fractional read index expressed as a float value, or a (int,frac) pair -// -//-------------------------------------------- - -interpolator_cubic(gen, idv) = interpolator_four_points(gen, idv, interpolate_cubic); - -// Enum of interpolation algorithms -MAX_INTER = 4; - -linear = 0; -cosine = 1; -cubic = 2; -nointerp = MAX_INTER-1; - - -//-------`(it.)interpolator_select`---------- -// Generic configurable interpolator (with selector between in [0..3]). The value 3 is used for no interpolation. -// -// #### Usage -// -// ``` -// interpolator_select(gen, idv, sel) : _,_... (equal to N = outputs(gen)) -// ``` -// -// Where: -// -// * `gen`: a circuit with an 'idv' reader input that produces N outputs -// * `idv`: a fractional read index expressed as a float value, or a (int,frac) pair -// * `sel`: an interpolation algorithm selector in [0..3] (0 = linear, 1 = cosine, 2 = cubic, 3 = nointerp) -// -//-------------------------------------------- - -interpolator_select(gen, idv, sel) = ba.selectmulti(ma.SR/10, interpolators, sel) -with { - interpolators = (interpolator_linear(gen, idv), - interpolator_cosine(gen, idv), - interpolator_cubic(gen, idv), - interpolator_null(gen, idv)); -}; diff --git a/dist/examples/LIBRARIES/maths.lib b/dist/examples/LIBRARIES/maths.lib deleted file mode 100644 index 51673d1b..00000000 --- a/dist/examples/LIBRARIES/maths.lib +++ /dev/null @@ -1,722 +0,0 @@ -//################################### maths.lib ########################################## -// Mathematic library for Faust. Its official prefix is `ma`. -//######################################################################################## -// Some functions are implemented as Faust foreign functions of `math.h` functions -// that are not part of Faust's primitives. Defines also various constants and several -// utilities. -//######################################################################################## - -// ## History -// * 06/13/2016 [RM] normalizing and integrating to new libraries -// * 07/08/2015 [YO] documentation comments -// * 20/06/2014 [SL] added FTZ function -// * 22/06/2013 [YO] added float|double|quad variants of some foreign functions -// * 28/06/2005 [YO] postfixed functions with 'f' to force float version instead of double -// * 28/06/2005 [YO] removed 'modf' because it requires a pointer as argument - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2003-2016 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Faust Math Library"; -declare version "2.3"; -declare author "GRAME"; -declare copyright "GRAME"; -declare license "LGPL with exception"; - -// This library contains platform specific constants -pl = library("platform.lib"); -ma = library("maths.lib"); // for compatible copy/paste out of this file - -//=============================Functions Reference======================================== -//======================================================================================== - - -//---------------------------------`(ma.)SR`--------------------------------------- -// Current sampling rate. Constant during -// program execution. -// -// #### Usage -// -// ``` -// SR : _ -// ``` -//----------------------------------------------------------------------------- -SR = pl.SR; - - -//---------------------------------`(ma.)BS`--------------------------------------- -// Current block-size. Can change during the execution. -// -// #### Usage -// -// ``` -// BS : _ -// ``` -//----------------------------------------------------------------------------- -BS = fvariable(int count, ); - - -//---------------------------------`(ma.)PI`--------------------------------------- -// Constant PI in double precision. -// -// #### Usage -// -// ``` -// PI : _ -// ``` -//----------------------------------------------------------------------------- -PI = 3.14159265358979323846; - - -//---------------------------------`(ma.)E`--------------------------------------- -// Constant e in double precision. -// -// #### Usage -// -// ``` -// E : _ -// ``` -//----------------------------------------------------------------------------- -E = 2.71828182845904523536; - - -//---------------------------------`(ma.)EPSILON`--------------------------------------- -// Constant EPSILON in simple/double/quad precision. -// -// #### Usage -// -// ``` -// EPSILON : _ -// ``` -//----------------------------------------------------------------------------- -singleprecision EPSILON = 1.192092896e-07; -doubleprecision EPSILON = 2.2204460492503131e-016; -quadprecision EPSILON = 2.2204460492503131e-016; - - -//---------------------------------`(ma.)MIN`--------------------------------------- -// Constant MIN in simple/double/quad precision (minimal positive value). -// -// #### Usage -// -// ``` -// MIN : _ -// ``` -//----------------------------------------------------------------------------- -singleprecision MIN = 1.175494351e-38; -doubleprecision MIN = 2.2250738585072014e-308; -quadprecision MIN = 2.2250738585072014e-308; - - -//---------------------------------`(ma.)INFINITY`------------------------------ -// Constant INFINITY in simple/double/quad precision (maximal positive value). -// -// #### Usage -// -// ``` -// INFINITY : _ -// ``` -//----------------------------------------------------------------------------- -singleprecision INFINITY = 3.402823466e+38; -doubleprecision INFINITY = 1.7976931348623158e+308; -quadprecision INFINITY = 1.7976931348623158e+308; - - -//---------------------------------`(ma.)FTZ`--------------------------------------- -// Flush to zero: force samples under the "maximum subnormal number" -// to be zero. Usually not needed in C++ because the architecture -// file take care of this, but can be useful in JavaScript for instance. -// -// #### Usage -// -// ``` -// _ : FTZ : _ -// ``` -// -// #### Reference -// -// -//----------------------------------------------------------------------------- -FTZ(x) = x * (abs(x) > MIN); - - -//---------------------------------`(ma.)neg`--------------------------------------- -// Invert the sign (-x) of a signal. -// -// #### Usage -// -// ``` -// _ : neg : _ -// ``` -//----------------------------------------------------------------------------- -neg(x) = -x; - - -//-------`(ma.)sub(x,y)`------------------ -// Subtract `x` and `y`. -//------------------------------ -sub(x,y) = y-x; - - -//---------------------------------`(ma.)inv`--------------------------------------- -// Compute the inverse (1/x) of the input signal. -// -// #### Usage -// -// ``` -// _ : inv : _ -// ``` -//----------------------------------------------------------------------------- -inv(x) = 1/x; - - -//---------------------------------`(ma.)cbrt`-------------------------------------- -// Computes the cube root of of the input signal. -// -// #### Usage -// -// ``` -// _ : cbrt : _ -// ``` -//----------------------------------------------------------------------------- -cbrt = ffunction(float cbrtf|cbrt|cbrtl (float), ,""); - - -//---------------------------------`(ma.)hypot`------------------------------------- -// Computes the euclidian distance of the two input signals -// sqrt(x*x+y*y) without undue overflow or underflow. -// -// #### Usage -// -// ``` -// _,_ : hypot : _ -// ``` -//----------------------------------------------------------------------------- -hypot = ffunction(float hypotf|hypot|hypotl (float, float), ,""); - - -//---------------------------------`(ma.)ldexp`------------------------------------- -// Takes two input signals: x and n, and multiplies x by 2 to the power n. -// -// #### Usage -// -// ``` -// _,_ : ldexp : _ -// ``` -//----------------------------------------------------------------------------- -ldexp = ffunction(float ldexpf|ldexp|ldexpl (float, int), ,""); - - -//---------------------------------`(ma.)scalb`------------------------------------- -// Takes two input signals: x and n, and multiplies x by 2 to the power n. -// -// #### Usage -// -// ``` -// _,_ : scalb : _ -// ``` -//----------------------------------------------------------------------------- -scalb = ffunction(float scalbnf|scalbn|scalbnl (float, int), ,""); - - -//---------------------------------`(ma.)log1p`---------------------------------- -// Computes log(1 + x) without undue loss of accuracy when x is nearly zero. -// -// #### Usage -// -// ``` -// _ : log1p : _ -// ``` -//----------------------------------------------------------------------------- -log1p = ffunction(float log1pf|log1p|log1pl (float), ,""); - - -//---------------------------------`(ma.)logb`--------------------------------------- -// Return exponent of the input signal as a floating-point number. -// -// #### Usage -// -// ``` -// _ : logb : _ -// ``` -//----------------------------------------------------------------------------- -logb = ffunction(float logbf|logb|logbl (float), ,""); - - -//---------------------------------`(ma.)ilogb`------------------------------------- -// Return exponent of the input signal as an integer number. -// -// #### Usage -// -// ``` -// _ : ilogb : _ -// ``` -//----------------------------------------------------------------------------- -ilogb = ffunction(int ilogbf|ilogb|ilogbl (float), ,""); - - -//---------------------------------`(ma.)log2`------------------------------------- -// Returns the base 2 logarithm of x. -// -// #### Usage -// -// ``` -// _ : log2 : _ -// ``` -//----------------------------------------------------------------------------- -log2(x) = log(x)/log(2.0); - - -//---------------------------------`(ma.)expm1`------------------------------------- -// Return exponent of the input signal minus 1 with better precision. -// -// #### Usage -// -// ``` -// _ : expm1 : _ -// ``` -//----------------------------------------------------------------------------- -expm1 = ffunction(float expm1f|expm1|expm1l (float), ,""); - - -//---------------------------------`(ma.)acosh`------------------------------------- -// Computes the principle value of the inverse hyperbolic cosine -// of the input signal. -// -// #### Usage -// -// ``` -// _ : acosh : _ -// ``` -//----------------------------------------------------------------------------- -acosh = ffunction(float acoshf|acosh|acoshl (float), , ""); - - -//--------------------------------`(ma.)asinh`----------------------------------- -// Computes the inverse hyperbolic sine of the input signal. -// -// #### Usage -// -// ``` -// _ : asinh : _ -// ``` -//----------------------------------------------------------------------------- -asinh = ffunction(float asinhf|asinh|asinhl (float), , ""); - - -//--------------------------------`(ma.)atanh`----------------------------------- -// Computes the inverse hyperbolic tangent of the input signal. -// -// #### Usage -// -// ``` -// _ : atanh : _ -// ``` -//----------------------------------------------------------------------------- -atanh = ffunction(float atanhf|atanh|atanhl (float), , ""); - - -//---------------------------------`(ma.)sinh`--------------------------------------- -// Computes the hyperbolic sine of the input signal. -// -// #### Usage -// -// ``` -// _ : sinh : _ -// ``` -//----------------------------------------------------------------------------- -sinh = ffunction(float sinhf|sinh|sinhl (float), , ""); - - -//---------------------------------`(ma.)cosh`-------------------------------------- -// Computes the hyperbolic cosine of the input signal. -// -// #### Usage -// -// ``` -// _ : cosh : _ -// ``` -//----------------------------------------------------------------------------- -cosh = ffunction(float coshf|cosh|coshl (float), , ""); - - -//---------------------------------`(ma.)tanh`-------------------------------------- -// Computes the hyperbolic tangent of the input signal. -// -// #### Usage -// -// ``` -// _ : tanh : _ -// ``` -//----------------------------------------------------------------------------- -tanh = ffunction(float tanhf|tanh|tanhl (float), ,""); - - -//---------------------------------`(ma.)erf`--------------------------------------- -// Computes the error function of the input signal. -// -// #### Usage -// -// ``` -// _ : erf : _ -// ``` -//----------------------------------------------------------------------------- -erf = ffunction(float erff|erf|erfl(float), ,""); - - -//---------------------------------`(ma.)erfc`--------------------------------------- -// Computes the complementary error function of the input signal. -// -// #### Usage -// -// ``` -// _ : erfc : _ -// ``` -//----------------------------------------------------------------------------- -erfc = ffunction(float erfcf|erfc|erfcl(float), ,""); - - -//---------------------------------`(ma.)gamma`------------------------------------- -// Computes the gamma function of the input signal. -// -// #### Usage -// -// ``` -// _ : gamma : _ -// ``` -//----------------------------------------------------------------------------- -gamma = ffunction(float tgammaf|tgamma|tgammal(float), ,""); - - -//---------------------------------`(ma.)lgamma`------------------------------------ -// Calculates the natural logorithm of the absolute value of -// the gamma function of the input signal. -// -// #### Usage -// -// ``` -// _ : lgamma : _ -// ``` -//----------------------------------------------------------------------------- -lgamma = ffunction(float lgammaf|lgamma|lgammal(float), ,""); - - -//----------------------------------`(ma.)J0`--------------------------------------- -// Computes the Bessel function of the first kind of order 0 -// of the input signal. -// -// #### Usage -// -// ``` -// _ : J0 : _ -// ``` -//----------------------------------------------------------------------------- -J0 = ffunction(float j0(float), ,""); - - -//----------------------------------`(ma.)J1`--------------------------------------- -// Computes the Bessel function of the first kind of order 1 -// of the input signal. -// -// #### Usage -// -// ``` -// _ : J1 : _ -// ``` -//----------------------------------------------------------------------------- -J1 = ffunction(float j1(float), ,""); - - -//----------------------------------`(ma.)Jn`--------------------------------------- -// Computes the Bessel function of the first kind of order n -// (first input signal) of the second input signal. -// -// #### Usage -// -// ``` -// _,_ : Jn : _ -// ``` -//----------------------------------------------------------------------------- -Jn = ffunction(float jn(int, float), ,""); - - -//----------------------------------`(ma.)Y0`--------------------------------------- -// Computes the linearly independent Bessel function of the second kind -// of order 0 of the input signal. -// -// #### Usage -// -// ``` -// _ : Y0 : _ -// ``` -//----------------------------------------------------------------------------- -Y0 = ffunction(float y0(float), ,""); - - -//----------------------------------`(ma.)Y1`--------------------------------------- -// Computes the linearly independent Bessel function of the second kind -// of order 1 of the input signal. -// -// #### Usage -// -// ``` -// _ : Y0 : _ -// ``` -//----------------------------------------------------------------------------- -Y1 = ffunction(float y1(float), ,""); - - -//----------------------------------`(ma.)Yn`--------------------------------------- -// Computes the linearly independent Bessel function of the second kind -// of order n (first input signal) of the second input signal. -// -// #### Usage -// -// ``` -// _,_ : Yn : _ -// ``` -//----------------------------------------------------------------------------- -Yn = ffunction(float yn(int, float), ,""); - - -//----------------------------`(ma.)fabs`, `(ma.)fmax`, `(ma.)fmin`--------------------------- -// Just for compatibility... -// -// ``` -// fabs = abs -// fmax = max -// fmin = min -// ``` -//----------------------------------------------------------------------------- -fabs = abs; -fmax = max; -fmin = min; - -//-------------------------------`(ma.)np2`-------------------------------------- -// Gives the next power of 2 of x. -// -// #### Usage -// -// ``` -// np2(n) : _ -// ``` -// -// Where: -// -// * `n`: an integer -//----------------------------------------------------------------------------- -np2 = -(1) <: >>(1)|_ <: >>(2)|_ <: >>(4)|_ <: >>(8)|_ <: >>(16)|_ : +(1); - - -//-----------------------------`(ma.)frac`--------------------------------------- -// Gives the fractional part of n. -// -// #### Usage -// -// ``` -// frac(n) : _ -// ``` -// -// Where: -// -// * `n`: a decimal number -//------------------------------------------------------------------------------ -frac(n) = n - floor(n); -decimal = frac; -// NOTE: decimal does the same thing as frac but using floor instead. JOS uses frac a lot -// in filters.lib so we decided to keep that one... decimal is declared though for -// backward compatibility. -// decimal(n) = n - floor(n); - - -//-------------------------------`(ma.)modulo`--------------------------------------- -// Modulus operation. -// -// #### Usage -// -// ``` -// modulo(x,N) : _ -// ``` -// -// Where: -// -// * `x`: the numerator -// * `N`: the denominator -//------------------------------------------------------------------------------ -modulo(x,N) = (x % N + N) % N; - - -//---------------`(ma.)isnan`---------------- -// Return non-zero if x is a NaN. -// -// #### Usage -// -// ``` -// isnan(x) -// _ : isnan : _ -// ``` -// -// Where: -// -// * `x`: signal to analyse -//------------------------------------------ -isnan = ffunction(int isnanf|isnan|isnanl (float),,""); - - -//---------------`(ma.)isinf`---------------- -// Return non-zero if x is a positive or negative infinity. -// -// #### Usage -// -// ``` -// isinf(x) -// _ : isinf : _ -// ``` -// -// Where: -// -// * `x`: signal to analyse -//------------------------------------------ -isinf = ffunction(int isinff|isinf|isinfl (float),,""); - -nextafter = ffunction(float nextafter(float, float),,""); - - -//---------------------------`(ma.)chebychev`------------------------------- -// Chebychev transformation of order n. -// -// #### Usage -// -// ``` -// _ : chebychev(n) : _ -// ``` -// -// Where: -// -// * `n`: the order of the polynomial -// -// #### Semantics -// -// ``` -// T[0](x) = 1, -// T[1](x) = x, -// T[n](x) = 2x*T[n-1](x) - T[n-2](x) -// ``` -// -// #### Reference -// -// -//------------------------------------------------------------------------- -chebychev(0,x) = 1; -chebychev(1,x) = x; -chebychev(n,x) = 2*x*chebychev(n-1, x) - chebychev(n-2, x); - - -//------------------------`(ma.)chebychevpoly`------------------------------- -// Linear combination of the first Chebyshev polynomials. -// -// #### Usage -// -// ``` -// _ : chebychevpoly((c0,c1,...,cn)) : _ -// ``` -// -// Where: -// -// * `cn`: the different Chebychevs polynomials such that: -// chebychevpoly((c0,c1,...,cn)) = Sum of chebychev(i)*ci -// -// #### Reference -// -// -//------------------------------------------------------------------------- -chebychevpoly(lcoef) = _ <: L(0,lcoef) :> _ - with { - L(n,(c,cs)) = chebychev(n)*c, L(n+1,cs); - L(n,c) = chebychev(n)*c; - }; - - -//------------------`(ma.)diffn`---------------------------- -// Negated first-order difference. -// -// #### Usage -// -// ``` -// _ : diffn : _ -// ``` -//-------------------------------------------------------- -diffn(x) = x' - x; // negated first-order difference - - -//------------------`(ma.)signum`---------------------------- -// The signum function signum(x) is defined as -// -1 for x<0, 0 for x==0, and 1 for x>0. -// -// #### Usage -// -// ``` -// _ : signum : _ -// ``` -//-------------------------------------------------------- -signum(x) = (x>0)-(x<0); - - -//------------------`(ma.)nextpow2`---------------------------- -// The nextpow2(x) returns the lowest integer m such that -// 2^m >= x. -// -// #### Usage -// -// ``` -// 2^nextpow2(n) -// ``` -// Useful for allocating delay lines, e.g., -// ``` -// delay(2^nextpow2(maxDelayNeeded), currentDelay); -// ``` -//-------------------------------------------------------- -nextpow2(x) = ceil(log(x)/log(2.0)); - - -//--------------------`(ma.)zc`------------------------------------------------ -// Indicator function for zero-crossing: it returns 1 if a zero-crossing -// occurs, 0 otherwise. -// -// #### Usage -// -// ``` -// _ : zc : _ -// ``` -//----------------------------------------------------------------------------- -zc(x) = x * x' < 0; - diff --git a/dist/examples/LIBRARIES/maxmsp.lib b/dist/examples/LIBRARIES/maxmsp.lib deleted file mode 100644 index 0a995481..00000000 --- a/dist/examples/LIBRARIES/maxmsp.lib +++ /dev/null @@ -1,230 +0,0 @@ -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2019-2020 GRAME, Centre National de Creation Musicale ---------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commerci -************************************************************************ -************************************************************************/ - -declare name "MaxMSP compatibility Library"; -declare author "GRAME"; -declare copyright "GRAME"; -declare version "1.1"; -declare license "LGPL with exception"; - -ba = library("basics.lib"); -ma = library("maths.lib"); - -atodb = db2lin; - -//------------------------------------------------------------------------- -// -// Implementation of MaxMSP filtercoeff -// -// from : Cookbook formulae for audio EQ biquad filter coefficients -// by : Robert Bristow-Johnson -// URL : -// -//------------------------------------------------------------------------- - -filtercoeff(f0, dBgain, Q) = environment -{ - //---------------------------------------- - // biquad coeffs for various filters - // usage : filtercoeff(f0, dBgain, Q).LPF - //---------------------------------------- - - LPF = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = (1 - cos(w0))/2; - b1 = 1 - cos(w0); - b2 = (1 - cos(w0))/2; - a0 = 1 + alpha; - a1 = -2*cos(w0); - a2 = 1 - alpha; - }; - - HPF = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = (1 + cos(w0))/2; - b1 = -1 - cos(w0); - b2 = (1 + cos(w0))/2; - a0 = 1 + alpha; - a1 = -2*cos(w0); - a2 = 1 - alpha; - }; - - BPF = rbjcoef(a0, a1, a2, b0, b1, b2) // constant 0 dB peak gain - with { - b0 = alpha; - b1 = 0; - b2 = -alpha; - a0 = 1 + alpha; - a1 = -2*cos(w0); - a2 = 1 - alpha; - }; - - notch = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = 1; - b1 = -2*cos(w0); - b2 = 1; - a0 = 1 + alpha; - a1 = -2*cos(w0); - a2 = 1 - alpha; - }; - - APF = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = 1 - alpha; - b1 = -2*cos(w0); - b2 = 1 + alpha; - a0 = 1 + alpha; - a1 = -2*cos(w0); - a2 = 1 - alpha; - }; - - peakingEQ = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = 1 + alpha*A; - b1 = -2*cos(w0); - b2 = 1 - alpha*A; - a0 = 1 + alpha/A; - a1 = -2*cos(w0); - a2 = 1 - alpha/A; - }; - - peakNotch = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = 1 + alpha*G; - b1 = -2*cos(w0); - b2 = 1 - alpha*G; - a0 = 1 + alpha/G; - a1 = -2*cos(w0); - a2 = 1 - alpha/G; - }; - - lowShelf = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = A*((A+1) - (A-1)*cos(w0) + 2*sqrt(A)*alpha); - b1 = 2*A*((A-1) - (A+1)*cos(w0)); - b2 = A*((A+1) - (A-1)*cos(w0) - 2*sqrt(A)*alpha); - a0 = (A+1) + (A-1)*cos(w0) + 2*sqrt(A)*alpha; - a1 = -2*((A-1) + (A+1)*cos(w0)); - a2 = (A+1) + (A-1)*cos(w0) - 2*sqrt(A)*alpha; - }; - - highShelf = rbjcoef(a0, a1, a2, b0, b1, b2) - with { - b0 = A*((A+1) + (A-1)*cos(w0) + 2*sqrt(A)*alpha); - b1 = -2*A*((A-1) + (A+1)*cos(w0)); - b2 = A*((A+1) + (A-1)*cos(w0) - 2*sqrt(A)*alpha); - a0 = (A+1) - (A-1)*cos(w0) + 2*sqrt(A)*alpha; - a1 = 2*((A-1) - (A+1)*cos(w0)); - a2 = (A+1) - (A-1)*cos(w0) - 2*sqrt(A)*alpha; - }; - - // --------------------- implementation ------------------------------ - - // convert rbj coeffs to biquad coeffs - rbjcoef(a0,a1,a2,b0,b1,b2) = (b0/a0, b1/a0, b2/a0, a1/a0, a2/a0); - - // common values -// alpha = sin(w0)/(2*Q); -// w0 = 2*ma.PI*f0/Fs; - alpha = sin(w0)/(2*max(0.001,Q)); - w0 = 2*ma.PI*max(0,f0)/Fs; - Fs = ma.SR; - A = 10^(dBgain/40); // (for peaking and shelving EQ filters only) - G = sqrt(max(0.00001, dBgain)); // When gain is a linear values (i.e. not in dB) -}; - - -//------------------------------------------------------------------------- -// Implementation of MaxMSP biquad~ -// y[n] = a0 * x[n] + a1 * x[n-1] + a2 * x[n-2] - b1 * y[n-1] - b2 * y[n-2] -//------------------------------------------------------------------------- - -biquad(x,a0,a1,a2,b1,b2) = x : + ~ ((-1)*conv2(b1, b2)) : conv3(a0, a1, a2) - with { - conv2(c0,c1,x) = c0*x+c1*x'; - conv3(c0,c1,c2,x) = c0*x+c1*x'+c2*x''; - }; - -//------------------------------------------------------------------------- -// -// Filters using filtercoeff and biquad -// -//------------------------------------------------------------------------- - -// Low Pass Filter -LPF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).LPF : biquad; - -// High Pass Filter -HPF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).HPF : biquad; - -// Band Pass Filter -BPF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).BPF : biquad; - -// notch Filter -notch(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).notch : biquad; - -// All Pass Filter -APF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).APF : biquad; - -// ???? -peakingEQ(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).peakingEQ : biquad; - -// Max peakNotch is like peakingEQ but with a linear gain -peakNotch(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).peakNotch : biquad; - -// ???? -lowShelf(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).lowShelf : biquad; - -// ???? -highShelf(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).highShelf : biquad; - - -//------------------------------------------------------------------------- -// Implementation of Max/MSP line~. Generate signal ramp or envelop -// -// USAGE : line(value, time) -// value : the desired output value -// time : the interpolation time to reach this value (in milliseconds) -// -// NOTE : the interpolation process is restarted every time the desired -// output value changes. The interpolation time is sampled only then. -//------------------------------------------------------------------------- - -line(value, time) = state~(_,_):!,_ - with { - state(t, c) = nt,nc - with { - nt = ba.if(value != value', samples, t-1); - nc = ba.if(nt <= 0, value, c + (value - c)/nt); - samples = time*ma.SR/1000.0; - }; - }; diff --git a/dist/examples/LIBRARIES/mi.lib b/dist/examples/LIBRARIES/mi.lib deleted file mode 100644 index 286a60d0..00000000 --- a/dist/examples/LIBRARIES/mi.lib +++ /dev/null @@ -1,545 +0,0 @@ -//############################# mi.lib ######################################### -// This ongoing work is the fruit of a collaboration between GRAME-CNCM and -// the ANIS (Arts Numériques et Immersions Sensorielles) research group from -// GIPSA-Lab (Université Grenoble Alpes). -// -// This library implements basic 1-DoF mass-interaction physics algorithms, -// allowing to declare and connect physical elements (masses, springs, non -// linear interactions, etc.) together to form topological networks. -// Models can be assembled by hand, however in more complex scenarios it is -// recommended to use a scripting tool (such as MIMS) to generate the FAUST -// signal routing for a given physical network. -// -// -// -// -// -// -// ## Sources -// -// The core mass-interaction algorithms implemented in this library are in the public -// domain and are disclosed in the following scientific publications: -// -// * Claude Cadoz, Annie Luciani, Jean-Loup Florens, Curtis Roads and Françoise -// Chabade. Responsive Input Devices and Sound Synthesis by Stimulation of -// Instrumental Mechanisms: The Cordis System. Computer Music Journal, Vol 8. -// No. 3, 1984. -// * Claude Cadoz, Annie Luciani and Jean Loup Florens. CORDIS-ANIMA: A Modeling -// and Simulation System for Sound and Image Synthesis: The General Formalism. -// Computer Music Journal. Vol. 17, No. 1, 1993. -// * Alexandros Kontogeorgakopoulos and Claude Cadoz. Cordis Anima Physical -// Modeling and Simulation System Analysis. In Proceedings of the Sound and Music -// Computing Conference (SMC-07), Lefkada, Greece, 2007. -// * Nicolas Castagne, Claude Cadoz, Ali Allaoui and Olivier Tache. G3: Genesis -// Software Environment Update. In Proceedings of the International Computer -// Music Conference (ICMC-09), Montreal, Canada, 2009. -// * Nicolas Castagné and Claude Cadoz. Genesis 3: Plate-forme pour la création -// musicale à l'aide des modèles physiques Cordis-Anima. In Proceedings of the -// Journée de l'Informatique Musicale, Grenoble, France, 2009. -// * Edgar Berdahl and Julius O. Smith. An Introduction to the Synth-A-Modeler -// Compiler: Modular and Open-Source Sound Synthesis using Physical Models. In -// Proceedings of the Linux Audio Conference (LAC-12), Stanford, USA, 2012. -// * James Leonard and Claude Cadoz. Physical Modelling Concepts for a Collection -// of Multisensory Virtual Musical Instruments. In Proceedings of the New -// Interfaces for Musical Expression (NIME-15) Conference, Baton Rouge, USA, 2015. -//############################################################################## - - -ma = library("maths.lib"); -ba = library("basics.lib"); - -declare name "Faust mass-interaction physical modelling library"; -declare version "0.0"; -declare author "James Leonard"; -declare author "Romain Michon"; -declare copyright "2018-2020 GRAME / GIPSA-Lab"; - - -//===============================Utility Functions======================================== -// These utility functions are used to help certain operations (e.g. define initial -// positions and velocities for physical elements). -//======================================================================================== - - - -//------------------------`(mi.)initState`---------------------- -// Used to set initial delayed position values that must be initialised -// at step 0 of the physics simulation. -// -// If you develop any of your own modules, you will need to use this (see -// mass and springDamper algorithm codes for examples). -// -// #### Usage -// -// ``` -// x: initState(x0) : _ -// ``` -// -// Where: -// -// * `x`: position value signal -// * `x0`: initial value for position -//--------------------------------------------------------- -initState(init) = R(0,init) -with{ - R(n,(initn,init)) = +(1: ba.impulsify@n * initn) : R(n+1,init); - R(n,initn) = +(1 : ba.impulsify@n * initn); -}; - - - - -//=================================Mass Algorithms======================================== -// All mass-type physical element functions are declared here. They all expect to receive -// a force input signal and produce a position signal. -// All physical parameters are expressed in sample-rate dependant values. -//======================================================================================== - - - -//------------------------`(mi.)mass`---------------------- -// Implementation of a punctual mass element. -// Takes an input force and produces output position. -// -// #### Usage -// -// ``` -// mass(m, grav, x0, xr0),_ : _ -// ``` -// -// Where: -// -// * `m`: mass value -// * `grav`: gravity force value -// * `x0`: initial position -// * `xr0`: initial delayed position (inferred from initial velocity) -//--------------------------------------------------------- -mass(m, grav, x0, x1) = equation -with{ - A = 2; - B = -1; - C = 1/m; - equation = x - letrec{ - 'x = A*(x : initState(x0)) + B*(x' : initState((x1,x0))) + (_-grav)*(C); - }; -}; - - - -//------------------------`(mi.)oscil`---------------------- -// Implementation of a simple linear harmonic oscillator. -// Takes an input force and produces output position. -// -// #### Usage -// -// ``` -// oscil(m, k, z, grav, x0, xr0),_ : _ -// ``` -// -// Where: -// -// * `m`: mass value -// * `k`: stiffness value -// * `z`: damping value -// * `grav`: gravity force value -// * `x0`: initial position -// * `xr0`: initial delayed position (inferred from initial velocity) -//--------------------------------------------------------- -oscil(m, k, z, grav, x0, x1) = equation -with{ - A = 2 - (k + z)/m; - B = z/m - 1; - C = 1/m; - equation = x - letrec{ - 'x = A*(x : initState(x0)) + B*(x' : initState((x1, x0))) + (_-grav)*(C); - }; -}; - - - -//------------------------`(mi.)ground`---------------------- -// Implementation of a fixed point element. -// The position output produced by this module never changes, however -// it still expects a force input signal (for compliance with connection -// rules). -// -// #### Usage -// -// ``` -// ground(x0),_ : _ -// ``` -// -// Where: -// -// * `x0`: initial position -//--------------------------------------------------------- -ground(x0) = equation -with{ - // could this term be removed or simlified? Need "unused" input force signal for the routing scheme to work - C = 0; - equation = x - letrec{ - 'x = (x : initState(x0)) + *(C); - }; -}; - - - -//------------------------`(mi.)posInput`---------------------- -// Implementation of a position input module (driven by an outside -// signal). Takes two signal inputs: incoming force (which doesn't -// affect position) and the driving position signal. -// -// #### Usage -// -// ``` -// posInput(x0),_,_ : _ -// ``` -// -// Where: -// -// * `x0`: initial position -//--------------------------------------------------------- -posInput(init) = _,_ : !,_ : initState(init); - - - -//===============================Interaction Algorithms==================================== -// All interaction-type physical element functions are declared here. They each expect to -// receive two position signals (coming from the two mass-elements that they connect) and -// produce two equal and opposite force signals that must be routed back to the mass -// elements' inputs. -// All physical parameters are expressed in sample-rate dependant values. -//========================================================================================= - - - -//------------------------`(mi.)spring`---------------------- -// Implementation of a linear elastic spring interaction. -// -// #### Usage -// -// ``` -// spring(k, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `k`: stiffness value -// * `x1r`: initial delayed position of mass 1 (unused here) -// * `x2r`: initial delayed position of mass 2 (unused here) -//--------------------------------------------------------- -spring(k, x1r0, x2r0, x1, x2) = - k*deltapos <: *(-1),_ -with{ - deltapos = x1-x2; -}; - - - -//------------------------`(mi.)damper`---------------------- -// Implementation of a linear damper interaction. -// Beware: in 32bit precision mode, damping forces can become -// truncated if position values are not centered around zero! -// -// #### Usage -// -// ``` -// damper(z, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `z`: damping value -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -damper(z, x1r0, x2r0, x1, x2) = - z*deltavel <: *(-1),_ -with{ - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); -}; - - - -//------------------------`(mi.)springDamper`---------------------- -// Implementation of a linear viscoelastic spring-damper interaction -// (a combination of the spring and damper modules). -// -// #### Usage -// -// ``` -// springDamper(k, z, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `k`: stiffness value -// * `z`: damping value -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -springDamper(k, z, x1r0, x2r0, x1, x2) = - k*deltapos + - z*deltavel <: *(-1),_ -with{ - deltapos = x1-x2; - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); -}; - - - -//------------------------`(mi.)nlSpringDamper2`---------------------- -// Implementation of a non-linear viscoelastic spring-damper interaction -// containing a quadratic term (function of squared distance). -// Beware: at high displacements, this interaction will break numerical -// stability conditions ! The nlSpringDamperClipped is a safer option. -// -// #### Usage -// -// ``` -// nlSpringDamper2(k, q, z, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `k`: linear stiffness value -// * `q`: quadratic stiffness value -// * `z`: damping value -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -nlSpringDamper2(k, q, z, x1r0, x2r0, x1, x2) = - k*deltapos + q * ma.signum(deltapos) * pow(deltapos, 2) + - z*deltavel <: *(-1),_ -with{ - deltapos = x1-x2; - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); -}; - - - -//------------------------`(mi.)nlSpringDamper3`---------------------- -// Implementation of a non-linear viscoelastic spring-damper interaction -// containing a cubic term (function of distance^3). -// Beware: at high displacements, this interaction will break numerical -// stability conditions ! The nlSpringDamperClipped is a safer option. -// -// #### Usage -// -// ``` -// nlSpringDamper3(k, q, z, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `k`: linear stiffness value -// * `q`: cubic stiffness value -// * `z`: damping value -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -nlSpringDamper3(k, q, z, x1r0, x2r0, x1, x2) = - k*deltapos + q * pow(deltapos, 3) + - z*deltavel <: *(-1),_ -with{ - deltapos = x1-x2; - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); -}; - - - -//------------------------`(mi.)nlSpringDamperClipped`---------------------- -// Implementation of a non-linear viscoelastic spring-damper interaction -// containing a cubic term (function of distance^3), bound by an -// upper linear stiffness (hard-clipping). -// -// This bounding means that when faced with strong displacements, the -// interaction profile will "clip" at a given point and never produce -// forces higher than the bounding equivalent linear spring, stopping models -// from becoming unstable. -// -// So far the interaction clips "hard" (with no soft-knee spline -// interpolation, etc.) -// -// #### Usage -// -// ``` -// nlSpringDamperClipped(s, c, k, z, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `s`: linear stiffness value -// * `c`: cubic stiffness value -// * `k`: upper-bound linear stiffness value -// * `z`: (linear) damping value -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -nlSpringDamperClipped(s, c, k, z, x1r0, x2r0, x1, x2) = - select2(c == 0, - select2(s >= k, - select2(absdeltapos <= b, - // Overdamping induced here to prevent "locked" states... - k * deltapos + (z+0.3*k)*deltavel, - s * deltapos + c * pow(deltapos, 3) + z*deltavel - ), - k * deltapos + z*deltavel - ), - s * deltapos + z*deltavel - )<: *(-1),_ -with{ - b = sqrt(k-s)/c; - deltapos = x1-x2; - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); - absdeltapos = abs(deltapos); - -}; - - - -//------------------------`(mi.)nlPluck`---------------------- -// Implementation of a piecewise linear plucking interaction. -// The symmetric function provides a repulsive viscoelastic interaction -// upon contact, until a tipping point is reached (when the plucking occurs). -// The tipping point depends both on the stiffness and the distance scaling -// of the interaction. -// -// -// #### Usage -// -// ``` -// nlPluck(knl, scale, z, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `knl`: stiffness scaling parameter (vertical stretch of the NL function) -// * `scale`: distance scaling parameter (horizontal stretch of the NL function) -// * `z`: (linear) damping value -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -nlPluck(k, scale, z, x1r0, x2r0, x1, x2) = - select2(absdeltapos < tipdist, - select2(absdeltapos < scale, - 0, - ma.signum(deltapos)* -tipdist * k + Kend * deltapos + - z* deltavel - ), - (k - Kend) * -deltapos + z* deltavel - ) <: *(-1),_ -with{ - deltapos = x1 - x2; - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); - - absdeltapos = abs(deltapos); - sharpness = 10; - tipdist = scale / sharpness; - Kend = k / sharpness; -}; - - - -//------------------------`(mi.)nlBow`---------------------- -// Implementation of a non-linear friction based interaction -// that allows for stick-slip bowing behaviour. -// Two versions are proposed : a piecewise linear function (very -// similar to the nlPluck) or a mathematical approximation (see -// Stefan Bilbao's book, Numerical Sound Synthesis). -// -// -// #### Usage -// -// ``` -// nlBow(znl, scale, type, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `znl`: friction scaling parameter (vertical stretch of the NL function) -// * `scale`: velocity scaling parameter (horizontal stretch of the NL function) -// * `type`: interaction profile (0 = piecewise linear, 1 = smooth function) -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -nlBow(z, scale, type, x1r0, x2r0, x1, x2) = - select2(type > 0, - select2(absdeltavel < tipvel, - select2(absdeltavel < scale, - 0, - ma.signum(deltavel)* tipvel * z - Zend * deltavel - ), - (z - Zend) * deltavel - ), - 0.63 * z * deltavel *exp(-4*pow(deltavel/scale, 2) + 1/2) - ) - <: *(-1),_ -with{ - deltavel = (x1 - x1' : initState(x1r0)) - (x2 - x2' : initState(x2r0)); - absdeltavel = abs(deltavel); - sharpness = 3; - tipvel = scale / sharpness; - Zend = z / sharpness; -}; - - - -//------------------------`(mi.)collision`---------------------- -// Implementation of a collision interaction, producing linear visco-elastic -// repulsion forces when two mass elements are interpenetrating. -// -// -// #### Usage -// -// ``` -// collision(k, z, thres, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `k`: collision stiffness parameter -// * `z`: collision damping parameter -// * `thres`: threshold distance for the contact between elements -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -collision(k,z,thres,x1r0,x2r0,x1,x2) = - springDamper(k,z,x1r0,x2r0,x1+thres,x2) : (select2(comp,0,_),select2(comp,0,_)) -with{ - comp = (x2-x1) < thres; -}; - - - -//------------------------`(mi.)nlCollisionClipped`---------------------- -// Implementation of a collision interaction, producing non-linear -// visco-elastic repulsion forces when two mass elements are interpenetrating. -// Bound by an upper stiffness value to maintain stability. -// This interaction is particularly useful for more realistic contact dynamics -// (greater difference in velocity provides sharper contacts, and reciprocally). -// -// #### Usage -// -// ``` -// nlCollisionClipped(s, c, k, z, thres, x1r, x2r),_,_ : _,_ -// ``` -// -// Where: -// -// * `s`: collision linear stiffness parameter -// * `c`: collision cubic stiffness parameter -// * `k`: collision upper-bounding stiffness parameter -// * `z`: collision damping parameter -// * `thres`: threshold distance for the contact between elements -// * `x1r`: initial delayed position of mass 1 -// * `x2r`: initial delayed position of mass 2 -//--------------------------------------------------------- -nlCollisionClipped(s, c, k, z, thres, x1r0, x2r0, x1, x2) = - nlSpringDamperClipped(s,c,k,z,x1r0,x2r0,x1+thres,x2) : (select2(comp,0,_),select2(comp,0,_)) -with{ - comp = (x2-x1) < thres; -}; diff --git a/dist/examples/LIBRARIES/misceffects.lib b/dist/examples/LIBRARIES/misceffects.lib deleted file mode 100644 index 91550e17..00000000 --- a/dist/examples/LIBRARIES/misceffects.lib +++ /dev/null @@ -1,584 +0,0 @@ -//################################## misceffects.lib ########################################## -// This library contains a collection of audio effects. Its official prefix is `ef`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2003-2016 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ma = library("maths.lib"); -ba = library("basics.lib"); -de = library("delays.lib"); -si = library("signals.lib"); -an = library("analyzers.lib"); -fi = library("filters.lib"); -ef = library("misceffects.lib"); // for compatible copy/paste out of this file - -declare name "Misc Effects Library"; -declare version "2.0"; // TODO to check - -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2019 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -MarkDown comments in this section are Copyright 2016-2019 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ - -//======================================Dynamic=========================================== -//======================================================================================== - -//---------------------`(ef.)cubicnl`----------------------- -// Cubic nonlinearity distortion. -// `cubicnl` is a standard Faust library. -// -// #### Usage: -// -// ``` -// _ : cubicnl(drive,offset) : _ -// _ : cubicnl_nodc(drive,offset) : _ -// ``` -// -// Where: -// -// * `drive`: distortion amount, between 0 and 1 -// * `offset`: constant added before nonlinearity to give even harmonics. Note: offset -// can introduce a nonzero mean - feed cubicnl output to dcblocker to remove this. -// -// #### References: -// -// * -// * -//------------------------------------------------------------ -cubicnl(drive,offset) = *(pregain) : +(offset) : clip(-1,1) : cubic -with { - pregain = pow(10.0,2*drive); - clip(lo,hi) = min(hi) : max(lo); - cubic(x) = x - x*x*x/3; - postgain = max(1.0,1.0/pregain); -}; - -cubicnl_nodc(drive,offset) = cubicnl(drive,offset) : fi.dcblocker; - - -//-----------------`(ef.)gate_mono`------------------- -// Mono signal gate. -// `gate_mono` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : gate_mono(thresh,att,hold,rel) : _ -// ``` -// -// Where: -// -// * `thresh`: dB level threshold above which gate opens (e.g., -60 dB) -// * `att`: attack time = time constant (sec) for gate to open (e.g., 0.0001 s = 0.1 ms) -// * `hold`: hold time = time (sec) gate stays open after signal level < thresh (e.g., 0.1 s) -// * `rel`: release time = time constant (sec) for gate to close (e.g., 0.020 s = 20 ms) -// -// #### References -// -// * -// * -// * -//------------------------------------------------------------ -gate_mono(thresh,att,hold,rel,x) = x * gate_gain_mono(thresh,att,hold,rel,x); - - -//-----------------`(ef.)gate_stereo`------------------- -// Stereo signal gates. -// `gate_stereo` is a standard Faust function. -// -// #### Usage -// -// ``` -// _,_ : gate_stereo(thresh,att,hold,rel) : _,_ -// ``` -// -// Where: -// -// * `thresh`: dB level threshold above which gate opens (e.g., -60 dB) -// * `att`: attack time = time constant (sec) for gate to open (e.g., 0.0001 s = 0.1 ms) -// * `hold`: hold time = time (sec) gate stays open after signal level < thresh (e.g., 0.1 s) -// * `rel`: release time = time constant (sec) for gate to close (e.g., 0.020 s = 20 ms) -// -// #### References -// -// * -// * -// * -//------------------------------------------------------------ -gate_stereo(thresh,att,hold,rel,x,y) = ggm*x, ggm*y with { - ggm = gate_gain_mono(thresh,att,hold,rel,abs(x)+abs(y)); -}; - -gate_gain_mono(thresh,att,hold,rel,x) = x : extendedrawgate : an.amp_follower_ar(att,rel) with { - extendedrawgate(x) = max(float(rawgatesig(x)),holdsig(x)); - rawgatesig(x) = inlevel(x) > ba.db2linear(thresh); - minrate = min(att,rel); - inlevel = an.amp_follower_ar(minrate,minrate); - holdcounter(x) = (max(holdreset(x) * holdsamps,_) ~-(1)); - holdsig(x) = holdcounter(x) > 0; - holdreset(x) = rawgatesig(x) < rawgatesig(x)'; // reset hold when raw gate falls - holdsamps = int(hold*ma.SR); -}; - - -//=====================================Filtering========================================== -//======================================================================================== - -//-------------------------`(ef.)speakerbp`------------------------------- -// Dirt-simple speaker simulator (overall bandpass eq with observed -// roll-offs above and below the passband). -// -// Low-frequency speaker model = +12 dB/octave slope breaking to -// flat near f1. Implemented using two dc blockers in series. -// -// High-frequency model = -24 dB/octave slope implemented using a -// fourth-order Butterworth lowpass. -// -// Example based on measured Celestion G12 (12" speaker): -// -// `speakerbp` is a standard Faust function -// -// #### Usage -// -// ``` -// speakerbp(f1,f2) -// _ : speakerbp(130,5000) : _ -// ``` -//------------------------------------------------------------ -// TODO: perhaps this should be moved to physmodels.lib -// [JOS: I don't think so because it's merely a bandpass filter tuned to speaker bandwidth] -speakerbp(f1,f2) = fi.dcblockerat(f1) : fi.dcblockerat(f1) : fi.lowpass(4,f2); - - -//------------`(ef.)piano_dispersion_filter`--------------- -// Piano dispersion allpass filter in closed form. -// -// #### Usage -// -// ``` -// piano_dispersion_filter(M,B,f0) -// _ : piano_dispersion_filter(1,B,f0) : +(totalDelay),_ : fdelay(maxDelay) : _ -// ``` -// -// Where: -// -// * `M`: number of first-order allpass sections (compile-time only) -// Keep below 20. 8 is typical for medium-sized piano strings. -// * `B`: string inharmonicity coefficient (0.0001 is typical) -// * `f0`: fundamental frequency in Hz -// -// #### Outputs -// -// * MINUS the estimated delay at `f0` of allpass chain in samples, -// provided in negative form to facilitate subtraction -// from delay-line length. -// * Output signal from allpass chain -// -// #### Reference -// -// * "Dispersion Modeling in Waveguide Piano Synthesis Using Tunable -// Allpass Filters", by Jukka Rauhala and Vesa Valimaki, DAFX-2006, pp. 71-76 -// * -// An erratum in Eq. (7) is corrected in Dr. Rauhala's encompassing -// dissertation (and below). -// * -//------------------------------------------------------------ -// TODO: perhaps this should be moved to physmodels.lib? -// [JOS: I vote yes when there is a piano model in physmodels.lib.] -piano_dispersion_filter(M,B,f0) = -Df0*M,seq(i,M,fi.tf1(a1,1,a1)) -with { - a1 = (1-D)/(1+D); // By Eq. 3, have D >= 0, hence a1 >= 0 also - D = exp(Cd - Ikey(f0)*kd); - trt = pow(2.0,1.0/12.0); // 12th root of 2 - logb(b,x) = log(x) / log(b); // log-base-b of x - Ikey(f0) = logb(trt,f0*trt/27.5); - Bc = max(B,0.000001); - kd = exp(k1*log(Bc)*log(Bc) + k2*log(Bc)+k3); - Cd = exp((m1*log(M)+m2)*log(Bc)+m3*log(M)+m4); - k1 = -0.00179; - k2 = -0.0233; - k3 = -2.93; - m1 = 0.0126; - m2 = 0.0606; - m3 = -0.00825; - m4 = 1.97; - wT = 2*ma.PI*f0/ma.SR; - polydel(a) = atan(sin(wT)/(a+cos(wT)))/wT; - Df0 = polydel(a1) - polydel(1.0/a1); -}; - -//-------------------------`(ef.)stereo_width`--------------------------- -// Stereo Width effect using the Blumlein Shuffler technique. -// `stereo_width` is a standard Faust function. -// -// #### Usage -// -// ``` -// _,_ : stereo_width(w) : _,_ -// ``` -// -// Where: -// -// * `w`: stereo width between 0 and 1 -// -// At `w=0`, the output signal is mono ((left+right)/2 in both channels). -// At `w=1`, there is no effect (original stereo image). -// Thus, w between 0 and 1 varies stereo width from 0 to "original". -// -// #### Reference -// -// * "Applications of Blumlein Shuffling to Stereo Microphone Techniques" -// Michael A. Gerzon, JAES vol. 42, no. 6, June 1994 -//------------------------------------------------------------ -stereo_width(w) = shuffle : *(mgain),*(sgain) : shuffle -with { - shuffle = _,_ <: +,-; // normally scaled by 1/sqrt(2) for orthonormality, - mgain = 1-w/2; // but we pick up the needed normalization here. - sgain = w/2; -}; - -//===========================================Meshes======================================= -//======================================================================================== - - -// TODO: the following should be in physmodels.lib when it will be operational -// [JOS: I think a new "Meshes" section would fit well after Modal Percussions.] -//----------------------------------`(ef.)mesh_square`------------------------------ -// Square Rectangular Digital Waveguide Mesh. -// -// #### Usage -// -// ``` -// bus(4*N) : mesh_square(N) : bus(4*N); -// ``` -// -// Where: -// -// * `N`: number of nodes along each edge - a power of two (1,2,4,8,...) -// -// #### Reference -// -// -// -// #### Signal Order In and Out -// -// The mesh is constructed recursively using 2x2 embeddings. Thus, -// the top level of `mesh_square(M)` is a block 2x2 mesh, where each -// block is a `mesh(M/2)`. Let these blocks be numbered 1,2,3,4 in the -// geometry NW,NE,SW,SE, i.e., as -// 1 2 -// 3 4 -// Each block has four vector inputs and four vector outputs, where the -// length of each vector is `M/2`. Label the input vectors as Ni,Ei,Wi,Si, -// i.e., as the inputs from the North, East South, and West, -// and similarly for the outputs. Then, for example, the upper -// left input block of M/2 signals is labeled 1Ni. Most of the -// connections are internal, such as 1Eo -> 2Wi. The `8*(M/2)` input -// signals are grouped in the order -// 1Ni 2Ni -// 3Si 4Si -// 1Wi 3Wi -// 2Ei 4Ei -// and the output signals are -// 1No 1Wo -// 2No 2Eo -// 3So 3Wo -// 4So 4Eo -// or -// -// In: 1No 1Wo 2No 2Eo 3So 3Wo 4So 4Eo -// -// Out: 1Ni 2Ni 3Si 4Si 1Wi 3Wi 2Ei 4Ei -// -// Thus, the inputs are grouped by direction N,S,W,E, while the -// outputs are grouped by block number 1,2,3,4, which can also be -// interpreted as directions NW, NE, SW, SE. A simple program -// illustrating these orderings is `process = mesh_square(2);`. -// -// #### Example -// -// Reflectively terminated mesh impulsed at one corner: -// -// ``` -// mesh_square_test(N,x) = mesh_square(N)~(busi(4*N,x)) // input to corner -// with { busi(N,x) = bus(N) : par(i,N,*(-1)) : par(i,N-1,_), +(x); }; -// process = 1-1' : mesh_square_test(4); // all modes excited forever -// ``` -// -// In this simple example, the mesh edges are connected as follows: -// -// 1No -> 1Ni, 1Wo -> 2Ni, 2No -> 3Si, 2Eo -> 4Si, -// -// 3So -> 1Wi, 3Wo -> 3Wi, 4So -> 2Ei, 4Eo -> 4Ei -// -// A routing matrix can be used to obtain other connection geometries. -//------------------------------------------------------------ -// four-port scattering junction: -mesh_square(1) = - si.bus(4) <: par(i,4,*(-1)), (si.bus(4) :> (*(.5)) <: si.bus(4)) :> si.bus(4); - -// rectangular NxN square waveguide mesh: -mesh_square(N) = si.bus(4*N) : (route_inputs(N/2) : par(i,4,mesh_square(N/2))) - ~(prune_feedback(N/2)) - : prune_outputs(N/2) : route_outputs(N/2) : si.bus(4*N) -with { - // select block i of N, block size = M: - s(i,N,M) = par(j, M*N, Sv(i, j)) - with { Sv(i,i) = si.bus(N); Sv(i,j) = si.block(N); }; - - // prune mesh outputs down to the signals which make it out: - prune_outputs(N) - = si.bus(16*N) : - si.block(N), si.bus(N), si.block(N), si.bus(N), - si.block(N), si.bus(N), si.bus(N), si.block(N), - si.bus(N), si.block(N), si.block(N), si.bus(N), - si.bus(N), si.block(N), si.bus(N), si.block(N) - : si.bus(8*N); - - // collect mesh outputs into standard order (N,W,E,S): - route_outputs(N) - = si.bus(8*N) - <: s(4,N,8),s(5,N,8), s(0,N,8),s(2,N,8), - s(3,N,8),s(7,N,8), s(1,N,8),s(6,N,8) - : si.bus(8*N); - - // collect signals used as feedback: - prune_feedback(N) = si.bus(16*N) : - si.bus(N), si.block(N), si.bus(N), si.block(N), - si.bus(N), si.block(N), si.block(N), si.bus(N), - si.block(N), si.bus(N), si.bus(N), si.block(N), - si.block(N), si.bus(N), si.block(N), si.bus(N) : - si.bus(8*N); - - // route mesh inputs (feedback, external inputs): - route_inputs(N) = si.bus(8*N), si.bus(8*N) - <:s(8,N,16),s(4,N,16), s(12,N,16),s(3,N,16), - s(9,N,16),s(6,N,16), s(1,N,16),s(14,N,16), - s(0,N,16),s(10,N,16), s(13,N,16),s(7,N,16), - s(2,N,16),s(11,N,16), s(5,N,16),s(15,N,16) - : si.bus(16*N); -}; - -//--------------------`(ef.)reverseEchoN(nChans,delay)`------------------- -// Reverse echo effect -// -// #### Usage -// -// ``` -// _ : ef.reverseEchoN(N,delay) : si.bus(N) -// ``` -// -// Where: -// -// * `N`: Number of channels desired (1 or more) -// * `delay`: echo delay (integer power of 2) -// -// #### Demo -// -// ``` -// _ : dm.reverseEchoN(N) : _,_ -// ``` -// -// #### Description -// -// The effect uses N instances of reverseDelayRamped at different phases. -// -//------------------------------------------------------------ -reverseEchoN(N,delMax) = _<: par(i,N,ef.reverseDelayRamped(delMax,i/N)); - -//-------------------`(ef.)reverseDelayRamped(delay,phase)`------------------ -// Reverse delay with amplitude ramp -// -// #### Usage -// -// ``` -// _ : ef.reverseDelayRamped(delay,phase) : _ -// ``` -// -// Where: -// -// * `delay`: echo delay (integer power of 2) -// * `phase`: float between 0 and 1 giving ramp delay phase*delay -// -// #### Demo -// -// ``` -// _ : dm.reverseEchoN(N) : _,_ -// ``` -// -//------------------------------------------------------------ -reverseDelayRamped(delMax,phs) = rampGain * de.delay(delMax,del) with { - rampGain = 4 * (del/delMax) * (1 - del/delMax); // suppress click when delay-line wraps around - delOffset = int(floor(0.5 + delMax * max(0,min(0.999999,phs)))); // starting point in delay line - startPulse = (1-1') * delOffset; - del = int(startPulse : + ~ +(2)) & (delMax-1); -}; - -//-------------------`(ef.)uniformPanToStereo(nChans)`------------------ -// Pan nChans channels to the stereo field, spread uniformly left to right -// -// #### Usage -// -// ``` -// si.bus(N) : ef.uniformPanToStereo(N) : _,_ -// ``` -// -// Where: -// -// * `N`: Number of input channels to pan down to stereo -// -// #### Demo -// -// ``` -// _ : dm.reverseEchoN(N) : _,_ -// ``` -// -//------------------------------------------------------------ -uniformPanToStereo(N) = si.bus(N) <: par(i,2*N,_) : - (par(i,N,*(i/(N-1))) :> _), - (par(i,N,*(1-i/(N-1))) :> _); - -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -//========================================Time Based====================================== -//======================================================================================== - -//----------`(ef.)echo`---------- -// A simple echo effect. -// -// `echo` is a standard Faust function -// -// #### Usage -// -// ``` -// _ : echo(maxDuration,duration,feedback) : _ -// ``` -// -// Where: -// -// * `maxDuration`: the max echo duration in seconds -// * `duration`: the echo duration in seconds -// * `feedback`: the feedback coefficient -//---------------------------------------------------- -// TODO: author RM -echo(maxDuration,duration,feedback) = +~de.delay(maxDel,del)*feedback -with{ - maxDel = ma.SR*maxDuration; - del = ma.SR*duration; -}; - -// TODO demo function for echo - -//=======================================Pitch Shifting=================================== -//======================================================================================== - -//--------------`(ef.)transpose`---------------- -// A simple pitch shifter based on 2 delay lines. -// `transpose` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : transpose(w, x, s) : _ -// ``` -// -// Where: -// -// * `w`: the window length (samples) -// * `x`: crossfade duration duration (samples) -// * `s`: shift (semitones) -//----------------------------------------- -transpose(w, x, s, sig) = de.fdelay(maxDelay,d,sig)*ma.fmin(d/x,1) + - de.fdelay(maxDelay,d+w,sig)*(1-ma.fmin(d/x,1)) -with { - maxDelay = 65536; - i = 1 - pow(2, s/12); - d = i : (+ : +(w) : fmod(_,w)) ~ _; -}; - -//////////////////////////////////Deprecated Functions//////////////////////////////////// -// This section implements functions that used to be in music.lib but that are now -// considered as "deprecated". -////////////////////////////////////////////////////////////////////////////////////////// - -echo1s = vgroup("echo 1000", +~(de.delay(65536, int(hslider("millisecond", 0, 0, 1000, 0.10)*ba.millisec)-1) * (hslider("feedback", 0, 0, 100, 0.1)/100.0))); -echo2s = vgroup("echo 2000", +~(de.delay(131072, int(hslider("millisecond", 0, 0, 2000, 0.25)*ba.millisec)-1) * (hslider("feedback", 0, 0, 100, 0.1)/100.0))); -echo5s = vgroup("echo 5000", +~(de.delay(262144, int(hslider("millisecond", 0, 0, 5000, 0.50)*ba.millisec)-1) * (hslider("feedback", 0, 0, 100, 0.1)/100.0))); -echo10s = vgroup("echo 10000", +~(de.delay(524288, int(hslider("millisecond", 0, 0, 10000, 1.00)*ba.millisec)-1) * (hslider("feedback", 0, 0, 100, 0.1)/100.0))); -echo21s = vgroup("echo 21000", +~(de.delay(1048576, int(hslider("millisecond", 0, 0, 21000, 1.00)*ba.millisec)-1) * (hslider("feedback", 0, 0, 100, 0.1)/100.0))); -echo43s = vgroup("echo 43000", +~(de.delay(2097152, int(hslider("millisecond", 0, 0, 43000, 1.00)*ba.millisec)-1) * (hslider("feedback", 0, 0, 100, 0.1)/100.0))); diff --git a/dist/examples/LIBRARIES/noises.lib b/dist/examples/LIBRARIES/noises.lib deleted file mode 100644 index c68f7eb7..00000000 --- a/dist/examples/LIBRARIES/noises.lib +++ /dev/null @@ -1,296 +0,0 @@ -//##################################### noises.lib ######################################## -// Faust Noise Generator Library. Its official prefix is `no`. -//######################################################################################## - -ma = library("maths.lib"); -ba = library("basics.lib"); -fi = library("filters.lib"); -os = library("oscillators.lib"); -no = library("noises.lib"); // for compatible copy/paste out of this file - -declare name "Faust Noise Generator Library"; -declare version "0.0"; - -//=============================Functions Reference======================================== -//======================================================================================== - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -//-------`(no.)noise`---------- -// White noise generator (outputs random number between -1 and 1). -// `Noise` is a standard Faust function. -// -// #### Usage -// -// ``` -// noise : _ -// ``` -//------------------------ -noise = random / RANDMAX -with{ - mask = 4294967295; // 2^32-1 - random = +(12345) ~ *(1103515245) & mask; // "linear congruential" - RANDMAX = 2147483647.0; // = 2^31-1 = MAX_SIGNED_INT in 32 bits -}; - -//---------------------`(no.)multirandom`-------------------------- -// Generates multiple decorrelated random numbers in parallel. -// -// #### Usage -// ``` -// multirandom(n) : si.bus(n) -// ``` -// -// Where: -// -// * `n`: the number of decorrelated random numbers in parallel -//------------------------------------------------------------- -multirandom(n) = randomize(n) ~_ -with { - randomize(1) = +(12345) : *(1103515245); - randomize(n) = randomize(1) <: randomize(n-1),_; -}; - -//-----------------------`(no.)multinoise`------------------------ -// Generates multiple decorrelated noises in parallel. -// -// #### Usage -// -// ``` -// multinoise(n) : si.bus(n) -// ``` -// -// Where: -// -// * `n`: the number of decorrelated random numbers in parallel -//------------------------------------------------------------ -multinoise(n) = multirandom(n) : par(i,n,/(RANDMAX)) : par(i,n,float) -with { - RANDMAX = 2147483647.0; -}; - -//-----------------------`(no.)noises`------------------------ -// TODO. -//---------------------------------------------------------- -noises(N,i) = multinoise(N) : ba.selector(i,N); - -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2017 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -All MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and/or Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees) - -************************************************************************/ - -//---------------------------`(no.)pink_noise`-------------------------- -// Pink noise (1/f noise) generator (third-order approximation) -// `pink_noise` is a standard Faust function. -// -// #### Usage -// -// ``` -// pink_noise : _; -// ``` -// -// #### Reference: -// -// -//------------------------------------------------------------ -pink_filter = fi.iir((0.049922035, -0.095993537, 0.050612699, -0.004408786), - (-2.494956002, 2.017265875, -0.522189400)); - -pink_noise = noise : pink_filter; - -pink_noise_m = pink_noise * 12.5; // Equalizes loudness to that of no.noise (thanks Mykle Hansen) - beware of clipping - -//-------------------------`(no.)pink_noise_vm`------------------- -// Multi pink noise generator. -// -// #### Usage -// -// ``` -// pink_noise_vm(N) : _; -// ``` -// -// Where: -// -// * `N`: number of latched white-noise processes to sum, -// not to exceed sizeof(int) in C++ (typically 32). -// -// #### References -// -// * -// * -//------------------------------------------------------------ -pink_noise_vm(N) = noise <: _,par(i,N,ba.latch(clock(i))) :> _ -with { - clock(i) = (ba.time>>i)&1; // i'th latch clock signal -}; - -//--------------------`(no.)lfnoise`, `(no.)lfnoise0` and `(no.)lfnoiseN`----------------- -// Low-frequency noise generators (Butterworth-filtered downsampled white noise). -// -// #### Usage -// -// ``` -// lfnoise0(rate) : _; // new random number every int(SR/rate) samples or so -// lfnoiseN(N,rate) : _; // same as "lfnoise0(rate) : lowpass(N,rate)" [see filters.lib] -// lfnoise(rate) : _; // same as "lfnoise0(rate) : seq(i,5,lowpass(N,rate))" (no overshoot) -// ``` -// -// #### Example -// -// (view waveforms in faust2octave): -// -// ``` -// rate = SR/100.0; // new random value every 100 samples (SR from music.lib) -// process = lfnoise0(rate), // sampled/held noise (piecewise constant) -// lfnoiseN(3,rate), // lfnoise0 smoothed by 3rd order Butterworth LPF -// lfnoise(rate); // lfnoise0 smoothed with no overshoot -// ``` -//------------------------------------------------------------ -lfnoise0(freq) = noise : ba.latch(os.oscrs(freq)); -lfnoiseN(N,freq) = lfnoise0(freq) : fi.lowpass(N,freq); // Nth-order Butterworth lowpass -lfnoise(freq) = lfnoise0(freq) : seq(i,5,fi.lowpass(1,freq)); // non-overshooting lowpass - -//-------------------------`(no.)sparse_noise_vm`------------------- -// sparse noise generator. -// -// #### Usage -// -// ``` -// sparse_noise(f0) : _; -// ``` -// -// Where: -// -// * ` f0`: average frequency of noise impulses per second -// -// Random impulses in the amplitude range -1 to 1 are generated -// at an average rate of f0 impulses per second. -// -// #### Reference -// -// * See velvet_noise -//------------------------------------------------------------ -sparse_noise(f0) = sn -with { - saw = os.lf_sawpos(f0); - sawdiff = saw - saw'; - e = float(no.noise); // float() keeps 4.656613e-10f scaling here instead of later - eHeld = e : ba.latch(sawdiff); - eHeldPos = 0.5 + 0.5 * eHeld; - crossed = (saw >= eHeldPos) * (saw' < eHeldPos); - sn = e' * float(crossed); -}; - -//-------------------------`(no.)velvet_noise_vm`------------------- -// velvet noise generator. -// -// #### Usage -// -// ``` -// velvet_noise(amp,f0) : _; -// ``` -// -// Where: -// -// * `amp`: amplitude of noise impulses (positive and negative) -// * ` f0`: average frequency of noise impulses per second -// -// #### Reference -// -// * Matti Karjalainen and Hanna Jarvelainen, -// "Reverberation Modeling Using Velvet Noise", -// in Proc. 30th Int. Conf. Intelligent Audio Environments (AES07), -// March 2007. -// -//------------------------------------------------------------ -velvet_noise(amp,f0) = vn -with { - sn = no.sparse_noise(f0); - vn = amp * ma.signum(sn); -}; - -//----------------------------`(no.)gnoise`------------------------ -// approximate zero-mean, unit-variance Gaussian white noise generator. -// -// #### Usage -// -// ``` -// gnoise(N) : _; -// ``` -// -// Where: -// -// * `N`: number of uniform random numbers added to approximate Gaussian white noise -// -// #### Reference -// -// * See Central Limit Theorem -// -//------------------------------------------------------------ -gnoise(N) = uvgwn -with { - uwn = no.multinoise(N); // uniform white noise in [-1,1] on N channels - gwn = uwn :> _; // sum of uniform approaches Gaussian by centeral limit thm - sigma = sqrt(N/3.0); // rms of each uwn channel - uvgwn = gwn / sigma; // approaches zero-mean, unit-variance Gaussian white noise, for large N -}; - -gnoisem(N) = gnoise(N) * 0.625; // Equalizes loudness to that of no.noise (thanks Mykle Hansen) - -/*** END jos section ***/ - -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ diff --git a/dist/examples/LIBRARIES/oscillators.lib b/dist/examples/LIBRARIES/oscillators.lib deleted file mode 100644 index 8bd08409..00000000 --- a/dist/examples/LIBRARIES/oscillators.lib +++ /dev/null @@ -1,1522 +0,0 @@ -//############################## oscillators.lib ###################################### -// This library contains a collection of sound generators. Its official prefix is `os`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Faust Oscillator Library"; -declare version "0.1"; - -ma = library("maths.lib"); -ba = library("basics.lib"); -fi = library("filters.lib"); - -// This library contains platform specific constants -pl = library("platform.lib"); - -//=========================Wave-Table-Based Oscillators=================================== -//======================================================================================== - - -//-----------------------`(os.)sinwaveform`------------------------ -// Sine waveform ready to use with a `rdtable`. -// -// #### Usage -// -// ``` -// sinwaveform(tablesize) : _ -// ``` -// -// Where: -// -// * `tablesize`: the table size -//------------------------------------------------------------ -sinwaveform(tablesize) = float(ba.time)*(2.0*ma.PI)/float(tablesize) : sin; - -//-----------------------`(os.)coswaveform`------------------------ -// Cosine waveform ready to use with a `rdtable`. -// -// #### Usage -// -// ``` -// coswaveform(tablesize) : _ -// ``` -// -// Where: -// -// * `tablesize`: the table size -//------------------------------------------------------------ -coswaveform(tablesize) = float(ba.time)*(2.0*ma.PI)/float(tablesize) : cos; - -//-----------------------`(os.)phasor`------------------------ -// A simple phasor to be used with a `rdtable`. -// `phasor` is a standard Faust function. -// -// #### Usage -// -// ``` -// phasor(tablesize,freq) : _ -// ``` -// -// Where: -// -// * `tablesize`: the table size -// * `freq`: the frequency of the phasor (Hz) -//------------------------------------------------------------ -phasor(tablesize,freq) = freq/float(ma.SR) : (+ : ma.decimal) ~ _ : *(float(tablesize)); - -//-----------------------`(os.)hs_phasor`------------------------ -// Hardsyncing phasor to be used with an `rdtable`. -// -// #### Usage -// -// ``` -// hs_phasor(tablesize,freq,c) : _ -// ``` -// -// Where: -// -// * `tablesize`: the table size -// * `freq`: the frequency of the phasor (Hz) -// * `c`: a clock signal, `c>0` resets phase to 0 -//--------------------------------------------------------- -// Author: Mike Olsen -hs_phasor(tablesize,freq,c) = inc : (+ : d)~(-(_<:(_,*(_,clk)))) : *(tablesize) -with { - clk = c>0; - d = ma.decimal; - inc = freq/float(ma.SR); -}; - -//-----------------------`(os.)hsp_phasor`------------------------ -// Hardsyncing phasor with selectable phase to be used with an `rdtable`. -// -// #### Usage -// -// ``` -// hsp_phasor(tablesize,freq,p,c) -// ``` -// -// Where: -// -// * `tablesize`: the table size -// * `freq`: the frequency of the phasor (Hz) -// * `p`: phase init (0 <= `p` <=1) -// * `c`: a clock signal, `c>0` resets phase to 0 -//--------------------------------------------------------- -// Author: Christophe Lebreton -hsp_phasor(tablesize,freq,p,c) = inc : (+ : d)~(-(_<:(_,*(_,clk))):+(clk*p)) : *(tablesize) -with { - clk = c>0; - d = ma.decimal; - inc = freq/float(ma.SR); -}; - -//-----------------------`(os.)oscsin`------------------------ -// Sine wave oscillator. -// `oscsin` is a standard Faust function. -// -// #### Usage -// -// ``` -// oscsin(freq) : _ -// ``` -// -// Where: -// -// * `freq`: the frequency of the wave (Hz) -//------------------------------------------------------------ -oscsin(freq) = rdtable(tablesize, sinwaveform(tablesize), int(phasor(tablesize,freq))) -with { - tablesize = pl.tablesize; -}; - -//-----------------------`(os.)hs_oscsin`------------------------ -// Sin lookup table with hardsyncing phase. -// -// #### Usage -// -// ``` -// hs_oscsin(freq,c) : _ -// ``` -// -// Where: -// -// * `freq`: the fundamental frequency of the phasor -// * `c`: a clock signal, `c>0` resets phase to 0 -//--------------------------------------------------------- -// Author: Mike Olsen -hs_oscsin(freq,c) = rdtable(tablesize, sinwaveform(tablesize), int(hs_phasor(tablesize,freq,c))) -with { - tablesize = pl.tablesize; -}; - -//-----------------------`(os.)osccos`------------------------ -// Cosine wave oscillator. -// -// #### Usage -// -// ``` -// osccos(freq) : _ -// ``` -// -// Where: -// -// * `freq`: the frequency of the wave (Hz) -//------------------------------------------------------------ -osccos(freq) = rdtable(tablesize, coswaveform(tablesize), int(phasor(tablesize,freq))) -with { - tablesize = pl.tablesize; -}; - -//-----------------------`(os.)oscp`------------------------ -// A sine wave generator with controllable phase. -// -// #### Usage -// -// ``` -// oscp(freq,phase) : _ -// ``` -// -// Where: -// -// * `freq`: the frequency of the wave (Hz) -// * `phase`: the phase in radian -//------------------------------------------------------------ -oscp(freq,phase) = oscsin(freq) * cos(phase) + osccos(freq) * sin(phase); - -//-----------------------`(os.)osci`------------------------ -// Interpolated phase sine wave oscillator. -// -// #### Usage -// -// ``` -// osci(freq) : _ -// ``` -// -// Where: -// -// * `freq`: the frequency of the wave (Hz) -//------------------------------------------------------------ -osci(freq) = s1 + d * (s2 - s1) -with { - tablesize = pl.tablesize; - i = int(phasor(tablesize,freq)); - d = ma.decimal(phasor(tablesize,freq)); - s1 = rdtable(tablesize+1,sinwaveform(tablesize),i); - s2 = rdtable(tablesize+1,sinwaveform(tablesize),i+1); -}; - -// end GRAME section -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2017 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -The MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees) - -************************************************************************/ - -//===============================LFOs=============================== -// Low-Frequency Oscillators (LFOs) have prefix `lf_` -// (no aliasing suppression, which is not audible at LF). -//================================================================== - -//--------`(os.)lf_imptrain`---------- -// Unit-amplitude low-frequency impulse train. -// `lf_imptrain` is a standard Faust function. -// -// #### Usage -// -// ``` -// lf_imptrain(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -//------------------------------------------------------------ -lf_imptrain(freq) = lf_sawpos(freq)<:-(mem)<0; // definition below - -//--------`(os.)lf_pulsetrainpos`---------- -// Unit-amplitude nonnegative LF pulse train, duty cycle between 0 and 1. -// -// -// #### Usage -// -// ``` -// lf_pulsetrainpos(freq,duty) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -// * `duty`: duty cycle between 0 and 1 -//------------------------------------------------------------ -lf_pulsetrainpos(freq,duty) = float(lf_sawpos(freq) <= duty); - -//pulsetrainpos = lf_pulsetrainpos; // for backward compatibility - -//--------`(os.)lf_pulsetrain`---------- -// Unit-amplitude zero-mean LF pulse train, duty cycle between 0 and 1. -// -// #### Usage -// -// ``` -// lf_pulsetrain(freq,duty) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -// * `duty`: duty cycle between 0 and 1 -//------------------------------------------------------------ -lf_pulsetrain(freq,duty) = 2.0*lf_pulsetrainpos(freq,duty) - 1.0; - -//--------`(os.)lf_squarewavepos`---------- -// Positive LF square wave in [0,1] -// -// #### Usage -// -// ``` -// lf_squarewavepos(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -//------------------------------------------------------------ -lf_squarewavepos(freq) = lf_pulsetrainpos(freq,0.5); -// squarewavepos = lf_squarewavepos; // for backward compatibility - - -//--------`(os.)lf_squarewave`---------- -// Zero-mean unit-amplitude LF square wave. -// `lf_squarewave` is a standard Faust function. -// -// #### Usage -// -// ``` -// lf_squarewave(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -//------------------------------------------------------------ -lf_squarewave(freq) = 2*lf_squarewavepos(freq) - 1; -// squarewave = lf_squarewave; // for backward compatibility - - -//--------`(os.)lf_trianglepos`---------- -// Positive unit-amplitude LF positive triangle wave. -// -// #### Usage -// -// ``` -// lf_trianglepos(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -//------------------------------------------------------------ -lf_trianglepos(freq) = 1-abs(saw1(freq)); // saw1 defined below - -//----------`(os.)lf_triangle`---------- -// Positive unit-amplitude LF triangle wave -// `lf_triangle` is a standard Faust function. -// -// #### Usage -// -// ``` -// lf_triangle(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency in Hz -//------------------------------------------------------------ -// Author: Bart Brouns -// License: STK-4.3 -lf_triangle(freq) = 2*lf_trianglepos(freq) - 1; - -//================== Low Frequency Sawtooths ==================== -// Sawtooth waveform oscillators for virtual analog synthesis et al. -// The 'simple' versions (`lf_rawsaw`, `lf_sawpos` and `saw1`), are mere samplings of -// the ideal continuous-time ("analog") waveforms. While simple, the -// aliasing due to sampling is quite audible. The differentiated -// polynomial waveform family (`saw2`, `sawN`, and derived functions) -// do some extra processing to suppress aliasing (not audible for -// very low fundamental frequencies). According to Lehtonen et al. -// (JASA 2012), the aliasing of `saw2` should be inaudible at fundamental -// frequencies below 2 kHz or so, for a 44.1 kHz sampling rate and 60 dB SPL -// presentation level; fundamentals 415 and below required no aliasing -// suppression (i.e., `saw1` is ok). -//===================================================================== - -//-----------------`(os.)lf_rawsaw`-------------------- -// Simple sawtooth waveform oscillator between 0 and period in samples. -// -// #### Usage -// -// ``` -// lf_rawsaw(periodsamps) -// ``` -// -// Where: -// -// * `periodsamps`: number of periods per samples -//--------------------------------------------------------- -lf_rawsaw(periodsamps) = (_,periodsamps : fmod) ~ +(1.0); - -//-----------------`(os.)lf_sawpos_phase`-------------------- -// Simple sawtooth waveform oscillator between 0 and 1 -// with phase control. -// -// #### Usage -// -// ``` -// lf_sawpos_phase(phase,freq) -// ``` -// -// Where: -// -// * `phase`: phase -// * `freq`: frequency -//--------------------------------------------------------- -lf_sawpos_phase(phase,freq) = (+(phase-phase') : ma.frac) ~ +(freq/ma.SR); - -//-----------------`(os.)lf_sawpos`-------------------- -// Simple sawtooth waveform oscillator between 0 and 1. -// -// #### Usage -// -// ``` -// lf_sawpos(freq) -// ``` -// -// Where: -// -// * `freq`: frequency -// -//--------------------------------------------------------- -// Author: Bart Brouns -// License: STK-4.3 -// MarkDown: Romain Michon -lf_sawpos(freq) = ma.frac ~ +(freq/ma.SR); - -//-----------------`(os.)lf_sawpos_reset`-------------------- -// Simple sawtooth waveform oscillator between 0 and 1. -// with reset. -// -// #### Usage -// -// ``` -// lf_sawpos_reset(freq,reset) -// ``` -// -// Where: -// -// * `freq`: frequency -// * `reset`: reset the oscillator to 0 -// -//--------------------------------------------------------- -// Author: Bart Brouns -// License: STK-4.3 -lf_sawpos_reset(freq,reset) = ma.frac * (reset == 0) ~ +(freq/ma.SR); - -//-----------------`(os.)lf_sawpos_phase_reset`-------------------- -// Simple sawtooth waveform oscillator between 0 and 1. -// with phase control and reset. -// -// #### Usage -// -// ``` -// lf_sawpos_phase_reset(freq,phase,reset) -// ``` -// -// Where: -// -// * `freq`: frequency -// * `phase`: phase between 0 and 1 -// * `reset`: reset the oscillator to 0 -// -//--------------------------------------------------------- -// Author: Bart Brouns -// License: STK-4.3 -lf_sawpos_phase_reset(freq,phase,reset) = lf_sawpos_reset(freq,reset) + phase : ma.frac; - -//-----------------`(os.)lf_saw`-------------------- -// Simple sawtooth waveform. -// `lf_saw` is a standard Faust function. -// -// #### Usage -// -// ``` -// lf_saw(freq) -// ``` -// -// Where: -// -// * `freq`: frequency -//--------------------------------------------------------- -// Author: Bart Brouns -// License: STK-4.3 -saw1(freq) = 2.0 * lf_sawpos(freq) - 1.0; -lf_saw(freq) = saw1(freq); - -//================== Bandlimited Sawtooth ==================== -//-----------------`(os.)sawN`-------------------- -// Bandlimited Sawtooth -// -// `sawN(N,freq)`, `sawNp`, `saw2dpw(freq)`, `saw2(freq)`, `saw3(freq)`, -// `saw4(freq)`, `saw5(freq)`, `saw6(freq)`, `sawtooth(freq)`, `saw2f2(freq)` -// `saw2f4(freq)` -// -// #### Method 1 (`saw2`) -// -// Polynomial Transition Regions (PTR) (for aliasing suppression). -// -// ##### References -// -// * Kleimola, J.; Valimaki, V., "Reducing Aliasing from Synthetic Audio -// Signals Using Polynomial Transition Regions," in Signal Processing -// Letters, IEEE , vol.19, no.2, pp.67-70, Feb. 2012 -// * -// * -// -// #### Method 2 (`sawN`) -// -// Differentiated Polynomial Waves (DPW) (for aliasing suppression). -// -// ##### Reference -// -// "Alias-Suppressed Oscillators based on Differentiated Polynomial Waveforms", -// Vesa Valimaki, Juhan Nam, Julius Smith, and Jonathan Abel, -// IEEE Tr. Acoustics, Speech, and Language Processing (IEEE-ASLP), -// Vol. 18, no. 5, May 2010. -// -// #### Other Cases -// -// Correction-filtered versions of `saw2`: `saw2f2`, `saw2f4` -// The correction filter compensates "droop" near half the sampling rate. -// See reference for sawN. -// -// #### Usage -// -// ``` -// sawN(N,freq) : _ -// sawNp(N,freq,phase) : _ -// saw2dpw(freq) : _ -// saw2(freq) : _ -// saw3(freq) : _ // based on sawN -// saw4(freq) : _ // based on sawN -// saw5(freq) : _ // based on sawN -// saw6(freq) : _ // based on sawN -// sawtooth(freq) : _ // = saw2 -// saw2f2(freq) : _ -// saw2f4(freq) : _ -// ``` -// -// Where: -// -// * `N`: polynomial order -// * `freq`: frequency in Hz -// * `phase`: phase -//=================================================================== -// --- sawN for N = 1 to 6 --- -//We can do 6, but 5 and 6 have noise at low fundamentals: MAX_SAW_ORDER = 6; MAX_SAW_ORDER_NEXTPOW2 = 8; -MAX_SAW_ORDER = 4; MAX_SAW_ORDER_NEXTPOW2 = 8; // par cannot handle the case of 0 elements -sawN(N,freq) = saw1l : poly(Nc) : D(Nc-1) : gate(Nc-1) -with { - Nc = max(1,min(N,MAX_SAW_ORDER)); - clippedFreq = max(20.0,abs(freq)); // use lf_sawpos(freq) for LFOs (freq < 20 Hz) - saw1l = 2*lf_sawpos(clippedFreq) - 1; // zero-mean, amplitude +/- 1 - // Also note the availability of lf_sawpos_phase above. - poly(1,x) = x; - poly(2,x) = x*x; - poly(3,x) = x*x*x - x; - poly(4,x) = x*x*(x*x - 2.0); - poly(5,x) = x*(7.0/3 + x*x*(-10.0/3.0 + x*x)); - poly(6,x) = x*x*(7.0 + x*x*(-5.0 + x*x)); - p0n = float(ma.SR)/clippedFreq; // period in samples - diff1(x) = (x - x')/(2.0/p0n); - diff(N) = seq(n,N,diff1); // N diff1s in series - factorial(0) = 1; - factorial(i) = i * factorial(i-1); - D(0) = _; - D(i) = diff(i)/factorial(i+1); - gate(N) = *(1@(N)); // delayed step for blanking startup glitch -}; - -//------------------`(os.)sawNp`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -// --- sawNp for N = 1 to 6 --- -// Phase offset = delay (max 8191 samples is more than one period of audio): -sawNp(N,freq,phase) = sawN(N,freq) : @(max(0,min(8191,int(phase*ma.SR/freq)))); - -// Special named cases: - -//------------------`(os.)saw2dpw`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -// --- sawN --- -saw2dpw(freq) = saw1(freq) <: * <: -(mem) : *(0.25'*ma.SR/freq); // inferior to saw2 below - -//------------------`(os.)saw3`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -saw3 = sawN(3); saw4 = sawN(4); saw5 = sawN(5); saw6 = sawN(6); - -//------------------`(os.)sawtooth`-------------------------------- -// Alias-free sawtooth wave. 2nd order interpolation (based -// on `saw2`). -// `sawtooth` is a standard Faust function. -// -// #### Usage -// -// ``` -// sawtooth(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -//-------------------------------------------------------- -saw2(freq) = y with { // newer PTR version (stateless - freq can vary at any speed) - p0 = float(ma.SR)/float(max(ma.EPSILON,abs(freq))); // period in samples - t0 = 1.0/p0; // phase increment - p = ((_<:(-(1)<:_,_),_) <: selector1,selector2) ~(+(t0)):!,_; - selector1 = select2(<(0)); // for feedback - selector2 = select2(<(0), (_<:_,(*(1-p0):+(1)):+), _); // for output - y = 2*p-1; -}; -// --- sawtooth --- -sawtooth = saw2; // default choice for sawtooth signal - see also sawN - -//------------------`(os.)saw2f2`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -// --- Correction-filtered versions of saw2: saw2f2, saw2f4 ---- -// The correction filter compensates "droop" near half the sampling rate. -// See reference for sawN. -saw2f2 = saw2 : cf2 with { - cf2 = fi.tf2(1.155704605878911, 0.745184288225518,0.040305967265900, - 0.823765146386639, 0.117420665547108); -}; - -//------------------`(os.)saw2f4`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -saw2f4 = saw2 : cf4 with { - cf4 = fi.iir((1.155727435125014, 2.285861038554662, - 1.430915027294021, 0.290713280893317, 0.008306401748854), - (2.156834679164532, 1.559532244409321, 0.423036498118354, - 0.032080681130972)); -}; - -//=========Bandlimited Pulse, Square, and Impulse Trains============ -// Bandlimited Pulse, Square, and Impulse Trains. -// -// `pulsetrainN`, `pulsetrain`, `squareN`, `square`, `imptrain`, `imptrainN`, -// `triangle`, `triangleN` -// -// All are zero-mean and meant to oscillate in the audio frequency range. -// Use simpler sample-rounded lf_* versions above for LFOs. -// -// #### Usage -// -// ``` -// pulsetrainN(N,freq,duty) : _ -// pulsetrain(freq, duty) : _ // = pulsetrainN(2) -// squareN(N, freq) : _ -// square : _ // = squareN(2) -// imptrainN(N,freq) : _ -// imptrain : _ // = imptrainN(2) -// triangleN(N,freq) : _ -// triangle : _ // = triangleN(2) -// ``` -// -// Where: -// -// * `N`: polynomial order -// * `freq`: frequency in Hz -//==================================================================== - -//------------------`(os.)pulsetrainN`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -pulsetrainN(N,freq,duty) = diffdel(sawN(N,freqC),del) with { - // non-interpolated-delay version: diffdel(x,del) = x - x@int(del+0.5); - // linearly interpolated delay version (sounds good to me): - diffdel(x,del) = x-x@int(del)*(1-ma.frac(del))-x@(int(del)+1)*ma.frac(del); - // Third-order Lagrange interpolated-delay version (see filters.lib): - // diffdel(x,del) = x - fdelay3(DELPWR2,max(1,min(DELPWR2-2,ddel))); - DELPWR2 = 2048; // Needs to be a power of 2 when fdelay*() used above. - delmax = DELPWR2-1; // arbitrary upper limit on diff delay (duty=0.5) - SRmax = 96000.0; // assumed upper limit on sampling rate - fmin = SRmax / float(2.0*delmax); // 23.4 Hz (audio freqs only) - freqC = max(freq,fmin); // clip frequency at lower limit - period = (float(ma.SR) / freqC); // actual period - ddel = duty * period; // desired delay - del = max(0,min(delmax,ddel)); -}; - -//------------------`(os.)pulsetrain`-------------------------------- -// Bandlimited pulse train oscillator. Based on `pulsetrainN(2)`. -// `pulsetrain` is a standard Faust function. -// -// #### Usage -// -// ``` -// pulsetrain(freq, duty) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// * `duty`: duty cycle between 0 and 1 -//-------------------------------------------------------- -pulsetrain = pulsetrainN(2); - -//------------------`(os.)squareN`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -squareN(N,freq) = pulsetrainN(N,freq,0.5); - -//------------------`(os.)square`-------------------------------- -// Bandlimited square wave oscillator. Based on `squareN(2)`. -// `square` is a standard Faust function. -// -// #### Usage -// -// ``` -// square(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -//-------------------------------------------------------- -square = squareN(2); - -//------------------`(os.)impulse`-------------------------------- -// One-time impulse generated when the Faust process is started. -// `impulse` is a standard Faust function. -// -// #### Usage -// -// ``` -// impulse : _ -// ``` -//-------------------------------------------------------- -impulse = 1-1'; - -//------------------`(os.)imptrainN`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -imptrainN(N,freq) = impulse + 0.5*ma.diffn(sawN(N,freq)); - - -//------------------`(os.)imptrain`-------------------------------- -// Bandlimited impulse train generator. Based on `imptrainN(2)`. -// `imptrain` is a standard Faust function. -// -// #### Usage -// -// ``` -// imptrain(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -//-------------------------------------------------------- -imptrain = imptrainN(2); // default based on saw2 - -//------------------`(os.)triangleN`-------------------------------- -// TODO: MarkDown doc in comments -//-------------------------------------------------------- -triangleN(N,freq) = squareN(N,freq) : fi.pole(p) : *(gain) with { - gain = 4.0*freq/ma.SR; // for aproximate unit peak amplitude - p = 0.999; -}; - -//------------------`(os.)triangle`-------------------------------- -// Bandlimited triangle wave oscillator. Based on `triangleN(2)`. -// `triangle` is a standard Faust function. -// -// #### Usage -// -// ``` -// triangle(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -//-------------------------------------------------------- -triangle = triangleN(2); // default based on saw2 - -//===============================Filter-Based Oscillators================================= -// Filter-Based Oscillators -// -// #### Usage -// -// ``` -// osc[b|r|rs|rc|s|w](f), where f = frequency in Hz. -// ``` -// -// #### References -// -// * -// * -//======================================================================================== - -//--------------------------`(os.)oscb`-------------------------------- -// Sinusoidal oscillator based on the biquad. -// -// #### Usage -// -// ``` -// oscb(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -//------------------------------------------------------------ -oscb(f) = impulse : fi.tf2(1,0,0,a1,1) -with { - a1 = -2*cos(2*ma.PI*f/ma.SR); -}; - - -//--------------------------`(os.)oscrq`--------------------------- -// Sinusoidal (sine and cosine) oscillator based on 2D vector rotation, -// = undamped "coupled-form" resonator -// = lossless 2nd-order normalized ladder filter. -// -// #### Usage -// -// ``` -// oscrq(freq) : _,_ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscrq(f) = impulse : fi.nlf2(f,1); // sine and cosine outputs - -//--------------------------`(os.)oscrs`--------------------------- -// Sinusoidal (sine) oscillator based on 2D vector rotation, -// = undamped "coupled-form" resonator -// = lossless 2nd-order normalized ladder filter. -// -// #### Usage -// -// ``` -// oscrs(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscrs(f) = impulse : fi.nlf2(f,1) : _,!; // sine - -//--------------------------`(os.)oscrc`--------------------------- -// Sinusoidal (cosine) oscillator based on 2D vector rotation, -// = undamped "coupled-form" resonator -// = lossless 2nd-order normalized ladder filter. -// -// #### Usage -// -// ``` -// oscrc(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscrc(f) = impulse : fi.nlf2(f,1) : !,_; // cosine - -oscrp(f,p) = oscrq(f) : *(cos(p)), *(sin(p)) : + ; // p=0 for sine, p=PI/2 for cosine, etc. -oscr = oscrs; // default = sine (starts without a pop) - -//--------------------------`(os.)oscs`-------------------------------- -// Sinusoidal oscillator based on the state variable filter -// = undamped "modified-coupled-form" resonator -// = "magic circle" algorithm used in graphics. -//------------------------------------------------------------ -oscs(f) = (*(-1) : sint(wn) : sintp(wn,impulse)) ~ _ -with { - wn = 2*ma.PI*f/ma.SR; // approximate - // wn = 2*sin(PI*f/SR); // exact - sint(x) = *(x) : + ~ _ ; // frequency-scaled integrator - sintp(x,y) = *(x) : +(y): + ~ _ ; // same + state input -}; - -//-----------------------`(os.)osc`------------------------ -// Default sine wave oscillator (same as [oscsin](#oscsin)). -// `osc` is a standard Faust function. -// -// #### Usage -// -// ``` -// osc(freq) : _ -// ``` -// -// Where: -// -// * `freq`: the frequency of the wave (Hz) -//------------------------------------------------------------ -osc = oscsin; - -//================ Waveguide-Resonator-Based Oscillators ================ -// Sinusoidal oscillator based on the waveguide resonator `wgr`. -//======================================================================= - -//-----------------`(os.)oscw`-------------------- -// Sinusoidal oscillator based on the waveguide resonator `wgr`. Unit-amplitude -// cosine oscillator. -// -// #### Usage -// -// ``` -// oscwc(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscwc(fr) = impulse : fi.wgr(fr,1) : _,!; // cosine (cheapest at 1 mpy/sample) - -//-----------------`(os.)oscws`-------------------- -// Sinusoidal oscillator based on the waveguide resonator `wgr`. Unit-amplitude -// sine oscillator. -// -// #### Usage -// -// ``` -// oscws(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscws(fr) = impulse : fi.wgr(fr,1) : !,_; // sine (needs a 2nd scaling mpy) - -//-----------------`(os.)oscwq`-------------------- -// Sinusoidal oscillator based on the waveguide resonator `wgr`. -// Unit-amplitude cosine and sine (quadrature) oscillator. -// -// #### Usage -// -// ``` -// oscwq(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscq(fr) = impulse : fi.wgr(fr,1); // phase quadrature outputs - -//-----------------`(os.)oscw`-------------------- -// Sinusoidal oscillator based on the waveguide resonator `wgr`. -// Unit-amplitude cosine oscillator (default). -// -// #### Usage -// -// ``` -// oscw(freq) : _ -// ``` -// -// Where: -// -// * `freq`: frequency -// -// #### Reference -// -// * -//------------------------------------------------------------ -oscw = oscwc; - -// end jos section -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ - -//===================== Casio CZ Oscillators ========================== -// Oscillators that mimic some of the Casio CZ oscillators. -// -// There are two sets: -// - A set with an index parameter -// - A set with a res parameter -// -// The "index oscillators" outputs a sine wave at index=0 and gets brighter with a higher index. -// There are two versions of the "index oscillators": -// - with P appended to the name: is phase aligned with 'fund:sin' -// - without P appended to the name: has the phase of the original CZ oscillators -// -// The "res oscillators" have a resonant frequency. -// "res" is the frequency of resonance as a factor of the fundamental pitch. -//===================================================================== - -//----------`(os.)CZsaw`---------- -// Oscillator that mimics the Casio CZ saw oscillator -// `CZsaw` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZsaw(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = saw-wave -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZsaw(fund, index) = CZ.sawChooseP(fund, index, 0); - -//----------`(os.)CZsawP`---------- -// Oscillator that mimics the Casio CZ saw oscillator, -// with it's phase aligned to `fund:sin`. -// `CZsawP` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZsawP(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = saw-wave -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZsawP(fund, index) = CZ.sawChooseP(fund, index, 1); - -//----------`(os.)CZsquare`---------- -// Oscillator that mimics the Casio CZ square oscillator -// `CZsquare` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZsquare(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = square-wave -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZsquare(fund, index) = CZ.squareChooseP(fund, index, 0); - -//----------`(os.)CZsquareP`---------- -// Oscillator that mimics the Casio CZ square oscillator, -// with it's phase aligned to `fund:sin`. -// `CZsquareP` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZsquareP(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = square-wave -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZsquareP(fund, index) = CZ.squareChooseP(fund, index, 1); - -//----------`(os.)CZpulse`---------- -// Oscillator that mimics the Casio CZ pulse oscillator -// `CZpulse` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZpulse(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 gives a sine-wave, 1 is closer to a pulse -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZpulse(fund, index) = CZ.pulseChooseP(fund, index, 0); - -//----------`(os.)CZpulseP`---------- -// Oscillator that mimics the Casio CZ pulse oscillator, -// with it's phase aligned to `fund:sin`. -// `CZpulseP` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZpulseP(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 gives a sine-wave, 1 is closer to a pulse -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZpulseP(fund, index) = CZ.pulseChooseP(fund, index, 1); - -//----------`(os.)CZsinePulse`---------- -// Oscillator that mimics the Casio CZ sine/pulse oscillator -// `CZsinePulse` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZsinePulse(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 gives a sine-wave, 1 is a sine minus a pulse -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZsinePulse(fund, index) = CZ.sinePulseChooseP(fund, index, 0); - -//----------`(os.)CZsinePulseP`---------- -// Oscillator that mimics the Casio CZ sine/pulse oscillator, -// with it's phase aligned to `fund:sin`. -// `CZsinePulseP` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZsinePulseP(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 gives a sine-wave, 1 is a sine minus a pulse -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZsinePulseP(fund, index) = CZ.sinePulseChooseP(fund, index, 1); - -//----------`(os.)CZhalfSine`---------- -// Oscillator that mimics the Casio CZ half sine oscillator -// `CZhalfSine` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZhalfSine(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 gives a sine-wave, 1 is somewhere between a saw and a square -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZhalfSine(fund, index) = CZ.halfSineChooseP(fund, index, 0); - -//----------`(os.)CZhalfSineP`---------- -// Oscillator that mimics the Casio CZ half sine oscillator, -// with it's phase aligned to `fund:sin`. -// `CZhalfSineP` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZhalfSineP(fund,index) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `index`: the brightness of the oscillator, 0 gives a sine-wave, 1 is somewhere between a saw and a square -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZhalfSineP(fund, index) = CZ.halfSineChooseP(fund, index, 1); - -//----------`(os.)CZresSaw`---------- -// Oscillator that mimics the Casio CZ resonant saw-tooth oscillator -// `CZresSaw` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZresSaw(fund,res) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `res`: the frequency of resonance as a factor of the fundamental pitch. -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZresSaw(fund,res) = CZ.resSaw(fund,res); - -//----------`(os.)CZresTriangle`---------- -// Oscillator that mimics the Casio CZ resonant triangle oscillator -// `CZresTriangle` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZresTriangle(fund,res) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `res`: the frequency of resonance as a factor of the fundamental pitch. -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZresTriangle(fund,res) = CZ.resTriangle(fund,res); - -//----------`(os.)CZresTrap`---------- -// Oscillator that mimics the Casio CZ resonant trapeze oscillator -// `CZresTrap` is a standard Faust function. -// -// #### Usage -// -// ``` -// CZresTrap(fund,res) : _ -// ``` -// -// Where: -// -// * `fund`: a saw-tooth waveform between 0 and 1 that the oscillator slaves to -// * `res`: the frequency of resonance as a factor of the fundamental pitch. -//------------------------------------------------------------ -// Author: Bart Brouns -// License: GPLv3 -// CZ oscillators by Mike Moser-Booth: -// -// Ported from pd to Faust by Bart Brouns - -CZresTrap(fund, res) = CZ.resTrap(fund, res); - -CZ = environment { - - saw(fund, index) = sawChooseP(fund, index, 0); - sawP(fund, index) = sawChooseP(fund, index, 1); - sawChooseP(fund, index, p) = - (((FUND(fund,align,p)*((.5-INDEX)/INDEX)),(-1*FUND(fund,align,p)+1)*((.5-INDEX)/(1-INDEX))):min+FUND(fund,align,p))*2*ma.PI:cos - with { - INDEX = (.5-(index*.5)):max(0.01):min(0.5); - align = si.interpolate(index, 0.75, 0.5); - }; - - square(fund, index) = squareChooseP(fund, index, 0); - squareP(fund, index) = squareChooseP(fund, index, 1); - squareChooseP(fund, index, p) = (FUND(fund,align,p)>=0.5), (ma.decimal((FUND(fund,align,p)*2)+1)<:_-min(_,(-1*_+1)*((INDEX)/(1-INDEX)))) :+ *ma.PI:cos - with { - INDEX = (index:pow(0.25)):max(0):min(1); - align = si.interpolate(INDEX, -0.25, 0); - }; - - pulse(fund, index) = pulseChooseP(fund, index, 0); - pulseP(fund, index) = pulseChooseP(fund, index, 1); - pulseChooseP(fund, index, p) = ((FUND(fund,align,p)-min(FUND(fund,align,p),((-1*FUND(fund,align,p)+1)*(INDEX/(1-INDEX)))))*2*ma.PI):cos - with { - INDEX = index:min(0.99):max(0); - align = si.interpolate(index, -0.25, 0.0); - }; - - sinePulse(fund, index) = sinePulseChooseP(fund, index, 0); - sinePulseP(fund, index) = sinePulseChooseP(fund, index, 1); - sinePulseChooseP(fund, index, p) = (min(FUND(fund,align,p)*((0.5-INDEX)/INDEX),(-1*FUND(fund,align,p)+1)*((.5-INDEX)/(1-INDEX)))+FUND(fund,align,p))*4*ma.PI:cos - with { - INDEX = ((index*-0.49)+0.5); - align = si.interpolate(index, -0.125, -0.25); - }; - - halfSine(fund, index) = halfSineChooseP(fund, index, 0); - halfSineP(fund, index) = halfSineChooseP(fund, index, 1); - halfSineChooseP(fund, index, p) = (select2(FUND(fund,align,p)<.5, .5*(FUND(fund,align,p)-.5)/INDEX+.5, FUND(fund,align,p)):min(1))*2*ma.PI:cos - with { - INDEX = (.5-(index*0.5)):min(.5):max(.01); - align = si.interpolate(index:min(0.975), -0.25, -0.5); - }; - - FUND = - case { - (fund,align,0) => fund; - (fund,align,1) => (fund+align) : ma.frac; // align phase with fund - }; - resSaw(fund,res) = (((-1*(1-fund))*((cos((ma.decimal((max(1,res)*fund)+1))*2*ma.PI)*-.5)+.5))*2)+1; - resTriangle(fund,res) = select2(fund<.5, 2-(fund*2), fund*2)*INDEX*2-1 - with { - INDEX = ((fund*(res:max(1)))+1:ma.decimal)*2*ma.PI:cos*.5+.5; - }; - resTrap(fund, res) = (((1-fund)*2):min(1)*sin(ma.decimal(fund*(res:max(1)))*2*ma.PI)); -}; - -//===============================PolyBLEP-Based Oscillators================================= - -//----------`(os.)polyblep`---------- -// PolyBLEP residual function - used for smoothing steps in the audio signal. -// -// #### Usage -// -// ``` -// polyblep(Q, phase) : _ -// ``` -// -// Where: -// -// * `Q`: smoothing factor between 0 and 0.5. Determines how far from the ends of the phase interval the quadratic function is used. -// * `phase`: normalised phase (between 0 and 1) -//------------------------------------------------------------ -// Author: Jacek Wieczorek -polyblep(Q, phase) = (0, L(phase / Q), R((phase - 1) / Q)) : select3(sel) -with { - sel = (phase < Q) + 2*(phase > 1 - Q); - L(x) = 2*x - x*x - 1; // Used near the left end of the interval - R(x) = 2*x + x*x + 1; // Used near the right end of the interval -}; - -//----------`(os.)polyblep_saw`---------- -// Sawtooth oscillator with suppressed aliasing (using polyBLEP). -// -// #### Usage -// -// ``` -// polyblep_saw(f) : _ -// ``` -// -// Where: -// -// * `f`: frequency in Hz -//------------------------------------------------------------ -// Author: Jacek Wieczorek -polyblep_saw(f) = naive - polyblep(Q , phase) -with { - phase = phasor(1, f); - naive = 2 * phase - 1; - Q = f / ma.SR; -}; - -//----------`(os.)polyblep_square`---------- -// Square wave oscillator with suppressed aliasing (using polyBLEP). -// -// #### Usage -// -// ``` -// polyblep_square(f) : _ -// ``` -// -// Where: -// -// * `f`: frequency in Hz -//------------------------------------------------------------ -// Author: Jacek Wieczorek -polyblep_square(f) = naive - polyblep(Q, phase) + polyblep(Q, ma.modulo(phase + 0.5, 1)) -with { - phase = phasor(1, f); - naive = 2 * (phase * 2 : int) - 1; - Q = f / ma.SR; -}; - -//----------`(os.)polyblep_triangle`---------- -// Triangle wave oscillator with suppressed aliasing (using polyBLEP). -// -// #### Usage -// -// ``` -// polyblep_triangle(f) : _ -// ``` -// -// Where: -// -// * `f`: frequency in Hz -//------------------------------------------------------------ -// Author: Jacek Wieczorek -polyblep_triangle(f) = polyblep_square(f) : fi.pole(0.999) : *(4 * f / ma.SR); - - -//===============================Filter-Based Oscillators================================= - -//-----------------`(os.)quadosc`-------------------- -// Sinusoidal oscillator based on QuadOsc by Martin Vicanek. -// -// #### Usage -// -// ``` -// quadosc(freq) : _ -// ``` -// -// where -// -// * `freq`: frequency in Hz -// -// #### Reference -// * -//------------------------------------------------------------ -// Authors: -// Dario Sanfilippo -// and Oleg Nesterov (jos ed.) -quadosc(f) = tick ~ (_,_) -with { - k1 = tan(f * ma.PI / ma.SR); - k2 = 2 * k1 / (1 + k1 * k1); - tick(u_0,v_0) = u_1,v_1 - with { - tmp = u_0 - k1 * v_0; - v_1 = v_0 + k2 * tmp; - u_1 = tmp - k1 * v_1 : select2(1',1); - }; -}; - -// end further contributions section -//######################################################################################## diff --git a/dist/examples/LIBRARIES/phaflangers.lib b/dist/examples/LIBRARIES/phaflangers.lib deleted file mode 100644 index 3bbb0fad..00000000 --- a/dist/examples/LIBRARIES/phaflangers.lib +++ /dev/null @@ -1,232 +0,0 @@ -//#################################### phaflangers.lib ######################################## -// A library of phasor and flanger effects. Its official prefix is `pf`. -//######################################################################################## - -ma = library("maths.lib"); -de = library("delays.lib"); -fi = library("filters.lib"); -os = library("oscillators.lib"); -pf = library("phaflangers.lib"); - -declare name "Faust Phaser and Flanger Library"; -declare version "0.0"; - -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2017 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -All MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ - -//=============================Functions Reference======================================== -//======================================================================================== - -//---------------`(pf.)flanger_mono`------------- -// Mono flanging effect. -// -// #### Usage: -// -// ``` -// _ : flanger_mono(dmax,curdel,depth,fb,invert) : _; -// ``` -// -// Where: -// -// * `dmax`: maximum delay-line length (power of 2) - 10 ms typical -// * `curdel`: current dynamic delay (not to exceed dmax) -// * `depth`: effect strength between 0 and 1 (1 typical) -// * `fb`: feedback gain between 0 and 1 (0 typical) -// * `invert`: 0 for normal, 1 to invert sign of flanging sum -// -// #### Reference -// -// -//------------------------------------------------------------ -flanger_mono(dmax,curdel,depth,fb,invert) - = _ <: _, (- : de.fdelay(dmax,curdel)) ~ *(fb) : _, - *(select2(invert,depth,0-depth)) - : + : *(0.5); - -//---------------`(pf.)flanger_stereo`------------- -// Stereo flanging effect. -// `flanger_stereo` is a standard Faust function. -// -// #### Usage: -// -// ``` -// _,_ : flanger_stereo(dmax,curdel1,curdel2,depth,fb,invert) : _,_; -// ``` -// -// Where: -// -// * `dmax`: maximum delay-line length (power of 2) - 10 ms typical -// * `curdel`: current dynamic delay (not to exceed dmax) -// * `depth`: effect strength between 0 and 1 (1 typical) -// * `fb`: feedback gain between 0 and 1 (0 typical) -// * `invert`: 0 for normal, 1 to invert sign of flanging sum -// -// #### Reference -// -// -//------------------------------------------------------------ -flanger_stereo(dmax,curdel1,curdel2,depth,fb,invert) - = flanger_mono(dmax,curdel1,depth,fb,invert), - flanger_mono(dmax,curdel2,depth,fb,invert); - - -vibrato2_mono(sections,phase01,fb,width,frqmin,fratio,frqmax,speed) = - (+ : seq(i,sections,ap2p(R,th(i)))) ~ *(fb) -with { - //tf2 = component("filters.lib").tf2; - // second-order resonant digital allpass given pole radius and angle: - ap2p(R,th) = fi.tf2(a2,a1,1,a1,a2) with { - a2 = R^2; - a1 = -2*R*cos(th); - }; - R = exp(-pi*width/ma.SR); - cososc = os.oscrc; // oscillators.lib - sinosc = os.oscrs; // oscillators.lib - osc = cososc(speed) * phase01 + sinosc(speed) * (1-phase01); - lfo = (1-osc)/2; // in [0,1] - pi = 4*atan(1); - thmin = 2*pi*frqmin/ma.SR; - thmax = 2*pi*frqmax/ma.SR; - th1 = thmin + (thmax-thmin)*lfo; - th(i) = (fratio^(i+1))*th1; -}; - - -//-------`(pf.)phaser2_mono`----------------- -// Mono phasing effect. -// -// #### Phaser -// -// ``` -// _ : phaser2_mono(Notches,phase,width,frqmin,fratio,frqmax,speed,depth,fb,invert) : _; -// ``` -// -// Where: -// -// * `Notches`: number of spectral notches (MACRO ARGUMENT - not a signal) -// * `phase`: phase of the oscillator (0-1) -// * `width`: approximate width of spectral notches in Hz -// * `frqmin`: approximate minimum frequency of first spectral notch in Hz -// * `fratio`: ratio of adjacent notch frequencies -// * `frqmax`: approximate maximum frequency of first spectral notch in Hz -// * `speed`: LFO frequency in Hz (rate of periodic notch sweep cycles) -// * `depth`: effect strength between 0 and 1 (1 typical) (aka "intensity") -// when depth=2, "vibrato mode" is obtained (pure allpass chain) -// * `fb`: feedback gain between -1 and 1 (0 typical) -// * `invert`: 0 for normal, 1 to invert sign of flanging sum -// -// Reference: -// -// * -// * -// * 'An Allpass Approach to Digital Phasing and Flanging', Julius O. Smith III, -// Proc. Int. Computer Music Conf. (ICMC-84), pp. 103-109, Paris, 1984. -// * CCRMA Tech. Report STAN-M-21: -//------------------------------------------------------------ -phaser2_mono(Notches,phase01,width,frqmin,fratio,frqmax,speed,depth,fb,invert) = - _ <: *(g1) + g2mi*vibrato2_mono(Notches,phase01,fb,width,frqmin,fratio,frqmax,speed) -with { // depth=0 => direct-signal only - g1 = 1-depth/2; // depth=1 => phaser mode (equal sum of direct and allpass-chain) - g2 = depth/2; // depth=2 => vibrato mode (allpass-chain signal only) - g2mi = select2(invert,g2,-g2); // inversion negates the allpass-chain signal -}; - - -//-------`(pf.)phaser2_stereo`------- -// Stereo phasing effect. -// `phaser2_stereo` is a standard Faust function. -// -// #### Phaser -// -// ``` -// _ : phaser2_stereo(Notches,phase,width,frqmin,fratio,frqmax,speed,depth,fb,invert) : _; -// ``` -// -// Where: -// -// * `Notches`: number of spectral notches (MACRO ARGUMENT - not a signal) -// * `phase`: phase of the oscillator (0-1) -// * `width`: approximate width of spectral notches in Hz -// * `frqmin`: approximate minimum frequency of first spectral notch in Hz -// * `fratio`: ratio of adjacent notch frequencies -// * `frqmax`: approximate maximum frequency of first spectral notch in Hz -// * `speed`: LFO frequency in Hz (rate of periodic notch sweep cycles) -// * `depth`: effect strength between 0 and 1 (1 typical) (aka "intensity") -// when depth=2, "vibrato mode" is obtained (pure allpass chain) -// * `fb`: feedback gain between -1 and 1 (0 typical) -// * `invert`: 0 for normal, 1 to invert sign of flanging sum -// -// Reference: -// -// * -// * -// * 'An Allpass Approach to Digital Phasing and Flanging', Julius O. Smith III, -// Proc. Int. Computer Music Conf. (ICMC-84), pp. 103-109, Paris, 1984. -// * CCRMA Tech. Report STAN-M-21: -//------------------------------------------------------------ -phaser2_stereo(Notches,width,frqmin,fratio,frqmax,speed,depth,fb,invert) - = phaser2_mono(Notches,0,width,frqmin,fratio,frqmax,speed,depth,fb,invert), - phaser2_mono(Notches,1,width,frqmin,fratio,frqmax,speed,depth,fb,invert); - -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -// TODO: Add GRAME functions here - -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ diff --git a/dist/examples/LIBRARIES/physmodels.lib b/dist/examples/LIBRARIES/physmodels.lib deleted file mode 100644 index f4701fbc..00000000 --- a/dist/examples/LIBRARIES/physmodels.lib +++ /dev/null @@ -1,3965 +0,0 @@ -//##################################### physmodels.lib ################################### -// Faust physical modeling library. Its official prefix is `pm`. -// -// This library provides an environment to facilitate physical modeling of musical -// instruments. It contains dozens of functions implementing low and high level -// elements going from a simple waveguide to fully operational models with -// built-in UI, etc. -// -// It is organized as follows: -// -// * [Global Variables](#global-variables): useful pre-defined variables for -// physical modeling (e.g., speed of sound, etc.). -// * [Conversion Tools](#conversion-tools-1): conversion functions specific -// to physical modeling (e.g., length to frequency, etc.). -// * [Bidirectional Utilities](#bidirectional-utilities): functions to create -// bidirectional block diagrams for physical modeling. -// * [Basic Elements](#basic-elements-1): waveguides, specific types of filters, etc. -// * [String Instruments](#string-instruments): various types of strings -// (e.g., steel, nylon, etc.), bridges, guitars, etc. -// * [Bowed String Instruments](#bowed-string-instruments): parts and models -// specific to bowed string instruments (e.g., bows, bridges, violins, etc.). -// * [Wind Instrument](#wind-instruments): parts and models specific to wind -// string instruments (e.g., reeds, mouthpieces, flutes, clarinets, etc.). -// * [Exciters](#exciters): pluck generators, "blowers", etc. -// * [Modal Percussions](#modal-percussions): percussion instruments based on -// modal models. -// * [Vocal Synthesis](#vocal-synthesis): functions for various vocal synthesis -// techniques (e.g., fof, source/filter, etc.) and vocal synthesizers. -// * [Misc Functions](#misc-functions): any other functions that don't fit in -// the previous category (e.g., nonlinear filters, etc.). -// -// This library is part of the Faust Physical Modeling ToolKit. -// More information on how to use this library can be found on this page: -// . Tutorials on how to make -// physical models of musical instruments using Faust can be found -// [here](https://ccrma.stanford.edu/~rmichon/faustTutorials/#making-physical-models-of-musical-instruments-with-faust) as well. -//######################################################################################## -// Authors: Romain Michon, Pierre-Amaury Grumiaux, and Yann Orlarey - -import("stdfaust.lib"); - -/* -TODO: - - It'd be cool to have a version of the block diagram generator that automatically flips - things based on the use of chains, etc. - - When setting pole of filters by hand (e.g. smooth, should adjust pole in function of SR) - - Probably need a single resonator function / see how to integrate that with "mode" - - Need a non-linear function and see how this can be integrated with modal synthesis - - See how bowed modal models could be integarted to this - - Currently still missing keyboard instruments - - Currently still missing vocal synth: easy to fix (create a formant filter function) - - Real polyphonic instruments should be designated with some kind of prefix (e.g., - full) -*/ - -//=============================Global Variables=========================================== -// Useful pre-defined variables for physical modeling. -//======================================================================================== - -//--------------`(pm.)speedOfSound`---------- -// Speed of sound in meters per second (340m/s). -//-------------------------------------- -speedOfSound = 340; - -//--------------`(pm.)maxLength`---------- -// The default maximum length (3) in meters of strings and tubes used in this -// library. This variable should be overriden to allow longer strings or tubes. -//-------------------------------------- -maxLength = 3; - -//================================Conversion Tools======================================= -// Useful conversion tools for physical modeling. -//======================================================================================== - -//--------------`(pm.)f2l`---------- -// Frequency to length in meters. -// -// #### Usage -// -// ``` -// f2l(freq) : distanceInMeters -// ``` -// -// Where: -// -// * `freq`: the frequency -//------------------------------- -f2l(freq) = speedOfSound/freq; - -//--------------`(pm.)l2f`---------- -// Length in meters to frequency. -// -// #### Usage -// -// ``` -// l2f(length) : freq -// ``` -// -// Where: -// -// * `length`: length/distance in meters -//------------------------------- -l2f(length) = speedOfSound/length; - -//--------------`(pm.)l2s`---------- -// Length in meters to number of samples. -// -// #### Usage -// -// ``` -// l2s(l) : numberOfSamples -// ``` -// -// Where: -// -// * `l`: length in meters -//------------------------------- -l2s(l) = l*ma.SR/speedOfSound; - -//=============================Bidirectional Utilities==================================== -// Set of fundamental functions to create bi-directional block diagrams in Faust. -// These elements are used as the basis of this library to connect high level -// elements (e.g., mouthpieces, strings, bridge, instrument body, etc.). Each -// block has 3 inputs and 3 outputs. The first input/output carry left going -// waves, the second input/output carry right going waves, and the third -// input/output is used to carry any potential output signal to the end of the -// algorithm. -//======================================================================================== - -//--------------`(pm.)basicBlock`---------- -// Empty bidirectional block to be used with [`chain`](#chain): 3 signals ins -// and 3 signals out. -// -// #### Usage -// -// ``` -// chain(basicBlock : basicBlock : etc.) -// ``` -//------------------------------- -basicBlock = _,_,_; - -//-------`(pm.)chain`---------- -// Creates a chain of bidirectional blocks. -// Blocks must have 3 inputs and outputs. The first input/output carry left -// going waves, the second input/output carry right going waves, and the third -// input/output is used to carry any potential output signal to the end of the -// algorithm. The implied one sample delay created by the `~` operator is -// generalized to the left and right going waves. Thus, `n` blocks in `chain()` -// will add an `n` samples delay to both left and right going waves. -// -// #### Usage -// -// ``` -// leftGoingWaves,rightGoingWaves,mixedOutput : chain( A : B ) : leftGoingWaves,rightGoingWaves,mixedOutput -// with{ -// A = _,_,_; -// B = _,_,_; -// }; -// ``` -//----------------------------- -chain(A:As) = ((ro.crossnn(1),_',_ : _,A : ro.crossnn(1),_,_ : _,chain(As) : ro.crossnn(1),_,_)) ~ _ : !,_,_,_; -chain(A) = A; - -//-------`(pm.)inLeftWave`-------------- -// Adds a signal to left going waves anywhere in a [`chain`](#chain) of blocks. -// -// #### Usage -// -// ``` -// model(x) = chain(A : inLeftWave(x) : B) -// ``` -// -// Where `A` and `B` are bidirectional blocks and `x` is the signal added to left -// going waves in that chain. -//-------------------------------- -inLeftWave(x) = +(x),_,_; - -//-------`(pm.)inRightWave`-------------- -// Adds a signal to right going waves anywhere in a [`chain`](#chain) of blocks. -// -// #### Usage -// -// ``` -// model(x) = chain(A : inRightWave(x) : B) -// ``` -// -// Where `A` and `B` are bidirectional blocks and `x` is the signal added to right -// going waves in that chain. -//-------------------------------- -inRightWave(x) = _,+(x),_; - -//-------`(pm.)in`-------------- -// Adds a signal to left and right going waves anywhere in a [`chain`](#chain) -// of blocks. -// -// #### Usage -// -// ``` -// model(x) = chain(A : in(x) : B) -// ``` -// -// Where `A` and `B` are bidirectional blocks and `x` is the signal added to -// left and right going waves in that chain. -//-------------------------------- -in(x) = +(x),+(x),_; - -//-------`(pm.)outLeftWave`-------------- -// Sends the signal of left going waves to the output channel of the [`chain`](#chain). -// -// #### Usage -// -// ``` -// chain(A : outLeftWave : B) -// ``` -// -// Where `A` and `B` are bidirectional blocks. -//-------------------------------- -outLeftWave(x,y,s) = x,y,x+s; - -//-------`(pm.)outRightWave`-------------- -// Sends the signal of right going waves to the output channel of the [`chain`](#chain). -// -// #### Usage -// -// ``` -// chain(A : outRightWave : B) -// ``` -// -// Where `A` and `B` are bidirectional blocks. -//-------------------------------- -outRightWave(x,y,s) = x,y,y+s; - -//-------`(pm.)out`-------------- -// Sends the signal of right and left going waves to the output channel of the -// [`chain`](#chain). -// -// #### Usage -// -// ``` -// chain(A : out : B) -// ``` -// -// Where `A` and `B` are bidirectional blocks. -//-------------------------------- -out(x,y,s) = x,y,x+y+s; - -//-------`(pm.)terminations`-------------- -// Creates terminations on both sides of a [`chain`](#chain) without closing -// the inputs and outputs of the bidirectional signals chain. As for -// [`chain`](#chain), this function adds a 1 sample delay to the bidirectional -// signal, both ways. Of course, this function can be nested within a -// [`chain`](#chain). -// -// #### Usage -// -// ``` -// terminations(a,b,c) -// with{ -// a = *(-1); // left termination -// b = chain(D : E : F); // bidirectional chain of blocks (D, E, F, etc.) -// c = *(-1); // right termination -// }; -// ``` -//---------------------------------------- -terminations(a,b,c) = (_,ro.crossnn(1),_,_ : +,+,_ : b) ~ (a,c : ro.crossnn(1)); - -//-------`(pm.)lTermination`---------- -// Creates a termination on the left side of a [`chain`](#chain) without -// closing the inputs and outputs of the bidirectional signals chain. This -// function adds a 1 sample delay near the termination and can be nested -// within another [`chain`](#chain). -// -// #### Usage -// -// ``` -// lTerminations(a,b) -// with{ -// a = *(-1); // left termination -// b = chain(D : E : F); // bidirectional chain of blocks (D, E, F, etc.) -// }; -// ``` -//---------------------------------------- -lTermination(a,b) = (ro.crossnn(1),_,_ : _,+,_ : b) ~ a; - -//-------`(pm.)rTermination`---------- -// Creates a termination on the right side of a [`chain`](#chain) without -// closing the inputs and outputs of the bidirectional signals chain. This -// function adds a 1 sample delay near the termination and can be nested -// within another [`chain`](#chain). -// -// #### Usage -// -// ``` -// rTerminations(b,c) -// with{ -// b = chain(D : E : F); // bidirectional chain of blocks (D, E, F, etc.) -// c = *(-1); // right termination -// }; -// ``` -//---------------------------------------- -rTermination(b,c) = (_,_,_,_ : +,_,_ : b) ~ (!,c); - -//-------`(pm.)closeIns`---------- -// Closes the inputs of a bidirectional chain in all directions. -// -// #### Usage -// -// ``` -// closeIns : chain(...) : _,_,_ -// ``` -//---------------------------------------- -closeIns = 0,0,0; - -//-------`(pm.)closeOuts`---------- -// Closes the outputs of a bidirectional chain in all directions except for the -// main signal output (3d output). -// -// #### Usage -// -// ``` -// _,_,_ : chain(...) : _ -// ``` -//---------------------------------------- -closeOuts = !,!,_; - -//-------`(pm.)endChain`---------- -// Closes the inputs and outputs of a bidirectional chain in all directions -// except for the main signal output (3d output). -// -// #### Usage -// -// ``` -// endChain(chain(...)) : _ -// ``` -//---------------------------------------- -endChain(b) = closeIns : b : closeOuts; - - -//==================================Basic Elements======================================== -// Basic elements for physical modeling (e.g., waveguides, specific filters, -// etc.). -//======================================================================================== - -//-------`(pm.)waveguideN`---------- -// A series of waveguide functions based on various types of delays (see -// [`fdelay[n]`](#fdelayn)). -// -// #### List of functions -// -// * `waveguideUd`: unit delay waveguide -// * `waveguideFd`: fractional delay waveguide -// * `waveguideFd2`: second order fractional delay waveguide -// * `waveguideFd4`: fourth order fractional delay waveguide -// -// #### Usage -// -// ``` -// chain(A : waveguideUd(nMax,n) : B) -// ``` -// -// Where: -// -// * `nMax`: the maximum length of the delays in the waveguide -// * `n`: the length of the delay lines in samples. -//---------------------------------- -waveguideUd(nMax,n) = par(i,2,de.delay(nMax,n)),_; -waveguideFd(nMax,n) = par(i,2,de.fdelay(nMax,n)),_; -waveguideFd2(nMax,n) = par(i,2,de.fdelay2(nMax,n)),_; -waveguideFd4(nMax,n) = par(i,2,de.fdelay4(nMax,n)),_; - - -//-------`(pm.)waveguide`---------- -// Standard `pm.lib` waveguide (based on [`waveguideFd4`](#waveguiden)). -// -// #### Usage -// -// ``` -// chain(A : waveguide(nMax,n) : B) -// ``` -// -// Where: -// -// * `nMax`: the maximum length of the delays in the waveguide -// * `n`: the length of the delay lines in samples. -//---------------------------------- -waveguide(nMax,n) = waveguideFd4(nMax,n); - - -//-------`(pm.)bridgeFilter`---------- -// Generic two zeros bridge FIR filter (as implemented in the -// [STK](https://ccrma.stanford.edu/software/stk/)) that can be used to -// implement the reflectance violin, guitar, etc. bridges. -// -// #### Usage -// -// ``` -// _ : bridge(brightness,absorption) : _ -// ``` -// -// Where: -// -// * `brightness`: controls the damping of high frequencies (0-1) -// * `absorption`: controls the absorption of the brige and thus the t60 of -// the string plugged to it (0-1) (1 = 20 seconds) -//---------------------------------- -// TODO: perhaps, the coefs of this filter should be adapted in function of SR -bridgeFilter(brightness,absorption,x) = rho * (h0 * x' + h1*(x+x'')) -with{ - freq = 320; - t60 = (1-absorption)*20; - h0 = (1.0 + brightness)/2; - h1 = (1.0 - brightness)/4; - rho = pow(0.001,1.0/(freq*t60)); -}; - - -//-------`(pm.)modeFilter`---------- -// Resonant bandpass filter that can be used to implement a single resonance -// (mode). -// -// #### Usage -// -// ``` -// _ : modeFilter(freq,t60,gain) : _ -// ``` -// -// Where: -// -// * `freq`: mode frequency -// * `t60`: mode resonance duration (in seconds) -// * `gain`: mode gain (0-1) -//---------------------------------- -modeFilter(freq,t60,gain) = fi.tf2(b0,b1,b2,a1,a2)*gain -with{ - b0 = 1; - b1 = 0; - b2 = -1; - w = 2*ma.PI*freq/ma.SR; - r = pow(0.001,1/float(t60*ma.SR)); - a1 = -2*r*cos(w); - a2 = r^2; -}; - - -//================================String Instruments====================================== -// Low and high level string instruments parts. Most of the elements in -// this section can be used in a bidirectional chain. -//======================================================================================== - -//-------`(pm.)stringSegment`---------- -// A string segment without terminations (just a simple waveguide). -// -// #### Usage -// -// ``` -// chain(A : stringSegment(maxLength,length) : B) -// ``` -// -// Where: -// -// * `maxLength`: the maximum length of the string in meters (should be static) -// * `length`: the length of the string in meters -//---------------------------------- -stringSegment(maxLength,length) = waveguide(nMax,n) -with{ - nMax = maxLength : l2s; - n = length : l2s/2; -}; - - -//-------`(pm.)openString`---------- -// A bidirectional block implementing a basic "generic" string with a -// selectable excitation position. Lowpass filters are built-in and -// allow to simulate the effect of dispersion on the sound and thus -// to change the "stiffness" of the string. -// -// #### Usage -// -// ``` -// chain(... : openString(length,stiffness,pluckPosition,excitation) : ...) -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `stiffness`: the stiffness of the string (0-1) (1 for max stiffness) -// * `pluckPosition`: excitation position (0-1) (1 is bottom) -// * `excitation`: the excitation signal -//---------------------------------- -openString(length,stiffness,pluckPosition,excitation) = chain(stringSegment(maxStringLength,ntbd) : in(excitation) : dispersionFilters : stringSegment(maxStringLength,btbd)) -with{ - dispersionFilters = par(i,2,si.smooth(stiffness)),_; // one pole filters - maxStringLength = maxLength; - ntbd = length*pluckPosition; // length of the upper portion of the string - btbd = length*(1-pluckPosition); // length of the lower portion of the string -}; - - -//-------`(pm.)nylonString`---------- -// A bidirectional block implementing a basic nylon string with selectable -// excitation position. This element is based on [`openString`](#openstring) -// and has a fix stiffness corresponding to that of a nylon string. -// -// #### Usage -// -// ``` -// chain(... : nylonString(length,pluckPosition,excitation) : ...) -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: excitation position (0-1) (1 is bottom) -// * `excitation`: the excitation signal -//---------------------------------- -nylonString(length,pluckPosition,excitation) = -openString(length,stiffness,pluckPosition,excitation) -with{ - stiffness = 0.4; // empirically set but it sounds good ;) -}; - - -//-------`(pm.)steelString`---------- -// A bidirectional block implementing a basic steel string with selectable -// excitation position. This element is based on [`openString`](#openstring) -// and has a fix stiffness corresponding to that of a steel string. -// -// #### Usage -// -// ``` -// chain(... : steelString(length,pluckPosition,excitation) : ...) -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: excitation position (0-1) (1 is bottom) -// * `excitation`: the excitation signal -//---------------------------------- -steelString(length,pluckPosition,excitation) = -openString(length,stiffness,pluckPosition,excitation) -with{ - stiffness = 0.05; // empirically set but it sounds good ;) - // in fact, we could almost get rid of the filters in that case, - // but I think it's good to keep them for consistency -}; - - -//-------`(pm.)openStringPick`---------- -// A bidirectional block implementing a "generic" string with selectable -// excitation position. It also has a built-in pickup whose position is the -// same as the excitation position. Thus, moving the excitation position -// will also move the pickup. -// -// #### Usage -// -// ``` -// chain(... : openStringPick(length,stiffness,pluckPosition,excitation) : ...) -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `stiffness`: the stiffness of the string (0-1) (1 for max stiffness) -// * `pluckPosition`: excitation position (0-1) (1 is bottom) -// * `excitation`: the excitation signal -//---------------------------------- -openStringPick(length,stiffness,pluckPosition,excitation) = strChain -with{ - dispersionFilters = par(i,2,si.smooth(stiffness)),_; - maxStringLength = maxLength; - nti = length*pluckPosition; // length of the upper portion of the string - itb = length*(1-pluckPosition); // length of the lower portion of the string - strChain = chain(stringSegment(maxStringLength,nti) : in(excitation) : out : - dispersionFilters : stringSegment(maxStringLength,itb)); -}; - - -//-------`(pm.)openStringPickUp`---------- -// A bidirectional block implementing a "generic" string with selectable -// excitation position and stiffness. It also has a built-in pickup whose -// position can be independenly selected. The only constraint is that the -// pickup has to be placed after the excitation position. -// -// #### Usage -// -// ``` -// chain(... : openStringPickUp(length,stiffness,pluckPosition,excitation) : ...) -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `stiffness`: the stiffness of the string (0-1) (1 for max stiffness) -// * `pluckPosition`: pluck position between the top of the string and the -// pickup (0-1) (1 for same as pickup position) -// * `pickupPosition`: position of the pickup on the string (0-1) (1 is bottom) -// * `excitation`: the excitation signal -//---------------------------------- -openStringPickUp(length,stiffness,pluckPosition,pickupPosition,excitation) = strChain -with{ - dispersionFilters = par(i,2,si.smooth(stiffness)),_; - maxStringLength = maxLength; - nti = length*pluckPosition; // top to excitation length - nto = nti*pickupPosition; // nuts to pickup length - oti = nti*(1-pickupPosition); // pickup to excitation length - itb = length*(1-pluckPosition); // pickup to bottom length - strChain = chain(stringSegment(maxStringLength,nto) : out : - stringSegment(maxStringLength,oti) : in(excitation) : dispersionFilters : - stringSegment(maxStringLength,itb)); -}; - - -//-------`(pm.)openStringPickDown`---------- -// A bidirectional block implementing a "generic" string with selectable -// excitation position and stiffness. It also has a built-in pickup whose -// position can be independenly selected. The only constraint is that the -// pickup has to be placed before the excitation position. -// -// #### Usage -// -// ``` -// chain(... : openStringPickDown(length,stiffness,pluckPosition,excitation) : ...) -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `stiffness`: the stiffness of the string (0-1) (1 for max stiffness) -// * `pluckPosition`: pluck position on the string (0-1) (1 is bottom) -// * `pickupPosition`: position of the pickup between the top of the string -// and the excitation position (0-1) (1 is excitation position) -// * `excitation`: the excitation signal -//---------------------------------- -openStringPickDown(length,stiffness,pluckPosition,pickupPosition,excitation) = -strChain -with{ - dispersionFilters = par(i,2,si.smooth(stiffness)),_; - maxStringLength = maxLength; - nto = length*pickupPosition; // top to pickup length - nti = nto*pluckPosition; // top to excitation length - ito = nto*(1-pluckPosition); // excitation to pickup length - otb = length*(1-pickupPosition); // pickup to bottom length - strChain = chain(stringSegment(maxStringLength,nti) : in(excitation) : - stringSegment(maxStringLength,ito) : out : dispersionFilters : - stringSegment(maxStringLength,otb)); -}; - - -// TODO: eventually, we'd want to implement a generic function here that -// automatically switches the position of elements in the algorithm -// depending on the position of the pick. Even though this is currently -// possible, it will pose optimization issues (we'd want the new mute -// feature of Faust to be generalized in order to do that) - -//-------`(pm.)ksReflexionFilter`---------- -// The "typical" one-zero Karplus-strong feedforward reflexion filter. This -// filter will be typically used in a termination (see below). -// -// #### Usage -// -// ``` -// terminations(_,chain(...),ksReflexionFilter) -// ``` -//---------------------------------- -ksReflexionFilter = _ <: (_+_')/2; - - -//-------`(pm.)rStringRigidTermination`---------- -// Bidirectional block implementing a right rigid string termination (no damping, -// just phase inversion). -// -// #### Usage -// -// ``` -// chain(rStringRigidTermination : stringSegment : ...) -// ``` -//---------------------------------- -rStringRigidTermination = rTermination(basicBlock,*(-1)); - - -//-------`(pm.)lStringRigidTermination`---------- -// Bidirectional block implementing a left rigid string termination (no damping, -// just phase inversion). -// -// #### Usage -// -// ``` -// chain(... : stringSegment : lStringRigidTermination) -// ``` -//---------------------------------- -lStringRigidTermination = lTermination(*(-1),basicBlock); - - -//-------`(pm.)elecGuitarBridge`---------- -// Bidirectional block implementing a simple electric guitar bridge. This -// block is based on [`bridgeFilter`](#bridgeFilter). The bridge doesn't -// implement transmittance since it is not meant to be connected to a -// body (unlike acoustic guitar). It also partially sets the resonance -// duration of the string with the nuts used on the other side. -// -// #### Usage -// -// ``` -// chain(... : stringSegment : elecGuitarBridge) -// ``` -//---------------------------------- -elecGuitarBridge = rTermination(basicBlock,-bridgeFilter(0.8,0.6)); - - -//-------`(pm.)elecGuitarNuts`---------- -// Bidirectional block implementing a simple electric guitar nuts. This -// block is based on [`bridgeFilter`](#bridgeFilter) and does essentially -// the same thing as [`elecGuitarBridge`](#elecguitarbridge), but on the -// other side of the chain. It also partially sets the resonance duration of -// the string with the bridge used on the other side. -// -// #### Usage -// -// ``` -// chain(elecGuitarNuts : stringSegment : ...) -// ``` -//---------------------------------- -elecGuitarNuts = lTermination(-bridgeFilter(0.8,0.6),basicBlock); - - -//-------`(pm.)guitarBridge`---------- -// Bidirectional block implementing a simple acoustic guitar bridge. This -// bridge damps more hight frequencies than -// [`elecGuitarBridge`](#elecguitarbridge) and implements a transmittance -// filter. It also partially sets the resonance duration of the string with -// the nuts used on the other side. -// -// #### Usage -// -// ``` -// chain(... : stringSegment : guitarBridge) -// ``` -//---------------------------------- -guitarBridge = rTermination(basicBlock,reflectance) : _,transmittance,_ -with{ - reflectance = -bridgeFilter(0.4,0.5); - transmittance = _; // TODO -}; - - -//-------`(pm.)guitarNuts`---------- -// Bidirectional block implementing a simple acoustic guitar nuts. This -// nuts damps more hight frequencies than -// [`elecGuitarNuts`](#elecguitarnuts) and implements a transmittance -// filter. It also partially sets the resonance duration of the string with -// the bridge used on the other side. -// -// #### Usage -// -// ``` -// chain(guitarNuts : stringSegment : ...) -// ``` -//---------------------------------- -guitarNuts = lTermination(-bridgeFilter(0.4,0.5),basicBlock); - - -//-------`(pm.)idealString`---------- -// An "ideal" string with rigid terminations and where the plucking position -// and the pick-up position are the same. Since terminations are rigid, this -// string will ring forever. -// -// #### Usage -// -// ``` -// 1-1' : idealString(length,reflexion,xPosition,excitation) -// ``` -// -// With: -// * `length`: the length of the string in meters -// * `pluckPosition`: the plucking position (0.001-0.999) -// * `excitation`: the input signal for the excitation. -//---------------------------------------------------------- -idealString(length,pluckPosition,excitation) = wg -with{ - maxStringLength = maxLength; - lengthTuning = 0.08; // tuned "by hand" - tunedLength = length-lengthTuning; - nUp = tunedLength*pluckPosition; // upper string segment length - nDown = tunedLength*(1-pluckPosition); // lower string segment length - wg = chain(lStringRigidTermination : stringSegment(maxStringLength,nUp) : - in(excitation) : out : stringSegment(maxStringLength,nDown) : - rStringRigidTermination); // waveguide chain -}; - - -//-------`(pm.)ks`---------- -// A Karplus-Strong string (in that case, the string is implemented as a -// one dimension waveguide). -// -// #### Usage -// -// ``` -// ks(length,damping,excitation) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `damping`: string damping (0-1) -// * `excitation`: excitation signal -//---------------------------------- -ks(length,damping,excitation) = endChain(ksChain) -with{ - maxStringLength = maxLength; - lengthTuning = 0.05; // tuned "by hand" - tunedLength = length-lengthTuning; - refCoef = (1-damping)*0.2+0.8; - refFilter = ksReflexionFilter*refCoef; - ksChain = terminations(_,chain(in(excitation) : - stringSegment(maxStringLength,tunedLength) : out),refFilter); -}; - - -//-------`(pm.)ks_ui_MIDI`---------- -// Ready-to-use, MIDI-enabled Karplus-Strong string with buil-in UI. -// -// #### Usage -// -// ``` -// ks_ui_MIDI : _ -// ``` -//---------------------------------- -ks_ui_MIDI = gate : impulseExcitation*gain : ks( (freq : f2l), damping ) -with{ - f = hslider("v:karplus/h:[0]params/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:karplus/h:[0]params/[1]bend[style:knob][hidden:1][midi:pitchwheel]" - ,0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:karplus/h:[0]params/[2]gain[style:knob]",0.8,0,1,0.01); - s = hslider("v:karplus/h:[0]params/[3]sustain[hidden:1][midi:ctrl 64][style:knob]" - ,0,0,1,1); - damping = hslider("v:karplus/h:[0]params/[1]damping[midi:ctrl 1][style:knob]" - ,0.01,0,1,0.01) : si.smoo; - t = button("v:karplus/[1]gate"); - - gate = t+s : min(1); - freq = f*bend; -}; - - -//-------`(pm.)elecGuitarModel`---------- -// A simple electric guitar model (without audio effects, of course) with -// selectable pluck position. -// This model implements a single string. Additional strings should be created -// by making a polyphonic applications out of this function. Pitch is changed by -// changing the length of the string and not through a finger model. -// -// #### Usage -// -// ``` -// elecGuitarModel(length,pluckPosition,mute,excitation) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `mute`: mute coefficient (1 for no mute and 0 for instant mute) -// * `excitation`: excitation signal -//---------------------------------- -elecGuitarModel(length,pluckPosition,mute,excitation) = endChain(egChain) -with{ - maxStringLength = maxLength; - lengthTuning = 0.11; // tuned "by hand" - stringL = length-lengthTuning; - muteBlock = *(mute),*(mute),_; - egChain = chain( - elecGuitarNuts : - openStringPick(stringL,0.05,pluckPosition,excitation) : - muteBlock : - elecGuitarBridge); -}; - - -//-------`(pm.)elecGuitar`---------- -// A simple electric guitar model with steel strings (based on -// [`elecGuitarModel`](#elecguitarmodel)) implementing an excitation -// model. -// This model implements a single string. Additional strings should be created -// by making a polyphonic applications out of this function. -// -// #### Usage -// -// ``` -// elecGuitar(length,pluckPosition,trigger) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `mute`: mute coefficient (1 for no mute and 0 for instant mute) -// * `gain`: gain of the pluck (0-1) -// * `trigger`: trigger signal (1 for on, 0 for off) -//---------------------------------- -elecGuitar(stringLength,pluckPosition,mute,gain,trigger) = -pluckString(stringLength,1,1,1,gain,trigger) : -elecGuitarModel(stringLength,pluckPosition,mute); - - -//-------`(pm.)elecGuitar_ui_MIDI`---------- -// Ready-to-use MIDI-enabled electric guitar physical model with built-in UI. -// -// #### Usage -// -// ``` -// elecGuitar_ui_MIDI : _ -// ``` -//---------------------------------- -elecGuitar_ui_MIDI = elecGuitar(stringLength,pluckPosition,1,gain,gate)*outGain -with{ - f = hslider("v:elecGuitar/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:elecGuitar/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel][style:knob]" - ,0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:elecGuitar/h:[0]midi/[2]gain[style:knob]",0.8,0,1,0.01); - s = hslider("v:elecGuitar/h:[0]midi/[3]sustain[hidden:1] - [midi:ctrl 64][style:knob]",0,0,1,1); - pluckPosition = hslider("v:elecGuitar/[1]pluckPosition[midi:ctrl 1]",0.8,0,1,0.01) : si.smoo; - outGain = hslider("v:elecGuitar/[2]outGain",0.5,0,1,0.01); - t = button("v:elecGuitar/[3]gate"); - gate = t+s : min(1); - freq = f*bend; - stringLength = freq : f2l; -}; - - -//-------`(pm.)guitarBody`---------- -// WARNING: not implemented yet! -// Bidirectional block implementing a simple acoustic guitar body. -// -// #### Usage -// -// ``` -// chain(... : guitarBody) -// ``` -//---------------------------------- -// TODO: not implemented yet -guitarBody = reflectance,transmittance,_ -with{ - transmittance = _; - reflectance = _; -}; - - -//-------`(pm.)guitarModel`---------- -// A simple acoustic guitar model with steel strings and selectable excitation -// position. This model implements a single string. Additional strings should be created -// by making a polyphonic applications out of this function. Pitch is changed by -// changing the length of the string and not through a finger model. -// WARNING: this function doesn't currently implement a body (just strings and -// bridge). -// -// #### Usage -// -// ``` -// guitarModel(length,pluckPosition,excitation) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `excitation`: excitation signal -//---------------------------------- -guitarModel(length,pluckPosition,excitation) = endChain(egChain) -with{ - maxStringLength = maxLength; - lengthTuning = 0.1; // tuned "by hand" - stringL = length-lengthTuning; - egChain = chain(guitarNuts : steelString(stringL,pluckPosition,excitation) : - guitarBridge : guitarBody : out); -}; - - -//-------`(pm.)guitar`---------- -// A simple acoustic guitar model with steel strings (based on -// [`guitarModel`](#guitarmodel)) implementing an excitation model. -// This model implements a single string. Additional strings should be created -// by making a polyphonic applications out of this function. -// -// #### Usage -// -// ``` -// guitar(length,pluckPosition,trigger) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `gain`: gain of the excitation -// * `trigger`: trigger signal (1 for on, 0 for off) -//---------------------------------- -guitar(stringLength,pluckPosition,gain,trigger) = -pluckString(stringLength,1,1.5,1,gain,trigger) : guitarModel(stringLength, pluckPosition); - - -//-------`(pm.)guitar_ui_MIDI`---------- -// Ready-to-use MIDI-enabled steel strings acoustic guitar physical model with -// built-in UI. -// -// #### Usage -// -// ``` -// guitar_ui_MIDI : _ -// ``` -//---------------------------------- -guitar_ui_MIDI = guitar(stringLength,pluckPosition,gain,gate)*outGain -with{ - f = hslider("v:guitar/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:guitar/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:guitar/h:[0]midi/[2]gain[style:knob]",0.8,0,1,0.01); - s = hslider("v:guitar/h:[0]midi/[3]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - pluckPosition = hslider("v:guitar/pluckPosition[midi:ctrl 1]" - ,0.8,0,1,0.01) : si.smoo; - outGain = hslider("v:guitar/outGain",0.5,0,1,0.01); - t = button("v:guitar/[4]gate"); - gate = t+s : min(1); - freq = f*bend; - stringLength = freq : f2l; -}; - - -//-------`(pm.)nylonGuitarModel`---------- -// A simple acoustic guitar model with nylon strings and selectable excitation -// position. This model implements a single string. Additional strings should be created -// by making a polyphonic applications out of this function. Pitch is changed by -// changing the length of the string and not through a finger model. -// WARNING: this function doesn't currently implement a body (just strings and -// bridge). -// -// #### Usage -// -// ``` -// nylonGuitarModel(length,pluckPosition,excitation) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `excitation`: excitation signal -//---------------------------------- -nylonGuitarModel(length,pluckPosition,excitation) = endChain(egChain) -with{ - maxStringLength = maxLength; // meters - lengthTuning = 0.11; - stringL = length-lengthTuning; - egChain = chain(guitarNuts : nylonString(stringL,pluckPosition,excitation) : - guitarBridge : guitarBody : out); -}; - - -//-------`(pm.)nylonGuitar`---------- -// A simple acoustic guitar model with nylon strings (based on -// [`nylonGuitarModel`](#nylonguitarmodel)) implementing an excitation model. -// This model implements a single string. Additional strings should be created -// by making a polyphonic applications out of this function. -// -// #### Usage -// -// ``` -// nylonGuitar(length,pluckPosition,trigger) : _ -// ``` -// -// Where: -// -// * `length`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `gain`: gain of the excitation (0-1) -// * `trigger`: trigger signal (1 for on, 0 for off) -//---------------------------------- -nylonGuitar(stringLength,pluckPosition,gain,trigger) = -pluckString(stringLength,1,1.5,1,gain,trigger) : nylonGuitarModel(stringLength, pluckPosition); - - -//-------`(pm.)nylonGuitar_ui_MIDI`---------- -// Ready-to-use MIDI-enabled nylon strings acoustic guitar physical model with -// built-in UI. -// -// #### Usage -// -// ``` -// nylonGuitar_ui_MIDI : _ -// ``` -//---------------------------------- -nylonGuitar_ui_MIDI = nylonGuitar(stringLength,pluckPosition,gain,gate)*outGain -with{ - f = hslider("v:nylonGuitar/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:nylonGuitar/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:nylonGuitar/h:[0]midi/[2]gain[style:knob]",0.8,0,1,0.01); - s = hslider("v:nylonGuitar/h:[0]midi/[3]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - pluckPosition = hslider("v:nylonGuitar/pluckPosition[midi:ctrl 1]" - ,0.8,0,1,0.01) : si.smoo; - outGain = hslider("v:nylonGuitar/outGain",0.5,0,1,0.01); - t = button("v:nylonGuitar/[4]gate"); - gate = t+s : min(1); - freq = f*bend; - stringLength = freq : f2l; -}; - - -//-------`(pm.)modeInterpRes`---------- -// Modular string instrument resonator based on IR measurements made on 3D -// printed models. The 2D space allowing for the control of the shape and the -// scale of the model is enabled by interpolating between modes parameters. -// More information about this technique/project can be found here: -// . -// -// #### Usage -// -// ``` -// _ : modeInterpRes(nModes,x,y) : _ -// ``` -// -// Where: -// -// * `nModes`: number of modeled modes (40 max) -// * `x`: shape of the resonator (0: square, 1: square with rounded corners, 2: round) -// * `y`: scale of the resonator (0: small, 1: medium, 2: large) -//---------------------------------- -modeInterpRes(nModes,x,y) = _ <: par(i,min(40,nModes),modeFilter(modeFreq(i),modeT60(i),modeGain(i))) :> /(nModes) -with{ - // modes parameters - roundBigCenterFreq(i) = ba.take(i+1,(286.134404,476.384455,602.872587,831.823345,862.773611,1024.985313,1209.932428,1515.548598,1777.819591,2001.806241,2674.135433,3154.282144,3329.555657,3431.385589,3673.656995,4228.801853,4389.842060,4552.745406,4766.151594,4854.354993,4970.516137,5064.203325,5200.399916,5347.650831,5459.807495,5630.144253,5870.258034,6121.961406,6244.522341,6677.052569,7233.100711,7520.031251,7677.902736,7805.138717,9918.905945,10418.988301,11296.101954,11432.719867,13422.238365,13679.232778)); - roundBigCenterGain(i) = ba.take(i+1,(1.000000,0.609711,0.222375,0.025505,0.026108,0.026840,0.605767,0.368186,0.093526,0.016656,0.159600,0.013836,0.044000,0.023103,0.107971,0.013696,0.043615,0.039848,0.041903,0.043671,0.055018,0.041730,0.062832,0.030464,0.028049,0.012880,0.047154,0.084707,0.050532,0.032735,0.031938,0.023554,0.017534,0.017268,0.026202,0.013725,0.015611,0.021294,0.011486,0.011875)); - roundBigCenterT60(i) = ba.take(i+1,(0.283544,0.076723,0.287423,0.058391,0.075172,0.120794,0.131540,0.081173,0.088549,0.034991,0.060237,0.014153,0.074709,0.068893,0.033354,0.032013,0.019088,0.020992,0.026703,0.018040,0.015815,0.016671,0.028732,0.017929,0.021520,0.024622,0.022706,0.023138,0.027323,0.020556,0.024577,0.023669,0.024714,0.024420,0.017733,0.017881,0.018715,0.017737,0.015660,0.016464)); - roundMidCenterFreq(i) = ba.take(i+1,(380.910663,615.862831,933.855656,1128.769825,1231.353452,1404.948092,1764.641239,2095.586536,2451.220548,2566.435588,2781.467120,2946.757398,3522.047891,3748.375254,3892.352583,4340.896246,4454.851770,4629.302932,4806.417393,5024.545475,5604.684752,5671.112515,6533.147087,6751.949816,6862.781990,6951.226279,7180.863112,7901.631311,8074.662174,8979.395914,10075.249374,10521.350963,11964.859921,14227.213322,15501.455250,15587.852956,16290.138756,16418.172746,16663.266694,17991.614994)); - roundMidCenterGain(i) = ba.take(i+1,(1.000000,0.437495,0.110598,0.025858,0.010841,0.022400,0.245241,0.187990,0.029650,0.058174,0.007035,0.013188,0.009767,0.059284,0.160848,0.007463,0.016816,0.008689,0.031644,0.045608,0.019773,0.018546,0.013495,0.018482,0.020130,0.015417,0.031109,0.007624,0.008526,0.032539,0.009846,0.007605,0.019866,0.007583,0.008991,0.009194,0.010128,0.008557,0.009333,0.007494)); - roundMidCenterT60(i) = ba.take(i+1,(0.193654,0.076056,0.197517,0.019475,0.043087,0.063829,0.074308,0.059791,0.082616,0.081949,0.042855,0.036140,0.068564,0.041711,0.043799,0.025988,0.057494,0.028353,0.018586,0.018651,0.025380,0.021250,0.019217,0.016326,0.019469,0.020754,0.019487,0.019590,0.011348,0.015969,0.015674,0.016305,0.026772,0.010597,0.009926,0.007595,0.008676,0.008274,0.011471,0.012424)); - roundSmallCenterFreq(i) = ba.take(i+1,(511.119501,860.897453,977.675690,1245.454667,1408.823199,1604.478891,1825.857776,1960.985105,2340.204377,2594.337460,2700.041698,3277.766643,3388.510632,3505.100505,4151.457765,4257.308449,4425.319123,4526.878869,4629.688075,4819.012204,5493.628166,6323.383769,6514.513248,6709.979636,6823.104590,7009.748398,7198.916858,9019.248381,9492.252653,9706.451249,9858.889433,10080.422278,10252.000811,10389.864946,12327.892342,12465.475093,13491.187794,15072.291233,15176.746743,20143.302052)); - roundSmallCenterGain(i) = ba.take(i+1,(1.000000,0.686570,0.362616,0.178685,0.113981,0.158727,0.024067,0.023659,0.085113,0.192224,0.174412,0.160279,0.042275,0.042204,0.027219,0.040505,0.064866,0.069074,0.029473,0.033054,0.055311,0.073694,0.071341,0.068366,0.026735,0.037359,0.026008,0.025958,0.025327,0.052859,0.082911,0.038156,0.046079,0.034839,0.022738,0.024480,0.158056,0.026848,0.028009,0.031387)); - roundSmallCenterT60(i) = ba.take(i+1,(0.200041,0.030199,0.050855,0.020135,0.020101,0.026910,0.043249,0.040814,0.058128,0.047490,0.051189,0.069063,0.047344,0.049448,0.024720,0.027275,0.028407,0.030171,0.026606,0.030289,0.040772,0.023856,0.020889,0.032859,0.027543,0.026427,0.032154,0.020576,0.032990,0.019344,0.019827,0.018571,0.017213,0.019002,0.020440,0.021329,0.023027,0.018833,0.018344,0.018811)); - semBigCenterFreq(i) = ba.take(i+1,(318.812824,545.646717,727.103717,813.406232,938.026296,1067.472803,1239.311077,1478.409235,1567.366603,1840.215865,2162.299536,2302.660906,2394.006715,2499.397129,2724.662564,2876.713036,3051.447083,3219.116214,3378.667296,3507.736722,3687.907343,3827.904993,4039.858029,4208.742422,4385.651803,4574.818448,4744.136436,4866.893882,5090.532579,5200.283111,5448.339367,5751.719886,6040.059676,6500.665192,6780.883377,6878.732474,7127.463954,7701.025454,10337.623684,17411.019601)); - semBigCenterGain(i) = ba.take(i+1,(1.000000,0.386065,0.297923,0.235171,0.346593,0.219093,0.050655,0.310031,0.175387,0.180464,0.064716,0.070721,0.027399,0.076973,0.086367,0.024188,0.100553,0.028776,0.027974,0.040200,0.031680,0.021694,0.035362,0.031821,0.027726,0.037219,0.026308,0.016164,0.022938,0.046669,0.031128,0.027430,0.032404,0.018356,0.026887,0.041003,0.012779,0.028785,0.013346,0.017281)); - semBigCenterT60(i) = ba.take(i+1,(0.195061,0.269748,0.108389,0.132557,0.127125,0.113759,0.159514,0.058527,0.067333,0.071996,0.067001,0.054194,0.052818,0.050935,0.045373,0.051611,0.051410,0.061272,0.050844,0.029415,0.021966,0.023483,0.022866,0.023418,0.033572,0.026764,0.017334,0.021394,0.025984,0.026146,0.018801,0.018242,0.022440,0.020939,0.011937,0.011739,0.020314,0.013848,0.016504,0.085830)); - semMidCenterFreq(i) = ba.take(i+1,(316.511541,548.598445,682.927606,764.088220,1145.795222,1280.068992,1524.562996,1677.146625,2083.900770,2285.783756,2452.226740,2779.274140,3196.405966,3569.262928,3798.251779,4071.264178,4413.799330,4550.364404,4966.398087,5156.799448,5363.124121,5611.038360,5995.650074,6162.624225,6583.973014,7029.525719,7207.893991,7706.775019,7844.032020,10298.804956,10564.531850,11615.688447,12056.168362,12661.205157,12876.405687,13082.890228,13851.437211,14452.383106,15683.910228,16667.950883)); - semMidCenterGain(i) = ba.take(i+1,(0.999641,0.798181,0.200080,0.280473,0.042761,0.079955,0.286673,0.162652,1.000000,0.309945,0.097527,0.023964,0.124529,0.155314,0.075600,0.178980,0.089168,0.134962,0.120730,0.036885,0.024020,0.102628,0.085255,0.059439,0.023339,0.027443,0.141618,0.044053,0.024269,0.046682,0.034465,0.068930,0.070502,0.025912,0.076088,0.024972,0.038501,0.051135,0.027801,0.022469)); - semMidCenterT60(i) = ba.take(i+1,(0.210670,0.062329,0.097470,0.136802,0.077790,0.025877,0.054632,0.060485,0.061625,0.061352,0.060614,0.030867,0.039440,0.030054,0.037956,0.030948,0.046137,0.045345,0.025326,0.025515,0.022514,0.043142,0.018663,0.015057,0.052844,0.016478,0.025993,0.017880,0.014006,0.022971,0.017720,0.032173,0.015391,0.009217,0.028936,0.011895,0.012607,0.018141,0.018341,0.018180)); - semSmallCenterFreq(i) = ba.take(i+1,(440.578370,637.619026,828.182637,978.279267,1088.401911,1321.315700,1648.932125,1817.216790,1938.686740,2173.897496,2450.967026,2582.312643,2748.003128,2858.292897,2973.003533,3235.482621,3348.561906,3496.046199,3706.507771,3934.307821,4418.408376,5239.069796,5428.018005,5771.733971,6106.378549,6304.512786,6788.234913,6905.001294,7054.694449,7227.988097,7348.344488,8450.449049,9000.316477,10930.327581,11271.451255,11418.301881,13448.385700,13938.733921,14334.394664,17413.449273)); - semSmallCenterGain(i) = ba.take(i+1,(1.000000,0.297197,0.715097,0.178811,0.229363,0.183731,0.107685,0.120764,0.060436,0.503361,0.352264,0.056432,0.042926,0.090906,0.224894,0.128151,0.257120,0.076416,0.096971,0.078669,0.065573,0.057421,0.085378,0.085397,0.050578,0.046534,0.213480,0.090142,0.078632,0.089706,0.276299,0.061182,0.038941,0.045447,0.043447,0.051347,0.055647,0.071836,0.040813,0.066853)); - semSmallCenterT60(i) = ba.take(i+1,(0.136710,0.070656,0.049965,0.034104,0.023973,0.032990,0.049605,0.026798,0.024777,0.040671,0.039262,0.035240,0.019214,0.053001,0.045917,0.045864,0.048770,0.040981,0.020747,0.022565,0.031089,0.026788,0.013828,0.023917,0.022485,0.035319,0.017955,0.014831,0.018902,0.014661,0.032984,0.027729,0.025067,0.021211,0.016910,0.027488,0.013164,0.012325,0.019985,0.079428)); - squareBigCenterFreq(i) = ba.take(i+1,(222.231629,336.343611,555.041069,772.219662,911.261442,1096.774273,1203.102824,1404.011001,1540.420421,1628.944840,1994.925663,2197.106949,2533.354244,2672.470165,2821.185962,2967.436266,3342.189608,3479.723368,3631.705350,3806.882908,3910.078404,4173.779128,4292.901543,4519.288440,4631.053559,4855.405142,5079.828139,5182.392108,5328.291818,5636.817979,5983.629129,6104.013800,6184.547942,6602.614840,6718.247643,6835.844044,6882.254514,7220.774814,7283.263950,7407.672066)); - squareBigCenterGain(i) = ba.take(i+1,(0.581227,1.000000,0.167366,0.663184,0.127173,0.141424,0.232076,0.043454,0.168681,0.244908,0.193343,0.147543,0.062214,0.112585,0.383899,0.053139,0.104651,0.093521,0.029220,0.027646,0.020979,0.031887,0.052610,0.045000,0.023542,0.049426,0.029063,0.049062,0.015097,0.030925,0.032215,0.032146,0.050862,0.016861,0.019228,0.021428,0.021039,0.016988,0.017971,0.033065)); - squareBigCenterT60(i) = ba.take(i+1,(0.417113,0.247980,0.103791,0.131234,0.194764,0.130569,0.119615,0.103862,0.102785,0.079975,0.068871,0.120830,0.066401,0.064964,0.037272,0.057999,0.038435,0.036927,0.036970,0.069147,0.036096,0.049136,0.046268,0.029452,0.025066,0.020942,0.040527,0.027374,0.030986,0.019875,0.028632,0.032344,0.033709,0.024938,0.063833,0.032297,0.028473,0.025768,0.024877,0.026385)); - squareMidCenterFreq(i) = ba.take(i+1,(306.243391,426.381556,523.626577,637.813655,855.576390,992.200454,1098.863347,1226.922784,1545.950522,1704.776255,1839.163057,1983.832482,2190.814571,2445.409860,2672.907579,2782.642755,2983.850376,3268.313978,3458.038380,3590.850048,3783.143602,4123.002328,4250.310528,4408.442518,4531.916055,4865.211680,5248.660726,5387.011592,5780.593786,5880.954673,6095.291499,6432.605387,6596.403501,6820.917687,6907.055108,7030.829711,7337.883035,7602.739152,7926.836412,12248.346109)); - squareMidCenterGain(i) = ba.take(i+1,(1.000000,0.292592,0.554710,0.359595,0.041223,0.283249,0.182057,0.078666,0.898203,0.105021,0.037156,0.128493,0.302569,0.134081,0.090181,0.116704,0.041711,0.268207,0.079651,0.034128,0.296838,0.051959,0.124454,0.077586,0.084915,0.126202,0.019697,0.017643,0.077301,0.068367,0.023764,0.015924,0.022163,0.017954,0.029917,0.021449,0.019083,0.026076,0.017965,0.017018)); - squareMidCenterT60(i) = ba.take(i+1,(0.236061,0.179001,0.084440,0.165197,0.083836,0.055543,0.067029,0.054547,0.046195,0.055390,0.052760,0.079021,0.073765,0.059744,0.071780,0.050510,0.036326,0.036162,0.039268,0.031777,0.037990,0.072567,0.045824,0.026516,0.027684,0.034229,0.040867,0.037800,0.026894,0.023151,0.023381,0.021277,0.023057,0.020207,0.019672,0.016358,0.024757,0.017036,0.016600,0.010195)); - squareSmallCenterFreq(i) = ba.take(i+1,(375.008194,527.945584,775.002560,981.584262,1125.203834,1287.701398,1394.790058,1577.138666,1727.825366,1860.700270,1950.809059,2020.169063,2185.798879,2382.343983,2587.140759,2792.652735,2970.443881,3047.515682,3332.695227,3416.636119,3513.876416,3994.492272,4128.261485,4247.828681,4425.131019,4686.893838,4731.141754,5553.904972,5702.206389,6415.071752,6552.422900,6785.461423,6990.104471,7256.116515,7884.508530,8787.479467,10529.849261,10641.861836,12075.018006,17405.170359)); - squareSmallCenterGain(i) = ba.take(i+1,(0.991070,1.000000,0.515946,0.549911,0.115279,0.157813,0.463743,0.206985,0.131491,0.244054,0.160114,0.116274,0.161678,0.048839,0.071332,0.072482,0.097678,0.083415,0.057484,0.059259,0.034662,0.064479,0.061452,0.110522,0.045770,0.053318,0.051225,0.034998,0.051538,0.081127,0.039422,0.226011,0.053013,0.052620,0.041956,0.058147,0.061262,0.046118,0.038256,0.124151)); - squareSmallCenterT60(i) = ba.take(i+1,(0.102256,0.088069,0.026433,0.131998,0.050149,0.052897,0.066531,0.060621,0.045315,0.047413,0.058375,0.059098,0.029950,0.018537,0.024086,0.032984,0.036868,0.032205,0.023710,0.023430,0.015516,0.022773,0.025265,0.028872,0.019743,0.036565,0.032704,0.025234,0.028383,0.018356,0.018609,0.017534,0.018699,0.015762,0.022800,0.013151,0.012300,0.018114,0.013192,0.085670)); - - // computing modes freq in function of x and y - modeFreq(i) = zxd + (zxu-zxd)*select2(y<1,(y-1),y) - with{ - zx0 = squareSmallCenterFreq(i) + (semSmallCenterFreq(i)-squareSmallCenterFreq(i))*x; - zx1 = semSmallCenterFreq(i) + (roundSmallCenterFreq(i)-semSmallCenterFreq(i))*(x-1); - zx2 = squareMidCenterFreq(i) + (semMidCenterFreq(i)-squareMidCenterFreq(i))*x; - zx3 = semMidCenterFreq(i) + (roundMidCenterFreq(i)-semMidCenterFreq(i))*(x-1); - zx4 = squareBigCenterFreq(i) + (semBigCenterFreq(i)-squareBigCenterFreq(i))*x; - zx5 = semBigCenterFreq(i) + (roundBigCenterFreq(i)-semBigCenterFreq(i))*(x-1); - zxd = select2(y<1,select2(x<1,zx3,zx2),select2(x<1,zx1,zx0)); - zxu = select2(y<1,select2(x<1,zx5,zx4),select2(x<1,zx3,zx2)); - }; - - // computing modes gain in function of x and y - modeGain(i) = zxd + (zxu-zxd)*select2(y<1,(y-1),y) - with{ - zx0 = squareSmallCenterGain(i) + (semSmallCenterGain(i)-squareSmallCenterGain(i))*x; - zx1 = semSmallCenterGain(i) + (roundSmallCenterGain(i)-semSmallCenterGain(i))*(x-1); - zx2 = squareMidCenterGain(i) + (semMidCenterGain(i)-squareMidCenterGain(i))*x; - zx3 = semMidCenterGain(i) + (roundMidCenterGain(i)-semMidCenterGain(i))*(x-1); - zx4 = squareBigCenterGain(i) + (semBigCenterGain(i)-squareBigCenterGain(i))*x; - zx5 = semBigCenterGain(i) + (roundBigCenterGain(i)-semBigCenterGain(i))*(x-1); - zxd = select2(y<1,select2(x<1,zx3,zx2),select2(x<1,zx1,zx0)); - zxu = select2(y<1,select2(x<1,zx5,zx4),select2(x<1,zx3,zx2)); - }; - - // computing modes T60 in function of x and y - modeT60(i) = zxd + (zxu-zxd)*select2(y<1,(y-1),y) //: min(0.1) - with{ - zx0 = squareSmallCenterT60(i) + (semSmallCenterT60(i)-squareSmallCenterT60(i))*x; - zx1 = semSmallCenterT60(i) + (roundSmallCenterT60(i)-semSmallCenterT60(i))*(x-1); - zx2 = squareMidCenterT60(i) + (semMidCenterT60(i)-squareMidCenterT60(i))*x; - zx3 = semMidCenterT60(i) + (roundMidCenterT60(i)-semMidCenterT60(i))*(x-1); - zx4 = squareBigCenterT60(i) + (semBigCenterT60(i)-squareBigCenterT60(i))*x; - zx5 = semBigCenterT60(i) + (roundBigCenterT60(i)-semBigCenterT60(i))*(x-1); - zxd = select2(y<1,select2(x<1,zx3,zx2),select2(x<1,zx1,zx0)); - zxu = select2(y<1,select2(x<1,zx5,zx4),select2(x<1,zx3,zx2)); - }; -}; - - -//-------`(pm.)modularInterpBody`---------- -// Bidirectional block implementing a modular string instrument resonator -// (see [`modeInterpRes`](#pm.modeinterpres)). -// -// #### Usage -// -// ``` -// chain(... : modularInterpBody(nModes,shape,scale) : ...) -// ``` -// -// Where: -// -// * `nModes`: number of modeled modes (40 max) -// * `shape`: shape of the resonator (0: square, 1: square with rounded corners, 2: round) -// * `scale`: scale of the resonator (0: small, 1: medium, 2: large) -//---------------------------------- -modularInterpBody(nModes,shape,scale) = _,modeInterpRes(nModes,shape,scale),_; - - -//-------`(pm.)modularInterpStringModel`---------- -// String instrument model with a modular body (see -// [`modeInterpRes`](#pm.modeinterpres) and -// ). -// -// #### Usage -// -// ``` -// modularInterpStringModel(length,pluckPosition,shape,scale,bodyExcitation,stringExcitation) : _ -// ``` -// -// Where: -// -// * `stringLength`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `shape`: shape of the resonator (0: square, 1: square with rounded corners, 2: round) -// * `scale`: scale of the resonator (0: small, 1: medium, 2: large) -// * `bodyExcitation`: excitation signal for the body -// * `stringExcitation`: excitation signal for the string -//---------------------------------- -modularInterpStringModel(stringLength,pluckPosition,shape,scale,bodyExcitation,stringExcitation) = endChain(egChain)*0.5 -with{ - maxStringLength = maxLength; - lengthTuning = 0.1; // tuned "by hand" - stringL = stringLength-lengthTuning; - nBodyModes = 40; - egChain = chain(guitarNuts : steelString(stringL,pluckPosition,stringExcitation) : - guitarBridge : inRightWave(bodyExcitation) : modularInterpBody(nBodyModes,shape,scale) : out); -}; - - -//-------`(pm.)modularInterpInstr`---------- -// String instrument with a modular body (see -// [`modeInterpRes`](#pm.modeinterpres) and -// ). -// -// #### Usage -// -// ``` -// modularInterpInstr(stringLength,pluckPosition,shape,scale,gain,tapBody,triggerString) : _ -// ``` -// -// Where: -// -// * `stringLength`: the length of the string in meters -// * `pluckPosition`: pluck position (0-1) (1 is on the bridge) -// * `shape`: shape of the resonator (0: square, 1: square with rounded corners, 2: round) -// * `scale`: scale of the resonator (0: small, 1: medium, 2: large) -// * `gain`: of the string excitation -// * `tapBody`: send an impulse in the body of the instrument where the string is connected (1 for on, 0 for off) -// * `triggerString`: trigger signal for the string (1 for on, 0 for off) -//---------------------------------- -modularInterpInstr(stringLength,pluckPosition,shape,scale,gain,tapBody,triggerString) = -(tapBody : ba.impulsify), pluckString(stringLength,1,1,1,gain,triggerString) : -modularInterpStringModel(stringLength,pluckPosition,shape,scale); - - -//-------`(pm.)modularInterpInstr_ui_MIDI`---------- -// Ready-to-use MIDI-enabled string instrument with a modular body (see -// [`modeInterpRes`](#pm.modeinterpres) and -// ) -// with built-in UI. -// -// #### Usage -// -// ``` -// modularInterpInstr_ui_MIDI : _ -// ``` -//---------------------------------- -modularInterpInstr_ui_MIDI = modularInterpInstr(stringLength,pluckPosition,shape,scale,gain,tapBody,gate)*outGain -with{ - f = hslider("v:modularInterpInstr/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:modularInterpInstr/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:modularInterpInstr/h:[0]midi/[2]gain[style:knob]",0.8,0,1,0.01); - s = hslider("v:modularInterpInstr/h:[0]midi/[3]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - shape = hslider("v:modularInterpInstr/h:[1]body/[0]shape[style:knob]",0,0,1,0.01)*2; - scale = hslider("v:modularInterpInstr/h:[1]body/[1]scale[style:knob]",0,0,1,0.011)*2; - tapBody = button("v:modularInterpInstr/h:[1]body/[2]tapBody"); - pluckPosition = hslider("v:modularInterpInstr/[2]pluckPosition[midi:ctrl 1]" - ,0.8,0,1,0.01) : si.smoo; - outGain = hslider("v:modularInterpInstr/[3]outGain",0.5,0,1,0.01); - t = button("v:modularInterpInstr/[4]gate"); - gate = t+s : min(1); - freq = f*bend; - stringLength = freq : f2l; -}; - - -//=============================Bowed String Instruments=================================== -// Low and high level basic string instruments parts. Most of the elements in -// this section can be used in a bidirectional chain. -//======================================================================================== - -//-------`(pm.)bowTable`---------- -// Extremely basic bow table that can be used to implement a wide range of -// bow types for many different bowed string instruments (violin, cello, etc.). -// -// #### Usage -// -// ``` -// excitation : bowTable(offeset,slope) : _ -// ``` -// -// Where: -// -// * `excitation`: an excitation signal -// * `offset`: table offset -// * `slope`: table slope -//---------------------------------- -bowTable(offset,slope) = pow(abs(sample) + 0.75, -4) : min(1) -with{ - sample = +(offset)*slope; -}; - - -//-------`(pm.)violinBowTable`---------- -// Violin bow table based on [`bowTable`](#bowtable). -// -// #### Usage -// -// ``` -// bowVelocity : violinBowTable(bowPressure) : _ -// ``` -// -// Where: -// -// * `bowVelocity`: velocity of the bow/excitation signal (0-1) -// * `bowPressure`: bow pressure on the string (0-1) -//---------------------------------- -violinBowTable(bowPressure) = bowTable(0,tableSlope) -with{ - tableSlope = 5 - (4*bowPressure); -}; - - -//-------`(pm.)bowInteraction`---------- -// Bidirectional block implementing the interaction of a bow in a -// [`chain`](#chain). -// -// #### Usage -// -// ``` -// chain(... : stringSegment : bowInteraction(bowTable) : stringSegment : ...) -// ``` -// -// Where: -// -// * `bowTable`: the bow table -//---------------------------------- -bowInteraction(b) = (_,_ <: b,_,_ :> _,_),_; - - -//-------`(pm.)violinBow`---------- -// Bidirectional block implementing a violin bow and its interaction with -// a string. -// -// #### Usage -// -// ``` -// chain(... : stringSegment : violinBow(bowPressure,bowVelocity) : stringSegment : ...) -// ``` -// -// Where: -// -// * `bowVelocity`: velocity of the bow / excitation signal (0-1) -// * `bowPressure`: bow pressure on the string (0-1) -//---------------------------------- -violinBow(bowPressure,bowVelocity) = bowInteraction(bowSystem) -with{ - bowSystem = + : bowVelocity-_ <: *(violinBowTable(bowPressure)) <: _,_; -}; - - -//-------`(pm.)violinBowedString`---------- -// Violin bowed string bidirectional block with controllable bow position. -// Terminations are not implemented in this model. -// -// #### Usage -// -// ``` -// chain(nuts : violinBowedString(stringLength,bowPressure,bowVelocity,bowPosition) : bridge) -// ``` -// -// Where: -// -// * `stringLength`: the length of the string in meters -// * `bowVelocity`: velocity of the bow / excitation signal (0-1) -// * `bowPressure`: bow pressure on the string (0-1) -// * `bowPosition`: the position of the bow on the string (0-1) -//---------------------------------- -violinBowedString(stringLength,bowPressure,bowVelocity,bowPosition) = - chain( - stringSegment(maxStringLength,ntbd) : - violinBow(bowPressure,bowVelocity) : - stringSegment(maxStringLength,btbd) - ) - with{ - maxStringLength = maxLength; - ntbd = stringLength*bowPosition; // upper portion of the string length - btbd = stringLength*(1-bowPosition); // lower portion of the string length - }; - - -//-------`(pm.)violinNuts`---------- -// Bidirectional block implementing simple violin nuts. This function is -// based on [`bridgeFilter`](#bridgefilter). -// -// #### Usage -// -// ``` -// chain(violinNuts : stringSegment : ...) -// ``` -//---------------------------------- -violinNuts = lTermination(-bridgeFilter(0.6,0.1),basicBlock); - - -//-------`(pm.)violinBridge`---------- -// Bidirectional block implementing a simple violin bridge. This function is -// based on [`bridgeFilter`](#bridgefilter). -// -// #### Usage -// -// ``` -// chain(... : stringSegment : violinBridge -// ``` -//---------------------------------- -// TODO: -// * reflectance is not implemented yet -violinBridge = rTermination(basicBlock,reflectance) : _,transmittance,_ -with{ - reflectance = -bridgeFilter(0.2,0.9); - transmittance = _; -}; - - -//-------`(pm.)violinBody`---------- -// Bidirectional block implementing a simple violin body (just a simple -// resonant lowpass filter). -// -// #### Usage -// -// ``` -// chain(... : stringSegment : violinBridge : violinBody) -// ``` -//---------------------------------- -// TODO: -// * reflectance is not implemented yet -violinBody = reflectance,transmittance,_ -with{ - transmittance = fi.resonbp(500,2,1); - reflectance = _; -}; - - -//-------`(pm.)violinModel`---------- -// Ready-to-use simple violin physical model. This model implements a single -// string. Additional strings should be created -// by making a polyphonic applications out of this function. Pitch is changed -// by changing the length of the string (and not through a finger model). -// -// #### Usage -// -// ``` -// violinModel(stringLength,bowPressure,bowVelocity,bridgeReflexion, -// bridgeAbsorption,bowPosition) : _ -// ``` -// -// Where: -// -// * `stringLength`: the length of the string in meters -// * `bowVelocity`: velocity of the bow / excitation signal (0-1) -// * `bowPressure`: bow pressure on the string (0-1)) -// * `bowPosition`: the position of the bow on the string (0-1) -//---------------------------------- -violinModel(stringLength,bowPressure,bowVelocity,bowPosition) = - endChain(modelChain) -with{ - stringTuning = 0.08; - stringL = stringLength-stringTuning; - modelChain = chain( - violinNuts : - violinBowedString(stringL,bowPressure,bowVelocity,bowPosition) : - violinBridge : - violinBody : - out - ); -}; - - -//-------`(pm.)violin_ui`---------- -// Ready-to-use violin physical model with built-in UI. -// -// #### Usage -// -// ``` -// violinModel_ui : _ -// ``` -//---------------------------------- -violin_ui = violinModel(stringLength,bowPress,bowVel,bowPos)*outGain -with{ - stringLength = hslider("v:violin/v:[0]string/[0]length",0.75,0,2,0.01) : si.smoo; - bowVel = hslider("v:violin/v:[1]bow/[0]velocity",0,0,1,0.01) : si.smoo; - bowPress = hslider("v:violin/v:[1]bow/[1]pressure",0.5,0,1,0.01) : si.smoo; - bowPos = hslider("v:violin/v:[1]bow/[2]position",0.7,0,1,0.01) : si.smoo; - outGain = hslider("v:violin/outGain",0.5,0,1,0.01); -}; - - -//-------`(pm.)violin_ui_MIDI`---------- -// Ready-to-use MIDI-enabled violin physical model with built-in UI. -// -// #### Usage -// -// ``` -// violin_ui_MIDI : _ -// ``` -//---------------------------------- -violin_ui_MIDI = violinModel(stringLength,bowPress,bowVel,bowPos)*outGain -with{ - f = hslider("v:violin/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:violin/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:violin/h:[0]midi/[2]gain[style:knob] - ",0.6,0,1,0.01); - envAttack = hslider("v:violin/h:[0]midi/[3]envAttack[style:knob] - ",1,0,30,0.01)*0.001; - s = hslider("v:violin/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - bowPress = hslider("v:violin/h:[1]bow/[0]pressure[style:knob] - [midi:ctrl 1]",0.5,0,1,0.01) : si.smoo; - bowPos = hslider("v:violin/h:[1]bow/[1]position[style:knob] - ",0.7,0,1,0.01) : si.smoo; - vibratoFreq = hslider("v:violin/h:[2]otherParams/[0]vibratoFrequency - [style:knob]",6,1,10,0.01); - vibratoGain = hslider("v:violin/h:[2]otherParams/[1]vibratoGain - [style:knob]",0.5,0,1,0.01)*0.01; - outGain = hslider("v:violin/h:[2]otherParams/[2]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:violin/[3]gate"); - - gate = t+s : min(1); - vibrato = 1+os.osc(vibratoFreq)*vibratoGain*envelope; - freq = f*bend*vibrato; - envelope = gate*gain : si.smooth(ba.tau2pole(envAttack)); - - stringLength = freq : f2l; - bowVel = envelope; -}; - - -//=================================Wind Instruments======================================= -// Low and high level basic wind instruments parts. Most of the elements in -// this section can be used in a bidirectional chain. -//======================================================================================== - -//-------`(pm.)openTube`---------- -// A tube segment without terminations (same as [`stringSegment`](#stringsegment)). -// -// #### Usage -// -// ``` -// chain(A : openTube(maxLength,length) : B) -// ``` -// -// Where: -// -// * `maxLength`: the maximum length of the tube in meters (should be static) -// * `length`: the length of the tube in meters -//---------------------------------- -openTube = stringSegment; - - -//-------`(pm.)reedTable`---------- -// Extremely basic reed table that can be used to implement a wide range of -// single reed types for many different instruments (saxophone, clarinet, etc.). -// -// #### Usage -// -// ``` -// excitation : reedTable(offeset,slope) : _ -// ``` -// -// Where: -// -// * `excitation`: an excitation signal -// * `offset`: table offset -// * `slope`: table slope -//---------------------------------- -reedTable(offset,slope) = reedTable : min(1) : max(-1) -with { - reedTable = *(slope) + offset; -}; - - -//-------`(pm.)fluteJetTable`---------- -// Extremely basic flute jet table. -// -// #### Usage -// -// ``` -// excitation : fluteJetTable : _ -// ``` -// -// Where: -// -// * `excitation`: an excitation signal -//---------------------------------- -fluteJetTable = _ <: *(* : -(1)) : clipping -with{ - clipping = min(1) : max(-1); -}; - - -//-------`(pm.)brassLipsTable`---------- -// Simple brass lips/mouthpiece table. Since this implementation is very basic -// and that the lips and tube of the instrument are coupled to each other, the -// length of that tube must be provided here. -// -// #### Usage -// -// ``` -// excitation : brassLipsTable(tubeLength,lipsTension) : _ -// ``` -// -// Where: -// -// * `excitation`: an excitation signal (can be DC) -// * `tubeLength`: length in meters of the tube connected to the mouthpiece -// * `lipsTension`: tension of the lips (0-1) (default: 0.5) -//---------------------------------- -brassLipsTable(tubeLength,lipsTension) = *(0.03) : lipFilter <: * : clipping -with{ - clipping = min(1) : max(-1); - freq = (tubeLength : l2f)*pow(4,(2*lipsTension)-1); - filterR = 0.997; - a1 = -2*filterR*cos(ma.PI*2*freq/ma.SR); - lipFilter = fi.tf2(1,0,0,a1,pow(filterR,2)); // resonance with same freq as tube -}; - - -//-------`(pm.)clarinetReed`---------- -// Clarinet reed based on [`reedTable`](#reedtable) with controllable -// stiffness. -// -// #### Usage -// -// ``` -// excitation : clarinetReed(stiffness) : _ -// ``` -// -// Where: -// -// * `excitation`: an excitation signal -// * `stiffness`: reed stiffness (0-1) -//---------------------------------- -clarinetReed(stiffness) = reedTable(0.7,tableSlope) -with{ - tableSlope = -0.44 + 0.26*stiffness; -}; - - -//-------`(pm.)clarinetMouthPiece`---------- -// Bidirectional block implementing a clarinet mouthpiece as well as the various -// interactions happening with traveling waves. This element is ready to be -// plugged to a tube... -// -// #### Usage -// -// ``` -// chain(clarinetMouthPiece(reedStiffness,pressure) : tube : etc.) -// ``` -// -// Where: -// -// * `pressure`: the pressure of the air flow (DC) created by the virtual performer (0-1). -// This can also be any kind of signal that will directly injected in the mouthpiece -// (e.g., breath noise, etc.). -// * `reedStiffness`: reed stiffness (0-1) -//---------------------------------- -clarinetMouthPiece(reedStiffness,pressure) = lTermination(reedInteraction,in(pressure)) -with{ - reedInteraction = *(-1) <: *(clarinetReed(reedStiffness)); -}; - - -//-------`(pm.)brassLips`---------- -// Bidirectional block implementing a brass mouthpiece as well as the various -// interactions happening with traveling waves. This element is ready to be -// plugged to a tube... -// -// #### Usage -// -// ``` -// chain(brassLips(tubeLength,lipsTension,pressure) : tube : etc.) -// ``` -// -// Where: -// -// * `tubeLength`: length in meters of the tube connected to the mouthpiece -// * `lipsTension`: tension of the lips (0-1) (default: 0.5) -// * `pressure`: the pressure of the air flow (DC) created by the virtual performer (0-1). -// This can also be any kind of signal that will directly injected in the mouthpiece -// (e.g., breath noise, etc.). -//---------------------------------- -brassLips(tubeLength,lipsTension,pressure) = lTermination(mpInteraction,basicBlock) -with{ - absorption = *(0.85); // absorption coefficient - p = pressure*0.3; // scaling pressure - mpInteraction = absorption <: - (p-_ : brassLipsTable(tubeLength,lipsTension) <: *(p),1-_),_ : _,* : + : fi.dcblocker; -}; - - -//-------`(pm.)fluteEmbouchure`---------- -// Bidirectional block implementing a flute embouchure as well as the various -// interactions happening with traveling waves. This element is ready to be -// plugged between tubes segments... -// -// #### Usage -// -// ``` -// chain(... : tube : fluteEmbouchure(pressure) : tube : etc.) -// ``` -// -// Where: -// -// * `pressure`: the pressure of the air flow (DC) created by the virtual -// performer (0-1). -// This can also be any kind of signal that will directly injected in the -// mouthpiece (e.g., breath noise, etc.). -//---------------------------------- -fluteEmbouchure(pressure) = -(_ <: _,_),_,_ : _,*(0.5)+(pressure-_*0.5 : fluteJetTable),_; - - -//-------`(pm.)wBell`---------- -// Generic wind instrument bell bidirectional block that should be placed at -// the end of a [`chain`](#chain). -// -// #### Usage -// -// ``` -// chain(... : wBell(opening)) -// ``` -// -// Where: -// -// * `opening`: the "opening" of bell (0-1) -//---------------------------------- -wBell(opening) = rTermination(basicBlock,si.smooth(opening)); - - -//-------`(pm.)fluteHead`---------- -// Simple flute head implementing waves reflexion. -// -// #### Usage -// -// ``` -// chain(fluteHead : tube : ...) -// ``` -//---------------------------------- -fluteHead = lTermination(*(absorption),basicBlock) -with{ - absorption = 0.95; // same as for foot -}; - - -//-------`(pm.)fluteFoot`---------- -// Simple flute foot implementing waves reflexion and dispersion. -// -// #### Usage -// -// ``` -// chain(... : tube : fluteFoot) -// ``` -//---------------------------------- -fluteFoot = rTermination(basicBlock,*(absorption) : dispersion) -with{ - dispersion = si.smooth(0.7); // just a simple lowpass - absorption = 0.95; // same as for head -}; - - -//-------`(pm.)clarinetModel`---------- -// A simple clarinet physical model without tone holes (pitch is changed by -// changing the length of the tube of the instrument). -// -// #### Usage -// -// ``` -// clarinetModel(length,pressure,reedStiffness,bellOpening) : _ -// ``` -// -// Where: -// -// * `tubeLength`: the length of the tube in meters -// * `pressure`: the pressure of the air flow created by the virtual performer (0-1). -// This can also be any kind of signal that will directly injected in the mouthpiece -// (e.g., breath noise, etc.). -// * `reedStiffness`: reed stiffness (0-1) -// * `bellOpening`: the opening of bell (0-1) -//---------------------------------- -clarinetModel(tubeLength,pressure,reedStiffness,bellOpening) = endChain(modelChain) -with{ - lengthTuning = 0.05; // empirical adjustment of the tuning of the tube - maxTubeLength = maxLength; - tunedLength = tubeLength/2-lengthTuning; // not really sure why we had to shift octave here - modelChain = - chain( - clarinetMouthPiece(reedStiffness,pressure) : - openTube(maxTubeLength,tunedLength) : - wBell(bellOpening) : out - ); -}; - - -//-------`(pm.)clarinetModel_ui`---------- -// Same as [`clarinetModel`](#clarinetModel) but with a built-in UI. This function -// doesn't implement a virtual "blower", thus `pressure` remains an argument here. -// -// #### Usage -// -// ``` -// clarinetModel_ui(pressure) : _ -// ``` -// -// Where: -// -// * `pressure`: the pressure of the air flow created by the virtual performer (0-1). -// This can also be any kind of signal that will be directly injected in the mouthpiece -// (e.g., breath noise, etc.). -//---------------------------------- -clarinetModel_ui(pressure) = clarinetModel(tubeLength,pressure,reedStiffness,bellOpening)*outGain -with{ - tubeLength = hslider("v:clarinetModel/[0]tubeLength",0.8,0.01,3,0.01) : si.smoo; - reedStiffness = hslider("v:clarinetModel/[1]reedStiffness",0.5,0,1,0.01); - bellOpening = hslider("v:clarinetModel/[2]bellOpening",0.5,0,1,0.01); - outGain = hslider("v:clarinetModel/[3]outGain",0.5,0,1,0.01); -}; - - -//-------`(pm.)clarinet_ui`---------- -// Ready-to-use clarinet physical model with built-in UI based on -// [`clarinetModel`](#clarinetmodel). -// -// #### Usage -// -// ``` -// clarinet_ui : _ -// ``` -//---------------------------------- -clarinet_ui = hgroup("clarinet",blower_ui : clarinetModel_ui); - - -//-------`(pm.)clarinet_ui_MIDI`---------- -// Ready-to-use MIDI compliant clarinet physical model with built-in UI. -// -// #### Usage -// -// ``` -// clarinet_ui_MIDI : _ -// ``` -//---------------------------------- -clarinet_ui_MIDI = -clarinetModel(tubeLength,blow,reedStiffness,bellOpening)*outGain -with{ - f = hslider("v:clarinet/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:clarinet/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:clarinet/h:[0]midi/[2]gain[style:knob] - ",0.6,0,1,0.01); - envAttack = hslider("v:clarinet/h:[0]midi/[3]envAttack[style:knob] - ",1,0,30,0.01)*0.001; - s = hslider("v:clarinet/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - reedStiffness = hslider("v:clarinet/h:[1]otherParams/[0]reedStiffness - [midi:ctrl 1][style:knob]",0.5,0,1,0.01); - bellOpening = hslider("v:clarinet/h:[1]otherParams/[1]bellOpening - [midi:ctrl 3][style:knob]",0.5,0,1,0.01); - vibratoFreq = hslider("v:clarinet/h:[1]otherParams/[2]vibratoFreq - [style:knob]",5,1,10,0.01); - vibratoGain = hslider("v:clarinet/h:[1]otherParams/[3]vibratoGain - [style:knob]",0.25,0,1,0.01)*0.01; - outGain = hslider("v:clarinet/h:[1]otherParams/[4]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:clarinet/[2]gate"); - - gate = t+s : min(1); - vibrato = 1+os.osc(vibratoFreq)*vibratoGain*envelope; - freq = f*bend*vibrato; - envelope = gate*gain : si.smooth(ba.tau2pole(envAttack)); - - tubeLength = freq : f2l; - pressure = envelope; // TODO: double vibrato here!! - blow = blower(pressure,0.05,2000,vibratoFreq,vibratoGain); -}; - - -//-------`(pm.)brassModel`---------- -// A simple generic brass instrument physical model without pistons -// (pitch is changed by changing the length of the tube of the instrument). -// This model is kind of hard to control and might not sound very good if -// bad parameters are given to it... -// -// #### Usage -// -// ``` -// brassModel(tubeLength,lipsTension,mute,pressure) : _ -// ``` -// -// Where: -// -// * `tubeLength`: the length of the tube in meters -// * `lipsTension`: tension of the lips (0-1) (default: 0.5) -// * `mute`: mute opening at the end of the instrument (0-1) (default: 0.5) -// * `pressure`: the pressure of the air flow created by the virtual performer (0-1). -// This can also be any kind of signal that will directly injected in the mouthpiece -// (e.g., breath noise, etc.). -//---------------------------------- -brassModel(tubeLength,lipsTension,mute,pressure) = endChain(brassChain) -with{ - maxTubeLength = maxLength; - lengthTuning = 0; // Not that important for that one because of lips tension - tunedLength = tubeLength + lengthTuning; - brassChain = chain(brassLips(tunedLength,lipsTension,pressure) : openTube(maxTubeLength,tunedLength) : wBell(mute) : out); -}; - - -//-------`(pm.)brassModel_ui`---------- -// Same as [`brassModel`](#brassModel) but with a built-in UI. This function -// doesn't implement a virtual "blower", thus `pressure` remains an argument here. -// -// #### Usage -// -// ``` -// brassModel_ui(pressure) : _ -// ``` -// -// Where: -// -// * `pressure`: the pressure of the air flow created by the virtual performer (0-1). -// This can also be any kind of signal that will be directly injected in the mouthpiece -// (e.g., breath noise, etc.). -//---------------------------------- -brassModel_ui(pressure) = brassModel(tubeLength,lipsTension,mute,pressure) -with{ - tubeLength = hslider("v:brassModel/[1]tubeLength",0.5,0.01,2.5,0.01) : si.smoo; - lipsTension = hslider("v:brassModel/[2]lipsTension",0.5,0,1,0.01) : si.smoo; - mute = hslider("v:brassModel/[3]mute",0.5,0,1,0.01) : si.smoo; -}; - - -//-------`(pm.)brass_ui`---------- -// Ready-to-use brass instrument physical model with built-in UI based on -// [`brassModel`](#brassmodel). -// -// #### Usage -// -// ``` -// brass_ui : _ -// ``` -//---------------------------------- -brass_ui = hgroup("brass",blower_ui : brassModel_ui); - - -//-------`(pm.)brass_ui_MIDI`---------- -// Ready-to-use MIDI-controllable brass instrument physical model with built-in UI. -// -// #### Usage -// -// ``` -// brass_ui_MIDI : _ -// ``` -//---------------------------------- -brass_ui_MIDI = brassModel(tubeLength,lipsTension,mute,pressure)*outGain -with{ - f = hslider("v:brass/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:brass/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:brass/h:[0]midi/[2]gain[style:knob] - ",0.5,0,1,0.01); - envAttack = hslider("v:brass/h:[0]midi/[3]envAttack[style:knob] - ",1,0,30,0.01)*0.001; - s = hslider("v:brass/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - lipsTension = hslider("v:brass/h:[1]otherParams/[0]lipsTension[style:knob] - [midi:ctrl 1]",0.5,0,1,0.01) : si.smoo; - mute = hslider("v:brass/h:[1]otherParams/[1]mute[style:knob] - ",0.5,0,1,0.01) : si.smoo; - vibratoFreq = hslider("v:brass/h:[1]otherParams/[2]vibratoFreq[style:knob] - ",5,1,10,0.01); - vibratoGain = hslider("v:brass/h:[1]otherParams/[3]vibratoGain[style:knob] - ",0.5,0,1,0.01)*0.04; - outGain = hslider("v:brass/h:[1]otherParams/[4]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:brass/[2]gate"); - - gate = t+s : min(1); - vibrato = 1+os.osc(vibratoFreq)*vibratoGain*envelope; - freq = f*bend; - envelope = gate*gain : si.smooth(ba.tau2pole(envAttack)); - - tubeLength = freq : f2l; - pressure = envelope*vibrato; -}; - - -//-------`(pm.)fluteModel`---------- -// A simple generic flute instrument physical model without tone holes -// (pitch is changed by changing the length of the tube of the instrument). -// -// #### Usage -// -// ``` -// fluteModel(tubeLength,mouthPosition,pressure) : _ -// ``` -// -// Where: -// -// * `tubeLength`: the length of the tube in meters -// * `mouthPosition`: position of the mouth on the embouchure (0-1) (default: 0.5) -// * `pressure`: the pressure of the air flow created by the virtual performer (0-1). -// This can also be any kind of signal that will directly injected in the mouthpiece -// (e.g., breath noise, etc.). -//---------------------------------- -// TODO: this model is out of tune and we're not really sure why -fluteModel(tubeLength,mouthPosition,pressure) = endChain(fluteChain) : fi.dcblocker -with{ - maxTubeLength = maxLength; - tubeTuning = 0.27; // set "by hand" - tLength = tubeLength+tubeTuning; // global tube length - embouchurePos = 0.27 + (mouthPosition-0.5)*0.4; // position of the embouchure on the tube - tted = tLength*embouchurePos; // head to embouchure distance - eted = tLength*(1-embouchurePos); // embouchure to foot distance - fluteChain = chain(fluteHead : openTube(maxTubeLength,tted) : fluteEmbouchure(pressure) : openTube(maxTubeLength,eted) : fluteFoot : out); -}; - - -//-------`(pm.)fluteModel_ui`---------- -// Same as [`fluteModel`](#fluteModel) but with a built-in UI. This function -// doesn't implement a virtual "blower", thus `pressure` remains an argument here. -// -// #### Usage -// -// ``` -// fluteModel_ui(pressure) : _ -// ``` -// -// Where: -// -// * `pressure`: the pressure of the air flow created by the virtual performer (0-1). -// This can also be any kind of signal that will be directly injected in the mouthpiece -// (e.g., breath noise, etc.). -//---------------------------------- -fluteModel_ui(pressure) = -fluteModel(tubeLength,mouthPosition,pressure)*outGain -with{ - tubeLength = hslider("v:fluteModel/[0]tubeLength",0.8,0.01,3,0.01) : si.smoo; - mouthPosition = hslider("v:fluteModel/[1]mouthPosition",0.5,0,1,0.01) : si.smoo; - outGain = hslider("v:fluteModel/[2]outGain",0.5,0,1,0.01); -}; - - -//-------`(pm.)flute_ui`---------- -// Ready-to-use flute physical model with built-in UI based on -// [`fluteModel`](#flutemodel). -// -// #### Usage -// -// ``` -// flute_ui : _ -// ``` -//---------------------------------- -flute_ui = hgroup("flute",blower_ui : fluteModel_ui); - - -//-------`(pm.)flute_ui_MIDI`---------- -// Ready-to-use MIDI-controllable flute physical model with built-in UI. -// -// #### Usage -// -// ``` -// flute_ui_MIDI : _ -// ``` -//---------------------------------- -flute_ui_MIDI = fluteModel(tubeLength,mouthPosition,blow)*outGain -with{ - f = hslider("v:flute/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:flute/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:flute/h:[0]midi/[2]gain[style:knob] - ",0.9,0,1,0.01); - envAttack = hslider("v:flute/h:[0]midi/[3]envAttack[style:knob] - ",1,0,30,0.01)*0.001; - s = hslider("v:flute/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - mouthPosition = hslider("v:flute/h:[1]otherParams/[0]mouthPosition - [style:knob][midi:ctrl 1]",0.5,0,1,0.01) - : si.smoo; - vibratoFreq = hslider("v:flute/h:[1]otherParams/[1]vibratoFreq[style:knob] - ",5,1,10,0.01); - vibratoGain = hslider("v:flute/h:[1]otherParams/[2]vibratoGain[style:knob] - ",0.5,0,1,0.01)*0.04; - outGain = hslider("v:flute/h:[1]otherParams/[3]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:flute/[2]gate"); - - gate = t+s : min(1); - freq = f*bend; - envelope = gate*gain : si.smooth(ba.tau2pole(envAttack)); - - tubeLength = freq : f2l; - pressure = envelope; - blow = blower(pressure,0.05,2000,vibratoFreq,vibratoGain); -}; - - -//=====================================Exciters=========================================== -// Various kind of excitation signal generators. -//======================================================================================== - -//-------`(pm.)impulseExcitation`-------------- -// Creates an impulse excitation of one sample. -// -// #### Usage -// -// ``` -// gate = button('gate'); -// impulseExcitation(gate) : chain; -// ``` -// -// Where: -// -// * `gate`: a gate button -//-------------------------------------- -impulseExcitation(trigger) = trigger : ba.impulsify; - - -//-------`(pm.)strikeModel`-------------- -// Creates a filtered noise excitation. -// -// #### Usage -// -// ``` -// gate = button('gate'); -// strikeModel(LPcutoff,HPcutoff,sharpness,gain,gate) : chain; -// ``` -// -// Where: -// -// * `HPcutoff`: highpass cutoff frequency -// * `LPcutoff`: lowpass cutoff frequency -// * `sharpness`: sharpness of the attack and release (0-1) -// * `gain`: gain of the excitation -// * `gate`: a gate button/trigger signal (0/1) -//-------------------------------------- -strikeModel(HPcutoff,LPcutoff,sharpness,gain,trigger) = -no.noise : fi.highpass(2,HPcutoff) : fi.lowpass(2,LPcutoff) : -*(en.ar(att,rel,trigger))*gain -with{ - att = 0.002*sharpness; - rel = att; -}; - - -//-------`(pm.)strike`-------------- -// Strikes generator with controllable excitation position. -// -// #### Usage -// -// ``` -// gate = button('gate'); -// strike(exPos,sharpness,gain,gate) : chain; -// ``` -// -// Where: -// -// * `exPos`: excitation position wiht 0: for max low freqs and 1: for max high -// freqs. So, on membrane for example, 0 would be the middle and 1 the edge -// * `sharpness`: sharpness of the attack and release (0-1) -// * `gain`: gain of the excitation -// * `gate`: a gate button/trigger signal (0/1) -//-------------------------------------- -strike(exPos,sharpness,gain,trigger) = strikeModel(HPcutoff,LPcutoff,sharpness,gain,trigger) -with{ - HPcutoff = 40+exPos*500; - LPcutoff = 500+exPos*15000; -}; - - -//-------`(pm.)pluckString`-------------- -// Creates a plucking excitation signal. -// -// #### Usage -// -// ``` -// trigger = button('gate'); -// pluckString(stringLength,cutoff,maxFreq,sharpness,trigger) -// ``` -// -// Where: -// -// * `stringLength`: length of the string to pluck -// * `cutoff`: cutoff ratio (1 for default) -// * `maxFreq`: max frequency ratio (1 for default) -// * `sharpness`: sharpness of the attack and release (1 for default) -// * `gain`: gain of the excitation (0-1) -// * `trigger`: trigger signal (1 for on, 0 for off) -//-------------------------------------- -pluckString(stringLength,cutoff,maxFreq,sharpness,gain,trigger) = -no.noise : fi.lowpass(2,cutoffreq) : *(en.ar(att,rel,trigger))*gain -with{ - freq = stringLength : l2f; - maxF = 2000*maxFreq; - att = 0.002*sharpness*pow((1 - freq/maxF),2); - rel = att; - cutoffreq = freq*5*cutoff; -}; - - -//-------`(pm.)blower`-------------- -// A virtual blower creating a DC signal with some breath noise in it. -// -// #### Usage -// -// ``` -// blower(pressure,breathGain,breathCutoff) : _ -// ``` -// -// Where: -// -// * `pressure`: pressure (0-1) -// * `breathGain`: breath noise gain (0-1) (recommended: 0.005) -// * `breathCutoff`: breath cuttoff frequency (Hz) (recommended: 2000) -//-------------------------------------- -blower(pressure,breathGain,breathCutoff,vibratoFreq,vibratoGain) = pressure + vibrato + breathNoise -with{ - vibrato = os.osc(vibratoFreq)*vibratoGain; - breathNoise = no.noise : fi.lowpass(2,breathCutoff) : *(pressure*breathGain); -}; - - -//-------`(pm.)blower_ui`-------------- -// Same as [`blower`](#blower) but with a built-in UI. -// -// #### Usage -// -// ``` -// blower : somethingToBeBlown -// ``` -//-------------------------------------- -blower_ui = blower(pressure,breathGain,breathCutoff,vibratoFreq,vibratoGain) -with{ - pressure = hslider("v:blower/[0]pressure",0,0,1,0.01) : si.smoo; - breathGain = hslider("v:blower/[1]breathGain",0.1,0,1,0.01)*0.05; - breathCutoff = hslider("v:blower/[2]breathCutoff",2000,20,20000,0.1); - vibratoFreq = hslider("v:blower/[3]vibratoFreq",5,0.1,10,0.1); - vibratoGain = hslider("v:blower/[4]vibratoGain",0.25,0,1,0.01)*0.03; -}; - - -//============================Modal Percussions=========================================== -// High and low level functions for modal synthesis of percussion instruments. -//======================================================================================== - -//-------`(pm.)djembeModel`---------- -// Dirt-simple djembe modal physical model. Mode parameters are empirically -// calculated and don't correspond to any measurements or 3D model. They -// kind of sound good though :). -// -// #### Usage -// -// ``` -// excitation : djembeModel(freq) -// ``` -// -// Where: -// -// * `excitation`: excitation signal -// * `freq`: fundamental frequency of the bar -//---------------------------------- -djembeModel(freq) = _ <: par(i,nModes,modeFilter(modeFreqs(i),modeT60s(i),modeGains(i))) :> /(nModes) -with{ - nModes = 20; - theta = 0; // angle - modeFreqs(i) = freq + 200*i; - modeT60s(i) = (nModes-i)*0.03; - modeGains(i) = cos((i+1)*theta)/float(i+1)*(1/(i+1)); -}; - - -//-------`(pm.)djembe`---------- -// Dirt-simple djembe modal physical model. Mode parameters are empirically -// calculated and don't correspond to any measurements or 3D model. They -// kind of sound good though :). -// -// This model also implements a virtual "exciter". -// -// #### Usage -// -// ``` -// djembe(freq,strikePosition,strikeSharpness,gain,trigger) -// ``` -// -// Where: -// -// * `freq`: fundamental frequency of the model -// * `strikePosition`: strike position (0 for the middle of the membrane and -// 1 for the edge) -// * `strikeSharpness`: sharpness of the strike (0-1, default: 0.5) -// * `gain`: gain of the strike -// * `trigger`: trigger signal (0: off, 1: on) -//---------------------------------- -djembe(freq,strikePosition,strikeSharpness,gain,trigger) = -strike(strikePosition,strikeSharpness,gain,trigger) : djembeModel(freq); - -//-------`(pm.)djembe_ui_MIDI`---------- -// Simple MIDI controllable djembe physical model with built-in UI. -// -// #### Usage -// -// ``` -// djembe_ui_MIDI : _ -// ``` -//---------------------------------- -djembe_ui_MIDI = -djembe(freq,strikePosition,strikeSharpness,gain,gate)*outGain -with{ - freq = hslider("v:djembe/h:[0]midi/[0]freq[style:knob]",60,50,100,0.01); - gain = hslider("v:djembe/h:[0]midi/[2]gain[style:knob]",1,0,1,0.01); - strikePosition = hslider("v:djembe/h:[1]otherParams/[0]strikePosition - [midi:ctrl 1][style:knob]",0.5,0,1,0.01); - strikeSharpness = hslider("v:djembe/h:[1]otherParams/[1]strikeSharpness[style:knob]",0.5,0.01,5,0.01); - outGain = hslider("v:djembe/h:[1]otherParams/[2]outGain - [style:knob]",1,0,1,0.01); - gate = button("v:djembe/[3]gate"); -}; - - -//-------`(pm.)marimbaBarModel`---------- -// Generic marimba tone bar modal model. -// -// This model was generated using -// `mesh2faust` from a 3D CAD model of a marimba tone bar -// (`libraries/modalmodels/marimbaBar`). The corresponding CAD model is that -// of a C2 tone bar (original fundamental frequency: ~65Hz). While -// `marimbaBarModel` allows to translate the harmonic content of the generated -// sound by providing a frequency (`freq`), mode transposition has limits and -// the model will sound less and less like a marimba tone bar as it -// diverges from C2. To make an accurate model of a marimba, we'd want to have -// an independent model for each bar... -// -// This model contains 5 excitation positions going linearly from the center -// bottom to the center top of the bar. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : marimbaBarModel(freq,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: excitation signal -// * `freq`: fundamental frequency of the bar -// * `exPos`: excitation position (0-4) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -marimbaBarModel(freq,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nModes = 50; - nExPos = 5; - modesFreqRatios(n) = ba.take(n+1,(1,3.31356,3.83469,8.06313,9.44778,14.1169,18.384,21.0102,26.1775,28.9944,37.0728,37.8703,40.0634,47.6439,51.019,52.43,58.286,63.5486,65.3628,66.9587,74.5301,78.692,80.8375,89.978,92.9661,95.1914,97.4807,110.62,112.069,113.826,119.356,127.045,129.982,132.259,133.477,144.549,149.438,152.033,153.166,155.597,158.183,168.105,171.863,174.464,178.937,181.482,185.398,190.369,192.19,195.505)); - modesFreqs(i) = freq*modesFreqRatios(i); - modesGains(p,n) = waveform{1,0.776725,0.625723,0.855223,0.760159,0.698373,0.768011,0.641127,0.244034,0.707754,0.634013,0.247527,0.660849,0.450396,0.567783,0.106361,0.716814,0.66392,0.291208,0.310599,0.801495,0.635292,0.307435,0.874124,0.497668,0.487088,0.459115,0.733455,0.541818,0.441318,0.31392,0.40309,0.685353,0.60314,0.400552,0.453511,0.634386,0.291547,0.131605,0.368507,0.839907,0.60216,0.288296,0.57967,0.0242493,0.262746,0.368588,0.890284,0.408963,0.556072,0.884427,0.83211,0.612015,0.757176,0.919477,1,0.827963,0.89241,0.0357408,0.480789,0.752872,0.0546301,0.235937,0.362938,0.444472,0.101751,0.703418,0.453136,0.316629,0.490394,0.982508,0.551622,0.602009,0.666957,0.77683,0.905662,0.0987197,0.402968,0.829452,0.307645,0.64048,0.983971,0.584205,0.650365,0.334447,0.58357,0.540191,0.672534,0.245712,0.687298,0.883058,0.79295,0.600619,0.572682,0.122612,0.388248,0.290658,0.380255,0.290967,0.567819,0.0737721,0.42099,0.0786578,0.393995,0.268983,0.260614,0.494086,0.238026,0.0987824,0.277879,0.440563,0.0770212,0.450591,0.128137,0.0368275,0.128699,0.329605,0.374512,0.36359,0.272594,0.379052,0.305241,0.0741129,0.345728,0.29935,0.221284,0.0261391,0.293202,0.361885,0.11433,0.239005,0.434156,0.329583,0.21946,0.284175,0.198555,0.431976,0.302985,1,0.146221,0.140701,0.264243,0.185997,0.426322,0.30478,0.34399,0.19543,0.386955,0.1876,0.172812,0.0434115,0.303761,0.069454,0.453943,0.832451,0.317817,0.940601,1,0.180658,0.737921,0.832297,0.402352,0.126786,0.594398,0.485455,0.32447,0.365102,0.777922,0.588272,0.401353,0.610735,0.158693,0.0746072,0.825099,0.925459,0.65377,0.260792,0.719384,0.559908,0.37259,0.360035,0.622939,0.210271,0.444595,0.311286,0.464309,0.557231,0.52408,0.0701056,0.320749,0.19446,0.727609,0.522062,0.394004,0.235035,0.395646,0.494796,0.517318,0.109752,0.692849,0.00632009,0.0207583,0.00306107,0.0637191,0.081661,0.03511,0.127814,0.202294,0.0764145,0.263127,0.400199,0.267278,0.633385,1,0.739902,0.413763,0.41811,0.612715,0.672374,0.339674,0.21172,0.459645,0.1025,0.32589,0.148154,0.265442,0.0974305,0.286438,0.275213,0.109111,0.575089,0.370283,0.29411,0.259826,0.0648719,0.583418,0.282663,0.182004,0.117421,0.417727,0.16965,0.24853,0.122819,0.185486,0.0433618,0.373849,0.252768,0.195103,0.0927835,0.166543},int(p*nModes+n) : rdtable : select2(modesFreqs(n)<(ma.SR/2-1),0); - modesT60s(i) = t60*pow(1-(modesFreqRatios(i)/195.955)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)marimbaResTube`---------- -// Simple marimba resonance tube. -// -// #### Usage -// -// ``` -// marimbaResTube(tubeLength,excitation) -// ``` -// -// Where: -// -// * `tubeLength`: the length of the tube in meters -// * `excitation`: the excitation signal (audio in) -//---------------------------------- -marimbaResTube(tubeLength,excitation) = endChain(tubeChain) -with{ - maxTubeLength = maxLength; - lengthTuning = 0.04; - tunedLength = tubeLength-lengthTuning; - endTubeReflexion = si.smooth(0.95)*0.99; - tubeChain = - chain( - in(excitation) : - terminations(endTubeReflexion, - openTube(maxTubeLength,tunedLength), - endTubeReflexion) : - out - ); -}; - - -//-------`(pm.)marimbaModel`---------- -// Simple marimba physical model implementing a single tone bar connected to -// tube. This model is scalable and can be adapted to any size of bar/tube -// (see [`marimbaBarModel`](#marimbabarmodel) to know more about the -// limitations of this type of system). -// -// #### Usage -// -// ``` -// excitation : marimbaModel(freq,exPos) : _ -// ``` -// -// Where: -// -// * `freq`: the frequency of the bar/tube couple -// * `exPos`: excitation position (0-4) -//---------------------------------- -marimbaModel(freq,exPos) = -marimbaBarModel(freq,exPos,maxT60,T60Decay,T60Slope) : marimbaResTube(resTubeLength) -with{ - resTubeLength = freq : f2l; - maxT60 = 0.1; - T60Decay = 1; - T60Slope = 5; -}; - - -//-------`(pm.)marimba`---------- -// Simple marimba physical model implementing a single tone bar connected to -// tube. This model is scalable and can be adapted to any size of bar/tube -// (see [`marimbaBarModel`](#marimbabarmodel) to know more about the -// limitations of this type of system). -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : marimba(freq,strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `freq`: the frequency of the bar/tube couple -// * `strikePosition`: strike position (0-4) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -marimba(freq,strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -marimbaModel(freq,strikePosition); - - -//-------`(pm.)marimba_ui_MIDI`---------- -// Simple MIDI controllable marimba physical model with built-in UI -// implementing a single tone bar connected to -// tube. This model is scalable and can be adapted to any size of bar/tube -// (see [`marimbaBarModel`](#marimbabarmodel) to know more about the -// limitations of this type of system). -// -// #### Usage -// -// ``` -// marimba_ui_MIDI : _ -// ``` -//---------------------------------- -marimba_ui_MIDI = -marimba(freq,strikePosition,strikeCutoff,strikeSharpness,gain,gate)*outGain -with{ - freq = hslider("v:marimba/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - gain = hslider("v:marimba/h:[0]midi/[2]gain[style:knob]",1,0,1,0.01); - strikePosition = nentry("v:marimba/h:[1]otherParams/[0]strikePosition - [midi:ctrl 1]",0,0,4,1); - strikeCutoff = hslider("v:marimba/h:[1]otherParams/[1]strikeCutOff - [midi:ctrl 1][style:knob]",6500,20,20000,1); - strikeSharpness = hslider("v:marimba/h:[1]otherParams/[2]strikeSharpness - [style:knob]",0.5,0.01,5,0.01); - outGain = hslider("v:marimba/h:[1]otherParams/[2]outGain - [style:knob]",0.8,0,1,0.01); - gate = button("v:marimba/[3]gate"); -}; - - -//-------`(pm.)churchBellModel`---------- -// Generic church bell modal model generated by `mesh2faust` from -// `libraries/modalmodels/churchBell`. -// -// Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -// Acoustics 2, 1987. -// -// Model height is 301 mm. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : churchBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `nModes`: number of synthesized modes (max: 50) -// * `exPos`: excitation position (0-6) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -churchBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nExPos = 7; - modesFreqs(n) = ba.take(n+1,(451.918,455,864.643,871.402,1072.47,1073.98,1292.23,1292.48,1504.6,1532.41,1646.2,1647,1677.83,1678.13,1866.63,1882.08,1985.2,1989.87,2114.93,2356.81,2444.32,2446.22,2528.77,2530.92,2668.86,2669.63,2738.06,2749.03,2750.53,2753.11,2827.19,2842.32,2992.56,2996.84,3172.61,3330.79,3390.33,3403.1,3516.43,3538.54,3582.79,3583.82,3730.04,3739.35,3758.66,3903.78,3942.59,3981.74,3983.25,4033.97)); - modesGains(p,n) = waveform{0.525285,0.814174,0.483261,0.296745,0.975056,0.472244,0.409501,0.425364,0.687559,0.288381,0.309285,0.123054,0.286333,0.576706,0.908322,0.626974,0.0801852,0.309835,0.45143,0.132845,0.470635,0.417008,0.265112,0.0752802,0.46347,0.47181,0.275324,0.547027,0.512519,0.394078,0.595404,0.941306,0.392501,0.381435,0.391232,0.118924,0.339495,0.101421,0.241755,0.0873255,0.378944,0.637705,0.171946,0.149859,0.23329,0.54181,1,0.115554,0.244172,0.574329,0.606171,0.938397,0.392555,0.277359,0.86857,0.432489,0.408856,0.407932,0.299815,0.256659,0.549572,0.406347,0.312331,0.627578,0.670167,0.524648,0.406926,0.637524,0.555837,1,0.818979,0.705347,0.678141,0.427382,0.674404,0.636105,0.643635,0.699136,0.836201,0.613085,0.319019,0.725259,0.545519,0.479861,0.49836,0.488654,0.861672,0.314287,0.671052,0.531905,0.421781,0.815066,0.772032,0.488722,0.0896674,0.291286,0.65873,0.635632,0.679357,0.459497,0.36024,0.582289,0.650605,0.49095,0.38191,0.157261,0.479624,0.477491,0.174435,0.013094,0.879113,0.608069,0.268877,0.604479,0.24513,0.170507,0.292888,0.545849,0.476646,0.922316,0.669192,0.578094,0.578797,0.311396,0.60121,0.549955,1,0.66573,0.980115,0.537848,0.0740531,0.252472,0.25575,0.223974,0.0865103,0.138209,0.198623,0.0453034,0.432453,0.292407,0.39441,0.857659,0.271668,0.201545,0.583994,0.0602378,0.190618,0.849505,0.975542,0.17314,0.206472,0.344793,0.761011,0.558125,0.117245,0.0338485,0.337597,0.336646,0.174253,0.23017,0.934873,0.593647,0.393225,0.683704,0.0566093,0.0405012,0.148972,0.338722,0.283419,0.394007,0.237475,0.269964,0.428313,0.177499,0.462585,0.443963,0.981793,0.408239,0.676527,0.402865,0.0163303,0.0515114,0.34139,0.311135,0.613276,0.805884,0.95329,0.406091,0.578705,0.386785,0.434103,0.77526,1,0.635909,0.782052,0.0137183,0.0387725,0.618964,0.857071,0.131522,0.184988,0.299495,0.789212,0.603114,0.0704989,0.0129339,0.252481,0.254121,0.189206,0.357713,0.950308,0.552573,0.466454,0.77736,0.0307886,0.0251943,0.378886,0.740187,0.247637,0.235201,0.493045,0.51785,0.883954,0.429473,0.409433,0.415266,0.940198,0.282334,0.43789,0.375385,0.0157366,0.0171763,0.485555,0.461015,0.858958,0.907991,0.935191,0.37551,1,0.585493,0.269981,0.423053,0.666067,0.43509,0.790252,0.00889586,0.0208844,0.449735,0.790808,0.159856,0.089599,0.161546,0.528168,0.380642,0.0206276,0.00726426,0.0315352,0.0315841,0.197649,0.475057,0.517232,0.360922,0.421204,0.63134,0.00952139,0.016105,0.499615,0.922958,0.214983,0.0655141,0.50397,0.514848,1,0.483619,0.254027,0.228372,0.436105,0.233125,0.152242,0.279513,0.00906739,0.0132332,0.451257,0.388566,0.737226,0.479378,0.233037,0.103767,0.845609,0.644127,0.261359,0.371457,0.527229,0.381373,0.334492,0.00833749,0.00861982,0.255919,0.254197,0.0872333,0.0461512,0.113018,0.345986,0.236344,0.01078,0.00816506,0.405181,0.38718,0.343681,0.816493,0.259082,0.211906,0.432455,0.696886,0.00576224,0.013131,0.455969,0.811609,0.426544,0.128489,0.215937,0.233934,0.72307,0.351623,0.394231,0.323766,0.168803,0.276932,0.264684,0.227703,0.00680935,0.0170703,0.603018,0.476461,0.585925,0.71696,1,0.576527,0.475524,0.447322,0.356902,0.597573,0.697246,0.505333,0.285421,0.0147193,0.0141618,0.136188,0.0336537,0.216437},int(p*nModes+n) : rdtable; - modesT60s(i) = t60*pow(1-(modesFreqs(i)/4035.44)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)churchBell`---------- -// Generic church bell modal model. -// -// Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -// Acoustics 2, 1987. -// -// Model height is 301 mm. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : churchBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `strikePosition`: strike position (0-6) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -churchBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -churchBellModel(50,strikePosition,30,1,2.5); - - -//-------`(pm.)churchBell_ui`---------- -// Church bell physical model based on [`churchBell`](#churchbell) with -// built-in UI. -// -// #### Usage -// -// ``` -// churchBell_ui : _ -// ``` -//---------------------------------- -churchBell_ui = -churchBell(strikePosition,strikeCutoff,strikeSharpness,gain,gate) -with{ - strikePosition = nentry("v:churchBell/[0]strikePosition", - 0,0,4,1); - strikeCutoff = hslider("v:churchBell/[1]strikeCutOff", - 6500,20,20000,1); - strikeSharpness = hslider("v:churchBell/[2]strikeSharpness", - 0.5,0.01,5,0.01); - gain = hslider("v:churchBell/[3]gain",1,0,1,0.01); - gate = button("v:churchBell/[4]gate"); -}; - - -//-------`(pm.)englishBellModel`---------- -// English church bell modal model generated by `mesh2faust` from -// `libraries/modalmodels/englishBell`. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 1 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : englishBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `nModes`: number of synthesized modes (max: 50) -// * `exPos`: excitation position (0-6) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -englishBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nExPos = 7; - modesFreqs(n) = ba.take(n+1,(259.429,261.855,493.331,494.472,603.048,604.742,724.566,724.777,786.985,931.893,932.846,943.429,946.533,947.109,952.782,1024.24,1034.86,1211.59,1212.21,1236.28,1340.21,1341.15,1452.63,1453.38,1453.77,1457.45,1459.23,1460.7,1482.81,1483.04,1519.55,1547.27,1565.95,1576.95,1697.47,1826.61,1892.56,1896.09,1899.86,1908.29,2003.95,2005.07,2005.89,2005.99,2067.42,2082.42,2086.81,2120.56,2129.79,2133.23)); - modesGains(p,n) = waveform{0.694274,0.471698,0.17239,0.585446,0.397986,0.919579,0.531947,0.100205,0.639469,0.672209,0.144345,0.416595,0.124108,0.380591,0.256578,0.646031,0.8522,0.0224376,0.382762,0.143925,0.368691,0.430556,0.32318,0.142956,0.274521,0.713824,0.442794,0.352473,0.247756,0.415152,1,0.401869,0.197981,0.27951,0.210249,0.36974,0.369227,0.155769,0.272368,0.335712,0.31645,0.714103,0.285781,0.22006,0.827704,0.206342,0.180177,0.311478,0.197607,0.575475,0.473311,0.587232,0.50288,0.337308,0.304514,0.429039,0.351522,0.341373,0.175081,0.561748,0.439172,0.323164,0.540518,0.536523,0.0743865,0.213417,0.358012,0.474494,0.310274,0.839413,0.241372,0.202343,0.480634,0.995685,0.37374,0.133998,0.520674,0.207514,1,0.101239,0.279536,0.185985,0.436293,0.62411,0.334519,0.283585,0.179317,0.353847,0.449545,0.574128,0.135172,0.538275,0.476424,0.832903,0.164198,0.188562,0.135978,0.390128,0.131045,0.312065,0.142139,0.0255901,0.266947,0.371607,0.0168435,0.0249468,0.508917,0.35441,0.283348,0.628155,0.292478,0.35835,0.342569,0.441237,0.886699,0.0174698,0.00641843,0.55532,0.880129,0.0306909,0.290081,0.248816,0.981736,0.324624,0.213676,0.432885,0.0981559,0.444149,0.395554,0.525069,0.0771308,0.0488804,0.591321,0.108044,0.443802,0.740318,0.599438,0.293093,1,0.141662,0.910031,0.226126,0.299702,0.341472,0.0568061,0.222494,0.918718,0.199478,0.21662,0.107759,0.692324,0.556336,0.281718,0.430832,0.341656,0.608095,0.342129,0.311312,0.229953,0.695087,0.0761489,0.349818,0.361706,0.577611,0.147797,0.327376,0.465715,0.342902,0.521381,0.836828,0.241112,0.284394,0.539316,0.143408,0.51702,1,0.236336,0.480333,0.676744,0.807582,0.468621,0.236953,0.411604,0.579251,0.425098,0.37599,0.461176,0.27653,0.462368,0.613004,0.666849,0.954715,0.161507,0.170433,0.290461,0.117303,0.365133,0.233794,0.194568,0.338874,0.523381,0.39835,0.447839,0.652891,0.15708,0.340354,0.44217,0.338764,0.184397,0.771607,0.160502,0.324487,0.477499,0.831519,0.0168764,0.154264,0.201865,0.237786,0.390066,0.880164,0.284234,0.162837,0.437557,0.227846,0.39934,1,0.158107,0.396903,0.513029,0.676457,0.204282,0.0895575,0.55541,0.732486,0.125062,0.171229,0.081646,0.0541394,0.39616,0.454288,0.466863,0.928842,0.155393,0.26285,0.113453,0.133163,0.302021,0.612616,0.228392,0.195617,0.287236,0.198762,0.499884,0.809139,0.00929925,0.0840299,0.286446,0.182112,0.186044,0.754138,0.279556,0.266948,0.494291,1,0.321284,0.0230981,0.0375537,0.262531,0.602204,0.489925,0.633077,0.407409,0.422256,0.0910641,0.357935,0.550179,0.106192,0.132366,0.376231,0.351151,0.0420302,0.0372183,0.696335,0.840821,0.855235,0.249248,0.860011,0.340481,0.28558,0.363039,0.324122,0.515699,0.228131,0.172592,0.0188723,0.168243,0.995105,0.741759,0.107093,0.070349,0.136636,0.0780455,0.315748,0.502201,0.0190422,0.033914,0.225724,0.160236,0.184101,0.564203,0.247317,0.284225,0.327153,0.651443,0.593471,0.0163899,0.0141048,0.52113,1,0.105109,0.530936,0.363724,0.924809,0.25041,0.69288,0.414122,0.0793658,0.347813,0.441731,0.476428,0.0808834,0.0581638,0.557239,0.556515,0.746084,0.582228,0.177231,0.158425,0.850903,0.755271,0.673614,0.31706,0.0515386,0.201898,0.0577938,0.232031,0.734988,0.141594,0.267062,0.145807},int(p*nModes+n) : rdtable; - modesT60s(i) = t60*pow(1-(modesFreqs(i)/2137.04)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)englishBell`---------- -// English church bell modal model. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 1 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : englishBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `strikePosition`: strike position (0-6) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -englishBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -englishBellModel(50,strikePosition,30,1,3); - - -//-------`(pm.)englishBell_ui`---------- -// English church bell physical model based on [`englishBell`](#englishbell) with -// built-in UI. -// -// #### Usage -// -// ``` -// englishBell_ui : _ -// ``` -//---------------------------------- -englishBell_ui = -englishBell(strikePosition,strikeCutoff,strikeSharpness,gain,gate) -with{ - strikePosition = nentry("v:englishBell/[0]strikePosition",0,0,4,1); - strikeCutoff = hslider("v:englishBell/[1]strikeCutOff",6500,20,20000,1); - strikeSharpness = hslider("v:englishBell/[2]strikeSharpness",0.5,0.01,5,0.01); - gain = hslider("v:englishBell/[3]gain",1,0,1,0.01); - gate = button("v:englishBell/[4]gate"); -}; - - -//-------`(pm.)frenchBellModel`---------- -// French church bell modal model generated by `mesh2faust` from -// `libraries/modalmodels/frenchBell`. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 1 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : frenchBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `nModes`: number of synthesized modes (max: 50) -// * `exPos`: excitation position (0-6) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -frenchBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nExPos = 7; - modesFreqs(n) = ba.take(n+1,(439.077,440.305,606.452,611.776,709.617,709.877,856.966,899.051,1064.37,1064.75,1073.03,1074.43,1076.58,1145.42,1148.9,1197.09,1199.91,1387.7,1400.16,1402.37,1512.06,1513.06,1592.47,1593.35,1663.45,1666.47,1691.32,1693.77,1804.83,1808.84,1820.07,1847.14,1910.73,1927.7,2035.07,2038.73,2054.66,2055.67,2078.69,2091.76,2115.78,2127.01,2209.86,2214.05,2296.15,2298.08,2298.97,2307.62,2404.44,2408.99)); - modesGains(p,n) = waveform{0.97289,0.542393,0.495832,0.897966,0.552367,0.557895,0.614213,0.353694,0.436039,0.441024,0.674913,0.566754,0.755008,0.69903,0.164398,0.91004,0.628373,0.201718,0.429517,0.503715,0.871174,0.106886,0.761173,0.673602,0.291937,0.58859,0.31528,0.413081,0.274464,0.494062,0.696121,0.61201,0.382757,0.995113,0.228806,0.198449,0.595847,0.306263,0.252397,0.0883567,0.236086,1,0.245278,0.379388,0.198824,0.548892,0.492764,0.420871,0.794637,0.605634,1,0.604159,0.399841,0.799347,0.507187,0.50981,0.477383,0.310226,0.426976,0.437623,0.735712,0.630728,0.625785,0.651168,0.277738,0.850858,0.578079,0.645354,0.3837,0.370598,0.782542,0.181325,0.614391,0.740684,0.342441,0.586186,0.286909,0.405197,0.259215,0.566983,0.748219,0.655898,0.36826,0.940814,0.336157,0.413702,0.561557,0.402176,0.117698,0.329369,0.254571,0.870706,0.260981,0.274122,0.206247,0.6453,0.400758,0.363622,0.636834,0.584566,0.975603,0.616937,0.295401,0.650447,0.464221,0.465057,0.312467,0.238358,0.383695,0.399674,0.753912,0.662012,0.504268,0.599248,0.378665,0.725363,0.493214,1,0.332836,0.265889,0.674073,0.320401,0.440018,0.769782,0.316419,0.529968,0.380509,0.578676,0.249013,0.591384,0.761717,0.687057,0.324437,0.818864,0.505369,0.672485,0.461783,0.426198,0.0678875,0.435329,0.347955,0.708394,0.293322,0.328986,0.258254,0.893512,0.320131,0.433554,0.459302,0.542213,0.817241,0.51623,0.205302,0.467354,0.388683,0.388216,0.171262,0.150865,0.29172,0.311414,0.658876,0.570647,0.383619,0.502455,0.364114,0.532313,0.352989,1,0.261984,0.219591,0.544031,0.337199,0.279173,0.668303,0.208439,0.39923,0.418674,0.648618,0.234133,0.504729,0.645347,0.572851,0.232828,0.614292,0.485272,0.666264,0.31657,0.320355,0.191421,0.340131,0.342069,0.538371,0.281131,0.393115,0.251394,0.890725,0.310644,0.5037,0.29909,0.442478,0.733128,0.455217,0.199322,0.315699,0.375856,0.37649,0.029145,0.0200283,0.279578,0.3168,0.655957,0.546843,0.349666,0.470249,0.353765,0.286794,0.180185,1,0.210831,0.280133,0.535853,0.376488,0.15367,0.634745,0.0510449,0.485575,0.593111,0.917884,0.380477,0.422925,0.599373,0.311421,0.135654,0.359954,0.295748,0.474439,0.353339,0.116743,0.454313,0.112858,0.35931,0.483897,0.301608,0.577342,0.262663,0.794986,0.54958,0.808086,0.152511,0.439591,0.535941,0.308018,0.419837,0.579191,0.250428,0.25212,0.10286,0.288332,0.599679,0.665108,0.636285,0.495234,0.251613,0.208527,0.0939072,0.458415,0.318952,0.23535,0.215189,0.313412,0.0472787,0.0386893,0.0863359,0.222346,0.361511,0.997037,0.238509,0.38214,1,0.203554,0.472087,0.509015,0.206371,0.441013,0.794008,0.971623,0.796384,0.55043,0.68778,0.554298,0.0436545,0.0595577,0.214685,0.58147,0.27732,0.368466,0.121382,0.152739,0.0782244,0.190497,0.316269,0.180456,0.405196,0.518716,0.159365,0.165808,0.194372,0.614764,0.553415,0.644794,0.44178,0.44149,0.221588,1,0.579371,0.606339,0.529167,0.0214475,0.417046,0.663152,0.894841,0.475752,0.168289,0.46859,0.304604,0.666369,0.308337,0.295091,0.768945,0.350911,0.49068,0.516584,0.400117,0.820687,0.545486,0.709357,0.509759,0.472006,0.152455,0.981265,0.459134,0.698666,0.247154,0.623253,0.255508,0.830815,0.088709,0.126082,0.0770623,0.263328},int(p*nModes+n) : rdtable; - modesT60s(i) = t60*pow(1-(modesFreqs(i)/2555.3)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)frenchBell`---------- -// French church bell modal model. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 1 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : frenchBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `strikePosition`: strike position (0-6) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -frenchBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -frenchBellModel(50,strikePosition,30,1,3); - - -//-------`(pm.)frenchBell_ui`---------- -// French church bell physical model based on [`frenchBell`](#frenchbell) with -// built-in UI. -// -// #### Usage -// -// ``` -// frenchBell_ui : _ -// ``` -//---------------------------------- -frenchBell_ui = -frenchBell(strikePosition,strikeCutoff,strikeSharpness,gain,gate) -with{ - strikePosition = nentry("v:frenchBell/[0]strikePosition",0,0,4,1); - strikeCutoff = hslider("v:frenchBell/[1]strikeCutOff",6500,20,20000,1); - strikeSharpness = hslider("v:frenchBell/[2]strikeSharpness",0.5,0.01,5,0.01); - gain = hslider("v:frenchBell/[3]gain",1,0,1,0.01); - gate = button("v:frenchBell/[4]gate"); -}; - - -//-------`(pm.)germanBellModel`---------- -// German church bell modal model generated by `mesh2faust` from -// `libraries/modalmodels/germanBell`. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 1 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : germanBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `nModes`: number of synthesized modes (max: 50) -// * `exPos`: excitation position (0-6) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -germanBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nExPos = 7; - modesFreqs(n) = ba.take(n+1,(238.909,240.235,406.25,408.214,561.105,562.923,749.632,749.88,781.389,800.68,801.547,884.486,942.52,942.715,958.571,960.581,1016.87,1018.29,1022.29,1206.2,1206.87,1213.93,1222.77,1231.68,1345.65,1355.18,1356.55,1357.3,1389.29,1391.11,1420.17,1424.05,1424.31,1426.54,1582.3,1631.07,1638.15,1720.28,1726.7,1803.79,1827.08,1829.44,1922.87,1926.94,1940.96,1944.47,1948.2,1969.86,1992.24,2011.85)); - modesGains(p,n) = waveform{0.761411,0.797803,0.586057,0.225039,0.926354,0.813875,0.529871,0.158915,0.662516,0.30841,0.0454785,0.556082,0.784713,0.213035,0.956227,0.795165,0.313508,0.158531,0.301586,0.16832,0.281267,0.154237,0.217235,0.247239,0.522688,0.170303,0.320614,0.154857,0.414941,0.788364,0.713299,0.381592,0.707011,1,0.0106946,0.359763,0.0746156,0.431124,0.118053,0.52729,0.255303,0.646855,0.201145,0.919908,0.359389,0.253494,0.865695,0.0829263,0.222589,0.0415736,0.735774,0.769678,0.381416,0.197543,0.682389,0.614766,0.249525,0.289883,0.300319,0.443691,0.275272,0.370218,0.74879,0.161247,0.634353,0.498498,0.221988,0.350637,0.436817,0.436463,0.52508,0.842646,0.195324,0.224755,0.545681,0.353778,0.269044,0.327814,0.448952,0.852305,0.380503,1,0.458063,0.565058,0.354635,0.659529,0.449485,0.802014,0.283446,0.521563,0.374639,0.652112,0.181042,0.468394,0.430116,0.157207,0.414995,0.292737,0.487785,0.47768,0.481445,0.556988,0.561132,0.378265,0.291462,0.32325,0.482602,0.328248,0.196792,0.712254,0.389806,0.307751,0.792876,0.199098,0.288838,0.146811,0.0178444,0.394017,0.588212,0.489226,0.701486,0.940303,0.213191,0.0778845,0.474463,0.609972,0.16338,0.408376,0.330864,0.88999,0.0798101,1,0.167172,0.208727,0.227549,0.825903,0.531897,0.580946,0.215339,0.247319,0.268148,0.504088,0.160955,0.170316,0.230769,0.151191,0.0825031,0.141328,0.288079,0.499676,0.420355,0.487764,0.75371,0.492248,0.181364,0.20594,0.52497,0.325641,0.236827,0.931842,0.472981,0.312162,0.901032,0.270478,0.167112,0.0709698,0.166004,0.290745,0.425893,0.403633,0.581772,0.855694,0.0325587,0.0568359,0.241923,0.79931,0.181962,0.530283,0.41561,1,0.0291501,0.831155,0.119755,0.102188,0.132037,0.76603,0.442221,0.1749,0.142175,0.0140794,0.4375,0.85186,0.196836,0.0907522,0.551673,0.256528,0.0424377,0.490363,0.108178,0.503276,0.226584,0.312758,0.824079,0.48412,0.0347338,0.0619428,0.255097,0.145273,0.190359,0.995297,0.50342,0.217575,0.793975,0.357179,0.0409728,0.0187931,0.414458,0.15844,0.346233,0.0771673,0.175111,0.380567,0.497409,0.316164,0.488669,1,0.420657,0.442333,0.24706,0.796407,0.0104146,0.227079,0.10684,0.0289873,0.76757,0.0643122,0.0423098,0.715522,0.472117,0.392577,0.660433,0.803575,0.188653,0.0191653,0.873212,0.448719,0.0147128,0.618967,0.30718,0.345899,0.131394,0.193225,0.715283,0.40562,0.040637,0.0503336,0.0544331,0.0452023,0.152302,0.894549,0.443343,0.172071,0.647667,0.328993,0.0416014,0.0229488,0.551071,0.423544,0.862362,0.363526,0.769929,0.123452,0.710702,0.394895,0.556638,1,0.450925,0.422849,0.092187,0.413892,0.00995372,0.321146,0.160624,0.0300681,0.915385,0.4755,0.506951,0.387549,0.275591,0.468281,0.184776,0.186837,0.188195,0.0202785,0.697136,0.408862,0.0116935,0.349823,0.202301,0.461379,0.0559023,0.0582571,0.260608,0.181875,0.0271739,0.0249578,0.685089,0.470384,0.283194,0.33105,0.138349,0.338068,0.481992,0.178242,0.0155942,0.0110435,0.783771,0.442707,0.616478,0.381542,0.510892,0.045985,0.303119,0.0731909,0.547715,0.348941,0.149981,0.302158,0.284482,0.398177,0.00413049,0.180739,0.062839,0.0133459,0.347088,0.57637,0.240764,0.978481,0.452755,0.529742,0.340471,0.662282,0.444305,0.0429901,1,0.36194,0.0183372,0.626893,0.55285,0.384936},int(p*nModes+n) : rdtable; - modesT60s(i) = t60*pow(1-(modesFreqs(i)/2016.94)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)germanBell`---------- -// German church bell modal model. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 1 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : germanBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `strikePosition`: strike position (0-6) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -germanBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -germanBellModel(50,strikePosition,30,1,2.5); - - -//-------`(pm.)germanBell_ui`---------- -// German church bell physical model based on [`germanBell`](#germanbell) with -// built-in UI. -// -// #### Usage -// -// ``` -// germanBell_ui : _ -// ``` -//---------------------------------- -germanBell_ui = -germanBell(strikePosition,strikeCutoff,strikeSharpness,gain,gate) -with{ - strikePosition = nentry("v:germanBell/[0]strikePosition",0,0,4,1); - strikeCutoff = hslider("v:germanBell/[1]strikeCutOff",6500,20,20000,1); - strikeSharpness = hslider("v:germanBell/[2]strikeSharpness",0.5,0.01,5,0.01); - gain = hslider("v:germanBell/[3]gain",1,0,1,0.01); - gate = button("v:germanBell/[4]gate"); -}; - - -//-------`(pm.)russianBellModel`---------- -// Russian church bell modal model generated by `mesh2faust` from -// `libraries/modalmodels/russianBell`. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 2 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : russianBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `nModes`: number of synthesized modes (max: 50) -// * `exPos`: excitation position (0-6) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -russianBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nExPos = 7; - modesFreqs(n) = ba.take(n+1,(136.491,136.992,258.958,260.419,316.489,318.411,393.852,393.949,454.677,467.493,503.594,503.637,530.46,531.046,541.16,546.158,578.335,579.863,660.026,708.34,716.915,717.23,775.839,776.066,783.356,783.464,788.826,789.463,800.348,806.758,876.788,880.414,887.297,888.222,916.815,919.711,937.686,984.606,1057.2,1058.45,1065.48,1082.27,1083.93,1086.55,1086.77,1108.2,1116.17,1149,1150.54,1199.54)); - modesGains(p,n) = waveform{0.925507,0.59752,0.0965671,0.45412,0.989773,0.593498,0.512541,0.124241,0.705411,0.292396,0.673399,0.302181,0.026234,0.286249,0.556267,1,0.250426,0.107711,0.427299,0.336295,0.616257,0.21442,0.0845294,0.231363,0.522724,0.559114,0.34847,0.854197,0.835576,0.735036,0.288494,0.117122,0.409686,0.363575,0.484943,0.170862,0.420531,0.164793,0.233847,0.861232,0.214037,0.283462,0.173153,0.876122,0.607809,0.294745,0.143142,0.332009,0.491878,0.626104,0.962027,0.584298,0.213653,0.420452,0.812329,0.545172,0.380744,0.331536,0.386801,0.248909,0.688756,0.313904,0.377894,0.595846,0.412274,0.739626,0.541148,0.393005,0.656637,0.847672,0.930653,0.288289,0.404938,0.657989,0.763949,0.574085,0.282241,1,0.429131,0.572049,0.734868,0.577477,0.520789,0.355593,0.890067,0.272391,0.448223,0.423969,0.392237,0.856091,0.0583794,0.784967,0.359527,0.576567,0.201513,0.642013,0.419308,0.340667,0.42319,0.860812,0.69402,0.423568,0.376987,0.568453,0.502302,0.280716,0.464041,0.395601,0.19985,0.0950398,0.64279,0.228326,0.484911,0.842353,0.161404,0.403432,0.655549,0.409098,0.699392,0.87605,1,0.185606,0.414255,0.695205,0.732612,0.478298,0.24947,0.927739,0.213135,0.227382,0.976352,0.642745,0.376311,0.260674,0.811034,0.264631,0.239979,0.261897,0.191642,0.78167,0.390679,0.382437,0.206714,0.22472,0.0676332,0.502611,0.301455,0.241029,0.224505,0.721193,0.436348,0.254062,0.480496,0.772371,0.210681,0.103415,0.485338,0.378334,0.228484,0.114877,0.68676,0.296942,0.50742,0.99747,0.0377103,0.132212,0.319547,0.192032,0.520574,0.585844,0.419362,0.0847317,0.134544,0.194762,0.616689,0.39736,0.298809,0.914746,0.0513371,0.0543569,0.989159,0.602892,0.145582,0.102149,0.129022,0.116485,0.279988,0.39427,0.290139,1,0.708655,0.780555,0.387526,0.0395217,0.00964067,0.24368,0.0740625,0.619315,0.447395,0.292497,0.295458,0.163748,0.521375,0.864533,0.0773408,0.0334231,0.345121,0.27886,0.223876,0.307756,0.763106,0.424707,0.487201,0.968962,0.00911747,0.0324653,0.334275,0.166787,0.312498,0.264262,0.35488,0.37559,0.261094,0.565006,0.474935,0.31352,0.251249,0.735352,0.0189072,0.0153634,0.786225,0.503299,0.369038,0.250765,0.673019,0.387573,0.742025,0.749056,0.261714,0.751868,0.771816,1,0.459484,0.0124402,0.0105394,0.964109,0.457052,0.532316,0.407128,0.697241,0.1522,0.0895893,0.406175,0.65104,0.0233951,0.010107,0.0722347,0.066634,0.195489,0.41674,0.654451,0.382782,0.305396,0.631501,0.00162802,0.0140906,0.762915,0.410245,0.189436,0.0604462,0.624941,0.439781,0.516273,0.896678,0.273298,0.202868,0.0996022,0.257657,0.0174508,0.0157859,0.429433,0.202184,0.443111,0.343811,0.447562,0.268694,0.753551,0.529426,0.0772973,0.097696,0.446414,0.261678,0.169035,0.0116219,0.0207399,1,0.488856,0.413029,0.252661,0.148369,0.0919644,0.0330634,0.268764,0.441849,0.0139873,0.0108584,0.657799,0.488248,0.375433,0.958179,0.761492,0.40949,0.151709,0.314931,0.0036118,0.013307,1,0.605343,0.550506,0.363516,0.255278,0.137537,0.448881,0.867615,0.483247,0.308622,0.348444,0.534835,0.0157716,0.0128965,0.147608,0.0762611,0.762224,0.511585,0.985863,0.540227,0.691691,0.905296,0.397521,0.69794,0.423289,0.924613,0.491559,0.00567911,0.0106002,0.647916,0.324182,0.579449,0.451936,0.877897},int(p*nModes+n) : rdtable; - modesT60s(i) = t60*pow(1-(modesFreqs(i)/1201.01)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)russianBell`---------- -// Russian church bell modal model. -// -// Modeled after D. Bartocha and . Baron, Influence of Tin Bronze Melting and -// Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -// Engineering, 2016. -// -// Model height is 2 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : russianBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `strikePosition`: strike position (0-6) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -russianBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -russianBellModel(50,strikePosition,30,1,3); - - -//-------`(pm.)russianBell_ui`---------- -// Russian church bell physical model based on [`russianBell`](#russianbell) with -// built-in UI. -// -// #### Usage -// -// ``` -// russianBell_ui : _ -// ``` -//---------------------------------- -russianBell_ui = -russianBell(strikePosition,strikeCutoff,strikeSharpness,gain,gate) -with{ - strikePosition = nentry("v:russianBell/[0]strikePosition",0,0,4,1); - strikeCutoff = hslider("v:russianBell/[1]strikeCutOff",6500,20,20000,1); - strikeSharpness = hslider("v:russianBell/[2]strikeSharpness",0.5,0.01,5,0.01); - gain = hslider("v:russianBell/[3]gain",1,0,1,0.01); - gate = button("v:russianBell/[4]gate"); -}; - -//-------`(pm.)standardBellModel`---------- -// Standard church bell modal model generated by `mesh2faust` from -// `libraries/modalmodels/standardBell`. -// -// Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -// Acoustics 2, 1987. -// -// Model height is 1.8 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// #### Usage -// -// ``` -// excitation : standardBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `nModes`: number of synthesized modes (max: 50) -// * `exPos`: excitation position (0-6) -// * `t60`: T60 in seconds (recommended value: 0.1) -// * `t60DecayRatio`: T60 decay ratio (recommended value: 1) -// * `t60DecaySlope`: T60 decay slope (recommended value: 5) -//---------------------------------- -standardBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope) = _ <: par(i,nModes,modeFilter(modesFreqs(i),modesT60s(i),modesGains(int(exPos),i))) :> /(nModes) -with{ - nExPos = 7; - modesFreqs(n) = ba.take(n+1,(490.25,493.646,924.838,927.779,1181.21,1186.94,1348.84,1349.5,1560.33,1635.97,1706.73,1712.89,1745.05,1745.25,2005.51,2025.47,2053.88,2142.37,2151.4,2408.16,2534.11,2536.42,2623.3,2628.4,2711.57,2712.46,2823.23,2827.22,2863.42,2874.19,2923,2925.69,3032.52,3042.15,3208.57,3392.52,3485.92,3493.65,3539.8,3550.56,3678.71,3719.04,3722.59,3786.28,3789.38,3993.59,3998.43,4123.41,4164.83,4187.98)); - modesGains(p,n) = waveform{0.691911,0.622333,0.548651,0.463306,0.826946,0.749513,0.2242,0.642678,0.760442,0.326054,0.276463,0.359344,0.18258,0.686765,0.457159,0.839015,0.845338,0.372377,0.306417,0.147381,0.359707,0.653537,0.27553,0.401233,0.435417,0.251481,0.190062,0.773372,0.315014,0.228812,0.521512,0.411542,0.720762,1,0.286502,0.338938,0.119995,0.432289,0.409677,0.156272,0.298871,0.250786,0.640776,0.209431,0.17001,0.390014,0.301698,0.799413,0.980581,0.385,0.82544,0.818894,0.349616,0.235396,0.783164,0.821914,0.28411,0.430286,0.507671,0.326254,0.260488,0.273364,0.20518,0.714852,0.47995,0.803637,0.683943,0.355371,0.406924,0.656257,0.423025,0.413515,0.38636,0.384787,0.389448,0.813367,0.234988,1,0.311268,0.350245,0.403856,0.646143,0.500485,0.833553,0.431768,0.467064,0.298979,0.487413,0.514907,0.369383,0.106197,0.494224,0.816079,0.535807,0.379873,0.380201,0.606306,0.516117,0.748449,0.556948,0.587066,0.584423,0.394866,0.341121,0.433458,0.455987,0.361237,0.42939,0.122969,0.133175,0.505176,0.513985,0.0554619,0.604942,0.372074,0.381126,0.314354,0.499636,0.518711,0.923792,0.259544,0.576517,0.553915,0.585444,0.245369,1,0.117757,0.977318,0.652862,0.509314,0.14855,0.506402,0.180059,0.356005,0.38681,0.279354,0.205792,0.551055,0.689107,0.445724,0.306857,0.324747,0.603621,0.394466,0.288613,0.264697,0.60612,0.20274,0.267271,0.925656,0.439228,0.425884,0.626633,0.547204,0.230022,0.225654,0.392697,0.493474,0.149857,0.0604048,0.693889,0.740271,0.175485,0.704998,0.329732,0.153026,0.125744,0.286995,0.278878,0.812372,0.0562174,0.241479,0.294525,0.358834,0.171047,0.847604,0.17228,0.97521,0.892073,0.613987,0.0659213,0.301583,0.0610847,0.125438,0.145151,0.180086,0.124231,0.260161,0.337573,0.203743,0.655798,0.425893,0.902347,0.500686,0.311173,0.215561,0.349591,0.0854218,0.0805062,1,0.338652,0.295396,0.698314,0.664972,0.118983,0.0881905,0.31158,0.391136,0.151915,0.239504,0.685742,0.884332,0.288516,0.768688,0.274851,0.0490311,0.0357865,0.293303,0.249461,0.493771,0.340984,0.467623,0.216631,0.255235,0.0988695,0.46198,0.147247,0.640196,1,0.551938,0.0453732,0.189907,0.0197542,0.0309217,0.769837,0.360418,0.384041,0.867434,0.398948,0.171848,0.748652,0.301957,0.860611,0.958674,0.54903,0.272753,0.372753,0.0180728,0.0292353,0.8502,0.224583,0.214805,0.670319,0.586433,0.0435142,0.0388574,0.144811,0.157061,0.155569,0.418334,0.673656,0.749573,0.337354,0.747254,0.255997,0.0239656,0.0310719,0.721087,0.700616,0.199051,0.511844,0.849485,0.700682,0.778658,0.171289,0.261973,0.129228,0.328597,0.781821,0.583813,0.0806713,0.416876,0.0118202,0.00868563,1,0.461884,0.186882,0.641364,0.994705,0.501902,0.566449,0.0678845,0.139737,0.462582,0.318656,0.233947,0.495941,0.0314028,0.0146478,0.70432,0.124953,0.132549,0.457126,0.378636,0.0169362,0.0195494,0.204155,0.294401,0.271367,0.730857,0.459322,0.433078,0.325171,0.734536,0.416205,0.012873,0.0388489,0.821567,0.863683,0.0920531,0.393972,0.539544,0.832052,0.842732,0.241144,0.479558,0.283092,0.477845,0.385473,0.436587,0.144308,0.642395,0.0215791,0.00779029,0.563714,0.838279,0.410004,0.829086,1,0.630598,0.0233729,0.496217,0.711042,0.914266,0.695042,0.331894,0.898442,0.028568,0.0174966,0.482846},int(p*nModes+n) : rdtable; - modesT60s(i) = t60*pow(1-(modesFreqs(i)/4191.95)*t60DecayRatio,t60DecaySlope); -}; - - -//-------`(pm.)standardBell`---------- -// Standard church bell modal model. -// -// Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -// Acoustics 2, 1987. -// -// Model height is 1.8 m. -// -// This model contains 7 excitation positions going linearly from the -// bottom to the top of the bell. Obviously, a model with more excitation -// position could be regenerated using `mesh2faust`. -// -// This function also implement a virtual exciter to drive the model. -// -// #### Usage -// -// ``` -// excitation : standardBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _ -// ``` -// -// Where: -// -// * `excitation`: the excitation signal -// * `strikePosition`: strike position (0-6) -// * `strikeCutoff`: cuttoff frequency of the strike genarator (recommended: ~7000Hz) -// * `strikeSharpness`: shaarpness of the strike (recommened: ~0.25) -// * `gain`: gain of the strike (0-1) -// * `trigger` signal (0: off, 1: on) -//---------------------------------- -standardBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) = -strikeModel(10,strikeCutoff,strikeSharpness,gain,trigger) : -standardBellModel(50,strikePosition,30,1,2.5); - - -//-------`(pm.)standardBell_ui`---------- -// Standard church bell physical model based on [`standardBell`](#standardbell) with -// built-in UI. -// -// #### Usage -// -// ``` -// standardBell_ui : _ -// ``` -//---------------------------------- -standardBell_ui = -standardBell(strikePosition,strikeCutoff,strikeSharpness,gain,gate) -with{ - strikePosition = nentry("v:standardBell/[0]strikePosition",0,0,4,1); - strikeCutoff = hslider("v:standardBell/[1]strikeCutOff",6500,20,20000,1); - strikeSharpness = hslider("v:standardBell/[2]strikeSharpness",0.5,0.01,5,0.01); - gain = hslider("v:standardBell/[3]gain",1,0,1,0.01); - gate = button("v:standardBell/[4]gate"); -}; - - -//==============================Vocal Synthesis=========================================== -// Vocal synthesizer functions (source/filter, fof, etc.). -//======================================================================================== - -//-------`(pm.)formantValues`---------- -// Formant data values. -// -// The formant data used here come from the CSOUND manual -// . -// -// #### Usage -// -// ``` -// ba.take(j+1,formantValues.f(i)) : _ -// ba.take(j+1,formantValues.g(i)) : _ -// ba.take(j+1,formantValues.bw(i)) : _ -// ``` -// -// Where: -// -// * `i`: formant number -// * `j`: (voiceType*nFormants)+vowel -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, 3: -// soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -//-------------------------------------- -formantValues = environment { - f(0) = (800,400,350,450,325,600,400,250,400,350,660,440,270,430,370,800, - 350,270,450,325,650,400,290,400,350); // formant 0 freqs - f(1) = (1150,1600,1700,800,700,1040,1620,1750,750,600,1120,1800,1850,820,630, - 1150,2000,2140,800,700,1080,1700,1870,800,600); // formant 1 freqs - f(2) = (2800,2700,2700,2830,2530,2250,2400,2600,2400,2400,2750,2700,2900,2700,2750, - 2900,2800,2950,2830,2700,2650,2600,2800,2600,2700); // formant 2 freqs - f(3) = (3500,3300,3700,3500,3500,2450,2800,3050,2600,2675,3000,3000,3350,3000,3000, - 3900,3600,3900,3800,3800,2900,3200,3250,2800,2900); // formant 3 freqs - f(4) = (4950,4950,4950,4950,4950,2750,3100,3340,2900,2950,3350,3300,3590,3300,3400, - 4950,4950,4950,4950,4950,3250,3580,3540,3000,3300); // formant 4 freqs - g(0) = (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); // formant 0 gains - g(1) = (0.630957,0.063096,0.100000,0.354813,0.251189,0.446684,0.251189,0.031623, - 0.281838,0.100000,0.501187,0.199526,0.063096,0.316228,0.100000, - 0.501187,0.100000,0.251189,0.281838,0.158489,0.501187,0.199526,0.177828, - 0.316228,0.100000); // formant 1 gains - g(2) = (0.100000,0.031623,0.031623,0.158489,0.031623,0.354813,0.354813,0.158489, - 0.089125,0.025119,0.070795,0.125893,0.063096,0.050119,0.070795, - 0.025119,0.177828,0.050119,0.079433,0.017783,0.446684,0.251189,0.125893, - 0.251189,0.141254); // formant 2 gains - g(3) = (0.015849,0.017783,0.015849,0.039811,0.010000,0.354813,0.251189,0.079433, - 0.100000,0.039811,0.063096,0.100000,0.015849,0.079433,0.031623, - 0.100000,0.010000,0.050119,0.079433,0.010000,0.398107,0.199526,0.100000, - 0.251189,0.199526); // formant 3 gains - g(4) = (0.001000,0.001000,0.001000,0.001778,0.000631,0.100000,0.125893,0.039811, - 0.010000,0.015849,0.012589,0.100000,0.015849,0.019953,0.019953, - 0.003162,0.001585,0.006310,0.003162,0.001000,0.079433,0.100000,0.031623, - 0.050119,0.050119); // formant 4 gains - bw(0) = (80,60,50,70,50,60,40,60,40,40,80,70,40,40,40,80,60,60,40,50, - 50,70,40,70,40); // formant 0 bandwidths - bw(1) = (90,80,100,80,60,70,80,90,80,80,90,80,90,80,60,90,100,90,80,60, - 90,80,90,80,60); // formant 1 bandwidths - bw(2) = (120,120,120,100,170,110,100,100,100,100,120,100,100,100,100, - 120,120,100,100,170,120,100,100,100,100); // formant 2 bandwidths - bw(3) = (130,150,150,130,180,120,120,120,120,120,130,120,120,120,120, - 130,150,120,120,180,130,120,120,130,120); // formant 3 bandwidths - bw(4) = (140,200,200,135,200,130,120,120,120,120,140,120,120,120,120, - 140,200,120,120,200,140,120,120,135,120); // formant 4 bandwidths -}; - - -// array of values used to multiply BWs by to get attack Bws for FOF version. -// min/max values per vowel (AEIOU) and per gender (M/F). Index by: -// gender*5 + vowel; -// values were chosen based on informal listening tests -bwMultMins = (1.0, 1.25, 1.25, 1.0, 1.5, 2.0, 3.0, 3.0, 2.0, 2.0); -bwMultMaxes = (10.0, 2.5, 2.5, 10.0, 4.0, 15.0, 12.0, 12.0, 12.0, 12.0); - - -// minimum/maximum frequency values per gender (M/F) used in the calculation -// of the attack Bws from the release Bws in the FOF version -// values are based on arbitrary maximum/minimum singing values -// in Hz for male/female voices -minGenderFreq = (82.41,174.61); -maxGenderFreq = (523.25,1046.5); - - -//--------------`(pm.)voiceGender`----------------- -// Calculate the gender for the provided `voiceType` value. (0: male, 1: female) -// -// #### Usage -// -// ``` -// voiceGender(voiceType) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -//--------------------------------------------- -// Author: Mike Olsen -voiceGender(voiceType) = ba.if(voiceType == 0,1,ba.if(voiceType == 3,1,0)); - - -//-----------`(pm.)skirtWidthMultiplier`------------ -// Calculates value to multiply bandwidth to obtain `skirtwidth` -// for a Fof filter. -// -// #### Usage -// -// ``` -// skirtWidthMultiplier(vowel,freq,gender) : _ -// ``` -// -// Where: -// -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `freq`: the fundamental frequency of the excitation signal -// * `gender`: gender of the voice used in the fof filter (0: male, 1: female) -//--------------------------------------------- -// Author: Mike Olsen -skirtWidthMultiplier(vowel,freq,gender) = (multMax-multMin)*skirtParam+multMin -with { - nVowels = 5; - index = gender*nVowels + vowel; - multMin = bwMultMins : ba.selectn(10,index); - multMax = bwMultMaxes : ba.selectn(10,index); - freqMin = minGenderFreq : ba.selectn(2,gender); - freqMax = maxGenderFreq : ba.selectn(2,gender); - skirtParam = ba.if(freq <= freqMin,0.0,ba.if(freq >= freqMax,1.0, - (1.0/(freqMax-freqMin))*(freq-freqMin))); -}; - - -//--------------`(pm.)autobendFreq`----------------- -// Autobends the center frequencies of formants 1 and 2 based on -// the fundamental frequency of the excitation signal and leaves -// all other formant frequencies unchanged. Ported from `chant-lib`. -// Reference: . -// -// #### Usage -// -// ``` -// _ : autobendFreq(n,freq,voiceType) : _ -// ``` -// -// Where: -// -// * `n`: formant index -// * `freq`: the fundamental frequency of the excitation signal -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * input is the center frequency of the corresponding formant -//--------------------------------------------- -// Author: Mike Olsen -autobendFreq(n,freq,voiceType) = autobend(n) -with { - autobend(0) = _ <: ba.if(_ <= freq,freq,_); - autobend(1) = _ <: ba.if(voiceType != 2, - _ <: ba.if((_ >= 1300)&(freq >= 200), - _ -(freq-200)*(_-1300)/1050, - ba.if(_ <= (30 + 2*freq),30 + 2*freq,_)), _); - autobend(n) = _; -}; - - -//--------------`(pm.)vocalEffort`----------------- -// Changes the gains of the formants based on the fundamental -// frequency of the excitation signal. Higher formants are -// reinforced for higher fundamental frequencies. -// Ported from `chant-lib`. -// Reference: . -// -// #### Usage -// -// ``` -// _ : vocalEffort(freq,gender) : _ -// ``` -// -// Where: -// -// * `freq`: the fundamental frequency of the excitation signal -// * `gender`: the gender of the voice type (0: male, 1: female) -// * input is the linear amplitude of the formant -//--------------------------------------------- -// Author: Mike Olsen -vocalEffort(freq,gender) = _ <: ba.if(gender == 0,*(3+1.1*(400-freq)/300),*(0.8+1.05*(1000-freq)/1250)); - - -//-------------------------`(pm.)fof`-------------------------- -// Function to generate a single Formant-Wave-Function. -// Reference: . -// -// #### Usage -// -// ``` -// _ : fof(fc,bw,a,g) : _ -// ``` -// -// Where: -// -// * `fc`: formant center frequency, -// * `bw`: formant bandwidth (Hz), -// * `sw`: formant skirtwidth (Hz) -// * `g`: linear scale factor (g=1 gives 0dB amplitude response at fc) -// * input is an impulse signal to excite filter -//--------------------------------------------------------- -// Author: Mike Olsen -fof(fc,bw,sw,g) = _ <: (_',_) : (f * s) -with { - T = 1/ma.SR; // sample period - pi = ma.PI; // pi - u1 = exp(-sw*pi*T); // exponential controlling rise - u2 = exp(-bw*pi*T); // exponential controlling decay - a1 = -1*(u1+u2); // a1 filter coefficient - a2 = u1*u2; // a2 filter coefficient - G0 = 1/(1+a1+a2); // magnitude at DC - b0 = g/G0; // filter gain - s = os.hs_oscsin(fc); // hardsyncing wavetable oscillator - f = fi.tf2(b0,0,0,a1,a2); // biquad filter -}; - - -//-------------------------`(pm.)fofSH`------------------------- -// FOF with sample and hold used on `bw` and a parameter -// used in the filter-cycling FOF function `fofCycle`. -// Reference: . -// -// #### Usage -// -// ``` -// _ : fofSH(fc,bw,a,g) : _ -// ``` -// -// Where: all parameters same as for [`fof`](#fof) -//--------------------------------------------------------- -// Author: Mike Olsen -fofSH(fc,bw,a,g) = _ <: (((_,bw):ba.sAndH),((_,a):ba.sAndH),_) : (fc,_,_,g,_') : fof; - - -//----------------------`(pm.)fofCycle`------------------------- -// FOF implementation where time-varying filter parameter noise is -// mitigated by using a cycle of `n` sample and hold FOF filters. -// Reference: . -// -// #### Usage -// -// ``` -// _ : fofCycle(fc,bw,a,g,n) : _ -// ``` -// -// Where: -// -// * `n`: the number of FOF filters to cycle through -// * all other parameters are same as for [`fof`](#fof) -//--------------------------------------------------------- -// Author: Mike Olsen -fofCycle(fc,bw,a,g,n) = _ : ba.cycle(n) : par(i,n,fofSH(fc,bw,a,g)) :> _; - - -//----------------------`(pm.)fofSmooth`------------------------- -// FOF implementation where time-varying filter parameter -// noise is mitigated by lowpass filtering the filter -// parameters `bw` and `a` with [smooth](#smooth). -// -// #### Usage -// -// ``` -// _ : fofSmooth(fc,bw,sw,g,tau) : _ -// ``` -// -// Where: -// -// * `tau`: the desired smoothing time constant in seconds -// * all other parameters are same as for [`fof`](#fof) -//--------------------------------------------------------- -// Author: Mike Olsen -fofSmooth(fc,bw,sw,g,tau) = fof(fc,bw2,sw2,g) -with{ - sw2 = sw : si.smooth(ba.tau2pole(tau)); - bw2 = bw : si.smooth(ba.tau2pole(tau)); -}; - - -//-------`(pm.)formantFilterFofCycle`-------------- -// Formant filter based on a single FOF filter. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. A cycle of `n` fof filters with sample-and-hold is -// used so that the fof filter parameters can be varied in realtime. -// This technique is more robust but more computationally expensive than -// [`formantFilterFofSmooth`](#formantFilterFofSmooth).Voice type can be -// selected but must correspond to -// the frequency range of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterFofCycle(voiceType,vowel,nFormants,i,freq) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `nFormants`: number of formant regions in frequency domain, typically 5 -// * `i`: formant number (i.e. 0 - 4) used to index formant data value arrays -// * `freq`: fundamental frequency of excitation signal. Used to calculate -// rise time of envelope -//-------------------------------------- -// Author: Mike Olsen -formantFilterFofCycle(voiceType,vowel,nFormants,i,freq) = - fofCycle(formantFreq(i),formantBw(i),formantSw(i),formantGain(i),n) -with{ - n = 3; // number of fof filters to cycle between - index = (voiceType*nFormants)+vowel; // index of formant values - // formant center frequency using autobend correction - formantFreq(i) = ba.listInterp(formantValues.f(i),index) : autobendFreq(i,freq,voiceType); - // formant amplitude using vocal effort correction - formantGain(i) = ba.listInterp(formantValues.g(i),index) : vocalEffort(freq,gender); - formantBw(i) = ba.listInterp(formantValues.bw(i),index); // formant bandwidth - // formant skirtwidth - formantSw(i) = skirtWidthMultiplier(vowel,freq,gender)*formantBw(i); - gender = voiceGender(voiceType); // gender of voice -}; - - -//-------`(pm.)formantFilterFofSmooth`-------------- -// Formant filter based on a single FOF filter. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Fof filter parameters are lowpass filtered -// to mitigate possible noise from varying them in realtime. -// Voice type can be selected but must correspond to -// the frequency range of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterFofSmooth(voiceType,vowel,nFormants,i,freq) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `nFormants`: number of formant regions in frequency domain, typically 5 -// * `i`: formant number (i.e. 1 - 5) used to index formant data value arrays -// * `freq`: fundamental frequency of excitation signal. Used to calculate -// rise time of envelope -//-------------------------------------- -// Author: Mike Olsen -formantFilterFofSmooth(voiceType,vowel,nFormants,i,freq) = - fofSmooth(formantFreq(i),formantBw(i),formantSw(i),formantGain(i),tau) -with{ - tau = 0.001; - index = (voiceType*nFormants)+vowel; // index of formant values - // formant center frequency using autobend correction - formantFreq(i) = ba.listInterp(formantValues.f(i),index) : autobendFreq(i,freq,voiceType); - // formant amplitude using vocal effort correction - formantGain(i) = ba.listInterp(formantValues.g(i),index) : vocalEffort(freq,gender); - formantBw(i) = ba.listInterp(formantValues.bw(i),index); // formant bandwidth - // formant skirtwidth - formantSw(i) = skirtWidthMultiplier(vowel,freq,gender)*formantBw(i); - gender = voiceGender(voiceType); // gender of voice -}; - - -//-------`(pm.)formantFilterBP`-------------- -// Formant filter based on a single resonant bandpass filter. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterBP(voiceType,vowel,nFormants,i,freq) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `nFormants`: number of formant regions in frequency domain, typically 5 -// * `i`: formant index used to index formant data value arrays -// * `freq`: fundamental frequency of excitation signal. -//-------------------------------------- -formantFilterBP(voiceType,vowel,nFormants,i,freq) = - fi.resonbp(formantFreq(i),formantFreq(i)/formantBw(i), - formantGain(i)) -with{ - index = (voiceType*nFormants)+vowel; // index of formant values - // formant center frequency using autobend correction - formantFreq(i) = ba.listInterp(formantValues.f(i),index) : autobendFreq(i,freq,voiceType); - // formant amplitude using vocal effort correction - formantGain(i) = ba.listInterp(formantValues.g(i),index) : vocalEffort(freq,gender); - formantBw(i) = ba.listInterp(formantValues.bw(i),index); // formant bandwidth - gender = voiceGender(voiceType); // gender of voice -}; - - -//-------`(pm.)formantFilterbank`-------------- -// Formant filterbank which can use different types of filterbank -// functions and different excitation signals. Formant parameters are -// linearly interpolated allowing to go smoothly from one vowel to another. -// Voice type can be selected but must correspond to the frequency range -// of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterbank(voiceType,vowel,formantGen,freq) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `formantGen`: the specific formant filterbank function -// (i.e. FormantFilterbankBP, FormantFilterbankFof,...) -// * `freq`: fundamental frequency of excitation signal. Needed for FOF -// version to calculate rise time of envelope -//-------------------------------------- -// Author: Mike Olsen -formantFilterbank(voiceType,vowel,formantGen,freq) = - _ <: par(i,nFormants,formantGen(voiceType,vowel,nFormants,i,freq)) :> _ -with{ - nFormants = 5; -}; - - -//-----`(pm.)formantFilterbankFofCycle`----- -// Formant filterbank based on a bank of fof filters. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterbankFofCycle(voiceType,vowel,freq) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `freq`: the fundamental frequency of the excitation signal. Needed to -// calculate the skirtwidth of the FOF envelopes and for the -// autobendFreq and vocalEffort functions -//------------------------------------- -// Author: Mike Olsen -formantFilterbankFofCycle(voiceType,vowel,freq) = -formantFilterbank(voiceType,vowel,formantFilterFofCycle,freq); - - -//-----`(pm.)formantFilterbankFofSmooth`---- -// Formant filterbank based on a bank of fof filters. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterbankFofSmooth(voiceType,vowel,freq) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `freq`: the fundamental frequency of the excitation signal. Needed to -// calculate the skirtwidth of the FOF envelopes and for the -// autobendFreq and vocalEffort functions -//------------------------------------- -// Author: Mike Olsen -formantFilterbankFofSmooth(voiceType,vowel,freq) = -formantFilterbank(voiceType,vowel,formantFilterFofSmooth,freq); - - -//-------`(pm.)formantFilterbankBP`-------------- -// Formant filterbank based on a bank of resonant bandpass filters. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the provided source to be realistic. -// -// #### Usage -// -// ``` -// _ : formantFilterbankBP(voiceType,vowel) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u) -// * `freq`: the fundamental frequency of the excitation signal. Needed -// for the autobendFreq and vocalEffort functions -//-------------------------------------- -formantFilterbankBP(voiceType,vowel,freq) = -formantFilterbank(voiceType,vowel,formantFilterBP,freq); - - -//-------`(pm.)SFFormantModel`-------------- -// Simple formant/vocal synthesizer based on a source/filter model. The `source` -// and `filterbank` must be specified by the user. `filterbank` must take the same -// input parameters as [`formantFilterbank`](#formantFilterbank) (`BP`/`FofCycle` -// /`FofSmooth`). -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the synthesized voice to be realistic. -// -// #### Usage -// -// ``` -// SFFormantModel(voiceType,vowel,exType,freq,gain,source,filterbank,isFof) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u -// * `exType`: voice vs. fricative sound ratio (0-1 where 1 is 100% fricative) -// * `freq`: the fundamental frequency of the source signal -// * `gain`: linear gain multiplier to multiply the source by -// * `isFof`: whether model is FOF based (0: no, 1: yes) -//-------------------------------------- -// Author: Mike Olsen -SFFormantModel(voiceType,vowel,exType,freq,gain,source,filterbank,isFof) = - excitation : resonance -with{ - breath = no.noise; - excitation = ba.if(isFof,source,source*(1-exType) + breath*exType : - *(gain)); - resonance = filterbank(voiceType,vowel,freq) <: ba.if(isFof,*(gain),_); -}; - - -//-------`(pm.)SFFormantModelFofCycle`------- -// Simple formant/vocal synthesizer based on a source/filter model. The source -// is just a periodic impulse and the "filter" is a bank of FOF filters. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the synthesized voice to be realistic. This model -// does not work with noise in the source signal so exType has been removed -// and model does not depend on SFFormantModel function. -// -// #### Usage -// -// ``` -// SFFormantModelFofCycle(voiceType,vowel,freq,gain) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u -// * `freq`: the fundamental frequency of the source signal -// * `gain`: linear gain multiplier to multiply the source by -//--------------------------------------- -// Author: Mike Olsen -SFFormantModelFofCycle(voiceType,vowel,freq,gain) = -SFFormantModel(voiceType,vowel,0,freq,gain,os.lf_imptrain(freq), -formantFilterbankFofCycle,1); - - -//-------`(pm.)SFFormantModelFofSmooth`------- -// Simple formant/vocal synthesizer based on a source/filter model. The source -// is just a periodic impulse and the "filter" is a bank of FOF filters. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the synthesized voice to be realistic. -// -// #### Usage -// -// ``` -// SFFormantModelFofSmooth(voiceType,vowel,freq,gain) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u -// * `freq`: the fundamental frequency of the source signal -// * `gain`: linear gain multiplier to multiply the source by -//--------------------------------------- -// Author: Mike Olsen -SFFormantModelFofSmooth(voiceType,vowel,freq,gain) = -SFFormantModel(voiceType,vowel,0,freq,gain,os.lf_imptrain(freq), -formantFilterbankFofSmooth,1); - - -//-------`(pm.)SFFormantModelBP`-------------- -// Simple formant/vocal synthesizer based on a source/filter model. The source -// is just a sawtooth wave and the "filter" is a bank of resonant bandpass filters. -// Formant parameters are linearly interpolated allowing to go smoothly from -// one vowel to another. Voice type can be selected but must correspond to -// the frequency range of the synthesized voice to be realistic. -// -// The formant data used here come from the CSOUND manual -// . -// -// #### Usage -// -// ``` -// SFFormantModelBP(voiceType,vowel,exType,freq,gain) : _ -// ``` -// -// Where: -// -// * `voiceType`: the voice type (0: alto, 1: bass, 2: countertenor, -// 3: soprano, 4: tenor) -// * `vowel`: the vowel (0: a, 1: e, 2: i, 3: o, 4: u -// * `exType`: voice vs. fricative sound ratio (0-1 where 1 is 100% fricative) -// * `freq`: the fundamental frequency of the source signal -// * `gain`: linear gain multiplier to multiply the source by -//--------------------------------------- -SFFormantModelBP(voiceType,vowel,exType,freq,gain) = -SFFormantModel(voiceType,vowel,exType,freq,gain,os.sawtooth(freq), -formantFilterbankBP,0); - - -//-------`(pm.)SFFormantModelFofCycle_ui`---------- -// Ready-to-use source-filter vocal synthesizer with built-in user interface. -// -// #### Usage -// -// ``` -// SFFormantModelFofCycle_ui : _ -// ``` -//---------------------------------- -// Author: Mike Olsen -SFFormantModelFofCycle_ui = SFFormantModelFofCycle(voiceType,vowel,freq2,gain*corrFactor) -with{ - freq1 = hslider("v:vocal/[0]freq",440,50,1000,0.01); - gain = hslider("v:vocal/[1]gain",0.9,0,1,0.01); - corrFactor = 75.0; - voiceType = hslider("v:vocal/[2]voiceType",0,0,4,1); - vowel = hslider("v:vocal/[3]vowel",0,0,4,0.01) : si.smoo; - vibratoFreq = hslider("v:vocal/[5]vibratoFreq",6,1,10,0.01); - vibratoGain = hslider("v:vocal/[6]vibratoGain",0.5,0,1,0.01)*0.1; - freq2 = freq1*(os.osc(vibratoFreq)*vibratoGain+1); -}; - - -//-------`(pm.)SFFormantModelFofSmooth_ui`---------- -// Ready-to-use source-filter vocal synthesizer with built-in user interface. -// -// #### Usage -// -// ``` -// SFFormantModelFofSmooth_ui : _ -// ``` -//---------------------------------- -// Author: Mike Olsen -SFFormantModelFofSmooth_ui = SFFormantModelFofSmooth(voiceType,vowel,freq2,gain*corrFactor) -with{ - freq1 = hslider("v:vocal/[0]freq",440,50,1000,0.01); - gain = hslider("v:vocal/[1]gain",0.9,0,1,0.01); - corrFactor = 25.0; - voiceType = hslider("v:vocal/[2]voiceType",0,0,4,1); - vowel = hslider("v:vocal/[3]vowel",0,0,4,0.01) : si.smoo; - vibratoFreq = hslider("v:vocal/[5]vibratoFreq",6,1,10,0.01); - vibratoGain = hslider("v:vocal/[6]vibratoGain",0.5,0,1,0.01)*0.1; - freq2 = freq1*(os.osc(vibratoFreq)*vibratoGain+1); -}; - - -//-------`(pm.)SFFormantModelBP_ui`---------- -// Ready-to-use source-filter vocal synthesizer with built-in user interface. -// -// #### Usage -// -// ``` -// SFFormantModelBP_ui : _ -// ``` -//---------------------------------- -SFFormantModelBP_ui = SFFormantModelBP(voiceType,vowel,fricative,freq2,gain) -with{ - freq1 = hslider("v:vocal/[0]freq",440,50,1000,0.01); - gain = hslider("v:vocal/[1]gain",0.9,0,1,0.01); - voiceType = hslider("v:vocal/[2]voiceType",0,0,4,1); - vowel = hslider("v:vocal/[3]vowel",0,0,4,0.01) : si.smoo; - fricative = hslider("v:vocal/[4]fricative",0,0,1,0.01) : si.smoo; - vibratoFreq = hslider("v:vocal/[5]vibratoFreq",6,1,10,0.01); - vibratoGain = hslider("v:vocal/[6]vibratoGain",0.5,0,1,0.01)*0.1; - freq2 = freq1*(os.osc(vibratoFreq)*vibratoGain+1); -}; - - -//-------`(pm.)SFFormantModelFofCycle_ui_MIDI`---------- -// Ready-to-use MIDI-controllable source-filter vocal synthesizer. -// -// #### Usage -// -// ``` -// SFFormantModelFofCycle_ui_MIDI : _ -// ``` -//---------------------------------- -SFFormantModelFofCycle_ui_MIDI = SFFormantModelFofCycle(voiceType,vowel,freq2,envelope)*outGain -with{ - freq1 = hslider("v:vocal/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:vocal/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:vocal/h:[0]midi/[2]gain[style:knob] - ",0.9,0,1,0.01); - corrFactor = 75.0; - envAttack = hslider("v:vocal/h:[0]midi/[3]envAttack[style:knob] - ",10,0,30,0.01)*0.001; - s = hslider("v:vocal/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - voiceType = hslider("v:vocal/h:[1]otherParams/[0]voiceType - [style:knob]",0,0,4,1); - vowel = hslider("v:vocal/h:[1]otherParams/[1]vowel - [style:knob][midi:ctrl 1]",0,0,4,0.01) : si.smoo; - vibratoFreq = hslider("v:vocal/h:[1]otherParams/[3]vibratoFreq[style:knob] - ",6,1,10,0.01); - vibratoGain = hslider("v:vocal/h:[1]otherParams/[4]vibratoGain[style:knob] - ",0.5,0,1,0.01)*0.1; - outGain = hslider("v:vocal/h:[1]otherParams/[5]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:vocal/[2]gate"); - - gate = t+s : min(1); - freq2 = freq1*bend*(os.osc(vibratoFreq)*vibratoGain+1); - envelope = gate*gain*corrFactor : si.smooth(ba.tau2pole(envAttack)); -}; - - -//-------`(pm.)SFFormantModelFofSmooth_ui_MIDI`---------- -// Ready-to-use MIDI-controllable source-filter vocal synthesizer. -// -// #### Usage -// -// ``` -// SFFormantModelFofSmooth_ui_MIDI : _ -// ``` -//---------------------------------- -SFFormantModelFofSmooth_ui_MIDI = SFFormantModelFofSmooth(voiceType,vowel,freq2,envelope)*outGain -with{ - freq1 = hslider("v:vocal/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:vocal/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:vocal/h:[0]midi/[2]gain[style:knob] - ",0.9,0,1,0.01); - corrFactor = 25.0; - envAttack = hslider("v:vocal/h:[0]midi/[3]envAttack[style:knob] - ",10,0,30,0.01)*0.001; - s = hslider("v:vocal/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - voiceType = hslider("v:vocal/h:[1]otherParams/[0]voiceType - [style:knob]",0,0,4,1); - vowel = hslider("v:vocal/h:[1]otherParams/[1]vowel - [style:knob][midi:ctrl 1]",0,0,4,0.01) : si.smoo; - vibratoFreq = hslider("v:vocal/h:[1]otherParams/[3]vibratoFreq[style:knob] - ",6,1,10,0.01); - vibratoGain = hslider("v:vocal/h:[1]otherParams/[4]vibratoGain[style:knob] - ",0.5,0,1,0.01)*0.1; - outGain = hslider("v:vocal/h:[1]otherParams/[5]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:vocal/[2]gate"); - - gate = t+s : min(1); - freq2 = freq1*bend*(os.osc(vibratoFreq)*vibratoGain+1); - envelope = gate*gain*corrFactor : si.smooth(ba.tau2pole(envAttack)); -}; - - -//-------`(pm.)SFFormantModelBP_ui_MIDI`---------- -// Ready-to-use MIDI-controllable source-filter vocal synthesizer. -// -// #### Usage -// -// ``` -// SFFormantModelBP_ui_MIDI : _ -// ``` -//---------------------------------- -SFFormantModelBP_ui_MIDI = SFFormantModelBP(voiceType,vowel,fricative,freq2,envelope)*outGain -with{ - freq1 = hslider("v:vocal/h:[0]midi/[0]freq[style:knob]",440,50,1000,0.01); - bend = ba.semi2ratio(hslider("v:vocal/h:[0]midi/[1]bend[hidden:1][midi:pitchwheel] - [style:knob]",0,-2,2,0.01)) : si.polySmooth(gate,0.999,1); - gain = hslider("v:vocal/h:[0]midi/[2]gain[style:knob] - ",0.9,0,1,0.01); - envAttack = hslider("v:vocal/h:[0]midi/[3]envAttack[style:knob] - ",10,0,30,0.01)*0.001; - s = hslider("v:vocal/h:[0]midi/[4]sustain[hidden:1][midi:ctrl 64] - [style:knob]",0,0,1,1); - voiceType = hslider("v:vocal/h:[1]otherParams/[0]voiceType - [style:knob]",0,0,4,1); - vowel = hslider("v:vocal/h:[1]otherParams/[1]vowel - [style:knob][midi:ctrl 1]",0,0,4,0.01) : si.smoo; - fricative = hslider("v:vocal/h:[1]otherParams/[2]fricative - [style:knob]",0,0,1,0.01) : si.smoo; - vibratoFreq = hslider("v:vocal/h:[1]otherParams/[3]vibratoFreq[style:knob] - ",6,1,10,0.01); - vibratoGain = hslider("v:vocal/h:[1]otherParams/[4]vibratoGain[style:knob] - ",0.5,0,1,0.01)*0.1; - outGain = hslider("v:vocal/h:[1]otherParams/[5]outGain[style:knob] - ",0.5,0,1,0.01); - t = button("v:vocal/[2]gate"); - - gate = t+s : min(1); - freq2 = freq1*bend*(os.osc(vibratoFreq)*vibratoGain+1); - envelope = gate*gain : si.smooth(ba.tau2pole(envAttack)); -}; - - -//=============================== Misc Functions ========================================= -// Various miscellaneous functions. -//======================================================================================== - -//-------`(pm.)allpassNL`-------------- -// Bidirectional block adding nonlinearities in both directions in a chain. -// Nonlinearities are created by modulating the coefficients of a passive -// allpass filter by the signal it is processing. -// -// #### Usage -// -// ``` -// chain(... : allpassNL(nonlinearity) : ...) -// ``` -// -// Where: -// -// * `nonlinearity`: amount of nonlinearity to be added (0-1) -//-------------------------------------- -allpassNL(nonlinearity) = par(i,2,nlf),_ -with{ - nlf = _ <: fi.allpassn(2,par(i,2,*(nonlinearity)*ma.PI)); -}; - - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// UNCATEGORIZED FUNCTIONS (TODO) -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -//-------`modalModel`-------------- -// -// Implement multiple resonance modes using resonant bandpass filters. -// -// #### Usage -// -// ``` -// _ : modalModel(n, freqs, t60s, gains) : _ -// ``` -// -// Where: -// -// * `n`: number of given modes -// * `freqs` : list of filter center freqencies -// * `t60s` : list of mode resonance durations (in seconds) -// * `gains` : list of mode gains (0-1) -// -// For example, to generate a model with 2 modes (440 Hz and 660 Hz, a -// fifth) where the higher one decays faster and is attenuated: -// -// ``` -// os.impulse : modalModel(2, (440, 660), -// (0.5, 0.25), -// (ba.db2linear(-1), ba.db2linear(-6)) : _ -// ``` -// -// Further reading: [Grumiaux et. al., 2017: -// Impulse-Response and CAD-Model-Based Physical Modeling in -// Faust](https://raw.githubusercontent.com/grame-cncm/faust/master-dev/tools/physicalModeling/ir2dsp/lacPaper2017.pdf) -// -//-------------------------------------- -modalModel(n,modeFreqs,modeRes,modeGains) = _ <: par(i,n,modeFilter(freqs(i),res(i),gain(i))) :> _ -with{ - freqs(i) = ba.take(i+1,modeFreqs); - res(i) = ba.take(i+1,modeRes); - gain(i) = ba.take(i+1,modeGains); -}; diff --git a/dist/examples/LIBRARIES/platform.lib b/dist/examples/LIBRARIES/platform.lib deleted file mode 100644 index 2fb54cf2..00000000 --- a/dist/examples/LIBRARIES/platform.lib +++ /dev/null @@ -1,51 +0,0 @@ -//#################################### platform.lib ######################################## -// A library to handle platform specific code in Faust. Its official prefix is `pl`. -//######################################################################################## -// It can be reimplemented to globally change the SR and the tablesize definitions - - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2020 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Generic Platform Library"; -declare version "0.1"; - -//---------------------------------`(pl.)SR`----------------------------------- -// Current sampling rate (between 1Hz and 192000Hz). Constant during -// program execution. -//----------------------------------------------------------------------------- -SR = min(192000.0, max(1.0, fconstant(int fSamplingFreq, ))); - -//---------------------------------`(pl.)tablesize`---------------------------- -// Oscillator table size -//----------------------------------------------------------------------------- -tablesize = 1 << 16; diff --git a/dist/examples/LIBRARIES/quantizers.lib b/dist/examples/LIBRARIES/quantizers.lib deleted file mode 100644 index 1139a6e5..00000000 --- a/dist/examples/LIBRARIES/quantizers.lib +++ /dev/null @@ -1,302 +0,0 @@ -//##################################### quantizers.lib ######################################## -// Faust Frequency Quantization Library. Its official prefix is `qu`. -//######################################################################################## - -ba = library("basics.lib"); -it = library("interpolators.lib"); - -declare name "Faust Frequency Quantization Library"; -declare version "0.1"; - -//=============================Functions Reference======================================== -//======================================================================================== - -/************************************************************************ -************************************************************************ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to -************************************************************************ -************************************************************************/ - -MinFreq = 8; -MaxFreq = 20000; -TableSize = 256; - -qLog(x) = ba.tabulate(1,log(_),TableSize,MinFreq,MaxFreq,x).cub; -qSmooth(x) = ba.tabulate(1,0.5*atan(_*20-10)/1.4711+0.5,TableSize,0,1,x).cub; - - -//-------`(qu.)quantize`---------- -// Configurable frequency quantization tool. Outputs only the frenquencies that are part of the specified scale. -// -// Works for positive audio frequencies. -// -// #### Usage -// -// ``` -// _ : quantize(rf,nl) : _ -// ``` -// Where : -// -// * `rf` : frequency of the root note of the scale. -// * `nl` : list of the ratio of the frequencies of each note in relation to the root frequency. -//------------------------ -quantize(rf,nl) = _<: octave,_ <: _,!,noteRatio(nN) : rf*_*_ -with{ - octave = (qLog(_)-log(rf))/log(2)<: - (_<0)*(1/(1<<(-1*(_-1)):int))+ - (_>=0)*(1<<(_:int)); - nN = ba.count(nl); - noteRatio(1,oct) = 1; - noteRatio(n,oct) = _ <: (ba.take(n,nl)<=((_/oct)/rf))*ba.take(n,nl)+ - (ba.take(n,nl)>((_/oct)/rf))*(noteRatio(n-1,oct)); -}; - - -//-------`(qu.)quantizeSmoothed`---------- -// Configurable frequency quantization tool. Outputs frenquencies that are closer to the frequencies of the notes of the specified scale. -// -// Works for positive audio frequencies. -// -// -// #### Usage -// -// ``` -// _ : quantizeSmoothed(rf,nl) : _ -// nl = (1,1.2,1.4,1.7); -// ``` -// Where : -// -// * `rf` : frequency of the root note of the scale. -// * `nl` : list of the ratio of the frequencies of each note in relation to the root frequency. -//------------------------ -quantizeSmoothed(rf,nl) = _<: octave,_ <: _,!,noteRatio(nN) : rf*_*_ -with{ - octave = (qLog(_)-log(rf))/log(2)<: - (_<0)*(1/(1<<(-1*(_-1)):int))+ - (_>0)*(1<<(_:int))+ - (_==0)*2; - nN = ba.count(nl); - noteRatio(1,oct) = findValue(1,oct); - noteRatio(n,oct) = _ <: (ba.take(n,nl)<=((_/oct)/rf))*findValue(n,oct)+ - (ba.take(n,nl)>((_/oct)/rf))*(noteRatio(n-1,oct)); - - findValue(n,oct) = _<: (n -// on a block of consecutive samples of a signal . -// For example : reduce(max,128) will compute the maximun of each -// block of 128 samples. Please note that the resulting -// value, while produced continuously, will be constant for -// the duration of a block. A new value is only produced -// at the end of a block. Note also that blocks should be of at -// least one sample (n>0). -// -// #### Usage -// -// ``` -// reduce(op, n, x) -// ``` -//----------------------------------------------------------------------------- - -reduce(op, n, x) = compute ~ (_,_,_) : (!,!,_) - with { - compute(acc, count, val) = - ba.if(count -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -All MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ - -//=============================Schroeder Reverberators====================================== -//========================================================================================== - -//------------------------------`(re.)jcrev`------------------------------ -// This artificial reverberator take a mono signal and output stereo -// (`satrev`) and quad (`jcrev`). They were implemented by John Chowning -// in the MUS10 computer-music language (descended from Music V by Max -// Mathews). They are Schroeder Reverberators, well tuned for their size. -// Nowadays, the more expensive freeverb is more commonly used (see the -// Faust examples directory). -// -// `jcrev` reverb below was made from a listing of "RV", dated April 14, 1972, -// which was recovered from an old SAIL DART backup tape. -// John Chowning thinks this might be the one that became the -// well known and often copied JCREV. -// -// `jcrev` is a standard Faust function -// -// #### Usage -// -// ``` -// _ : jcrev : _,_,_,_ -// ``` -//------------------------------------------------------------ -jcrev = *(0.06) : allpass_chain <: comb_bank : mix_mtx with { - rev1N = fi.rev1; - rev12(len,g) = rev1N(2048,len,g); - rev14(len,g) = rev1N(4096,len,g); - allpass_chain = - fi.rev2(512,347,0.7) : - fi.rev2(128,113,0.7) : - fi.rev2(64, 37,0.7); - comb_bank = - rev12(1601,.802), - rev12(1867,.773), - rev14(2053,.753), - rev14(2251,.733); - mix_mtx = _,_,_,_ <: psum, -psum, asum, -asum : _,_,_,_ with { - psum = _,_,_,_ :> _; - asum = *(-1),_,*(-1),_ :> _; - }; -}; - - -//------------------------------`(re.)satrev`------------------------------ -// This artificial reverberator take a mono signal and output stereo -// (`satrev`) and quad (`jcrev`). They were implemented by John Chowning -// in the MUS10 computer-music language (descended from Music V by Max -// Mathews). They are Schroeder Reverberators, well tuned for their size. -// Nowadays, the more expensive freeverb is more commonly used (see the -// Faust examples directory). -// -// `satrev` was made from a listing of "SATREV", dated May 15, 1971, -// which was recovered from an old SAIL DART backup tape. -// John Chowning thinks this might be the one used on his -// often-heard brass canon sound examples, one of which can be found at -// . -// -// #### Usage -// -// ``` -// _ : satrev : _,_ -// ``` -//------------------------------------------------------------ -satrev = *(0.2) <: comb_bank :> allpass_chain <: _,*(-1) with { - rev1N = fi.rev1; - rev11(len,g) = rev1N(1024,len,g); - rev12(len,g) = rev1N(2048,len,g); - comb_bank = - rev11(778,.827), - rev11(901,.805), - rev11(1011,.783), - rev12(1123,.764); - rev2N = fi.rev2; - allpass_chain = - rev2N(128,125,0.7) : - rev2N(64, 42,0.7) : - rev2N(16, 12,0.7); -}; - -//======================Feedback Delay Network (FDN) Reverberators======================== -//======================================================================================== - -//--------------------------------`(re.)fdnrev0`--------------------------------- -// Pure Feedback Delay Network Reverberator (generalized for easy scaling). -// `fdnrev0` is a standard Faust function. -// -// #### Usage -// -// ``` -// <1,2,4,...,N signals> <: -// fdnrev0(MAXDELAY,delays,BBSO,freqs,durs,loopgainmax,nonl) :> -// <1,2,4,...,N signals> -// ``` -// -// Where: -// -// * `N`: 2, 4, 8, ... (power of 2) -// * `MAXDELAY`: power of 2 at least as large as longest delay-line length -// * `delays`: N delay lines, N a power of 2, lengths perferably coprime -// * `BBSO`: odd positive integer = order of bandsplit desired at freqs -// * `freqs`: NB-1 crossover frequencies separating desired frequency bands -// * `durs`: NB decay times (t60) desired for the various bands -// * `loopgainmax`: scalar gain between 0 and 1 used to "squelch" the reverb -// * `nonl`: nonlinearity (0 to 0.999..., 0 being linear) -// -// #### Reference -// -// -//------------------------------------------------------------ -fdnrev0(MAXDELAY, delays, BBSO, freqs, durs, loopgainmax, nonl) - = (si.bus(2*N) :> si.bus(N) : delaylines(N)) ~ - (delayfilters(N,freqs,durs) : feedbackmatrix(N)) -with { - N = ba.count(delays); - NB = ba.count(durs); -//assert(count(freqs)+1==NB); - delayval(i) = ba.take(i+1,delays); - dlmax(i) = MAXDELAY; // must hardwire this from argument for now -//dlmax(i) = 2^max(1,nextpow2(delayval(i))) // try when slider min/max is known -// with { nextpow2(x) = ceil(log(x)/log(2.0)); }; -// -1 is for feedback delay: - delaylines(N) = par(i,N,(de.delay(dlmax(i),(delayval(i)-1)))); - delayfilters(N,freqs,durs) = par(i,N,filter(i,freqs,durs)); - feedbackmatrix(N) = bhadamard(N); - vbutterfly(n) = si.bus(n) <: (si.bus(n):>bus(n/2)) , ((si.bus(n/2),(si.bus(n/2):par(i,n/2,*(-1)))) :> si.bus(n/2)); - bhadamard(2) = si.bus(2) <: +,-; - bhadamard(n) = si.bus(n) <: (si.bus(n):>si.bus(n/2)) , ((si.bus(n/2),(si.bus(n/2):par(i,n/2,*(-1)))) :> si.bus(n/2)) - : (bhadamard(n/2) , bhadamard(n/2)); - - // Experimental nonlinearities: - // nonlinallpass = apnl(nonl,-nonl); - // s = nonl*PI; - // nonlinallpass(x) = allpassnn(3,(s*x,s*x*x,s*x*x*x)); // filters.lib - nonlinallpass = _; // disabled by default (rather expensive) - - filter(i,freqs,durs) = fi.filterbank(BBSO,freqs) : par(j,NB,*(g(j,i))) - :> *(loopgainmax) / sqrt(N) : nonlinallpass - with { - dur(j) = ba.take(j+1,durs); - n60(j) = dur(j)*ma.SR; // decay time in samples - g(j,i) = exp(-3.0*log(10.0)*delayval(i)/n60(j)); - // ~ 1.0 - 6.91*delayval(i)/(SR*dur(j)); // valid for large dur(j) - }; -}; - - -//-------------------------------`(re.)zita_rev_fdn`------------------------------- -// Internal 8x8 late-reverberation FDN used in the FOSS Linux reverb zita-rev1 -// by Fons Adriaensen . This is an FDN reverb with -// allpass comb filters in each feedback delay in addition to the -// damping filters. -// -// #### Usage -// -// ``` -// bus(8) : zita_rev_fdn(f1,f2,t60dc,t60m,fsmax) : bus(8) -// ``` -// -// Where: -// -// * `f1`: crossover frequency (Hz) separating dc and midrange frequencies -// * `f2`: frequency (Hz) above f1 where T60 = t60m/2 (see below) -// * `t60dc`: desired decay time (t60) at frequency 0 (sec) -// * `t60m`: desired decay time (t60) at midrange frequencies (sec) -// * `fsmax`: maximum sampling rate to be used (Hz) -// -// #### Reference -// -// * -// * -//------------------------------------------------------------ -zita_rev_fdn(f1,f2,t60dc,t60m,fsmax) = - ((si.bus(2*N) :> allpass_combs(N) : feedbackmatrix(N)) ~ - (delayfilters(N,freqs,durs) : fbdelaylines(N))) -with { - N = 8; - - // Delay-line lengths in seconds: - apdelays = (0.020346, 0.024421, 0.031604, 0.027333, 0.022904, - 0.029291, 0.013458, 0.019123); // feedforward delays in seconds - tdelays = (0.153129, 0.210389, 0.127837, 0.256891, 0.174713, - 0.192303, 0.125000, 0.219991); // total delays in seconds - tdelay(i) = floor(0.5 + ma.SR*ba.take(i+1,tdelays)); // samples - apdelay(i) = floor(0.5 + ma.SR*ba.take(i+1,apdelays)); - fbdelay(i) = tdelay(i) - apdelay(i); - // NOTE: Since SR is not bounded at compile time, we can't use it to - // allocate delay lines; hence, the fsmax parameter: - tdelaymaxfs(i) = floor(0.5 + fsmax*ba.take(i+1,tdelays)); - apdelaymaxfs(i) = floor(0.5 + fsmax*ba.take(i+1,apdelays)); - fbdelaymaxfs(i) = tdelaymaxfs(i) - apdelaymaxfs(i); - nextpow2(x) = ceil(log(x)/log(2.0)); - maxapdelay(i) = int(2.0^max(1.0,nextpow2(apdelaymaxfs(i)))); - maxfbdelay(i) = int(2.0^max(1.0,nextpow2(fbdelaymaxfs(i)))); - - apcoeff(i) = select2(i&1,0.6,-0.6); // allpass comb-filter coefficient - allpass_combs(N) = - par(i,N,(fi.allpass_comb(maxapdelay(i),apdelay(i),apcoeff(i)))); // filters.lib - fbdelaylines(N) = par(i,N,(de.delay(maxfbdelay(i),(fbdelay(i))))); - freqs = (f1,f2); durs = (t60dc,t60m); - delayfilters(N,freqs,durs) = par(i,N,filter(i,freqs,durs)); - feedbackmatrix(N) = ro.hadamard(N); - - staynormal = 10.0^(-20); // let signals decay well below LSB, but not to zero - - special_lowpass(g,f) = si.smooth(p) with { - // unity-dc-gain lowpass needs gain g at frequency f => quadratic formula: - p = mbo2 - sqrt(max(0,mbo2*mbo2 - 1.0)); // other solution is unstable - mbo2 = (1.0 - gs*c)/(1.0 - gs); // NOTE: must ensure |g|<1 (t60m finite) - gs = g*g; - c = cos(2.0*ma.PI*f/float(ma.SR)); - }; - - filter(i,freqs,durs) = lowshelf_lowpass(i)/sqrt(float(N))+staynormal - with { - lowshelf_lowpass(i) = gM*low_shelf1_l(g0/gM,f(1)):special_lowpass(gM,f(2)); - low_shelf1_l(G0,fx,x) = x + (G0-1)*fi.lowpass(1,fx,x); // filters.lib - g0 = g(0,i); - gM = g(1,i); - f(k) = ba.take(k,freqs); - dur(j) = ba.take(j+1,durs); - n60(j) = dur(j)*ma.SR; // decay time in samples - g(j,i) = exp(-3.0*log(10.0)*tdelay(i)/n60(j)); - }; -}; - -// Stereo input delay used by zita_rev1 in both stereo and ambisonics mode: -zita_in_delay(rdel) = zita_delay_mono(rdel), zita_delay_mono(rdel) with { - zita_delay_mono(rdel) = de.delay(8192,ma.SR*rdel*0.001) * 0.3; -}; - -// Stereo input mapping used by zita_rev1 in both stereo and ambisonics mode: -zita_distrib2(N) = _,_ <: fanflip(N) with { - fanflip(4) = _,_,*(-1),*(-1); - fanflip(N) = fanflip(N/2),fanflip(N/2); -}; - - -//----------------------------`(re.)zita_rev1_stereo`--------------------------- -// Extend `zita_rev_fdn` to include `zita_rev1` input/output mapping in stereo mode. -// `zita_rev1_stereo` is a standard Faust function. -// -// #### Usage -// -// ``` -// _,_ : zita_rev1_stereo(rdel,f1,f2,t60dc,t60m,fsmax) : _,_ -// ``` -// -// Where: -// -// `rdel` = delay (in ms) before reverberation begins (e.g., 0 to ~100 ms) -// (remaining args and refs as for `zita_rev_fdn` above) -//------------------------------------------------------------ -zita_rev1_stereo(rdel,f1,f2,t60dc,t60m,fsmax) = - zita_in_delay(rdel) - : zita_distrib2(N) - : zita_rev_fdn(f1,f2,t60dc,t60m,fsmax) - : output2(N) -with { - N = 8; - output2(N) = outmix(N) : *(t1),*(t1); - t1 = 0.37; // zita-rev1 linearly ramps from 0 to t1 over one buffer - outmix(4) = !,ro.butterfly(2),!; // probably the result of some experimenting! - outmix(N) = outmix(N/2),par(i,N/2,!); -}; - - -//-----------------------------`(re.)zita_rev1_ambi`--------------------------- -// Extend zita_rev_fdn to include zita_rev1 input/output mapping in -// "ambisonics mode", as provided in the Linux C++ version. -// -// #### Usage -// -// ``` -// _,_ : zita_rev1_ambi(rgxyz,rdel,f1,f2,t60dc,t60m,fsmax) : _,_,_,_ -// ``` -// -// Where: -// -// `rgxyz` = relative gain of lanes 1,4,2 to lane 0 in output (e.g., -9 to 9) -// (remaining args and references as for zita_rev1_stereo above) -//------------------------------------------------------------ -zita_rev1_ambi(rgxyz,rdel,f1,f2,t60dc,t60m,fsmax) = - zita_in_delay(rdel) - : zita_distrib2(N) - : zita_rev_fdn(f1,f2,t60dc,t60m,fsmax) - : output4(N) // ambisonics mode -with { - N = 8; - output4(N) = select4 : *(t0),*(t1),*(t1),*(t1); - select4 = _,_,_,!,_,!,!,! : _,_,cross with { cross(x,y) = y,x; }; - t0 = 1.0/sqrt(2.0); - t1 = t0 * 10.0^(0.05 * rgxyz); -}; - -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -//===============================Freeverb=================================== -//========================================================================== - -//----------------------------`(re.)mono_freeverb`------------------------- -// A simple Schroeder reverberator primarily developed by "Jezar at Dreampoint" that -// is extensively used in the free-software world. It uses four Schroeder allpasses in -// series and eight parallel Schroeder-Moorer filtered-feedback comb-filters for each -// audio channel, and is said to be especially well tuned. -// -// `mono_freeverb` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : mono_freeverb(fb1, fb2, damp, spread) : _; -// ``` -// -// Where: -// -// * `fb1`: coefficient of the lowpass comb filters (0-1) -// * `fb2`: coefficient of the allpass comb filters (0-1) -// * `damp`: damping of the lowpass comb filter (0-1) -// * `spread`: spatial spread in number of samples (for stereo) -// -// #### License -// While this version is licensed LGPL (with exception) along with other GRAME -// library functions, the file freeverb.dsp in the examples directory of older -// Faust distributions, such as faust-0.9.85, was released under the BSD license, -// which is less restrictive. -//------------------------------------------------------------ -// TODO: author RM -mono_freeverb(fb1, fb2, damp, spread) = _ <: par(i,8,lbcf(combtuningL(i)+spread,fb1,damp)) - :> seq(i,4,fi.allpass_comb(1024, allpasstuningL(i)+spread, -fb2)) -with { - - // Filters parameters - combtuningL(0) = adaptSR(1116); - combtuningL(1) = adaptSR(1188); - combtuningL(2) = adaptSR(1277); - combtuningL(3) = adaptSR(1356); - combtuningL(4) = adaptSR(1422); - combtuningL(5) = adaptSR(1491); - combtuningL(6) = adaptSR(1557); - combtuningL(7) = adaptSR(1617); - - allpasstuningL(0) = adaptSR(556); - allpasstuningL(1) = adaptSR(441); - allpasstuningL(2) = adaptSR(341); - allpasstuningL(3) = adaptSR(225); - - // Lowpass Feedback Combfilter: - // - lbcf(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb)); - - origSR = 44100; - adaptSR(val) = val*ma.SR/origSR : int; - -}; - - -//----------------------------`(re.)stereo_freeverb`------------------------- -// A simple Schroeder reverberator primarily developed by "Jezar at Dreampoint" that -// is extensively used in the free-software world. It uses four Schroeder allpasses in -// series and eight parallel Schroeder-Moorer filtered-feedback comb-filters for each -// audio channel, and is said to be especially well tuned. -// -// #### Usage -// -// ``` -// _,_ : stereo_freeverb(fb1, fb2, damp, spread) : _,_; -// ``` -// -// Where: -// -// * `fb1`: coefficient of the lowpass comb filters (0-1) -// * `fb2`: coefficient of the allpass comb filters (0-1) -// * `damp`: damping of the lowpass comb filter (0-1) -// * `spread`: spatial spread in number of samples (for stereo) -//------------------------------------------------------------ -// TODO: author RM -stereo_freeverb(fb1, fb2, damp, spread) = + <: mono_freeverb(fb1, fb2, damp, 0), mono_freeverb(fb1, fb2, damp, spread); - -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ - -// end further further contributions section diff --git a/dist/examples/LIBRARIES/routes.lib b/dist/examples/LIBRARIES/routes.lib deleted file mode 100644 index e84a1030..00000000 --- a/dist/examples/LIBRARIES/routes.lib +++ /dev/null @@ -1,213 +0,0 @@ -//#################################### routes.lib ######################################## -// A library to handle signal routing in Faust. Its official prefix is `ro`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2003-2019 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ba = library("basics.lib"); -si = library("signals.lib"); -sp = library("spats.lib"); - -declare name "Faust Signal Routing Library"; -declare version "0.2"; - -//=============================Functions Reference======================================== -//======================================================================================== - -//--------------------------------`(ro.)cross`----------------------------------- -// Cross n signals: `(x1,x2,..,xn) -> (xn,..,x2,x1)`. -// `cross` is a standard Faust function. -// -// #### Usage -// -// ``` -// cross(n) -// _,_,_ : cross(3) : _,_,_ -// ``` -// -// Where: -// -// * `n`: number of signals (int, must be known at compile time) -// -// #### Note -// -// Special case: `cross2`: -// -// ``` -// cross2 = _,cross(2),_; -// ``` -//----------------------------------------------------------------------------- -// cross n cables : (x1,x2,..,xn) -> (xn,..,x2,x1) -cross(n) = route(n, n, par(i, n, (i+1, n-i))); -cross2 = _,cross(2),_; // for compatibility with some old misceffects.lib functions - - -//--------------`(ro.)crossnn`-------------- -// Cross two `bus(n)`s. -// -// #### Usage -// -// ``` -// (si.bus(2*n)) : crossnn(n) : (si.bus(2*n)) -// ``` -// -// Where: -// -// * `n`: the number of signals in the `bus` -//-------------------------------------- -crossnn(n) = crossNM(n,n); - - -//--------------`(ro.)crossn1`-------------- -// Cross bus(n) and bus(1). -// -// #### Usage -// -// ``` -// (si.bus(n),_) : crossn1(n) : (_,si.bus(n)) -// ``` -// -// Where: -// -// * `n`: the number of signals in the first `bus` -//-------------------------------------- -crossn1(n) = crossNM(n,1); - - -//--------------`(ro.)cross1n`-------------- -// Cross bus(1) and bus(n). -// -// #### Usage -// -// ``` -// (_,si.bus(n)) : crossn1(n) : (si.bus(n),_) -// ``` -// -// Where: -// -// * `n`: the number of signals in the second `bus` -//-------------------------------------- -cross1n(n) = crossNM(1,n); - - -//--------------`(ro.)crossNM`-------------- -// Cross bus(n) and bus(m). -// -// #### Usage -// -// ``` -// (si.bus(n),si.bus(m)) : crossNM(n,m) : (si.bus(m),si.bus(n)) -// ``` -// -// Where: -// -// * `n`: the number of signals in the first `bus` -// * `m`: the number of signals in the second `bus` -//-------------------------------------- -crossNM(n,m) = route(n+m, n+m, par(i, n+m, i+1, ((i+m)%(n+m))+1)); - - -//--------------------------`(ro.)interleave`------------------------------ -// Interleave row*col cables from column order to row order. -// input : x(0), x(1), x(2) ..., x(row*col-1) -// output: x(0+0*row), x(0+1*row), x(0+2*row), ..., x(1+0*row), x(1+1*row), x(1+2*row), ... -// -// #### Usage -// -// ``` -// _,_,_,_,_,_ : interleave(row,column) : _,_,_,_,_,_ -// ``` -// -// Where: -// -// * `row`: the number of row (int, known at compile time) -// * `column`: the number of column (int, known at compile time) -//----------------------------------------------------------------------------- -interleave(1,2) = _,_; -interleave(row,col) = route(row*col, row*col, par(i, row*col, (i+1, (i%row)*col + int(i/row) + 1))); - -//-------------------------------`(ro.)butterfly`-------------------------------- -// Addition (first half) then substraction (second half) of interleaved signals. -// -// #### Usage -// -// ``` -// _,_,_,_ : butterfly(n) : _,_,_,_ -// ``` -// -// Where: -// -// * `n`: size of the butterfly (n is int, even and known at compile time) -//----------------------------------------------------------------------------- -butterfly(2) = si.bus(2) <: +,-; -butterfly(n) = si.bus(n) <: interleave(n/2,2), interleave(n/2,2) : par(i, n/2, +), par(i, n/2, -); - - -//------------------------------`(ro.)hadamard`---------------------------------- -// Hadamard matrix function of size `n = 2^k`. -// -// #### Usage -// -// ``` -// _,_,_,_ : hadamard(n) : _,_,_,_ -// ``` -// -// Where: -// -// * `n`: `2^k`, size of the matrix (int, must be known at compile time) -// -// #### Note: -// -// Implementation contributed by Remy Muller. -//----------------------------------------------------------------------------- -// TODO: author: Remy Muller, revised by RM -hadamard(2) = butterfly(2); -hadamard(n) = butterfly(n) : (hadamard(n/2) , hadamard(n/2)); - - -//---------------`(ro.)recursivize`------------- -// Create a recursion from two arbitrary processors p and q. -// -// #### Usage -// -// ``` -// _,_ : recursivize(p,q) : _,_ -// -// ``` -// -// Where: -// -// * `p`: the forward arbitrary processor -// * `q`: the feedback arbitrary processor -//---------------------------------------- -recursivize(p,q) = (_,_,_,_ :> sp.stereoize(p)) ~ sp.stereoize(q); diff --git a/dist/examples/LIBRARIES/sf.lib b/dist/examples/LIBRARIES/sf.lib deleted file mode 100644 index 99e1d91c..00000000 --- a/dist/examples/LIBRARIES/sf.lib +++ /dev/null @@ -1,53 +0,0 @@ -/* - sf.lib - aliases all prefixes to sf = all.lib, so that both old and new prefixes can be mixed. - - USAGE: - - import("sf.lib"); // use either standard prefixes or the one prefix "sf" - - The Faust team is committed to unique names for standard Faust - functions, allowing them to all be in the same namespace. - Therefore, only two namespaces are needed: (1) the highest-level - scope (no prefix), and (2) the Standard Faust scope, using prefix 'sf'. -*/ - -sf = library("all.lib"); // "Standard Faust" prefix - -//--- use old library prefixes using old libraries --- -/* - ml = library("old/music.lib"); - fl = library("old/filter.lib"); - ol = library("old/oscillator.lib"); - el = library("old/effect.lib"); -*/ -//--- use old library prefixes using new libraries --- -ol = sf; -fl = sf; -ml = sf; -el = sf; -//--- new library prefixes --- -an = sf; -ba = sf; -co = sf; -de = sf; -dm = sf; -dx = sf; -ef = sf; -en = sf; -fd = sf; -fi = sf; -ho = sf; -ma = sf; -os = sf; -no = sf; -pf = sf; -pm = sf; -re = sf; -ro = sf; -sp = sf; -si = sf; -so = sf; -sy = sf; -ve = sf; -wa = sf; -//----- diff --git a/dist/examples/LIBRARIES/signals.lib b/dist/examples/LIBRARIES/signals.lib deleted file mode 100644 index c67971f5..00000000 --- a/dist/examples/LIBRARIES/signals.lib +++ /dev/null @@ -1,334 +0,0 @@ -//#################################### signals.lib ######################################## -// A library of basic elements to handle signals in Faust. Its official prefix is `si`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. - ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -ba = library("basics.lib"); -ro = library("routes.lib"); -ma = library("maths.lib"); -si = library("signals.lib"); - -declare name "Faust Signal Routing Library"; -declare version "0.0"; - -//=============================Functions Reference======================================== -//======================================================================================== - -//--------------------------------`(si.)bus`------------------------------------- -// Put n cables in parallel. -// `bus` is a standard Faust function. -// -// #### Usage -// -// ``` -// bus(N) -// bus(4) : _,_,_,_ -// ``` -// -// Where: -// -// * `N`: is an integer known at compile time that indicates the number of parallel cables -//----------------------------------------------------------------------------- -bus(2) = _,_; // avoids a lot of "bus(1)" labels in block diagrams -bus(n) = par(i, n, _); - -//--------------`(si.)block`-------------- -// Block - terminate N signals. -// `block` is a standard Faust function. -// -// #### Usage -// -// ``` -// _,_,... : block(n) : _,... -// ``` -// -// Where: -// -// * `N`: the number of signals to be blocked known at compile time -//-------------------------------------- -block(n) = par(i, n, !); - -//-----------------------------`(si.)interpolate`------------------------------- -// Linear interpolation between two signals. -// -// #### Usage -// -// ``` -// _,_ : interpolate(i) : _ -// ``` -// -// Where: -// -// * `i`: interpolation control between 0 and 1 (0: first input; 1: second input) -//----------------------------------------------------------------------------- -interpolate(i,x,y) = x + i*(y-x); - -//------------------------`(si.)smoo`--------------------------------------- -// Smoothing function based on `smooth` ideal to smooth UI signals -// (sliders, etc.) down. Approximately, this is a 7 Hz one-pole -// low-pass considering the coefficient calculation: -// exp(-2pi*CF/SR). -// -// `smoo` is a standard Faust function. -// -// #### Usage -// -// ``` -// hslider(...) : smoo; -// ``` -//--------------------------------------------------------------------- -smoo = si.smooth(1 - 44.1 / ma.SR); - -//-----------------------`(si.)polySmooth`-------------------------------- -// A smoothing function based on `smooth` that doesn't smooth when a -// trigger signal is given. This is very useful when making -// polyphonic synthesizer to make sure that the value of the parameter -// is the right one when the note is started. -// -// #### Usage -// -// ``` -// hslider(...) : polySmooth(g,s,d) : _ -// ``` -// -// Where: -// -// * `g`: the gate/trigger signal used when making polyphonic synths -// * `s`: the smoothness (see `smooth`) -// * `d`: the number of samples to wait before the signal start being -// smoothed after `g` switched to 1 -//------------------------------------------------------------------- -polySmooth(g,s,d) = smooth(s*((g==(g@d)) | (g == 0))); - -//-----------------------`(si.)smoothAndH`-------------------------------- -// A smoothing function based on `smooth` that holds its output -// signal when a trigger is sent to it. This feature is convenient -// when implementing polyphonic instruments to prevent some -// smoothed parameter to change when a note-off event is sent. -// -// #### Usage -// -// ``` -// hslider(...) : smoothAndH(g,s) : _ -// ``` -// -// Where: -// -// * `g`: the hold signal (0 for hold, 1 for bypass) -// * `s`: the smoothness (see `smooth`) -//------------------------------------------------------------------- -smoothAndH(t,s) = smooth(s*t) : ba.sAndH(t); - -//-----------------------------`(si.)bsmooth`------------------------------ -// Block smooth linear interpolation during a block of samples. -// -// #### Usage -// -// ``` -// hslider(...) : bsmooth : _ -// ``` -//----------------------------------------------------------------------- -bsmooth(c) = +(i) ~ _ -with { - i = (c-c@n)/n; - n = min(4096, max(1, ma.BS)); -}; - -//-------------------------------`(si.)dot`-------------------------------------- -// Dot product for two vectors of size N. -// -// #### Usage -// -// ``` -// _,_,_,_,_,_ : dot(N) : _ -// ``` -// -// Where: -// -// * `N`: size of the vectors (int, must be known at compile time) -//----------------------------------------------------------------------------- -dot(N) = ro.interleave(N,2) : par(i,N,*) :> _; - -// end GRAME section -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2017 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -All MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ -//-------------------`(si.)smooth`----------------------------------- -// Exponential smoothing by a unity-dc-gain one-pole lowpass. -// `smooth` is a standard Faust function. -// -// #### Usage: -// -// ``` -// _ : smooth(tau2pole(tau)) : _ -// ``` -// -// Where: -// -// * `tau`: desired smoothing time constant in seconds, or -// -// ``` -// hslider(...) : smooth(s) : _ -// ``` -// -// Where: -// -// * `s`: smoothness between 0 and 1. s=0 for no smoothing, s=0.999 is "very smooth", -// s>1 is unstable, and s=1 yields the zero signal for all inputs. -// The exponential time-constant is approximately 1/(1-s) samples, when s is close to -// (but less than) 1. -// -// #### Reference: -// -// -//------------------------------------------------------------- -smooth(s) = *(1.0 - s) : + ~ *(s); - -//--------------------------------`(si.)cbus`------------------------------------- -// n parallel cables for complex signals. -// `cbus` is a standard Faust function. -// -// #### Usage -// -// ``` -// cbus(n) -// cbus(4) : (r0,i0), (r1,i1), (r2,i2), (r3,i3) -// ``` -// -// Where: -// -// * `n`: is an integer known at compile time that indicates the number of parallel cables. -// * each complex number is represented by two real signals as (real,imag) -//----------------------------------------------------------------------------- -cbus(1) = (_,_); -cbus(n) = par(i, n, (_,_)); - -//--------------------------------`(si.)cmul`------------------------------------- -// multiply two complex signals pointwise. -// `cmul` is a standard Faust function. -// -// #### Usage -// -// ``` -// (r1,i1) : cmul(r2,i2) : (_,_); -// ``` -// -// Where: -// -// * Each complex number is represented by two real signals as (real,imag), so -// - `(r1,i1)` = real and imaginary parts of signal 1 -// - `(r2,i2)` = real and imaginary parts of signal 2 -//----------------------------------------------------------------------------- -cmul(r1,i1,r2,i2) = (r1*r2 - i1*i2), (r1*i2 + r2*i1); - -//--------------------------------`(si.)cconj`------------------------------------- -// complex conjugation of a (complex) signal. -// `cconj` is a standard Faust function. -// -// #### Usage -// -// ``` -// (r1,i1) : cconj : (_,_); -// ``` -// -// Where: -// -// * Each complex number is represented by two real signals as (real,imag), so -// - `(r1,i1)` = real and imaginary parts of the input signal -// - `(r1,-i1)` = real and imaginary parts of the output signal -//----------------------------------------------------------------------------- -cconj = _, *(-1); - -// end jos section -/************************************************************************ -FAUST library file, further contributions section -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ - -//-------------`(si.)lag_ud`--------------- -// Lag filter with separate times for up and down. -// -// #### Usage -// -// ``` -// _ : lag_ud(up, dn) : _; -// ``` -//---------------------------------------------------- -// Author: Jonatan Liljedahl -// License: STK-4.3 -// MarkDown: Romain Michon -lag_ud(up,dn) = _ <: ((>,ba.tau2pole(up),ba.tau2pole(dn):select2),_:si.smooth) ~ _; - -// end further further contributions section - -//-------------`(si.)rev`--------------- -// Reverse the input signal by blocks of N>0 samples. `rev(1)` is the indentity -// function. `rev(N)` has a latency of `N-1` samples. -// -// #### Usage -// -// ``` -// _ : rev(N) : _; -// ``` -// -// Where: -// -// * `N`: the block size -//---------------------------------------------------- -// Author: Yann Orlarey -rev(N) = @(phase(N)*2) -with { - phase(n) = 1 : (+ : %(n)) ~ _ : max(0) : min(n-1); -}; diff --git a/dist/examples/LIBRARIES/soundfiles.lib b/dist/examples/LIBRARIES/soundfiles.lib deleted file mode 100644 index 3409a46f..00000000 --- a/dist/examples/LIBRARIES/soundfiles.lib +++ /dev/null @@ -1,231 +0,0 @@ -//#################################### soundfiles.lib ######################################## -// A library to handle soundfiles in Faust. Its official prefix is `so`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2018-2020 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Faust Soundfile Library"; -declare version "0.7"; - -ba = library("basics.lib"); -ma = library("maths.lib"); -si = library("signals.lib"); -ro = library("routes.lib"); -it = library("interpolators.lib"); - -//======================================================================= -// Utility functions added in a 'super' environment (to test the idea...) -//======================================================================= - -super = environment { - - length(sf, part) = (part, 0) : sf : (_,si.block(outputs(sf)-1)); - srate(sf, part) = (part, 0) : sf : (!,_,si.block(outputs(sf)-2)) : float; - outs(sf, level) = sf : si.block(2), bus(outputs(sf)-2) with { bus(n) = par(i,n,*(level)); }; - - // Plays a soundfile - // 'reader' in a function of type \(sf,part).(body) whih produces the (possibly fractional) read index - player(sf, part, reader, level) = (part, it.int_part(reader(sf, part))) : outs(sf, level); - - // Plays a soundfile with configurable interpolation - player_interp(sf, part, reader, level, selector) = it.interpolator_select(gen, idv, selector) - with { - // Adapts the (sf, part, reader) parameters as 'idv' and 'gen' types for the generic interpolator - idv = reader(sf, part); - gen(idx) = (part, idx) : outs(sf, level); - }; - - // Plays a soundfile with configurable interpolation and a reference frequence 'ref' - play_interp(sf, part, ref, freq, level, gate, selector) = player_interp(sf, part, reader, level, selector) - with { - reader(sf, part) = it.raise(gate, step, length(sf, part)) with { step = freq/ref*srate(sf, part)/ma.SR; }; - }; - - // Generic version - loop_speed_level(sf, part, speed, level) = player(sf, part, reader, level) - with { - // A 'reader' which loops the sound with 'speed' and 'level' control - reader(sf, part) = it.raise_modulo(1, step, length(sf, part)) with { step = speed*srate(sf, part)/ma.SR; }; - }; - - // Defines 'loop_speed' as a specialized version of loop_speed_level with level = 1 - loop_speed(sf, part, speed) = loop_speed_level(sf, part, speed, 1); - - // Defines 'loop_speed' as a specialized version of loop_speed_level with speed = 1 and level = 1 - loop(sf, part) = loop_speed_level(sf, part, 1, 1); - - -}; // End of environment - -//=============================Functions Reference======================================== -//======================================================================================== - -//--------------------------------`(so.)loop`----------------------------------- -// Play a soundfile in a loop taking into account its sampling rate. -// `loop` is a standard Faust function. -// -// #### Usage -// -// ``` -// loop(sf, part) -// ``` -// -// Where: -// -// * `sf`: the soundfile -// * `part`: the part in the soundfile list of sounds -// -//----------------------------------------------------------------------------- - -loop(sf, part) = super.loop(sf, part); - -//--------------------------------`(so.)loop_speed`----------------------------------- -// Play a soundfile in a loop taking into account its sampling rate, with speed control. -// `loop_speed` is a standard Faust function. -// -// #### Usage -// -// ``` -// loop_speed(sf, part, speed) -// ``` -// -// Where: -// -// * `sf`: the soundfile -// * `part`: the part in the soundfile list of sounds -// * `speed`: the speed between 0 and n -// -//----------------------------------------------------------------------------- - -loop_speed(sf, part, speed) = super.loop_speed(sf, part, speed); - -//--------------------------------`(so.)loop_speed_level`----------------------------------- -// Play a soundfile in a loop taking into account its sampling rate, with speed and level controls. -// `loop_speed_level` is a standard Faust function. -// -// #### Usage -// -// ``` -// loop_speed_level(sf, part, speed, level) -// ``` -// -// Where: -// -// * `sf`: the soundfile -// * `part`: the part in the soundfile list of sounds -// * `speed`: the speed between 0 and n -// * `level`: the volume between 0 and n -// -//----------------------------------------------------------------------------- - -loop_speed_level(sf, part, speed, level) = super.loop_speed_level(sf, part, speed, level); - -//==================================================== -// Environment to handle a given sound in a soundfile -//==================================================== - -sound(sf, part) = environment { - - // Looping the sound - loop = super.loop(sf, part); - loop_speed(speed) = super.loop_speed(sf, part, speed); - loop_speed_level(speed, level) = super.loop_speed_level(sf, part, speed, level); - - // Play once - play(level, gate) = super.player(sf, part, reader, level) - with { - reader(sf, part) = it.raise(gate, super.srate(sf, part)/ma.SR, super.length(sf, part)); - }; - - // Play once in reverse - play_rev(level, gate) = super.player(sf, part, reader, level) - with { - reader(sf, part) = it.decrease(gate, super.srate(sf, part)/ma.SR, super.length(sf, part)); - }; - - // Play sound once with configurable interpolation and freq control (using a 'ref' value) - play_interp(ref, freq, level, gate, selector) = super.play_interp(sf, part, ref, freq, level, gate, selector); - - // Play sound once and alternate between normal play and reverse play - //play_alt(level, gate, ctrl) = super.player(sf, part, alt2(ramp1, ramp2, ctrl), level) - play_alt(level, gate, ctrl) = super.player(sf, part, altN(lramp, ctrl), level) - with { - // High-order function which alternate between 2 'readers' depending of the 'ctrl' signal - alt2(r1, r2, ctrl) = \(sf, part).(ba.selectmulti(ma.SR/100, lr, ctrl) with { lr = r1(sf, part), r2(sf, part); }); - - altN(lrs, ctrl) = \(sf, part).(ba.selectmulti(ma.SR/100, mapper(lrs), ctrl) - with { - mapper((xs, xxs)) = xs(sf, part), mapper(xxs); - mapper(xs) = xs(sf, part); - }); - - step = super.srate(sf, part)/ma.SR; - - ramp1(sf, part) = it.raise(gate, step, super.length(sf, part)); - ramp2(sf, part) = it.decrease(gate, step, super.length(sf, part)); - - lramp = (ramp1, ramp2, ramp2, ramp2, ramp1); - }; - -}; // End of environment - -/* -// Using the `sound` environment allocated with a given `sf` and `part` - -import("soundfiles.lib"); - -s1 = soundfile("[url:{'piano-C5.ogg';'piano-G5.ogg';'piano-C6.ogg';'piano-G6.ogg'}]",2); -sample1 = so.sound(s1, 0); -sample2 = so.sound(s1, 1); -sample3 = so.sound(s1, 2); - -// Plays the sound in various ways -sample1.loop; -sample1.loop_speed(0.5); -sample1.loop_speed_level(0.5, 0.5); - -sample2.play(0.5, button("gate")); -sample2.play_rev(0.5, button("gate")); -sample2.play_alt(0.5, button("gate"), checkbox("alt")); - -sample3.play_interp(440.0, 600.0, 0.5, button("gate"), it.linear); -sample3.play_interp(440.0, 800.0, en.ar(0.1, 0.8, button("gate")), button("gate"), it.cubic); - -play = button("gate"); -sample3.play_interp(440.0, - hslider("freq", 200, 200, 880, 0.01), - hslider("gain", 0.5, 0, 1, 0.01)*en.ar(0.1, 0.8, play), - play, - nentry("interp", 0, 0, 3, 1)); - -*/ diff --git a/dist/examples/LIBRARIES/spats.lib b/dist/examples/LIBRARIES/spats.lib deleted file mode 100644 index 3705e648..00000000 --- a/dist/examples/LIBRARIES/spats.lib +++ /dev/null @@ -1,142 +0,0 @@ -//#################################### spats.lib ########################################## -// This library contains a collection of tools for sound spatialization. -// Its official prefix is `sp`. -//######################################################################################## - -/************************************************************************ - ************************************************************************ -FAUST library file -Copyright (C) 2003-2012 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. - - ************************************************************************ - ************************************************************************/ - -si = library("signals.lib"); - -declare name "Faust Spatialization Library"; -declare version "0.0"; - - -//-----------------------`(sp.)panner`------------------------ -// A simple linear stereo panner. -// `panner` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : panner(g) : _,_ -// ``` -// -// Where: -// -// * `g`: the panning (0-1) -//------------------------------------------------------------ -panner(g) = _ <: *(1-g), *(g); - -// TODO: need demo function for panner here - - -//-----------------------`(sp.)spat`------------------------ -// GMEM SPAT: n-outputs spatializer. -// `spat` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : spat(n,r,d) : _,_,... -// ``` -// -// Where: -// -// * `n`: number of outputs -// * `r`: rotation (between 0 et 1) -// * `d`: distance of the source (between 0 et 1) -//------------------------------------------------------ -// TODO: author Laurent Pottier, revised by RM -spat(n,a,d) = _ <: par(i, n, *( scaler(i, n, a, d) : si.smooth(0.9999) )) -with { - scaler(i,n,a,d) = (d/2.0+0.5) - * sqrt( max(0.0, 1.0 - abs(fmod(a+0.5+float(n-i)/n, 1.0) - 0.5) * n * d) ); -}; - - -//---------------`(sp.)stereoize`------------- -// Transform an arbitrary processor `p` into a stereo processor with 2 inputs -// and 2 outputs. -// -// #### Usage -// -// ``` -// _,_ : stereoize(p) : _,_ -// ``` -// -// Where: -// -// * `p`: the arbitrary processor -//---------------------------------------- -stereoize(p) = S(inputs(p), outputs(p)) -with { - // degenerated processor with no outputs - S(n,0) = !,! : 0,0; // just in case, probably a rare case - // processors with no inputs - S(0,1) = !,! : p <: _,_; // add two fake inputs and split output - S(0,2) = !,! : p; - S(0,n) = !,! : p,p :> _,_; // we are sure this will work if n is odd - // processors with one input - S(1,1) = p,p; // add two fake inputs and split output - S(1,n) = p,p :> _,_; // we are sure this will work if n is odd - // processors with two inputs - S(2,1) = p <: _,_; // split the output - S(2,2) = p; // nothing to do, p is already stereo - // processors with inputs > 2 and outputs > 2 - S(n,m) = _,_ <: p,p :> _,_; // we are sure this works if n or p are odd -}; - -// TODO: need demo function of spat here - -////////////////////////////////////////////////////////////////////////////////////////// -// UNDOCUMENTED/DISMISSED ELEMENTS -////////////////////////////////////////////////////////////////////////////////////////// - -// music.lib: - // The following functions could remain available but they would have to be - // factorized and reimplemented using the `par` function... - // bus2 = _,_; - // bus3 = _,_,_; - // bus4 = _,_,_,_; - // bus5 = _,_,_,_,_; - // bus6 = _,_,_,_,_,_; - // bus7 = _,_,_,_,_,_,_; - // bus8 = _,_,_,_,_,_,_,_; - // gain2(g) = *(g),*(g); - // gain3(g) = *(g),*(g),*(g); - // gain4(g) = *(g),*(g),*(g),*(g); - // gain5(g) = *(g),*(g),*(g),*(g),*(g); - // gain6(g) = *(g),*(g),*(g),*(g),*(g),*(g); - // gain7(g) = *(g),*(g),*(g),*(g),*(g),*(g),*(g); - // gain8(g) = *(g),*(g),*(g),*(g),*(g),*(g),*(g),*(g); diff --git a/dist/examples/LIBRARIES/stdfaust.lib b/dist/examples/LIBRARIES/stdfaust.lib deleted file mode 100644 index 25e1922f..00000000 --- a/dist/examples/LIBRARIES/stdfaust.lib +++ /dev/null @@ -1,38 +0,0 @@ -//################################ stdfaust.lib ########################################## -// The purpose of this library is to give access to all the Faust standard libraries -// through a series of environments. -//######################################################################################## - -aa = library("aanl.lib"); -sf = library("all.lib"); -an = library("analyzers.lib"); -ba = library("basics.lib"); -co = library("compressors.lib"); -de = library("delays.lib"); -dm = library("demos.lib"); -dx = library("dx7.lib"); -en = library("envelopes.lib"); -fd = library("fds.lib"); -fi = library("filters.lib"); -ho = library("hoa.lib"); -it = library("interpolators.lib"); -ma = library("maths.lib"); -mi = library("mi.lib"); -ef = library("misceffects.lib"); -os = library("oscillators.lib"); -no = library("noises.lib"); -pf = library("phaflangers.lib"); -pl = library("platform.lib"); -pm = library("physmodels.lib"); -qu = library("quantizers.lib"); -rm = library("reducemaps.lib"); -re = library("reverbs.lib"); -ro = library("routes.lib"); -sp = library("spats.lib"); -si = library("signals.lib"); -so = library("soundfiles.lib"); -sy = library("synths.lib"); -ve = library("vaeffects.lib"); -vl = library("version.lib"); -wa = library("webaudio.lib"); -wd = library("wdmodels.lib"); diff --git a/dist/examples/LIBRARIES/synths.lib b/dist/examples/LIBRARIES/synths.lib deleted file mode 100644 index 9070ddbe..00000000 --- a/dist/examples/LIBRARIES/synths.lib +++ /dev/null @@ -1,206 +0,0 @@ -//################################### synths.lib ########################################## -// This library contains a collection of synthesizers. Its official -// prefix is `sy`. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2003-2016 GRAME, Centre National de Creation Musicale ----------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "Faust Synthesizer Library"; -declare version "0.0"; - -ma = library("maths.lib"); -ba = library("basics.lib"); -en = library("envelopes.lib"); -fi = library("filters.lib"); -os = library("oscillators.lib"); -no = library("noises.lib"); - -//-----------------------------------`(sy.)popFilterPerc`-------------------------------------- -// A simple percussion instrument based on a "popped" resonant bandpass filter. -// `popFilterPerc` is a standard Faust function. -// -// #### Usage -// -// ``` -// popFilterDrum(freq,q,gate) : _; -// ``` -// -// Where: -// -// * `freq`: the resonance frequency of the instrument -// * `q`: the q of the res filter (typically, 5 is a good value) -// * `gate`: the trigger signal (0 or 1) -//---------------------------------------------------------------------------------------- -// TODO: author RM -popFilterDrum(freq,q,gate) = en.ar(0.001,0.001,gate)*no.noise : fi.resonbp(freq,q,1); - - -//---------------------------------------`(sy.)dubDub`----------------------------------------- -// A simple synth based on a sawtooth wave filtered by a resonant lowpass. -// `dubDub` is a standard Faust function. -// -// #### Usage -// -// ``` -// dubDub(freq,ctFreq,q,gate) : _; -// ``` -// -// Where: -// -// * `freq`: frequency of the sawtooth -// * `ctFreq`: cutoff frequency of the filter -// * `q`: Q of the filter -// * `gate`: the trigger signal (0 or 1) -//---------------------------------------------------------------------------------------- -// TODO: author RM -dubDub(freq,ctFreq,q,gate) = os.sawtooth(freq)*gainEnvelope : fi.resonlp(ctFreq,q,1) -with { - maxGain = 0.5; - gainEnvelope = en.smoothEnvelope(0.01,gate)*maxGain; -}; - - -//-----------------------------------`(sy.)sawTrombone`---------------------------------------- -// A simple trombone based on a lowpassed sawtooth wave. -// `sawTrombone` is a standard Faust function. -// -// #### Usage -// -// ``` -// sawTrombone(att,freq,gain,gate) : _ -// ``` -// -// Where: -// -// * `att`: exponential attack duration in s (typically 0.01) -// * `freq`: the frequency -// * `gain`: the gain (0-1) -// * `gate`: the gate (0 or 1) -//---------------------------------------------------------------------------------------- -// TODO: author RM -sawTrombone(freq,gain,gate) = os.sawtooth(freq)*gainEnvelope : fi.lowpass(3,cutoff) -with { - // controls both the gain of the instrument and the lowpass frequency - gainEnvelope = en.smoothEnvelope(0.01,gate)*gain; - cutoff = gainEnvelope*5000+50; -}; - - -//-----------------------------------`(sy.)combString`----------------------------------------- -// Simplest string physical model ever based on a comb filter. -// `combString` is a standard Faust function. -// -// #### Usage -// -// ``` -// combString(freq,res,gate) : _; -// ``` -// -// Where: -// -// * `freq`: the frequency of the string -// * `res`: string T60 (resonance time) in second -// * `gate`: trigger signal (0 or 1) -//---------------------------------------------------------------------------------------- -// TODO: author RM -combString(freq,res,gate) = excitation : fi.fb_fcomb(maxDel,N,b0,aN) -with { - maxDel = 1024; - N = ma.SR/freq; - b0 = 1; - aN = ba.tau2pole(res*0.001)*-1; - excitation = no.noise*en.ar(0.001,0.001,gate); -}; - - -//-----------------------------------`(sy.)additiveDrum`--------------------------------------- -// A simple drum using additive synthesis. -// `additiveDrum` is a standard Faust function. -// -// #### Usage -// -// ``` -// additiveDrum(freq,freqRatio,gain,harmDec,att,rel,gate) : _ -// ``` -// -// Where: -// -// * `freq`: the resonance frequency of the drum -// * `freqRatio`: a list of ratio to choose the frequency of the mode in -// function of `freq` e.g.(1 1.2 1.5 ...). The first element should always -// be one (fundamental). -// * `gain`: the gain of each mode as a list (1 0.9 0.8 ...). The first element -// is the gain of the fundamental. -// * `harmDec`: harmonic decay ratio (0-1): configure the speed at which -// higher modes decay compare to lower modes. -// * `att`: attack duration in second -// * `rel`: release duration in second -// * `gate`: trigger signal (0 or 1) -//---------------------------------------------------------------------------------------- -// TODO: author RM -additiveDrum(freq,freqRatio,gain,modeDec,att,rel,gate) = par(i,N,os.osc(modeFreq(i))*gainEnvelope(i)) :> _ -with { - N = ba.count(freqRatio); - modeFreq(i) = freq*ba.take(i+1,freqRatio); - modeGain(i) = ba.take(i+1,gain); - gainEnvelope(i) = modeGain(i)*en.ar(att,rel*(1-(modeDec*(i/N))),gate); -}; - - -//-----------------------------------`(sy.)fm`--------------------------------------- -// An FM synthesizer with an arbitrary number of modulators connected as a sequence. -// `fm` is a standard Faust function. -// -// #### Usage -// -// ``` -// freqs = (300,400,...); -// indices = (20,...); -// fm(freqs,indices) : _ -// ``` -// -// Where: -// -// * `freqs`: a list of frequencies where the first one is the frequency of the carrier -// and the others, the frequency of the modulator(s) -// * `indices`: the indices of modulation (Nfreqs-1) -//---------------------------------------------------------------------------------------- -// TODO: author RM -fm(freqs,indices) = seq(i,N,fmBlock(i)) -with { - N = ba.count(freqs); - freq(i) = ba.take(N-i,freqs); - gain(i) = ba.take(N-i,indices); - fmBlock(0) = freq(0) : os.osc; - fmBlock(i) = *(gain(i))+freq(i) : os.osc; -}; diff --git a/dist/examples/LIBRARIES/tonestacks.lib b/dist/examples/LIBRARIES/tonestacks.lib deleted file mode 100644 index 341d26fd..00000000 --- a/dist/examples/LIBRARIES/tonestacks.lib +++ /dev/null @@ -1,427 +0,0 @@ -/** - ** Guitar tone stacks (based on the work from D.T. Yeh) - ** some values are taken from CAPS plugin tonestack - ** - ** this tonestacks.library provide the following tonestack models: - ** bassman, mesa, twin, princeton, jcm800, jcm2000, jtm45, mlead, - ** m2199, ac30, ac15, soldano, sovtek, peavey, ibanez, roland, - ** ampeg, ampeg_rev, bogner, groove, crunch, fender_blues, - ** fender_default, fender_deville, gibsen - ** - ** USAGE : - ** _:component("tonestacks.lib").model(t,m,l):_ - ** WHERE : - ** model is on of the models above. - ** t is treble freq control in range of (0.0 - 1.0) - ** m is middle freq control in range of (0.0 - 1.0) - ** l is low freq control in range of (0.0 - 1.0) - ** - ** EXAMPLE : - ** process = component("tonestacks.lib").jcm2000(t,m,l) - ** with { - ** t = vslider("Treble ", 0.5, 0, 1, 0.01); - ** m = vslider("Middle ", 0.5, 0, 1, 0.01); - ** l = vslider("Bass ", 0.5, 0, 1, 0.01); - ** }; - **/ - -declare name "Tonestack Emulation Library"; -declare author "Guitarix project ()"; -declare copyright "Guitarix project"; -declare version "0.28"; -declare license "LGPL"; - -ma = library("maths.lib"); -fi = library("filters.lib"); - -/**************************************************************** - ** Equalisation 3 bands - ** C1 - ** IN >---------||--------- - ** | | - ** | | - ** | | R4 | | R1 Treble - ** | | | |<------< Out - ** | | | | - ** | C2 | - ** |-------||--------|------ - ** | | | - ** | | | | - ** | | |<---- R2 Bass - ** | | | - ** | | - ** | C3 | | - ** --------||------>| | R3 Middle - ** | | - ** | - ** _|_ - ** - - ** - ****************************************************************/ - -tonestack(C1,C2,C3,R1,R2,R3,R4,t,m,L) = - 1/A0*fi.iir((B0,B1,B2,B3),(A1/A0,A2/A0,A3/A0)) - with { - - l = L : (_-1)*3.4 : exp; - - b1 = t*C1*R1 + m*C3*R3 + l*(C1*R2 + C2*R2) + (C1*R3 + C2*R3); - - b2 = t*(C1*C2*R1*R4 + C1*C3*R1*R4) - m*m*(C1*C3*R3*R3 + C2*C3*R3*R3) - + m*(C1*C3*R1*R3 + C1*C3*R3*R3 + C2*C3*R3*R3) - + l*(C1*C2*R1*R2 + C1*C2*R2*R4 + C1*C3*R2*R4) - + l*m*(C1*C3*R2*R3 + C2*C3*R2*R3) - + (C1*C2*R1*R3 + C1*C2*R3*R4 + C1*C3*R3*R4); - - b3 = l*m*(C1*C2*C3*R1*R2*R3 + C1*C2*C3*R2*R3*R4) - - m*m*(C1*C2*C3*R1*R3*R3 + C1*C2*C3*R3*R3*R4) - + m*(C1*C2*C3*R1*R3*R3 + C1*C2*C3*R3*R3*R4) - + t*C1*C2*C3*R1*R3*R4 - t*m*C1*C2*C3*R1*R3*R4 - + t*l*C1*C2*C3*R1*R2*R4; - - a0 = 1; - - a1 = (C1*R1 + C1*R3 + C2*R3 + C2*R4 + C3*R4) - + m*C3*R3 + l*(C1*R2 + C2*R2); - - a2 = m*(C1*C3*R1*R3 - C2*C3*R3*R4 + C1*C3*R3*R3 + C2*C3*R3*R3) - + l*m*(C1*C3*R2*R3 + C2*C3*R2*R3) - - m*m*(C1*C3*R3*R3 + C2*C3*R3*R3) - + l*(C1*C2*R2*R4 + C1*C2*R1*R2 + C1*C3*R2*R4 + C2*C3*R2*R4) - + (C1*C2*R1*R4 + C1*C3*R1*R4 + C1*C2*R3*R4 + C1*C2*R1*R3 + C1*C3*R3*R4 + C2*C3*R3*R4); - - a3 = l*m*(C1*C2*C3*R1*R2*R3 + C1*C2*C3*R2*R3*R4) - - m*m*(C1*C2*C3*R1*R3*R3 + C1*C2*C3*R3*R3*R4) - + m*(C1*C2*C3*R3*R3*R4 + C1*C2*C3*R1*R3*R3 - C1*C2*C3*R1*R3*R4) - + l*C1*C2*C3*R1*R2*R4 - + C1*C2*C3*R1*R3*R4; - - c = 2*float(ma.SR); - - B0 = -b1*c - b2*pow(c,2) - b3*pow(c,3); - B1 = -b1*c + b2*pow(c,2) + 3*b3*pow(c,3); - B2 = b1*c + b2*pow(c,2) - 3*b3*pow(c,3); - B3 = b1*c - b2*pow(c,2) + b3*pow(c,3); - A0 = -a0 - a1*c - a2*pow(c,2) - a3*pow(c,3); - A1 = -3*a0 - a1*c + a2*pow(c,2) + 3*a3*pow(c,3); - A2 = -3*a0 + a1*c + a2*pow(c,2) - 3*a3*pow(c,3); - A3 = -a0 + a1*c - a2*pow(c,2) + a3*pow(c,3); -}; - -ts = environment { - k = *(1e3); - M = *(1e6); - nF = *(1e-9); - pF = *(1e-12); - - /* Fender */ - - bassman = environment { /* 59 Bassman 5F6-A */ - R1 = 250:k; - R2 = 1:M; - R3 = 25:k; - R4 = 56:k; - C1 = 250:pF; - C2 = 20:nF; - C3 = 20:nF; - }; - - mesa = environment { /* Mesa Boogie Mark */ - R1 = 250:k; - R2 = 250:k; - R3 = 25:k; - R4 = 100:k; - C1 = 250:pF; - C2 = 100:nF; - C3 = 47:nF; - }; - - twin = environment { /* 69 Twin Reverb AA270 */ - R1 = 250:k; - R2 = 250:k; - R3 = 10:k; - R4 = 100:k; - C1 = 120:pF; - C2 = 100:nF; - C3 = 47:nF; - }; - - princeton = environment { /* 64 Princeton AA1164 */ - R1 = 250:k; - R2 = 250:k; - R3 = 4.8:k; - R4 = 100:k; - C1 = 250:pF; - C2 = 100:nF; - C3 = 47:nF; - }; - - /* Marshall */ - - jcm800 = environment { /* 59/81 JCM-800 Lead 100 2203 */ - R1 = 220:k; - R2 = 1:M; - R3 = 22:k; - R4 = 33:k; - C1 = 470:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - /* 90 JCM-900 Master 2100: same as JCM-800 */ - - jcm2000 = environment { /* 81 2000 Lead */ - R1 = 250:k; - R2 = 1:M; - R3 = 25:k; - R4 = 56:k; /* a 10 k fixed + 100 k pot in series actually */ - C1 = 500:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - jtm45 = environment { /* JTM 45 */ - R1 = 250:k; - R2 = 1:M; - R3 = 25:k; - R4 = 33:k; - C1 = 270:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - /* parameter order is R1 - R4, C1 - C3 */ - mlead = environment { /* 67 Major Lead 200 */ - R1 = 250:k; - R2 = 1:M; - R3 = 25:k; - R4 = 33:k; - C1 = 500:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - m2199 = environment { /* undated M2199 30W solid state */ - R1 = 250:k; - R2 = 250:k; - R3 = 25:k; - R4 = 56:k; - C1 = 250:pF; - C2 = 47:nF; - C3 = 47:nF; - }; - - /* Vox */ - ac30 = environment { /* 59/86 AC-30 */ - /* R3 is fixed (circuit differs anyway) */ - R1 = 1:M; - R2 = 1:M; - R3 = 10:k; - R4 = 100:k; - C1 = 50:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - ac15 = environment { /* VOX AC-15 */ - R1 = 220:k; - R2 = 220:k; - R3 = 220:k; - R4 = 100:k; - C1 = 470:pF; - C2 = 100:nF; - C3 = 47:nF; - }; - - soldano = environment { /* Soldano SLO 100 */ - R1 = 250:k; - R2 = 1:M; - R3 = 25:k; - R4 = 47:k; - C1 = 470:pF; - C2 = 20:nF; - C3 = 20:nF; - }; - - sovtek = environment { /* MIG 100 H*/ - R1 = 500:k; - R2 = 1:M; - R3 = 10:k; - R4 = 47:k; - C1 = 470:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - peavey = environment { /* c20*/ - R1 = 250:k; - R2 = 250:k; - R3 = 20:k; - R4 = 68:k; - C1 = 270:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - ibanez = environment { /* gx20 */ - R1 = 250:k; - R2 = 250:k; - R3 = 10:k; - R4 = 100:k; - C1 = 270:pF; - C2 = 100:nF; - C3 = 40:nF; - }; - - roland = environment { /* Cube 60 */ - R1 = 250:k; - R2 = 250:k; - R3 = 10:k; - R4 = 41:k; - C1 = 240:pF; - C2 = 33:nF; - C3 = 82:nF; - }; - - ampeg = environment { /* VL 501 */ - R1 = 250:k; - R2 = 1:M; - R3 = 25:k; - R4 = 32:k; - C1 = 470:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - ampeg_rev = environment { /* reverbrocket*/ - R1 = 250:k; - R2 = 250:k; - R3 = 10:k; - R4 = 100:k; - C1 = 100:pF; - C2 = 100:nF; - C3 = 47:nF; - }; - - bogner = environment { /* Triple Giant Preamp */ - R1 = 250:k; - R2 = 1:M; - R3 = 33:k; - R4 = 51:k; - C1 = 220:pF; - C2 = 15:nF; - C3 = 47:nF; - }; - - groove = environment { /* Trio Preamp */ - R1 = 220:k; - R2 = 1:M; - R3 = 22:k; - R4 = 68:k; - C1 = 470:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - crunch = environment { /* Hughes&Kettner */ - R1 = 220:k; - R2 = 220:k; - R3 = 10:k; - R4 = 100:k; - C1 = 220:pF; - C2 = 47:nF; - C3 = 47:nF; - }; - - fender_blues = environment { /* Fender blues junior */ - R1 = 250:k; - R2 = 250:k; - R3 = 25:k; - R4 = 100:k; - C1 = 250:pF; - C2 = 22:nF; - C3 = 22:nF; - }; - - fender_default = environment { /* Fender */ - R1 = 250:k; - R2 = 250:k; - R3 = 10:k; - R4 = 100:k; - C1 = 250:pF; - C2 = 100:nF; - C3 = 47:nF; - }; - - fender_deville = environment { /* Fender Hot Rod */ - R1 = 250:k; - R2 = 250:k; - R3 = 25:k; - R4 = 130:k; - C1 = 250:pF; - C2 = 100:nF; - C3 = 22:nF; - }; - - gibsen = environment { /* gs12 reverbrocket */ - R1 = 1:M; - R2 = 1:M; - R3 = 94:k; // 47k fixed - R4 = 270:k; - C1 = 25:pF; - C2 = 60:nF; - C3 = 20:nF; - }; - -}; - -bassman(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.bassman;}; -mesa(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.mesa;}; -twin(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.twin;}; -princeton(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.princeton;}; -jcm800(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.jcm800;}; -jcm2000(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.jcm2000;}; -jtm45(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.jtm45;}; -mlead(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.mlead;}; -m2199(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.m2199;}; -ac30(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.ac30;}; -ac15(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.ac15;}; -soldano(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.soldano;}; -sovtek(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.sovtek;}; -peavey(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.peavey;}; -ibanez(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.ibanez;}; -roland(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.roland;}; -ampeg(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.ampeg;}; -ampeg_rev(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.ampeg_rev;}; -bogner(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.bogner;}; -groove(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.groove;}; -crunch(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.crunch;}; -fender_blues(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.fender_blues;}; -fender_default(T,M,L)= tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.fender_default;}; -fender_deville(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.fender_deville;}; -gibsen(T,M,L) = tonestack(t.C1,t.C2,t.C3,t.R1,t.R2,t.R3,t.R4,T,M,L) - with {t = ts.gibsen;}; - diff --git a/dist/examples/LIBRARIES/tubes.lib b/dist/examples/LIBRARIES/tubes.lib deleted file mode 100644 index 49417dbc..00000000 --- a/dist/examples/LIBRARIES/tubes.lib +++ /dev/null @@ -1,5037 +0,0 @@ -/****************************************************************************** - ** Guitar(ix) tube amp emulations - ** - ** - ** this tubes.library provide the following tube models: - ** T1_12AX7, T2_12AX7, T3_12AX7, T1_12AT7, T2_12AT7, T3_12AT7, - ** T1_12AU7, T2_12AU7, T3_12AU7, T1_6V6, T2_6V6, T3_6V6, - ** T1_6DJ8, T2_6DJ8, T3_6DJ8, T1_6C16, T2_6C16, T3_6C16 - ** - ** - ** USAGE: - ** _:component("tubes.lib").model:_ - ** where - ** model is on of the models above. - ** - ** EXAMPLE 2 STAGE TUBE PREAMP: - ** process = component("tubes.lib").T1_12AX7 : *(preamp): - ** lowpass(1,6531.0) : component("tubes.lib").T2_12AX7 : *(preamp): - ** lowpass(1,6531.0) : component("tubes.lib").T3_12AX7 : *(gain) with { - ** preamp = vslider("Pregain",-6,-20,20,0.1) : db2linear : smooth(0.999); - ** gain = vslider("Gain", -6, -20.0, 20.0, 0.1) : db2linear : smooth(0.999); - ** }; - ** - ******************************************************************************/ - -fi = library("filters.lib"); - -/******************************************************************************* - * 1-dimensional function tables for linear interpolation -*******************************************************************************/ - -//-- Rdtable from waveform -rtable(table, r) = (table, int(r)):rdtable; - -// Change sign of input signal x; -inverse(x) = abs(x) * invsign(x); - -// function that takes f value and x sign -ccopysign(f, x) = abs(f) * sign(x); - -//-- Get sign and reversed sign of a signal x -sign(x) = x<0, 1, -1 : select2; -invsign(x) = x<0, -1, 1 : select2; - -//-- Interpolate value between i and i+1 in table with coefficient f. -interpolation(table, f, i) = rtable(table, i)*(1-f) + rtable(table,i+1)*f; - -//-- Bound Index with table boundaries -boundIndex(size, index) = index : floor: min(size-1) : max(0); - -//-- Bound factor of interpolation : -//if index<0 return 0 | if index>size-1 return size-1 -boundFactor(size, factor, index) = - select2(0 -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -All MarkDown comments in this section are Copyright 2016-2017 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ - -//====================================Moog Filters======================================== -//======================================================================================== - -//-------------------------`(ve.)moog_vcf`--------------------------- -// Moog "Voltage Controlled Filter" (VCF) in "analog" form. Moog VCF -// implemented using the same logical block diagram as the classic -// analog circuit. As such, it neglects the one-sample delay associated -// with the feedback path around the four one-poles. -// This extra delay alters the response, especially at high frequencies -// (see reference [1] for details). -// See `moog_vcf_2b` below for a more accurate implementation. -// -// #### Usage -// -// ``` -// moog_vcf(res,fr) -// ``` -// Where: -// -// * `res`: normalized amount of corner-resonance between 0 and 1 -// (0 is no resonance, 1 is maximum) -// * `fr`: corner-resonance frequency in Hz (less than SR/6.3 or so) -// -// #### References -// * -// * -//------------------------------------------------------------ -declare moog_vcf author "Julius O. Smith III"; -declare moog_vcf copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare moog_vcf license "MIT-style STK-4.3 license"; -moog_vcf(res,fr) = (+ : seq(i,4,fi.pole(p)) : *(unitygain(p))) ~ *(mk) -with { - p = 1.0 - fr * 2.0 * ma.PI / ma.SR; // good approximation for fr << SR - unitygain(p) = pow(1.0-p,4.0); // one-pole unity-gain scaling - mk = -4.0*max(0,min(res,0.999999)); // need mk > -4 for stability -}; - -//-----------------------`(ve.)moog_vcf_2b[n]`--------------------------- -// Moog "Voltage Controlled Filter" (VCF) as two biquads. Implementation -// of the ideal Moog VCF transfer function factored into second-order -// sections. As a result, it is more accurate than `moog_vcf` above, but -// its coefficient formulas are more complex when one or both parameters -// are varied. Here, res is the fourth root of that in `moog_vcf`, so, as -// the sampling rate approaches infinity, `moog_vcf(res,fr)` becomes equivalent -// to `moog_vcf_2b[n](res^4,fr)` (when res and fr are constant). -// `moog_vcf_2b` uses two direct-form biquads (`tf2`). -// `moog_vcf_2bn` uses two protected normalized-ladder biquads (`tf2np`). -// -// #### Usage -// -// ``` -// moog_vcf_2b(res,fr) -// moog_vcf_2bn(res,fr) -// ``` -// -// Where: -// -// * `res`: normalized amount of corner-resonance between 0 and 1 -// (0 is min resonance, 1 is maximum) -// * `fr`: corner-resonance frequency in Hz -//------------------------------------------------------------ -declare moog_vcf_2b author "Julius O. Smith III"; -declare moog_vcf_2b copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare moog_vcf_2b license "MIT-style STK-4.3 license"; -moog_vcf_2b(res,fr) = fi.tf2s(0,0,b0,a11,a01,w1) : fi.tf2s(0,0,b0,a12,a02,w1) -with { - s = 1; // minus the open-loop location of all four poles - frl = max(20,min(10000,fr)); // limit fr to reasonable 20-10k Hz range - w1 = 2*ma.PI*frl; // frequency-scaling parameter for bilinear xform - // Equivalent: w1 = 1; s = 2*PI*frl; - kmax = sqrt(2)*0.99999; // 0.99999 gives stability margin (tf2 is unprotected) - k = min(kmax,sqrt(2)*res); // fourth root of Moog VCF feedback gain - b0 = s^2; - s2k = sqrt(2) * k; - a11 = s * (2 + s2k); - a12 = s * (2 - s2k); - a01 = b0 * (1 + s2k + k^2); - a02 = b0 * (1 - s2k + k^2); -}; - -declare moog_vcf_2bn author "Julius O. Smith III"; -declare moog_vcf_2bn copyright "Copyright (C) 2003-2019 by Julius O. Smith III "; -declare moog_vcf_2bn license "MIT-style STK-4.3 license"; -moog_vcf_2bn(res,fr) = fi.tf2snp(0,0,b0,a11,a01,w1) : fi.tf2snp(0,0,b0,a12,a02,w1) -with { - s = 1; // minus the open-loop location of all four poles - w1 = 2*ma.PI*max(fr,20); // frequency-scaling parameter for bilinear xform - k = sqrt(2)*0.99999*res; // fourth root of Moog VCF feedback gain - b0 = s^2; - s2k = sqrt(2) * k; - a11 = s * (2 + s2k); - a12 = s * (2 - s2k); - a01 = b0 * (1 + s2k + k^2); - a02 = b0 * (1 - s2k + k^2); -}; - - -//------------------`(ve.)moogLadder`----------------- -// Virtual analog model of the 4th-order Moog Ladder, which is arguably the -// most well-known ladder filter in analog synthesizers. Several -// 1st-order filters are cascaded in series. Feedback is then used, in part, to -// control the cut-off frequency and the resonance. -// -// This filter was implemented in Faust by Eric Tarr during the -// [2019 Embedded DSP With Faust Workshop](https://ccrma.stanford.edu/workshops/faust-embedded-19/). -// -// #### References -// -// * -// * -// -// #### Usage -// -// ``` -// _ : moogLadder(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare moogLadder author "Eric Tarr"; -declare moogLadder license "MIT-style STK-4.3 license"; -moogLadder(normFreq,Q) = _<:(s1,s2,s3,s4,y) : !,!,!,!,_ -letrec{ - 's1 = -(s4*k):-(s3*g*k):-(s2*g*g*k):-(s1*g*g*g*k):*(A):-(s1):*(B*2):+(s1); - 's2 = -(s4*k):-(s3*g*k):-(s2*g*g*k):-(s1*g*g*g*k):*(A):-(s1):*(B):+(s1):-(s2):*(B*2):+(s2); - 's3 = -(s4*k):-(s3*g*k):-(s2*g*g*k):-(s1*g*g*g*k):*(A):-(s1):*(B):+(s1):-(s2):*(B):+(s2):-(s3):*(B*2):+(s3); - 's4 = -(s4*k):-(s3*g*k):-(s2*g*g*k):-(s1*g*g*g*k):*(A):-(s1):*(B):+(s1):-(s2):*(B):+(s2):-(s3):*(B):+(s3):-(s4):*(B*2):+(s4); - 'y = -(s4*k):-(s3*g*k):-(s2*g*g*k):-(s1*g*g*g*k):*(A):-(s1):*(B):+(s1):-(s2):*(B):+(s2):-(s3):*(B):+(s3):-(s4):*(B):+(s4); -} -with{ - freq = 2*(10^(3*normFreq+1)); - k = (3.9 - (normFreq^0.2)*0.9)*(Q - 0.707)/(25.0 - 0.707); - //k = 3.9*(Q - 0.707)/(25.0 - 0.707); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g*g*g*g; - A = 1/(1+(k*G)); - B = g/(1+g); -}; - - -//------------------`(ve.)moogHalfLadder`----------------- -// Virtual analog model of the 2nd-order Moog Half Ladder (simplified version of -// `(ve.)moogLadder`). Several 1st-order filters are cascaded in series. -// Feedback is then used, in part, to control the cut-off frequency and the -// resonance. -// -// This filter was implemented in Faust by Eric Tarr during the -// [2019 Embedded DSP With Faust Workshop](https://ccrma.stanford.edu/workshops/faust-embedded-19/). -// -// #### References -// -// * -// * -// -// #### Usage -// -// ``` -// _ : moogHalfLadder(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare moogHalfLadder author "Eric Tarr"; -declare moogHalfLadder license "MIT-style STK-4.3 license"; -moogHalfLadder(normFreq,Q) = _ <: (s1,s2,s3,y) : !,!,!,_ -letrec{ - 's1 = -(s3*B3*k):-(s2*B2*k):-(s1*B1*k):*(alpha0):-(s1):*(alpha*2):+(s1); - 's2 = -(s3*B3*k):-(s2*B2*k):-(s1*B1*k):*(alpha0):-(s1):*(alpha):+(s1):-(s2):*(alpha*2):+(s2); - 's3 = -(s3*B3*k):-(s2*B2*k):-(s1*B1*k):*(alpha0):-(s1):*(alpha):+(s1):-(s2):*(alpha):+(s2):-(s3):*(alpha*2):+(s3); - 'y = -(s3*B3*k):-(s2*B2*k):-(s1*B1*k):*(alpha0):-(s1):*(alpha):+(s1):-(s2):*(alpha):+(s2) <:_*-1,((-(s3):*(alpha):+(s3))*2):>_; -} -with{ - freq = 2*(10^(3*normFreq+1)); - k = 2.0*(Q - 0.707)/(25.0 - 0.707); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g/(1.0 + g); - alpha = G; - GA = 2*G-1; // All-pass gain - B1 = GA*G/(1+g); - B2 = GA/(1+g); - B3 = 2/(1+g); - alpha0 = 1/(1 + k*GA*G*G); -}; - - -//------------------`(ve.)diodeLadder`----------------- -// 4th order virtual analog diode ladder filter. In addition to the individual -// states used within each independent 1st-order filter, there are also additional -// feedback paths found in the block diagram. These feedback paths are labeled -// as connecting states. Rather than separately storing these connecting states -// in the Faust implementation, they are simply implicitly calculated by -// tracing back to the other states (`s1`,`s2`,`s3`,`s4`) each recursive step. -// -// This filter was implemented in Faust by Eric Tarr during the -// [2019 Embedded DSP With Faust Workshop](https://ccrma.stanford.edu/workshops/faust-embedded-19/). -// -// #### References -// -// * -// * -// -// #### Usage -// -// ``` -// _ : diodeLadder(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare diodeLadder author "Eric Tarr"; -declare diodeLadder license "MIT-style STK-4.3 license"; -diodeLadder(normFreq,Q) = ef.cubicnl(1,0)*1.5 <:(s1,s2,s3,s4,y) : !,!,!,!,_ -letrec{ - 's1 = _-(s4*B4*SG4*k) : - _-((s4*B4*d3+s3)*B3*SG3*k) : - _-(((s4*B4*d3+s3)*B3*d2 + s2)*B2*SG3*k) : - _-((((s4*B4*d3+s3)*B3*d2 + s2)*B2*d1 + s1)*B1*SG1*k) : - _*alpha0: _*gam1 : _+((s4*B4*d3+s3)*B3*d2 + s2)*B2 : //_+S2 - _+((((s4*B4*d3+s3)*B3*d2 + s2)*B2)*d1 + s1)*B1*G2 : // _ + (S2 ... - _*a1 : _-s1 :_*alpha*2 : _+s1; - - 's2 = _-(s4*B4*SG4*k) : - _-((s4*B4*d3+s3)*B3*SG3*k) : - _-(((s4*B4*d3+s3)*B3*d2 + s2)*B2*SG3*k): - _-((((s4*B4*d3+s3)*B3*d2 + s2)*B2*d1 + s1)*B1*SG1*k) : - _*alpha0: _*gam1 : _+((s4*B4*d3+s3)*B3*d2 + s2)*B2 : //_+S2 - _+((((s4*B4*d3+s3)*B3*d2 + s2)*B2)*d1 + s1)*B1*G2 : // _ + (S2 ... - _*a1 : _-s1 :_*alpha : _+s1 : _*gam2 : - _+(s4*B4*d3 + s3)*B3 : //_+S3 : - _+(((s4*B4*d3 + s3)*B3)*d2 + s2)*B2*G3 : //_+(S3...) - _*a2 : _-s2 : _*alpha*2 : _+s2; - - 's3 = _-(s4*B4*SG4*k) : - _-((s4*B4*d3+s3)*B3*SG3*k) : - _-(((s4*B4*d3+s3)*B3*d2 + s2)*B2*SG3*k) : - _-((((s4*B4*d3+s3)*B3*d2 + s2)*B2*d1 + s1)*B1*SG1*k) : - _*alpha0 : _*gam1 : _+((s4*B4*d3+s3)*B3*d2 + s2)*B2 : //_+S2 - _+((((s4*B4*d3+s3)*B3*d2 + s2)*B2)*d1+s1)*B1*G2 : // _ + (S2 ... - _*a1 : _-s1 :_*alpha : _+s1 : _*gam2 : - _+(s4*B4*d3 + s3)*B3 : //_+S3 : - _+(((s4*B4*d3 + s3)*B3)*d2 + s2)*B2*G3 : //_+(S3...) - _*a2 : _-s2 : _*alpha : _+s2 : _*gam3: - _+s4*B4 : // _ + S4 - _+((s4*B4)*d3 + s3)*B3*G4: // _ + S4 ... - _*a3 : _-s3 : _*alpha*2 : _+s3; - - 's4 = _-(s4*B4*SG4*k) : - _-((s4*B4*d3+s3)*B3*SG3*k) : - _-(((s4*B4*d3+s3)*B3*d2 + s2)*B2*SG3*k) : - _-((((s4*B4*d3+s3)*B3*d2 + s2)*B2*d1 + s1 )*B1*SG1*k) : - _*alpha0 : _*gam1 : _+((s4*B4*d3+s3)*B3*d2 + s2)*B2 : //_+S2 - _+((((s4*B4*d3+s3)*B3*d2 + s2)*B2)*d1 + s1)*B1*G2 : // _ + (S2 ... - _*a1 : _-s1 :_*alpha : _+s1 : _*gam2 : - _+(s4*B4*d3 + s3)*B3 : //_+S3 : - _+(((s4*B4*d3 + s3)*B3) *d2+s2)*B2*G3 : //_+(S3...) - _*a2 : _-s2 : _*alpha : _+s2 : _*gam3 : - _+s4*B4 : // _ + S4 - _+((s4*B4)*d3 + s3)*B3*G4: // _ + S4 ... - _*a3 : _-s3 : _*alpha : _+s3 : _*gam4 : _*a4 : _-s4 : _*alpha*2 : _+s4; - - // Output signal - 'y = _-(s4*B4*SG4*k) : - _-((s4*B4*d3+s3)*B3*SG3*k) : - _-(((s4*B4*d3+s3)*B3*d2 + s2)*B2*SG3*k) : - _-((((s4*B4*d3+s3)*B3*d2 + s2)*B2*d1 + s1 )*B1*SG1*k) : - _*alpha0: _*gam1 : _+((s4*B4*d3+s3)*B3*d2 + s2)*B2 : //_+S2 - _+((((s4*B4*d3+s3)*B3*d2 + s2)*B2)*d1 + s1)*B1*G2 : // _ + (S2 ... - _*a1 : _-s1 :_*alpha : _+s1 : _*gam2 : - _+(s4*B4*d3 + s3)*B3 : //_+S3 : - _+(((s4*B4*d3 + s3)*B3)*d2 + s2)*B2*G3 : //_+(S3...) - _*a2 : _-s2 : _*alpha : _+s2 : _*gam3 : - _+s4*B4 : // _ + S4 - _+((s4*B4)*d3 + s3)*B3*G4: // _ + S4 ... - _*a3 : _-s3 : _*alpha : _+s3 : _*gam4 : _*a4 : _-s4 : _*alpha : _+s4; -} -with{ - freq = 2*(10^(3*normFreq+1)); - k = (17 - (normFreq^10)*9.7)*(Q - 0.707)/(25.0 - 0.707); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G4 = 0.5*g/(1 + g); - G3 = 0.5*g/(1 + g - 0.5*g*G4); - G2 = 0.5*g/(1 + g - 0.5*g*G3); - G1 = g/(1.0 + g - g*G2); - Gamma = G1*G2*G3*G4; - SG1 = G4*G3*G2; // feedback gain pre-calculated - SG2 = G4*G3; - SG3 = G4; - SG4 = 1; - alpha = g/(1+g); - alpha0 = 1/(1+k*Gamma); - gam1 = 1+G1*G2; - gam2 = 1+G2*G3; - gam3 = 1+G3*G4; - gam4 = 1; - a1 = 1; // a0 for 1st LPF - a2 = 0.5; // a0 for 2nd LPF - a3 = 0.5; - a4 = 0.5; - B1 = 1/(1+g-g*G2); // Beta for 1st block - B2 = 1/(1+g-0.5*g*G3); - B3 = 1/(1+g-0.5*g*G4); - B4 = 1/(1+g); - d1 = g; // delta for 1st block - d2 = 0.5*g; - d3 = 0.5*g; - //d4 = 0; -}; - - -//===================================Korg 35 Filters====================================== -// The following filters are virtual analog models of the Korg 35 low-pass -// filter and high-pass filter found in the MS-10 and MS-20 synthesizers. -// The virtual analog models for the LPF and HPF are different, making these -// filters more interesting than simply tapping different states of the same -// circuit. -// -// These filters were implemented in Faust by Eric Tarr during the -// [2019 Embedded DSP With Faust Workshop](https://ccrma.stanford.edu/workshops/faust-embedded-19/). -// -// #### Filter history: -// -// -//======================================================================================== - -//------------------`(ve.)korg35LPF`----------------- -// Virtual analog models of the Korg 35 low-pass filter found in the MS-10 and -// MS-20 synthesizers. -// -// #### Usage -// -// ``` -// _ : korg35LPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare korg35LPF author "Eric Tarr"; -declare korg35LPF license "MIT-style STK-4.3 license"; -korg35LPF(normFreq,Q) = _ <: (s1,s2,s3,y) : !,!,!,_ -letrec{ - 's1 = _-s1:_*(alpha*2):_+s1; - 's2 = _-s1:_*alpha:_+s1:_+(s3*B3):_+(s2*B2):_*alpha0:_-s3:_*alpha:_+s3:_*K:_-s2:_*(alpha*2):_+s2; - 's3 = _-s1:_*alpha:_+s1:_+(s3*B3):_+(s2*B2):_*alpha0:_-s3:_*(alpha*2):_+s3; - 'y = _-s1:_*alpha:_+s1:_+(s3*B3):_+(s2*B2) :_*alpha0:_-s3:_*alpha:_+s3; -} -with{ - freq = 2*(10^(3*normFreq+1)); - K = 2.0*(Q - 0.707)/(10.0 - 0.707); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g/(1.0 + g); - alpha = G; - B3 = (K - K*G)/(1 + g); - B2 = -1/(1 + g); - alpha0 = 1/(1 - K*G + K*G*G); -}; - - -//------------------`(ve.)korg35HPF`----------------- -// Virtual analog models of the Korg 35 high-pass filter found in the MS-10 and -// MS-20 synthesizers. -// -// #### Usage -// -// ``` -// _ : korg35HPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare korg35HPF author "Eric Tarr"; -declare korg35HPF license "MIT-style STK-4.3 license"; -korg35HPF(normFreq,Q) = _ <: (s1,s2,s3,y) : !,!,!,_ -letrec{ - 's1 = _-s1:_*(alpha*2):_+s1; - 's2 = _<:(_-s1:_*alpha:_+s1)*-1,_:>_+(s3*B3):_+(s2*B2):_*alpha0:_*K:_-s2:_*alpha*2:_+s2; - 's3 = _<:(_-s1:_*alpha:_+s1)*-1,_:>_+(s3*B3):_+(s2*B2):_*alpha0:_*K:_<:(_-s2:_*alpha:_+s2)*-1,_:>_-s3:_*alpha*2:_+s3; - 'y = _<:(_-s1:_*alpha:_+s1)*-1,_:>_+(s3*B3):_+(s2*B2):_*alpha0; -} -with{ - freq = 2*(10^(3*normFreq+1)); - K = 2.0*(Q - 0.707)/(10.0 - 0.707); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g/(1.0 + g); - alpha = G; - B3 = 1.0/(1.0 + g); - B2 = -1.0*G/(1.0 + g); - alpha0 = 1/(1 - K*G + K*G*G); -}; - - -//==================================Oberheim Filters====================================== -// The following filter (4 types) is an implementation of the virtual analog -// model described in Section 7.2 of the Will Pirkle book, "Designing Software -// Synthesizer Plug-ins in C++". It is based on the block diagram in Figure 7.5. -// -// The Oberheim filter is a state-variable filter with soft-clipping distortion -// within the circuit. -// -// In many VA filters, distortion is accomplished using the "tanh" function. -// For this Faust implementation, that distortion function was replaced with -// the `(ef.)cubicnl` function. -//======================================================================================== - -//------------------`(ve.)oberheim`----------------- -// Generic multi-outputs Oberheim filter that produces the BSF, BPF, HPF and LPF outputs (see description above). -// -// #### Usage -// -// ``` -// _ : oberheim(normFreq,Q) : _,_,_,_ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare oberheim author "Eric Tarr"; -declare oberheim license "MIT-style STK-4.3 license"; -oberheim(normFreq,Q) = _<:(s1,s2,ybsf,ybpf,yhpf,ylpf) : !,!,_,_,_,_ -letrec{ - 's1 = _-s2:_-(s1*FBs1):_*alpha0:_*g<:_,(_+s1:ef.cubicnl(0.0,0)):>_; - 's2 = _-s2:_-(s1*FBs1):_*alpha0:_*g:_+s1:ef.cubicnl(0.0,0):_*g*2:_+s2; - // Compute the BSF, BPF, HPF, LPF outputs - 'ybsf = _-s2:_-(s1*FBs1):_*alpha0<:(_*g:_+s1:ef.cubicnl(0.0,0):_*g:_+s2),_:>_; - 'ybpf = _-s2:_-(s1*FBs1):_*alpha0:_*g:_+s1:ef.cubicnl(0.0,0); - 'yhpf = _-s2:_-(s1*FBs1):_*alpha0; - 'ylpf = _-s2:_-(s1*FBs1):_*alpha0:_*g :_+s1:ef.cubicnl(0.0,0):_*g:_+s2; -} -with{ - freq = 2*(10^(3*normFreq+1)); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g/(1.0 + g); - R = 1/(2*Q); - FBs1 = (2*R+g); - alpha0 = 1/(1 + 2*R*g + g*g); -}; - - -//------------------`(ve.)oberheimBSF`----------------- -// Band-Stop Oberheim filter (see description above). -// Specialize the generic implementation: keep the first BSF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : oberheimBSF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare oberheimBSF author "Eric Tarr"; -declare oberheimBSF license "MIT-style STK-4.3 license"; -oberheimBSF(normFreq,Q) = oberheim(normFreq,Q):_,!,!,!; - - -//------------------`(ve.)oberheimBPF`----------------- -// Band-Pass Oberheim filter (see description above). -// Specialize the generic implementation: keep the second BPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : oberheimBPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare oberheimBPF author "Eric Tarr"; -declare oberheimBPF license "MIT-style STK-4.3 license"; -oberheimBPF(normFreq,Q) = oberheim(normFreq,Q):!,_,!,!; - - -//------------------`(ve.)oberheimHPF`----------------- -// High-Pass Oberheim filter (see description above). -// Specialize the generic implementation: keep the third HPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : oberheimHPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare oberheimHPF author "Eric Tarr"; -declare oberheimHPF license "MIT-style STK-4.3 license"; -oberheimHPF(normFreq,Q) = oberheim(normFreq,Q):!,!,_,!; - - -//------------------`(ve.)oberheimLPF`----------------- -// Low-Pass Oberheim filter (see description above). -// Specialize the generic implementation: keep the fourth LPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : oberheimLPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare oberheimLPF author "Eric Tarr"; -declare oberheimLPF license "MIT-style STK-4.3 license"; -oberheimLPF(normFreq,Q) = oberheim(normFreq,Q):!,!,!,_; - - -//================================Sallen Key Filters====================================== -// The following filters were implemented based on VA models of synthesizer -// filters. -// -// The modeling approach is based on a Topology Preserving Transform (TPT) to -// resolve the delay-free feedback loop in the corresponding analog filters. -// -// The primary processing block used to build other filters (Moog, Korg, etc.) is -// based on a 1st-order Sallen-Key filter. -// -// The filters included in this script are 1st-order LPF/HPF and 2nd-order -// state-variable filters capable of LPF, HPF, and BPF. -// -// #### Resources: -// -// * Vadim Zavalishin (2018) "The Art of VA Filter Design", v2.1.0 -// -// * Will Pirkle (2014) "Resolving Delay-Free Loops in Recursive Filters Using -// the Modified Härmä Method", AES 137 -// * Description and diagrams of 1st- and 2nd-order TPT filters: -// -//======================================================================================== - -//------------------`(ve.)sallenKeyOnePole`----------------- -// Sallen-Key generic One Pole filter that produces the LPF and HPF outputs (see description above). -// -// For the Faust implementation of this filter, recursion (`letrec`) is used -// for storing filter "states". The output (e.g. `y`) is calculated by using -// the input signal and the previous states of the filter. -// During the current recursive step, the states of the filter (e.g. `s`) for -// the next step are also calculated. -// Admittedly, this is not an efficient way to implement a filter because it -// requires independently calculating the output and each state during each -// recursive step. However, it works as a way to store and use "states" -// within the constraints of Faust. - -// The simplest example is the 1st-order LPF (shown on the cover of Zavalishin -// 2018 and Fig 4.3 of ). Here, the input -// signal is split in parallel for the calculation of the output signal, `y`, and -// the state `s`. The value of the state is only used for feedback to the next -// step of recursion. It is blocked (!) from also being routed to the output. -// A trick used for calculating the state `s` is to observe that the input to -// the delay block is the sum of two signal: what appears to be a feedforward -// path and a feedback path. In reality, the signals being summed are identical -// (signal*2) plus the value of the current state. -// -// #### Usage -// -// ``` -// _ : sallenKeyOnePole(normFreq) : _,_ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -//--------------------------------------------------------------------- -declare sallenKeyOnePole author "Eric Tarr"; -declare sallenKeyOnePole license "MIT-style STK-4.3 license"; -sallenKeyOnePole(normFreq) = _<:(s,ylpf,-(ylpf)) : !,_,_ -letrec { - 's = -(s):*(2*G):+(s); - 'ylpf = -(s):*(G):+(s); -} -with{ - freq = 2*(10^(3*normFreq+1)); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g/(1.0 + g); -}; - - -//------------------`(ve.)sallenKeyOnePoleLPF`----------------- -// Sallen-Key One Pole lowpass filter (see description above). -// Specialize the generic implementation: keep the first LPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : sallenKeyOnePoleLPF(normFreq) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -//--------------------------------------------------------------------- -declare sallenKeyOnePoleLPF author "Eric Tarr"; -declare sallenKeyOnePoleLPF license "MIT-style STK-4.3 license"; -sallenKeyOnePoleLPF(normFreq) = sallenKeyOnePole(normFreq) : _,!; - - -//------------------`(ve.)sallenKeyOnePoleHPF`----------------- -// Sallen-Key One Pole Highpass filter (see description above). The dry input -// signal is routed in parallel to the output. The LPF'd signal is subtracted -// from the input so that the HPF remains. -// Specialize the generic implementation: keep the second HPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : sallenKeyOnePoleHPF(normFreq) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -//--------------------------------------------------------------------- -declare sallenKeyOnePoleHPF author "Eric Tarr"; -declare sallenKeyOnePoleHPF license "MIT-style STK-4.3 license"; -sallenKeyOnePoleHPF(normFreq) = sallenKeyOnePole(normFreq) : !,_; - - -//------------------`(ve.)sallenKey2ndOrder`----------------- -// Sallen-Key generic 2nd order filter that produces the LPF, BPF and HPF outputs. -// -// This is a 2nd-order Sallen-Key state-variable filter. The idea is that by -// "tapping" into different points in the circuit, different filters -// (LPF,BPF,HPF) can be achieved. See Figure 4.6 of -// -// -// This is also a good example of the next step for generalizing the Faust -// programming approach used for all these VA filters. In this case, there are -// three things to calculate each recursive step (`y`,`s1`,`s2`). For each thing, the -// circuit is only calculated up to that point. -// -// Comparing the LPF to BPF, the output signal (`y`) is calculated similarly. -// Except, the output of the BPF stops earlier in the circuit. Similarly, the -// states (`s1` and `s2`) only differ in that `s2` includes a couple more terms -// beyond what is used for `s1`. -// -// #### Usage -// -// ``` -// _ : sallenKey2ndOrder(normFreq,Q) : _,_,_ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare sallenKey2ndOrder author "Eric Tarr"; -declare sallenKey2ndOrder license "MIT-style STK-4.3 license"; -sallenKey2ndOrder(normFreq,Q) = _<:(s1,s2,ylpf,ybpf,yhpf) : !,!,_,_,_ -letrec{ - 's1 = -(s2):-(s1*FBs1):*(alpha0):*(g*2):+(s1); - 's2 = -(s2):-(s1*FBs1):*(alpha0):*(g):+(s1):*(g*2):+(s2); - // Compute the LPF, BPF, HPF outputs - 'ylpf = -(s2):-(s1*FBs1):*(alpha0):*(g*2):+(s1):*(g):+(s2); - 'ybpf = -(s2):-(s1*FBs1):*(alpha0):*(g):+(s1); - 'yhpf = -(s2):-(s1*FBs1):*(alpha0); -} -with{ - freq = 2*(10^(3*normFreq+1)); - wd = 2*ma.PI*freq; - T = 1/ma.SR; - wa = (2/T)*tan(wd*T/2); - g = wa*T/2; - G = g/(1.0 + g); - R = 1/(2*Q); - FBs1 = (2*R+g); - alpha0 = 1/(1 + 2*R*g + g*g); -}; - -//------------------`(ve.)sallenKey2ndOrderLPF`----------------- -// Sallen-Key 2nd order lowpass filter (see description above). -// Specialize the generic implementation: keep the first LPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : sallenKey2ndOrderLPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare sallenKey2ndOrderLPF author "Eric Tarr"; -declare sallenKey2ndOrderLPF license "MIT-style STK-4.3 license"; -sallenKey2ndOrderLPF(normFreq,Q) = sallenKey2ndOrder(normFreq,Q) : _,!,!; - - -//------------------`(ve.)sallenKey2ndOrderBPF`----------------- -// Sallen-Key 2nd order bandpass filter (see description above). -// Specialize the generic implementation: keep the second BPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : sallenKey2ndOrderBPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare sallenKey2ndOrderBPF author "Eric Tarr"; -declare sallenKey2ndOrderBPF license "MIT-style STK-4.3 license"; -sallenKey2ndOrderBPF(normFreq,Q) = sallenKey2ndOrder(normFreq,Q) : !,_,!; - - -//------------------`(ve.)sallenKey2ndOrderHPF`----------------- -// Sallen-Key 2nd order highpass filter (see description above). -// Specialize the generic implementation: keep the third HPF output, -// the compiler will only generate the needed code. -// -// #### Usage -// -// ``` -// _ : sallenKey2ndOrderHPF(normFreq,Q) : _ -// ``` -// -// Where: -// -// * `normFreq`: normalized frequency (0-1) -// * `Q`: q -//--------------------------------------------------------------------- -declare sallenKey2ndOrderHPF author "Eric Tarr"; -declare sallenKey2ndOrderHPF license "MIT-style STK-4.3 license"; -sallenKey2ndOrderHPF(normFreq,Q) = sallenKey2ndOrder(normFreq,Q) : !,!,_; - - -//=========================================Effects======================================== -//======================================================================================== - -//--------------------------`(ve.)wah4`------------------------------- -// Wah effect, 4th order. -// `wah4` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : wah4(fr) : _ -// ``` -// -// Where: -// -// * `fr`: resonance frequency in Hz -// -// #### Reference -// -// -//------------------------------------------------------------ -wah4(fr) = 4*moog_vcf((3.2/4),fr:si.smooth(0.999)); - -//------------------------`(ve.)autowah`----------------------------- -// Auto-wah effect. -// `autowah` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : autowah(level) : _ -// ``` -// -// Where: -// -// * `level`: amount of effect desired (0 to 1). -//------------------------------------------------------------ -autowah(level,x) = level * crybaby(an.amp_follower(0.1,x),x) + (1.0-level)*x; - -//--------------------------`(ve.)crybaby`----------------------------- -// Digitized CryBaby wah pedal. -// `crybaby` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : crybaby(wah) : _ -// ``` -// -// Where: -// -// * `wah`: "pedal angle" from 0 to 1 -// -// #### Reference -// -// -//------------------------------------------------------------ -crybaby(wah) = *(gs) : fi.tf2(1,-1,0,a1s,a2s) -with { - Q = pow(2.0,(2.0*(1.0-wah)+1.0)); // Resonance "quality factor" - fr = 450.0*pow(2.0,2.3*wah); // Resonance tuning - g = 0.1*pow(4.0,wah); // gain (optional) - - // Biquad fit using z = exp(s T) ~ 1 + sT for low frequencies: - frn = fr/ma.SR; // Normalized pole frequency (cycles per sample) - R = 1 - ma.PI*frn/Q; // pole radius - theta = 2*ma.PI*frn; // pole angle - a1 = 0-2.0*R*cos(theta); // biquad coeff - a2 = R*R; // biquad coeff - - // dezippering of slider-driven signals: - s = 0.999; // smoothing parameter (one-pole pole location) - a1s = a1 : si.smooth(s); - a2s = a2 : si.smooth(s); - gs = g : si.smooth(s); - - //tf2 = component("filters.lib").tf2; -}; - -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section - -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -//----------------------------`(ve.)vocoder`------------------------- -// A very simple vocoder where the spectrum of the modulation signal -// is analyzed using a filter bank. -// `vocoder` is a standard Faust function. -// -// #### Usage -// -// ``` -// _ : vocoder(nBands,att,rel,BWRatio,source,excitation) : _; -// ``` -// -// Where: -// -// * `nBands`: Number of vocoder bands -// * `att`: Attack time in seconds -// * `rel`: Release time in seconds -// * `BWRatio`: Coefficient to adjust the bandwidth of each band (0.1 - 2) -// * `source`: Modulation signal -// * `excitation`: Excitation/Carrier signal -//------------------------------------------------------------ -// TODO: author RM -oneVocoderBand(band,bandsNumb,bwRatio,bandGain,x) = x : fi.resonbp(bandFreq,bandQ,bandGain) with { - bandFreq = 25*pow(2,(band+1)*(9/bandsNumb)); - BW = (bandFreq - 25*pow(2,(band)*(9/bandsNumb)))*bwRatio; - bandQ = bandFreq/BW; -}; - -vocoder(nBands,att,rel,BWRatio,source,excitation) = source <: par(i,nBands,oneVocoderBand(i,nBands,BWRatio,1) : - an.amp_follower_ar(att,rel) : _,excitation : oneVocoderBand(i,nBands,BWRatio)) :> _ ; - -//######################################################################################## -/************************************************************************ -FAUST library file, further contributions section - -All contributions below should indicate both the contributor and terms -of license. If no such indication is found, "git blame" will say who -last edited each line, and that person can be emailed to inquire about -license disposition, if their license choice is not already indicated -elsewhere among the libraries. It is expected that all software will be -released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. -************************************************************************/ - -// end further further contributions section diff --git a/dist/examples/LIBRARIES/version.lib b/dist/examples/LIBRARIES/version.lib deleted file mode 100644 index 96c8eeeb..00000000 --- a/dist/examples/LIBRARIES/version.lib +++ /dev/null @@ -1,20 +0,0 @@ -//################################ version.lib ########################################## -// Semantic versioning for the Faust libraries. Its official prefix is `vl`. -//######################################################################################## - - -//---------------------------`(vl.)version`--------------------------- -// Return the version number of the Faust standard libraries. -// -// #### Usage -// -// ``` -// version : _,_,_ -// ``` -// -//------------------------------------------------------------ -version = 2, // MAJOR version when we make incompatible API changes, - 1, // MINOR version when we add functionality in a backwards compatible manner, - 0; // PATCH version when we make backwards compatible bug fixes. - - diff --git a/dist/examples/LIBRARIES/wdmodels.lib b/dist/examples/LIBRARIES/wdmodels.lib deleted file mode 100644 index d36ed593..00000000 --- a/dist/examples/LIBRARIES/wdmodels.lib +++ /dev/null @@ -1,2299 +0,0 @@ -//#################################### wdmodels.lib ############################################################################## -// A library of basic adaptors and methods to help construct Wave Digital Filter models in Faust. Its official prefix is `wd`. -//################################################################################################################################ - -// ## Library Readme - -// This library is intended for use for creating Wave Digital (WD) based models of audio circuitry for real-time audio processing within the Faust programming language. The goal is to provide a framework to create real-time virtual-analog audio effects and synthesizers using WD models without the use of C++. Furthermore, we seek to provide access to the technique of WD modeling to those without extensive knowledge of advanced digital signal processing techniques. Finally, we hope to provide a library which can integrate with all aspects of Faust, thus creating a platform for virtual circuit bending. - -// The library itself is written in Faust to maintain portability. - -// This library is heavily based on Kurt Werner's Dissertation, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters." I have tried to maintain consistent notation between the adaptors appearing within thesis and my adaptor code. The majority of the adaptors found in chapter 1 and chapter 3 are currently supported. - -// For inquires about use of this library in a commercial product, please contact dirk [dot] roosenburg [dot] 30 [at] gmail [dot] com - -// This documentation is taken directly from the readme of https://github.com/droosenb/faust-WD-library. Please refer to it for a more updated version. - -// Many of the more in depth comments within the library include jargon. I plan to create videos detailing the theory of WD models -// For now I recommend Kurt Werner's PhD, "Virtual analog modeling of Audio circuitry using Wave Digital Filters", found here: -// -// I have tried to maintain consistent syntax and notation to the thesis. -// This library currently includes the majority of the adaptors covered in chapter 1 and some from chapter 3. - - -// ## Using this Library - -// Use of this library expects some level of familiarity with WDF techniques, especially simplification and decomposition of electronic circuits into WDF connection trees. I plan to create video to cover both these techniques and use of the library. - -// ### Quick Start - -// to get a quick overview of the library, start with the `secondOrderFilters.dsp` code found in `examples`. Make sure that the `wdmodels.lib` is within the compile path. This can be achieved within the [online Faust IDE](https://faustide.grame.fr/) by simply downloading and dragging in `wdmodels.lib` in addition to the example code. - -// ### A Simple RC Filter Model - -// Creating a model using this library consists fo three steps. First, declare a set of components. Second, model the relationship between them using a tree. Finally, build the tree using the libraries build functions. - -// First, a set of components is declared using adaptors from the library. This list of components is created based on analysis of the circuit using WDF techniques, though generally each circuit element (resistor, capacitor, diode, etc.) can be expected to appear within the component set. For example, first order RC lowpass filter would require an unadapted voltage source, a 47k resistor, and a 10nF capacitor which outputs the voltage across itself. These can be declared with: - -// ``` -// vs1(i) = wd.u_voltage(i, no.noise); -// r1(i) = wd.resistor(i, 47*10^3); -// c1(i) = wd.capacitor_Vout(i, 10*10^-9); -// ``` - -// Note that the first argument, i, is left un-parametrized. Components must be declared in this form, as the build algorithm expects to receive adaptors which have exactly one parameter. - -// Also note that we have chosen to declare a white noise function as the input to our voltage source. We could potentially declare this as a direct input to our model, but to do so is more complicated process which cannot be covered within this tutorial. For information on how to do this see Declaring Model Parameters as Inputs or see various implementations in `examples`. - -// Second, the declared components and interconnection/structural adaptors (i.e. series, parallel, etc) are arranged into the connection tree which is produced from performing WD analysis on the modeled circuit. For example, to produce our first order RC lowpass circuit model, the following tree is declared: - -// `tree_lowpass = vs1(i) : WD.series : (r1, c1)` - -// For more information on how to represent trees in Faust, see Trees in Faust. - -// Finally, the tree is built using the the `buildtree` function. To build and compute our first order RC lowpass circuit model, we use - -// `process = buildtree(tree_lowpass);` - -// More information about build functions, see Build Functions. - -// ### Building a Model - -// After creating a connection tree which consists of WD adaptors, the connection tree must be passed to a build function in order to build the model. - -// ##### Automatic model building - -// `buildtree(connection_tree)` - -// The simplest build function for use with basic models. This automatically implements `buildup`, `builddown`, and `buildout` to create a working model. However, it gives minimum control to the user and cannot currently be used on trees which have parameters declared as inputs. - -// ##### Manual model building - -// Wave Digital Filters are an explicit state-space model, meaning they use a previous system state in order to calculate the current output. This is achieved in Faust by using a single global feedback operator. The models feed-forward terms are generated using `builddown` and the models feedback terms are generated using `buildup`. Thus, the most common model implementation (the method used by `buildtree`) is - -// `builddown(connection_tree)~buildup(connection_tree) : buildout(connection_tree)`. - -// Since the `~` operator in Faust will leave feedback terms hanging as outputs, `buildout` is a function provided for convenience. It automatically truncates the hanging outputs by identifying leaf components which have an intended output and generating an output matrix. - -// Building the model manually allows for greater user control and is often very helpful in testing. Also provided for testing are the `getres` and `parres` functions, which can be used to determine the upward-facing port resistance of an element. - -// ### Declaring Model Parameters as Inputs - -// When possible, parameters of components should be declared explicitly, meaning they are dependent on a function with no inputs. This might be something as simple as integer(declaring a static component), a function dependent on a UI input (declaring a component with variable value), or even a time-dependent function like an oscillator (declaring an audio input or circuit bending). - -// However, it is often necessary to declare parameters as input. To achieve this there are two possible methods. The first and recommended option is to create a separate model function and declare parameters which will later be implemented as inputs. This allows inputs to be explicitly declared as component parameters. For example, one might use - -// ``` -// model(in1) = buildtree(tree) -// with{ -// ... -// vin(i) = wd.u_voltage(i, in1); -// ... - -// tree = vin : ...; -// }; -// ``` - -// In order to simulate an audio input to the circuit. - -// Note that the tree and components must be declared inside a `with{...}` statement, or the model's parameters will not be accessible. - -// ##### The Empty Signal Operator - -// The Empty signal operator, `_` should NEVER be used to declare a parameter as in input in a wave-digital model. - -// Using it will result on breaking the internal routing of the model and thus breaks the model. Instead, use explicit declaration as shown directly above. - - - -// ### Trees in Faust - -// Since WD models use connection trees to represent relationships of elements, a comprehensive way to represent trees is critical. As there is no current convention for creating trees in Faust, I've developed a method using the existing series and parallel/list methods in Faust. - -// The series operator ` : ` is used to separate parent and child elements. For example the tree - -// ``` -// A -// | -// B -// ``` - -// is represented by - -// `A : B` - -// in Faust. - -// To denote a parent element with multiple child elements, simply use a list `(a1, a2, ... an)` of children connected to a single parent. For example the tree - -// ``` -// A -// / \ -// B C - -// ``` -// is represented by - -// `A : (B, C)` - -// Finally, for a tree with many levels, simply break the tree into subtrees following the above rules and connect the subtree as if it was an individual node. For example the tree - -// ``` -// A -// / \ -// B C -// / / \ -// X Y Z -// ``` - -// can be represented by - -// ``` -// B_sub = B : X; //B subtree -// C_sub = C : (Y, Z); //C subtree -// tree = A : (B_sub, C_sub); //full tree -// ``` - -// or more simply, using parentheses: - -// `A : ((B : X), (C : (Y, Z)))` - -// ### How Adaptors are Structured - -// In wave digital filters, adaptors can be described by the form - -// `b = Sa` - -// where `b` is a vector of output waves `b = (b0, b1, b2, ... bn)`, `a` is a vector of input waves`a = (a0, a1, a2, ... an)`, and `S` is an n x n scattering matrix. `S` is dependent on `R`, a list of port resistances `(R0, R1, R2, ... Rn)`. - -// The output wave vector `b` can be divided into downward-going and upward-going waves (downward-going waves travel down the connection tree, upward-going waves travel up). For adapted adaptors, with the zeroth port being the upward-facing port, the downward-going wave vector is `(b1, b2, ... bn)` and the upward-going wave vector is `(b0)`. For unadapted adaptors, there are no upward-going waves, so the downward-going wave vector is simply `b = (b0, b1, b2, ... bn)`. - -// In order for adaptors to be interpretable by the compiler, they must be structured in a specific way. -// Each adaptor is divided into three cases by their first parameter. This parameter, while accessible by the user, should only be set by the compiler/builder. - -// All other parameters are value declarations (for components), inputs (for voltage or current ins), or parameter controls (for potentiometers/variable capacitors/variable inductors) - -// ##### first case - downward going waves - -// `(0, params) => downward-going(R1, ... Rn, a0, a1, ... an)` -// outputs : `(b1, b2, ... bn)` - -// this function takes any number of port resistances, the downward going wave, and any number of upward going waves as inputs. - -// These values/waves are used to calculate the downward going waves coming from this adaptor - -// ##### second case - -// `(1, params) => upward-going(R1, ... Rn, a1, ... an)` -// outputs : `(b0)` - -// this function takes any number of port resistances and any number of upward going waves as inputs - -// these values/waves are used to calculate the upward going wave coming from this adaptor - -// ##### third case - -// `(2, params) => port-resistance(R1, ... Rn)` -// outputs: `(R0)` - -// this function takes any number of port resistances as inputs - -// these values are used to calculate the upward going port resistance of the element - - -// ##### Unadapted Adaptors - -// Unadapted adaptor's names will always begin "u_" -// An unadapted adaptor MUST be used as the root of the WD connection tree. -// Unadapted adaptors can ONLY be used as a root of the WD connection tree. -// While unadapted adaptors contain all three cases, the second and third are purely structural. -// Only the first case should contain computational information. - -// ### How the Build Functions Work - -// Expect this section to be added soon! It's currently in progress. - -// ### Acknowledgements - -// Many thanks to Kurt Werner for helping me to understand wave digital filter models. Without his publications and consultations, the library would not exist. -// Thanks also to my advisors, Rob Owen and Eli Stine whose input was critical to the development of the library. -// Finally, thanks to Romain Michon, Stephane Letz, and the Faust slack for contributing to testing, development, and inspiration when creating the library. - - - - -ba = library("basics.lib"); -ro = library("routes.lib"); -ma = library("maths.lib"); -si = library("signals.lib"); - -declare name "Faust Wave Digital Model Library"; -declare version "0.2.0"; - - - -//=============================Algebraic One Port Adaptors================================= -//========================================================================================= - -//----------------------`(wd.)resistor`-------------------------- -// Adapted Resistor -// -// A basic node implementing a resistor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// -// #### Usage -// -// ``` -// r1(i) = resistor(i, R); -// buildtree( A : r1 ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `R` : Resistance/Impedance of the resistor being modeled in Ohms. -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.1 -//---------------------------------------------------------- -declare resistor author "Dirk Roosenburg"; -declare resistor copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare resistor license "MIT-style STK-4.3 license"; -resistor = -case{ - (0, R) => !, 0; - (1, R) => _; - (2, R) => R0 - with{ - R0 = R; - }; -}; - - -//----------------------`(wd.)resistor_Vout`-------------------------- -// Adapted Resistor + voltage Out. -// -// A basic adaptor implementing a resistor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// The resistor will also pass the voltage across itself as an output of the model. -// -// #### Usage -// -// ``` -// rout(i) = resistor_Vout(i, R); -// buildtree( A : rout ) : _; -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `R` : Resistance/Impedance of the resistor being modeled in Ohms. -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.1 -//---------------------------------------------------------- -declare resistor_Vout author "Dirk Roosenburg"; -declare resistor_Vout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare resistor_Vout license "MIT-style STK-4.3 license"; -resistor_Vout = -case{ - (0, R) => 0, _*.5; - (1, R) => _, !; - (2, R) => R0 - with{ - R0 = R; - }; -}with{ - rho = 1; -}; - - -//----------------------`(wd.)resistor_Iout`-------------------------- -// Resistor + current Out. -// -// A basic adaptor implementing a resistor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// The resistor will also pass the current through itself as an output of the model. -// -// #### Usage -// -// ``` -// rout(i) = resistor_Iout(i, R); -// buildtree( A : rout ) : _; -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `R` : Resistance/Impedance of the resistor being modeled in Ohms. -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.1 -//---------------------------------------------------------- -declare resistor_Iout author "Dirk Roosenburg"; -declare resistor_Iout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare resistor_Iout license "MIT-style STK-4.3 license"; -resistor_Iout = -case{ - (0, R) => 0, _*.5/R; - (1, R) => _, !; - (2, R) => R0 - with{ - R0 = R; - }; -}; - - -//----------------------`(wd.)u_voltage`-------------------------- -// Unadapted Ideal Voltage Source -// -// An adaptor implementing an ideal voltage source within Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree. -// Can be used for either DC (constant) or AC (signal) voltage sources. -// -// #### Usage -// -// ``` -// v1(i) = u_Voltage(i, ein); -// buildtree( v1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `ein` : Voltage/Potential across ideal voltage source in Volts -// -// Note: -// Only usable as the root of a tree -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.2 -//---------------------------------------------------------- -declare u_voltage author "Dirk Roosenburg"; -declare u_voltage copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_voltage license "MIT-style STK-4.3 license"; -u_voltage = -case{ - (0 , ein) => b0 - with{ - b0(R0, a0) = 2*R0^(rho-1)*ein -a0; - }; - (1, ein) => !, !; - (2, ein) => 0; -}with{ - rho = 1; -}; - - -//----------------------`(wd.)u_current`-------------------------- -// Unadapted Ideal Current Source -// -// An unadapted adaptor implementing an ideal current source within Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree. -// Can be used for either DC (constant) or AC (signal) current sources. -// -// #### Usage -// -// ``` -// i1(i) = u_current(i, jin); -// buildtree( i1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `jin` : Current through the ideal current source in Amps -// -// Note: -// Only usable as the root of a tree. -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.3 -//---------------------------------------------------------- -declare u_current author "Dirk Roosenburg"; -declare u_current copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_current license "MIT-style STK-4.3 license"; -u_current = -case{ - (0 , jin) => b0 - with{ - b0(R0, a0) = 2*R0^(rho)*jin + a0; - }; - (1, jin) => !, !; - (2, jin) => 0; -}with{ - rho = 1; -}; - -//----------------------`(wd.)resVoltage`-------------------------- -// Adapted Resistive Voltage Source -// -// An adaptor implementing a resistive voltage source within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// It is comprised of an ideal voltage source in series with a resistor. -// Can be used for either DC (constant) or AC (signal) voltage sources. -// -// #### Usage -// -// ``` -// v1(i) = resVoltage(i, R, ein); -// buildtree( A : v1 ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `R` : Resistance/Impedance of the series resistor in Ohms -// * `ein` : Voltage/Potential of the ideal voltage source in Volts -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.4 -//---------------------------------------------------------- -declare resVoltage author "Dirk Roosenburg"; -declare resVoltage copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare resVoltage license "MIT-style STK-4.3 license"; -resVoltage = -case{ - (0, R, ein) => !, R^(1-rho)*ein; - (1, R, ein) => _; - (2, R, ein) => R0 - with { - R0 = R; - }; -}with{ - rho = 1; -}; - -//----------------------`(wd.)resVoltage_Vout`-------------------------- -// Adapted Resistive Voltage Source + voltage output. -// -// An adaptor implementing an adapted resistive voltage source within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// It is comprised of an ideal voltage source in series with a resistor. -// Can be used for either DC (constant) or AC (signal) voltage sources. -// The resistive voltage source will also pass the voltage across it as an output of the model. -// -// #### Usage -// -// ``` -// vout(i) = resVoltage_Vout(i, R, ein); -// buildtree( A : vout ) : _; -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `R` : Resistance/Impedance of the series resistor in Ohms -// * `ein` : Voltage/Potential across ideal voltage source in Volts -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.4 -//---------------------------------------------------------- -declare resVoltage_Vout author "Dirk Roosenburg"; -declare resVoltage_Vout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare resVoltage_Vout license "MIT-style STK-4.3 license"; -resVoltage_Vout = -case{ - (0, R, ein) => R^(1-rho)*ein, _*.5 + R^(1-rho)*ein*.5; - (1, R, ein) => _, !; - (2, R, ein) => R0 - with { - R0 = R; - }; -}with{ - rho = 1; -}; - -//----------------------`(wd.)u_resVoltage`-------------------------- -// Unadapted Resistive Voltage Source -// -// An unadapted adaptor implementing a resistive voltage source within Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree. -// It is comprised of an ideal voltage source in series with a resistor. -// Can be used for either DC (constant) or AC (signal) voltage sources. -// -// #### Usage -// -// ``` -// v1(i) = u_resVoltage(i, R, ein); -// buildtree( v1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `R` : Resistance/Impedance of the series resistor in Ohms -// * `ein` : Voltage/Potential across ideal voltage source in Volts -// -// Note: -// Only usable as the root of a tree. -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.4 -//---------------------------------------------------------- -declare u_resVoltage author "Dirk Roosenburg"; -declare u_resVoltage copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_resVoltage license "MIT-style STK-4.3 license"; -u_resVoltage = -case { - (0, R, ein) => b0 - with{ - b0(R0, a0) = a0*(R - R0)/(R+R0) + ein*(2*R0^rho)/(R + R0); - }; - (1, R, ein) => !, !; - (2, R, ein) => 0; - -}with{ - rho = 1; -}; - - -//----------------------`(wd.)resCurrent`-------------------------- -// Unadapted Resistive Current Source -// -// An adaptor implementing a resistive current source within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// It is comprised of an ideal current source in parallel with a resistor. -// Can be used for either DC (constant) or AC (signal) current sources. -// -// #### Usage -// -// ``` -// i1(i) = resCurrent(i, R, jin); -// buildtree( A : i1 ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `R` : Resistance/Impedance of the parallel resistor in Ohms -// * `jin` : Current through the ideal current source in Amps -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.5 -//---------------------------------------------------------- -declare resCurrent author "Dirk Roosenburg"; -declare resCurrent copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare resCurrent license "MIT-style STK-4.3 license"; -resCurrent = -case { - (0, R, jin) => !, 2*R^(rho)*jin; - (1, R, jin) => _; - (2, R, jin) => R0 - with { - R0 = R; - }; -}with{ - rho = 1; //assume voltage waves -}; - -//----------------------`(wd.)u_resCurrent`-------------------------- -// Unadapted Resistive Current Source -// -// An unadapted adaptor implementing a resistive current source within Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree -// It is comprised of an ideal current source in parallel with a resistor -// Can be used for either DC (constant) or AC (signal) current sources. -// -// #### Usage -// -// ``` -// i1(i) = u_resCurrent(i, R, jin); -// buildtree( i1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `R` : Resistance/Impedance of the series resistor in Ohms -// * `jin` : Current through the ideal current source in Amps -// -// Note: -// Only usable as the root of a tree. -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.5 -//---------------------------------------------------------- -declare u_resCurrent author "Dirk Roosenburg"; -declare u_resCurrent copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_resCurrent license "MIT-style STK-4.3 license"; -u_resCurrent = -case { - (0, R, jin) => b0 - with{ - b0(R0, a0) = a0*(R - R0)/(R + R0) + jin*(2*R*R0^rho)/(R + R0); - }; - (1, R, jin) => !, !; - (2, R, jin) => 0; - -}with{ - rho = 1; //assume voltage waves -}; - -//TODO -//add short circuit (1.2.6), add open circuit (1.2.7) - -//----------------------`(wd.)u_switch`-------------------------- -// Unadapted Ideal Switch -// -// An unadapted adaptor implementing an ideal switch for Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree -// -// #### Usage -// -// ``` -// s1(i) = u_resCurrent(i, lambda); -// buildtree( s1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `lambda` : switch state control. -1 for closed switch, 1 for open switch. -// -// Note: -// Only usable as the root of a tree -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.8 -//---------------------------------------------------------- -declare u_switch author "Dirk Roosenburg"; -declare u_switch copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_switch license "MIT-style STK-4.3 license"; -u_switch = -case { - (0, lambda) => b0 - with{ - b0(R0, a0) = a0*lambda; - }; - (1, lambda) => !, !; - (2, lambda) => 0; -}; - -//=============================Reactive One Port Adaptors================================= -//======================================================================================== -//TODO - add mobius transform and alpha transform digitizations - -//----------------------`(wd.)capacitor`-------------------------- -// Adapted Capacitor -// -// A basic adaptor implementing a capacitor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// This capacitor model was digitized using the bi-linear transform. -// -// #### Usage -// -// ``` -// c1(i) = capacitor(i, R); -// buildtree( A : c1 ) : _; -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared. -// * `R` : Capacitance/Impedance of the capacitor being modeled in Farads. -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.1 -//---------------------------------------------------------- -declare capacitor author "Dirk Roosenburg"; -declare capacitor copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare capacitor license "MIT-style STK-4.3 license"; -capacitor = -case{ - (0, R) => _*1; - (1, R) => _; - (2, R) => R0 - with { - R0 = t/(2*R); - }; -}with{ - t = 1/ma.SR; //sampling interval -}; - -//----------------------`(wd.)capacitor_Vout`-------------------------- -// Adapted Capacitor + voltage out -// -// A basic adaptor implementing a capacitor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// The capacitor will also pass the voltage across itself as an output of the model. -// This capacitor model was digitized using the bi-linear transform. -// -// #### Usage -// -// ``` -// cout(i) = capacitor_Vout(i, R); -// buildtree( A : cout ) : _; -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `R` : Capacitance/Impedence of the capacitor being modeled in Farads -// -// Note: -// The adaptor must be declared as a seperate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.1 -//---------------------------------------------------------- -declare capacitor_Vout author "Dirk Roosenburg"; -declare capacitor_Vout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare capacitor_Vout license "MIT-style STK-4.3 license"; -capacitor_Vout = -case{ - (0, R) => b0 - with{ - b0(a1) = a1*1, a1*.5 + (a1')*.5; - }; - (1, R) => _, !; - (2, R) => R0 - with { - R0 = t/(2*R); - }; -}with{ - t = 1/ma.SR; //sampling interval -}; - -//----------------------`(wd.)inductor`-------------------------- -// Unadapted Inductor -// -// A basic adaptor implementing an inductor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// This inductor model was digitized using the bi-linear transform. -// -// #### Usage -// -// ``` -// l1(i) = inductor(i, R); -// buildtree( A : l1 ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `R` : Inductance/Impedance of the inductor being modeled in Henries -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.2 -//---------------------------------------------------------- -declare inductor author "Dirk Roosenburg"; -declare inductor copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare inductor license "MIT-style STK-4.3 license"; -inductor = -case{ - (0, R) => _*(-1); - (1, R) => _; - (2, R) => R0 - with { - R0 = (2*R)/t; - }; -}with{ - t = 1/ma.SR; //sampling interval -}; - -//----------------------`(wd.)inductor_Vout`-------------------------- -// Unadapted Inductor + Voltage out -// -// A basic adaptor implementing an inductor for use within Wave Digital Filter connection trees. -// -// It should be used as a leaf/terminating element of the connection tree. -// The inductor will also pass the voltage across itself as an output of the model. -// This inductor model was digitized using the bi-linear transform. -// -// #### Usage -// -// ``` -// lout(i) = inductor_Vout(i, R); -// buildtree( A : lout ) : _; -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `R` : Inductance/Impedance of the inductor being modeled in Henries -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.2 -//---------------------------------------------------------- -declare inductor_Vout author "Dirk Roosenburg"; -declare inductor_Vout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare inductor_Vout license "MIT-style STK-4.3 license"; -inductor_Vout = -case{ - (0, R) => b0 - with{ - b0(a1) = a1*(-1), a1*.5 - (a1')*.5; - }; - (1, R) => _, !; - (2, R) => R0 - with { - R0 = (2*R)/t; - }; -}with{ - t = 1/ma.SR; //sampling interval -}; - -//===============================Nonlinear One Port Adaptors============================== -//======================================================================================== - -//----------------------`(wd.)u_idealDiode`-------------------------- -// Unadapted Ideal Diode -// -// An unadapted adaptor implementing an ideal diode for Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree. -// -// #### Usage -// -// ``` -// buildtree( u_idealDiode : B ); -// ``` -// -// Note: -// Only usable as the root of a tree -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 3.2.3 -//---------------------------------------------------------- -declare u_idealDiode author "Dirk Roosenburg"; -declare u_idealDiode copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_idealDiode license "MIT-style STK-4.3 license"; -u_idealDiode = -case{ - (0) => b1 - with{ - b1(R1, a0) = a0 : abs : *(-1); - }; - (1) => !, !; - (2) => 0; -}; - -//----------------------`(wd.)u_chua`-------------------------- -// Unadapted Chua Diode -// -// An adaptor implementing the chua diode / non-linear resistor within Wave Digital Filter connection trees. -// -// It should be used as the root/top element of the connection tree. -// -// #### Usage -// -// ``` -// chua1(i) = u_chua(i, G1, G2, V0); -// buildtree( chua1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `G1` : resistance parameter 1 of the chua diode -// * `G2` : resistance parameter 2 of the chua diode -// * `V0` : voltage parameter of the chua diode -// -// Note: -// Only usable as the root of a tree. -// The adaptor must be declared as a separate function before integration into the connection tree. -// Correct implementation is shown above. -// -// #### Reference -// -// Meerkotter and Scholz, "Digital Simulation of Nonlinear Circuits by Wave Digital Filter Principles" -//---------------------------------------------------------- -declare u_chua author "Dirk Roosenburg"; -declare u_chua copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_chua license "MIT-style STK-4.3 license"; -u_chua = -case{ - (0, G1, G2, V0) => b1 - with{ - b1(R1, a0) = g_1*a0 + 1/2*(g_2 - g_1)*(((a0 + a_0) : abs) - ((a0 - a_0): abs)) - with{ - g_1 = (1-G1*R1)/(1+G1*R1); - g_2 = (1-G2*R1)/(1+G2*R1); - a_0 = V0*(1+G2*R1); - }; - }; - (1, G1, G2, V0) => !, !; - (2, G1, G2, V0) => 0; -}; - - -//----------------------`(wd.)lambert`-------------------------- -// An implementation of the lambert function. -// It uses Halley's method of iteration to approximate the output. -// Included in the WD library for use in non-linear diode models. -// Adapted from K M Brigg's c++ lambert function approximation. -// -// #### Usage -// -// ``` -// lambert(n, itr) : _; -// ``` -// -// Where: -// * `n`: value at which the lambert function will be evaluated -// * `itr`: number of iterations before output -// -//---------------------------------------------------------- -declare lambert author "Dirk Roosenburg"; -declare lambert copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare lambert license "MIT-style STK-4.3 license"; -lambert(z, itr) = ba.if((z<(-em1+.0001)), less_approx, greater_approx) -with{ - less_approx = -1.0 - +2.331643981597124203363536062168*r - -1.812187885639363490240191647568*q - +1.936631114492359755363277457668*r*q - -2.353551201881614516821543561516*q2 - with{ - q = z+em1; - r = sqrt(q); - q2 = q*q; - }; - eps=4.0e-16; - em1=0.3678794411714423215955237701614608; - greater_approx = z : init : seq(i, itr, approx) - with{ - init(w) = ba.if((z<1), init1, init2) - with{ - init1 = -1.0+p*(1.0+p*(-0.333333333333333333333+p*0.152777777777777777777777)) - with{ - p = sqrt(2.0*(2.7182818284590452353602874713526625*z+1.0)); - }; - init2 = log(abs(z)); - }; - approx(w) = w-t - with{ - e = exp(w); - t = (w*e-z)/(e*p-.5*(p+1.0)*(w*e-z)/p); - p = w+1; - }; - }; -}; - - -//----------------------`(wd.)u_diodePair`-------------------------- -// Unadapted pair of diodes facing in opposite directions. -// -// An unadapted adaptor implementing two antiparallel diodes for Wave Digital Filter connection trees. -// The behavior is approximated using Schottkey's ideal diode law. -// -// #### Usage -// -// ``` -// d1(i) = u_diodePair(i, Is, Vt); -// buildtree( d1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `Is` : saturation current of the diodes -// * `Vt` : thermal resistances of the diodes -// -// Note: -// Only usable as the root of a tree. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner et al. "An Improved and Generalized Diode Clipper Model for Wave Digital Filters" -//---------------------------------------------------------- -declare u_diodePair author "Dirk Roosenburg"; -declare u_diodePair copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_diodePair license "MIT-style STK-4.3 license"; -u_diodePair = -case{ - (0, Is, Vt) => b1 - with{ - b1(R1, a1) = a1 + 2*R1*Is - 2*Vt*lambert((R1*Is/Vt*(a1+R1*Is))/Vt), 3) : exp; - }; - (1, Is, Vt) => !, !; - (2, Is, Vt) => 0; -}; - - -//----------------------`(wd.)u_diodeSingle`-------------------------- -// Unadapted single diode. -// -// An unadapted adaptor implementing a single diode for Wave Digital Filter connection trees. -// The behavior is approximated using Schottkey's ideal diode law. -// -// #### Usage -// -// ``` -// d1(i) = u_diodeSingle(i, Is, Vt); -// buildtree( d1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `Is` : saturation current of the diodes -// * `Vt` : thermal resistances of the diodes -// -// Note: -// Only usable as the root of a tree -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner et al. "An Improved and Generalized Diode Clipper Model for Wave Digital Filters" -//---------------------------------------------------------- -declare u_diodeSingle author "Dirk Roosenburg"; -declare u_diodeSingle copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_diodeSingle license "MIT-style STK-4.3 license"; -u_diodeSingle = -case{ - (0, Is, Vt) => b1 - with{ - b1(R1, a1) = ma.signum(a1)*( (a1 : abs) + 2*R1*Is - 2*Vt*(lambert((R1*Is/Vt*((((a1 : abs)+R1*Is)/Vt) : exp)),3) + lambert((-R1*Is/Vt*(((-1*(a1 : abs)+R1*Is)/Vt) : exp)),3))); - }; - (1, Is, Vt) => !, !; - (2, Is, Vt) => 0; -}; - -//----------------------`(wd.)u_diodeAntiparallel`-------------------------- -// Unadapted set of antiparallel diodes with M diodes facing forwards and N diodes facing backwards. -// -// An unadapted adaptor implementing antiparallel diodes for Wave Digital Filter connection trees. -// The behavior is approximated using Schottkey's ideal diode law. -// -// #### Usage -// -// ``` -// d1(i) = u_diodeAntiparallel(i, Is, Vt); -// buildtree( d1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `Is` : saturation current of the diodes -// * `Vt` : thermal resistances of the diodes -// -// Note: -// Only usable as the root of a tree -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner et al. "An Improved and Generalized Diode Clipper Model for Wave Digital Filters" -//---------------------------------------------------------- -declare u_diodeAntiparallel author "Dirk Roosenburg"; -declare u_diodeAntiparallel copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_diodeAntiparallel license "MIT-style STK-4.3 license"; -u_diodeAntiparallel = -case{ - (0, Is, Vt, M, N) => b1 - with{ - b1(R1, a1) = a1 - 2*lam*Vt*(mu0* lambert(((R1*Is)/(mu0*Vt) * exp((lam*a1)/(mu0*Vt))), 3) + - mu1* lambert(((-R1*Is)/(mu1*Vt) * exp((-lam*a1)/(mu1*Vt))), 3)) - with{ - lam = ma.signum(a1); - mu0 = ba.if((a1 < 0), N, M); - mu1 = ba.if((a1 > 0), M, N); - }; - }; - (1, Is, Vt, M, N) => !, !; - (2, Is, Vt, M, N) => 0; -}; - - -//=============================Two Port Adaptors========================================== -//======================================================================================== - - -//----------------------`(wd.)u_parallel2Port`-------------------------- -// Unadapted 2-port parallel connection -// -// An unadapted adaptor implementing a 2-port parallel connection between adaptors for Wave Digital Filter connection trees. -// Elements connected to this adaptor will behave as if connected in parallel in circuit. -// -// #### Usage -// -// ``` -// buildtree( u_parallel2Port : (A, B) ); -// ``` -// -// Note: -// Only usable as the root of a tree. -// This adaptor has no user-accessible parameters. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1 -//---------------------------------------------------------- -declare u_parallel2Port author "Dirk Roosenburg"; -declare u_parallel2Port copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_parallel2Port license "MIT-style STK-4.3 license"; -u_parallel2Port = -case{ - (0) => u_par - with{ - u_par = si.bus(4) <: b0, b1; - b0(R0, R1, a0, a1) = (-a0*(R0-R1) + a1*(2*R0^rho*R1^(1-rho)))/(R0+R1); - b1(R0, R1, a0, a1) = (a1*(R0-R1) + a0*(2*R0^(1-rho)*R1^rho))/(R0+R1); - }; - (1) => !, !, !, !; - (2) => 0; -}with{ - rho = 1; //assume voltage waves -}; - - -//----------------------`(wd.)parallel2Port`-------------------------- -// Adapted 2-port parallel connection -// -// An adaptor implementing a 2-port parallel connection between adaptors for Wave Digital Filter connection trees. -// Elements connected to this adaptor will behave as if connected in parallel in circuit. -// -// #### Usage -// -// ``` -// buildtree( A : parallel2Port : B ); -// ``` -// -// Note: -// This adaptor has no user-accessible parameters. -// It should be used within the connection tree with one previous and one forward adaptor. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1 -//---------------------------------------------------------- -declare parallel2Port author "Dirk Roosenburg"; -declare parallel2Port copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare parallel2Port license "MIT-style STK-4.3 license"; -parallel2Port = -case{ - (0) => par_down - with{ - par_down = b1; - b1(R1, a0, a1) = a0; - }; - (1) => par_up - with{ - par_up = b0; - b0(R1, a1) = a1; - }; - (2) => R0 - with{ - R0(R1) = R1; - }; -}; - -//----------------------`(wd.)u_series2Port`-------------------------- -// Unadapted 2-port series connection -// -// An unadapted adaptor implementing a 2-port series connection between adaptors for Wave Digital Filter connection trees. -// Elements connected to this adaptor will behave as if connected in series in circuit. -// -// #### Usage -// -// ``` -// buildtree( u_series2Port : (A, B) ); -// ``` -// -// Note: -// Only usable as the root of a tree. -// This adaptor has no user-accessible parameters. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1 -//---------------------------------------------------------- -declare u_series2Port author "Dirk Roosenburg"; -declare u_series2Port copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_series2Port license "MIT-style STK-4.3 license"; -u_series2Port = -case{ - (0) => u_ser - with{ - u_ser = si.bus(4) <: b0, b1; - b0(R0, R1, a0, a1) = (-a0*(R0-R1) - a1*(2*R0^rho*R1^(1-rho)))/(R0+R1); - b1(R0, R1, a0, a1) = (a1*(R0-R1) - a0*(2*R0^(1-rho)*R1^rho))/(R0+R1); - }; - (1) => !, !, !, !; - (2) => 0; -}with{ - rho = 1; //assume voltage waves -}; - - -//----------------------`(wd.)series2Port`-------------------------- -// Adapted 2-port series connection -// -// An adaptor implementing a 2-port series connection between adaptors for Wave Digital Filter connection trees. -// Elements connected to this adaptor will behave as if connected in series in circuit. -// -// #### Usage -// -// ``` -// buildtree( A : series2Port : B ); -// ``` -// -// Note: -// This adaptor has no user-accessible parameters. -// It should be used within the connection tree with one previous and one forward adaptor. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1 -//---------------------------------------------------------- -declare series2Port author "Dirk Roosenburg"; -declare series2Port copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare series2Port license "MIT-style STK-4.3 license"; -series2Port = -case{ - (0) => ser_down - with{ - ser_down = b1; - b1(R1, a0, a1) = -a0; - }; - (1) => ser_up - with{ - ser_up = b0; - b0(R1, a1) = -a1; - }; - (2) => R0 - with{ - R0(R1) = R1; - }; -}; - - -//----------------------`(wd.)parallelCurrent`-------------------------- -// Adapted 2-port parallel connection + ideal current source -// -// An adaptor implementing a 2-port series connection and internal idealized current source between adaptors for Wave Digital Filter connection trees. -// This adaptor connects the two connected elements and an additional ideal current source in parallel. -// -// #### Usage -// -// ``` -// i1(i) = parallelCurrent(i, jin); -// buildtree(A : i1 : B); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `jin` : Current through the ideal current source in Amps -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// It should be used within a connection tree with one previous and one forward adaptor. -// Correct implementation is shown above. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.2 -//---------------------------------------------------------- -declare parallelCurrent author "Dirk Roosenburg"; -declare parallelCurrent copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare parallelCurrent license "MIT-style STK-4.3 license"; -parallelCurrent = -case{ - (0, jin) => par_current_down - with{ - par_current_down = b1; - b1(R1, a0, a1) = a0 + R1^rho*jin; - }; - (1, jin) => par_current_up - with{ - par_current_up = b0; - b0(R1, a1) = a1 + R1^rho*jin; - }; - (2, jin) => R0 - with{ - R0(R1) = R1; - }; -}with{ - rho = 1; //assume voltage waves -}; - - -//----------------------`(wd.)seriesVoltage`-------------------------- -// Adapted 2-port series connection + ideal voltage source. -// -// An adaptor implementing a 2-port series connection and internal ideal voltage source between adaptors for Wave Digital Filter connection trees. -// This adaptor connects the two connected adaptors and an additional ideal voltage source in series. -// -// #### Usage -// -// ``` -// v1(i) = seriesVoltage(i, vin) -// buildtree( A : v1 : B ); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `vin` : voltage across the ideal current source in Volts -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// It should be used within the connection tree with one previous and one forward adaptor. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.2 -//---------------------------------------------------------- -declare seriesVoltage author "Dirk Roosenburg"; -declare seriesVoltage copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare seriesVoltage license "MIT-style STK-4.3 license"; -seriesVoltage = -case{ - (0, vin) => ser_down - with{ - ser_down = b1; - b1(R1, a0, a1) = -a0 - R1^(rho-1)*vin; - }; - (1, vin) => ser_up - with{ - ser_up = b0; - b0(R1, a1) = -a1 - R1^(rho-1)*vin; - }; - (2, vin) => R0 - with{ - R0(R1) = R1; - }; -}with{ - rho = 1; //assume voltage waves -}; - -//----------------------`(wd.)u_transformer`-------------------------- -// Unadapted ideal transformer -// -// An adaptor implementing an ideal transformer for Wave Digital Filter connection trees. -// The first downward-facing port corresponds to the primary winding connections, and the second downward-facing port to the secondary winding connections -// -// #### Usage -// -// ``` -// t1(i) = u_transformer(i, tr); -// buildtree(t1 : (A , B)); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `tr` : the turn ratio between the windings on the primary and secondary coils -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// It may only be used as the root of the connection tree with two forward nodes. -// -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3 -//---------------------------------------------------------- -declare u_transformer author "Dirk Roosenburg"; -declare u_transformer copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_transformer license "MIT-style STK-4.3 license"; -u_transformer(i, n) = u_genericNode(i, transformer_scatter) -with{ - matrix(M,N,f) = si.bus(N) <: ro.interleave(N,M) : par(n,N, par(m,M,*(f(m+1,n+1)))) :> si.bus(M); - - transformer_scatter(R0, R1) = matrix(2, 2, s) - with{ - s(1,1) =-1*(R0-n^2*R1)/(R0+n^2*R1); - s(1,2) = (2*n*R0^rho*R1^(1-rho))/(R0+n^2*R1); - s(2,1) = (2*n*R0^(1-rho)*R1^rho)/(R0+n^2*R1); - s(2,2) = (R0-n^2*R1)/(R0+n^2*R1); - s(i,j) = 10; - - rho = 1; //assume voltage waves - }; -}; - -//----------------------`(wd.)transformer`-------------------------- -// Adapted ideal transformer -// -// An adaptor implementing an ideal transformer for Wave Digital Filter connection trees. -// The upward-facing port corresponds to the primary winding connections, and the downward-facing port to the secondary winding connections -// -// #### Usage -// -// ``` -// t1(i) = transformer(i, tr); -// buildtree(A : t1 : B); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `tr` : the turn ratio between the windings on the primary and secondary coils -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// It should be used within the connection tree with one backward and one forward nodes. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3 -//---------------------------------------------------------- -declare transformer author "Dirk Roosenburg"; -declare transformer copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare transformer license "MIT-style STK-4.3 license"; -transformer(i, n) = genericNode(i, transformer_scatter, transformer_upPortRes) -with{ - matrix(M,N,f) = si.bus(N) <: ro.interleave(N,M) : par(n,N, par(m,M,*(f(m+1,n+1)))) :> si.bus(M); - - transformer_upPortRes(R1) = n^2*R1; //equation for upward-facing port resistance - - transformer_scatter(R1) = matrix(2, 2, s) - with{ - s(1,1) =-1*(R0-n^2*R1)/(R0+n^2*R1); - s(1,2) = (2*n*R0^rho*R1^(1-rho))/(R0+n^2*R1); - s(2,1) = (2*n*R0^(1-rho)*R1^rho)/(R0+n^2*R1); - s(2,2) = (R0-n^2*R1)/(R0+n^2*R1); - s(i,j) = 10; - - rho = 1; //assume voltage waves - - R0 = n^2*R1; //adapting condition - }; -}; - - -//----------------------`(wd.)u_transformerActive`-------------------------- -// Unadapted ideal active transformer -// -// An adaptor implementing an ideal transformer for Wave Digital Filter connection trees. -// The first downward-facing port corresponds to the primary winding connections, and the second downward-facing port to the secondary winding connections -// -// #### Usage -// -// ``` -// t1(i) = u_transformerActive(i, gamma1, gamma2); -// buildtree(t1 : (A , B)); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `gamma1` : the turn ratio describing the voltage relationship between the primary and secondary coils -// * `gamma2` : the turn ratio describing the current relationship between the primary and secondary coils -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// It may only be used as the root of the connection tree with two forward nodes. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3 -//---------------------------------------------------------- -declare u_transformerActive author "Dirk Roosenburg"; -declare u_transformerActive copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_transformerActive license "MIT-style STK-4.3 license"; -u_transformerActive(i, gamma1, gamma2) = u_genericNode(i, transformerActive_scatter) -with{ - matrix(M,N,f) = si.bus(N) <: ro.interleave(N,M) : par(n,N, par(m,M,*(f(m+1,n+1)))) :> si.bus(M); - - transformerActive_scatter(R0, R1) = matrix(2, 2, s) - with{ - s(1,1) =-1*(R0-gamma1*gamma2*R1)/(R0+gamma1*gamma2*R1); - s(1,2) = (2*gamma1*R0^rho*R1^(1-rho))/(R0+gamma1*gamma2*R1); - s(2,1) = ((2*gamma2*R0^(1-rho)*R1^rho/(R0+gamma1*gamma2*R1); - s(2,2) = (R0-gamma1*gamma2*R1)/(R0+gamma1*gamma2*R1); - s(i,j) = 10; - - rho = 1; //assume voltage waves - }; -}; - - -//----------------------`(wd.)transformerActive`-------------------------- -// Adapted ideal active transformer -// -// An adaptor implementing an ideal active transformer for Wave Digital Filter connection trees. -// The upward-facing port corresponds to the primary winding connections, and the downward-facing port to the secondary winding connections -// -// #### Usage -// -// ``` -// t1(i) = transformerActive(i, gamma1, gamma2); -// buildtree(A : t1 : B); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `gamma1` : the turn ratio describing the voltage relationship between the primary and secondary coils -// * `gamma2` : the turn ratio describing the current relationship between the primary and secondary coils -// -// Note: -// The adaptor must be declared as a separate function before integration into the connection tree. -// It should be used within the connection tree with two forward nodes. -// -// #### Reference -// -// K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3 -//---------------------------------------------------------- -declare transformerActive author "Dirk Roosenburg"; -declare transformerActive copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare transformerActive license "MIT-style STK-4.3 license"; -transformerActive(i, gamma1, gamma2) = genericNode(i, transformerActive_scatter, transformerActive_upPortRes) -with{ - matrix(M,N,f) = si.bus(N) <: ro.interleave(N,M) : par(n,N, par(m,M,*(f(m+1,n+1)))) :> si.bus(M); - - transformerActive_upPortRes(R1) = gamma1*gamma2*R1; //equation for upward-facing port resistance - - transformerActive_scatter(R1) = matrix(2, 2, s) - with{ - s(1,1) =-1*(R0-gamma1*gamma2*R1)/(R0+gamma1*gamma2*R1); - s(1,2) = (2*gamma1*R0^rho*R1^(1-rho))/(R0+gamma1*gamma2*R1); - s(2,1) = ((2*gamma2*R0^(1-rho)*R1^rho/(R0+gamma1*gamma2*R1); - s(2,2) = (R0-gamma1*gamma2*R1)/(R0+gamma1*gamma2*R1); - s(i,j) = 10; - - rho = 1; //assume voltage waves - - R0 = gamma1*gamma2*R1; //adapting condition - }; -}; - - -//===============================Three Port Adaptors====================================== -//======================================================================================== - - -//----------------------`(wd.)parallel`-------------------------- -// Adapted 3-port parallel connection -// -// An adaptor implementing a 3-port parallel connection between adaptors for Wave Digital Filter connection trees. -// This adaptor is used to connect adaptors simulating components connected in parallel in the circuit. -// -// #### Usage -// -// ``` -// buildtree( A : parallel : (B, C) ); -// ``` -// -// Note: -// This adaptor has no user-accessible parameters. -// It should be used within the connection tree with one previous and two forward adaptors. -// -// #### Reference -// -// K. Werner Dissertation, 1.5.1 -//---------------------------------------------------------- -declare parallel author "Dirk Roosenburg"; -declare parallel copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare parallel license "MIT-style STK-4.3 license"; -parallel= -case{ - (0) => par_down - with{ - par_down = si.bus(5) <: b1, b2; - b1(R1, R2, a0, a1, a2) = a0 + a1 * -R1/(R1 + R2) + a2 * R1/(R1 + R2); - b2(R1, R2, a0, a1, a2) = a0 + a1 * R2/(R1 + R2) + a2 * -R2/(R1 + R2); - }; - (1) => par_up - with{ - par_up = b0; - b0(R1, R2, a1, a2) = a1 * R2/(R1 + R2) + a2 * R1/(R1 + R2); - }; - (2) => R0 - with{ - R0(R1, R2) = 1/(1/R1+1/R2); - }; - -}; - - -//----------------------`(wd.)series`-------------------------- -// Adapted 3-port series connection -// -// An adaptor implementing a 3-port series connection between adaptors for Wave Digital Filter connection trees. -// This adaptor is used to connect adaptors simulating components connected in series in the circuit. -// -// #### Usage -// -// ``` -// -// tree = A : (series : (B, C)); -// ``` -// -// Note: -// This adaptor has no user-accessible parameters. -// It should be used within the connection tree with one previous and two forward adaptors. -// -// #### Reference -// -// K. Werner Dissertation, 1.5.2 -//---------------------------------------------------------- -declare series author "Dirk Roosenburg"; -declare series copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare series license "MIT-style STK-4.3 license"; -series= -case{ - - (0) => ser_down - with{ - ser_down = si.bus(5)<: b1, b2; - b1(R1, R2, a0, a1, a2) = a0 * -R1/(R1+R2) + a1 * R2/(R1+R2) + a2 *-R1/(R1+R2); - b2(R1, R2, a0, a1, a2) = a0 * -R2/(R1+R2) + a1 * -R2/(R1+R2) + a2 * R1/(R1+R2); - }; - (1) => ser_up - with{ - ser_up = b0; - b0(R1, R2, a1, a2) = -a1 - a2; - }; - (2) => R0 - with{ - R0(R1, R2) = R1 + R2; - }; -}; - -//====================================R-Type Adaptors===================================== -//======================================================================================== - - -//----------------------`(wd.)u_sixportPassive`-------------------------- -// Unadapted six-port rigid connection -// -// An adaptor implementing a six-port passive rigid connection between elements. -// It implements the simplest possible rigid connection found in the Fender Bassman Tonestack circuit -// -// -// #### Usage -// -// ``` -// -// tree = u_sixportPassive : (A, B, C, D, E, F)); -// ``` -// -// Note: -// This adaptor has no user-accessible parameters. -// It should be used within the connection tree with six forward adaptors. -// -// #### Reference -// -// K. Werner Dissertation, 2.1.5 -//---------------------------------------------------------- -declare u_sixportPassive author "Dirk Roosenburg"; -declare u_sixportPassive copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_sixportPassive license "MIT-style STK-4.3 license"; -u_sixportPassive(i) = genericNode(i, sixport_scatter) -with{ - sixport_scatter(Ra, Rb, Rc, Rd, Re, Rf) = matrix(6, 6, mtx) - with{ - mtx = - case{ - (1, 1) => ((-Ra)*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (1, 2) => (2*Ra*((Rc + Re)*Rf + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (1, 3) => (2*Ra*(Rb*Rd + Re*Rf + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (1, 4) => (-1)*((2*Ra*(Rb*(Rc + Re) + Rc*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (1, 5) => (2*Ra*(Rb*Rd - Rc*Rf))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (1, 6) => (-1)*((2*Ra*(Rc*Re + Rb*(Rc + Rd + Re)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (2, 1) => (2*Rb*((Rc + Re)*Rf + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (2, 2) => (Ra*(Rd*Re - Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) - Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (2, 3) => (-1)*((2*Rb*(Ra*Re + Re*Rf + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (2, 4) => (-2*Ra*Rb*Re + 2*Rb*Rc*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (2, 5) => (2*Rb*(Ra*(Rc + Rd) + Rc*(Rd + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (2, 6) => (-1)*((2*Rb*(Rc*Rd + Ra*(Rc + Rd + Re)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (3, 1) => (2*Rc*(Rb*Rd + Re*Rf + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (3, 2) => (-1)*((2*Rc*(Ra*Re + Re*Rf + Rd*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (3, 3) => 1 - (2*Rc*(Rd*Re + Rd*Rf + Re*Rf + Rb*(Rd + Rf) + Ra*(Rb + Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (3, 4) => (-1)*((2*Rc*(Rb*Rf + Ra*(Rb + Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (3, 5) => (-1)*((2*Rc*(Ra*(Rb + Rf) + Rb*(Rd + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (3, 6) => (2*Rc*(Rb*Rd - Ra*Re))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (4, 1) => (-1)*((2*Rd*(Rb*(Rc + Re) + Rc*(Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (4, 2) => (-2*Ra*Rd*Re + 2*Rc*Rd*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (4, 3) => (-1)*((2*Rd*(Rb*Rf + Ra*(Rb + Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (4, 4) => 1 - (2*Rd*(Rc*(Re + Rf) + Ra*(Rb + Re + Rf) + Rb*(Rc + Re + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (4, 5) => (-1)*((2*Rd*((Rb + Rc)*Rf + Ra*(Rb + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (4, 6) => (-1)*((2*Rd*((Ra + Rc)*Re + Rb*(Rc + Re)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (5, 1) => (2*Re*(Rb*Rd - Rc*Rf))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (5, 2) => (2*Re*(Ra*(Rc + Rd) + Rc*(Rd + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (5, 3) => (-1)*((2*Re*(Ra*(Rb + Rf) + Rb*(Rd + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (5, 4) => (-1)*((2*Re*((Rb + Rc)*Rf + Ra*(Rb + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (5, 5) => 1 - (2*Re*((Rb + Rc)*(Rd + Rf) + Ra*(Rb + Rc + Rd + Rf)))/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (5, 6) => (2*((Rb + Rc)*Rd + Ra*(Rc + Rd))*Re)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (6, 1) => (-1)*((2*(Rc*Re + Rb*(Rc + Rd + Re))*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (6, 2) => (-1)*((2*(Rc*Rd + Ra*(Rc + Rd + Re))*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (6, 3) => (2*(Rb*Rd - Ra*Re)*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (6, 4) => (-1)*((2*((Ra + Rc)*Re + Rb*(Rc + Re))*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf)))); - (6, 5) => (2*((Rb + Rc)*Rd + Ra*(Rc + Rd))*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (6, 6) => 1 - (2*(Rc*(Rd + Re) + Ra*(Rc + Rd + Re) + Rb*(Rc + Rd + Re))*Rf)/(Ra*(Rd*Re + Rb*(Rc + Rd + Re) + Rd*Rf + Re*Rf + Rc*(Re + Rf)) + Rc*(Re*Rf + Rd*(Re + Rf)) + Rb*(Re*Rf + Rc*(Rd + Rf) + Rd*(Re + Rf))); - (i, j) => 10; - }; - matrix(M,N,f) = si.bus(N) <: ro.interleave(N,M) : par(n,N, par(m,M,*(f(m+1,n+1)))) :> si.bus(M); - }; -}; - -//===============================Node Creating Functions================================== -//======================================================================================== - -//----------------------`(wd.)genericNode`-------------------------- -// Function for generating an adapted node from another faust function or scattering matrix -// -// This function generates a node which is suitable for use in the connection tree structure. -// genericNode separates the function that it is passed into upward-going and downward-going waves. -// -// #### Usage -// -// ``` -// n1(i) = genericNode(i, scatter, upRes); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `scatter` : the function which describes the the node's scattering behavior -// * `upRes` : the function which describes the node's upward-facing port-resistance -// -// Note: -// `scatter` must be a function with n inputs, n outputs, and n-1 parameter inputs. -// input/output 1 will be used as the adapted upward-facing port of the node, ports 2 to n will all be downward-facing. -// the first input/output pair is assumed to already be adapted - i.e. the output 1 is not dependent on input 1. -// the parameter inputs will receive the port resistances of the downward-facing ports. -// -// `upRes` must be a function with n-1 parameter inputs and 1 output. -// the parameter inputs will receive the port resistances of the downward-facing ports. -// the output should give the upward-facing port resistance of the node based on the upward-facing port resistances of the -// -// If used on a leaf element (n=1), the model will automatically introduce a one-sample delay. -// Thus, the output of the node at sample t based on the input, a[t], should be the output one sample ahead, b[t+1]. -// This may require transformation of the output signal. -// -//---------------------------------------------------------- -declare genericNode author "Dirk Roosenburg"; -declare genericNode copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare genericNode license "MIT-style STK-4.3 license"; -genericNode = -case{ - (0, scatter, upRes) => down(inputs(scatter)) - with{ - down(1) = scatter; //leaf node case - down(n) = scatter : !, bus(outputs(scatter)-1); //internal node case - }; - (1, scatter, upRes) => up(inputs(scatter)) - with{ - up(1) = _; //leaf node case - up(n) = bus(inputs(upRes)), 0 , bus(outputs(scatter)-1) : scatter : _, block(outputs(scatter)-1); //internal node case - }; - (2, scatter, upRes) => upRes; -} -with{ - bus(0) = 0:!; - bus(x) = si.bus(x); - block(0) = 0:!; - block(x) = si.block(x); -}; - - -//----------------------`(wd.)genericNode_Vout`-------------------------- -// Function for generating a terminating/leaf node which gives the voltage across itself as a model output -// -// This function generates a node which is suitable for use in the connection tree structure. -// It also calculates the voltage across the element and gives it as a model output -// -// #### Usage -// -// ``` -// n1(i) = genericNode_Vout(i, scatter, upRes); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `scatter` : the function which describes the the node's scattering behavior -// * `upRes` : the function which describes the node's upward-facing port-resistance -// -// Note: -// `scatter` must be a function with 1 input and 1 output. -// it should give the output from the node based on the incident wave. -// -// The model will automatically introduce a one-sample delay to the output of the function -// Thus, the output of the node at sample t based on the input, a[t], should be the output one sample ahead, b[t+1]. -// This may require transformation of the output signal. -// -// `upRes` must be a function with no inputs and 1 output. -// the output should give the upward-facing port resistance of the node -// -//---------------------------------------------------------- -declare genericNode_Vout author "Dirk Roosenburg"; -declare genericNode_Vout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare genericNode_Vout license "MIT-style STK-4.3 license"; -genericNode_Vout = -case{ - (0, scatter, upRes) => _ <: b, voltage - with{ - b(a) = a : scatter; - voltage(a) = 1/2*(a + b(a)'); - }; - (1, scatter, upRes) => _, !; - (2, scatter, upRes) => upRes; -}; - -//----------------------`(wd.)genericNode_Iout`-------------------------- -// Function for generating a terminating/leaf node which gives the current through itself as a model output -// -// This function generates a node which is suitable for use in the connection tree structure. -// It also calculates the current through the element and gives it as a model output -// -// #### Usage -// -// ``` -// n1(i) = genericNode_Iout(i, scatter, upRes); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `scatter` : the function which describes the the node's scattering behavior -// * `upRes` : the function which describes the node's upward-facing port-resistance -// -// Note: -// `scatter` must be a function with 1 input and 1 output. -// it should give the output from the node based on the incident wave. -// -// The model will automatically introduce a one-sample delay to the output of the function -// Thus, the output of the node at sample t based on the input, a[t], should be the output one sample ahead, b[t+1]. -// This may require transformation of the output signal. -// -// `upRes` must be a function with no inputs and 1 output. -// the output should give the upward-facing port resistance of the node -// -//---------------------------------------------------------- -declare genericNode_Iout author "Dirk Roosenburg"; -declare genericNode_Iout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare genericNode_Iout license "MIT-style STK-4.3 license"; -genericNode_Iout = -case{ - (0, scatter, upRes) => _ <: b, current - with{ - b(a) = a : scatter; - current(a) = 1/2/upRes*(a - b(a)'); - }; - (1, scatter, upRes) => _, !; - (2, scatter, upRes) => upRes; -}; - - -//----------------------`(wd.)u_genericNode`-------------------------- -// Function for generating an unadapted node from another Faust function or scattering matrix -// -// This function generates a node which is suitable for use as the root of the connection tree structure. -// -// #### Usage -// -// ``` -// n1(i) = u_genericNode(i, scatter); -// ``` -// -// Where: -// -// * `i`: index used by model-building functions. Should never be user declared -// * `scatter` : the function which describes the the node's scattering behavior -// -// Note: -// `scatter` must be a function with n inputs, n outputs, and n parameter inputs. -// each input/output pair will be used as a downward-facing port of the node -// the parameter inputs will receive the port resistances of the downward-facing ports. -// -//---------------------------------------------------------- -declare u_genericNode author "Dirk Roosenburg"; -declare u_genericNode copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare u_genericNode license "MIT-style STK-4.3 license"; -u_genericNode = -case{ - (0, scatter) => scatter; - (1, scatter) => block(inputs(scatter)); - (2, scatter) => 1234; -} -with{ - block(0) = 0:!; - block(x) = si.block(x); -}; - - -//===============================Model Building Functions================================= -//======================================================================================== - - -//----------------------`(wd.)builddown`-------------------------- -// Function for building the structure for calculating waves traveling down the WD connection tree. -// -// It recursively steps through the given tree, parametrizes the adaptors, and builds an algorithm. -// It is used in conjunction with the buildup() function to create a model. -// -// #### Usage -// -// ``` -// builddown(A : B)~buildup(A : B); -// ``` -// -// Where: -// * `(A : B)` : is a connection tree composed of WD adaptors -//---------------------------------------------------------- -declare builddown author "Dirk Roosenburg"; -declare builddown copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare builddown license "MIT-style STK-4.3 license"; -builddown(A : As) = ((upPortRes, addins(inputs(A(0)) - outputs(upPortRes))) : A(0)) , addins(inputs(pardown(As)) - outputs(A(0))) : route(mtxsum(s_mtx(As)), mtxsum(s_mtx(As)), gencross(0, 0, 0, 0, 0, s_mtx(As))) : pardown(As) -with{ - - //substitute for si.bus which can accept an argument of 0 - addins = - case{ - (0) => 0 : !; - (x) => si.bus(x); - }; - - //recursively build in parallel - pardown = - case{ - ((Ax, Axx)) => builddown(Ax), pardown(Axx); - (Ax) => builddown(Ax); - }; - - //generate a list of inputs from the next stage down the tree - s_mtx = - case{ - ((Ax, Axx)) => inputs(builddown(Ax)), s_mtx(Axx); - (Ax) => inputs(builddown(Ax)); - }; - - //take the sum of the list - mtxsum(t_mtx) = sum(i, ba.count(t_mtx), ba.take(i+1, t_mtx)); - - upPortRes = parres(As); - - //generate a crossover matrix for the route object based on a list of i/o dimensions - gencross = - case{ - (0, 0, 0, 0, 0, (1, 1)) => 1, 1, 2, 2; - (0, 0, 0, 0, 0, (xs, xxs)) => (1, 1), gencross(2, xs+1, ba.count((xs, xxs))-1, 2, mtxsum((xs, xxs)), xxs); - - (0, 0, 0, 0, 0, 0) => 0 : !; - (0, 0, 0, 0, 0, x) => par(i, x, i+1, i+1); - - //((out, next, norm_index, spec_index, sum), (xs, xxs)) - - (msum, msum, count, fcount, msum, xs) => (fcount, msum); //output is a special output - (msum, next, count, fcount, msum, xs) => (msum, msum-count); //escape case, reached end of bus - - (out, out, count, fcount, msum, (xs, xxs)) => (fcount, out), gencross(out+1, xs+out, count-1, fcount+1, msum, xxs); - (out, out, count, fcount, msum, xs) => (fcount, out), gencross(out+1, xs+out, count-1, fcount+1, msum, 0); //output is a special output - - (out, next, count, fcount, msum, xs) => ((count+out), out), gencross(out+1, next, count, fcount, msum, xs); //output is not a special output - }; -}; - -builddown(A) = A(0); - - -//----------------------`(wd.)buildup`-------------------------- -// Function for building the structure for calculating waves traveling up the WD connection tree. -// -// It recursively steps through the given tree, parametrizes the adaptors, and builds an algorithm. -// It is used in conjunction with the builddown() function to create a full structure. -// -// #### Usage -// -// ``` -// builddown(A : B)~buildup(A : B); -// ``` -// -// Where: -// * `(A : B)` : is a connection tree composed of WD adaptors -//---------------------------------------------------------- -declare builddown author "Dirk Roosenburg"; -declare builddown copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare builddown license "MIT-style STK-4.3 license"; -buildup(A : As) = upPortRes, (parup(As) : route(mtxsum(s_mtx(As)), mtxsum(s_mtx(As)), gencross_up(0, 0, 0, 0, 0, s_mtx(As))) : split(s_mtx(As))) : A(1), addins(outputs(split(s_mtx(As))) + outputs(upPortRes) - inputs(A(1))) -with{ - - //substitute for si.bus which can accept an argument of 0 - addins = - case{ - (0) => 0 : !; - (x) => si.bus(x); - }; - - //recursively build in parallel - parup = //<: crossover(out_list(Ap)) : split(out_list(Ap)) - case{ - ((Ax, Axx)) => buildup(Ax), parup(Axx); - (Ax) => buildup(Ax); - }; - - //generate a list of outputs from the next stage down the tree - s_mtx = - case{ - ((Ax, Axx)) => outputs(buildup(Ax)), s_mtx(Axx); - (Ax) => outputs(buildup(Ax)); - }; - - //take the sum of a list - mtxsum(t_mtx) = sum(i, ba.count(t_mtx), ba.take(i+1, t_mtx)); - - //split based on a list of i/o dimensions - split(inl) = (si.bus(n) <: si.bus(n), si.bus(n)), (addins(s-n)) - with{ - n = ba.count(inl); - s = inl :> _; - }; - - //generate a crossover matrix based for the route object based on a list of i/o dimensions - gencross_up = - case{ - //corner case which must be coded manually - (0, 0, 0, 0, 0, (1, 1)) => 1, 1, 2, 2; - //user access function - (0, 0, 0, 0, 0, (xs, xxs)) => (1, 1), gencross_up(2, xs+1, ba.count((xs, xxs))-1, 2, mtxsum((xs, xxs)), xxs); - - //more corner cases - (0, 0, 0, 0, 0, 0) => 0: !; - (0, 0, 0, 0, 0, x) => par(i, x, i+1, i+1); - - //((out, next, norm_index, spec_index, sum), (xs, xxs)) - - (msum, msum, count, fcount, msum, xs) => (msum, fcount); //output is a special output - (msum, next, count, fcount, msum, xs) => (msum-count, msum); //escape case, reached end of bus - - (out, out, count, fcount, msum, (xs, xxs)) => (out, fcount), gencross_up(out+1, xs+out, count-1, fcount+1, msum, xxs); - (out, out, count, fcount, msum, xs) => (out, fcount), gencross_up(out+1, xs+out, count-1, fcount+1, msum, 0); //output is a special output - - (out, next, count, fcount, msum, xs) => (out, (count+out)), gencross_up(out+1, next, count, fcount, msum, xs); //output is not a special output - }; - - upPortRes = parres(As); -}; - -buildup(A) = A(1); - -//----------------------`(wd.)getres`-------------------------- -// Function for determining the upward-facing port resistance of a partial WD connection tree. -// -// It recursively steps through the given tree, parametrizes the adaptors, and builds and algorithm. -// It is used by the buildup and builddown functions but is also helpful in testing. -// -// #### Usage -// -// ``` -// getres(A : B)~getres(A : B); -// ``` -// -// Where: -// * `(A : B)` : is a partial connection tree composed of WD adaptors -// -// Note: -// This function cannot be used on a complete WD tree. When called on an unadapted adaptor (u_ prefix), it will create errors -//---------------------------------------------------------- -declare getres author "Dirk Roosenburg"; -declare getres copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare getres license "MIT-style STK-4.3 license"; -getres(A: As) = parres(As) : A(2); -getres(A) = A(2); - - -//----------------------`(wd.)parres`-------------------------- -// Function for determining the upward-facing port resistance of a partial WD connection tree. -// -// It recursively steps through the given tree, parametrizes the adaptors, and builds and algorithm. -// It is used by the buildup and builddown functions but is also helpful in testing. -// This function is a parallelized version of getres. -// -// #### Usage -// -// ``` -// parres((A , B))~parres((A , B)); -// ``` -// -// Where: -// * `(A , B)` : is a partial connection tree composed of WD adaptors -// -// Note: -// This function cannot be used on a complete WD tree. When called on an unadapted adaptor (u_ prefix), it will create errors -//---------------------------------------------------------- -declare parres author "Dirk Roosenburg"; -declare parres copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare parres license "MIT-style STK-4.3 license"; -parres((Ap1, Ap2)) = getres(Ap1) , parres(Ap2); -parres(Ap) = getres(Ap); - - -//----------------------`(wd.)buildout`-------------------------- -// Function for creating the output matrix for a WD model from a WD connection tree. -// -// It recursively steps through the given tree and creates an output matrix passing only outputs. -// -// #### Usage -// -// ``` -// buildout( A : B ); -// ``` -// -// Where: -// * `(A : B)` : is a connection tree composed of WD adaptors -// -//---------------------------------------------------------- -declare buildout author "Dirk Roosenburg"; -declare buildout copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare buildout license "MIT-style STK-4.3 license"; -buildout(A: As) = parout(As) -with{ - parout((A, Ap)) = buildout(A), parout(Ap); - parout(A) = buildout(A); -}; -buildout(A) = outmtx(outputs(A(0))) -with{ - outmtx(1) = !; - outmtx(2) = !, _; -}; - - -//----------------------`(wd.)buildtree`-------------------------- -// Function for building the DSP model from a WD connection tree structure. -// -// It recursively steps through the given tree, parametrizes the adaptors, and builds the algorithm. -// -// #### Usage -// -// ``` -// buildtree(A : B); -// ``` -// -// Where: -// * `(A : B)` : a connection tree composed of WD adaptors -//---------------------------------------------------------- -declare buildtree author "Dirk Roosenburg"; -declare buildtree copyright "Copyright (C) 2020 by Dirk Roosenburg "; -declare buildtree license "MIT-style STK-4.3 license"; -buildtree((A : B)) = builddown(A : B)~buildup(A : B) : buildout(A : B); - - - -/******************************************************************************* -# Licenses - -## STK 4.3 License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -Any person wishing to distribute modifications to the Software is asked to send -the modifications to the original developer so that they can be incorporated -into the canonical version. For software copyrighted by Dirk Roosenburg, -email your modifications to . This is, however, not a -binding provision of this license. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- - -## LGPL License - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU Lesser General Public License as published by the Free -Software Foundation; either version 2.1 of the License, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with the GNU C Library; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -*******************************************************************************/ \ No newline at end of file diff --git a/dist/examples/LIBRARIES/webaudio.lib b/dist/examples/LIBRARIES/webaudio.lib deleted file mode 100644 index 8f37f864..00000000 --- a/dist/examples/LIBRARIES/webaudio.lib +++ /dev/null @@ -1,399 +0,0 @@ -//#################################### webaudio.lib ######################################## -//An implementation of the WebAudio API filters (https://www.w3.org/TR/webaudio/). Its official prefix is `wa`. -// -// This library implement WebAudio filters, using their C++ version as a starting point, -// taken from Mozilla Firefox implementation. -//######################################################################################## - -/************************************************************************ -************************************************************************ -FAUST library file -Copyright (C) 2019-2020 GRAME, Centre National de Creation Musicale ---------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -declare name "WebAudio Filters Library"; -declare author "GRAME"; -declare copyright "GRAME"; -declare version "0.1"; -declare license "LGPL with exception"; - -ma = library("maths.lib"); -fi = library("filters.lib"); - -//--------------------------------------------------- -// biquad coeffs for various filters -// usage : BiquadFilter(f0, dBgain, Q, aDetune).xxx -//--------------------------------------------------- - -BiquadFilter(f0, dBgain, Q, aDetune) = environment -{ - lowpass2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - g = pow(10.0, -0.05 * Q); - w0 = ma.PI * cutoff; - cos_w0 = cos(w0); - alpha = 0.5 * sin(w0) * g; - - b1 = 1.0 - cos_w0; - b0 = 0.5 * b1; - b2 = b0; - a0 = 1.0 + alpha; - a1 = -2.0 * cos_w0; - a2 = 1.0 - alpha; - }; - - highpass2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - g = pow(10.0, -0.05 * Q); - w0 = ma.PI * cutoff; - cos_w0 = cos(w0); - alpha = 0.5 * sin(w0) * g; - - b1 = -1.0 - cos_w0; - b0 = -0.5 * b1; - b2 = b0; - a0 = 1.0 + alpha; - a1 = -2.0 * cos_w0; - a2 = 1.0 - alpha; - }; - - bandpass2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - // Don't let Q go negative, which causes an unstable filter. - Qaux = max(0.01, Q); - - w0 = ma.PI * cutoff; - alpha = sin(w0) / (2 * Qaux); - k = cos(w0); - - b0 = alpha; - b1 = 0; - b2 = -alpha; - a0 = 1 + alpha; - a1 = -2 * k; - a2 = 1 - alpha; - }; - - notch2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - // Don't let Q go negative, which causes an unstable filter. - Qaux = max(0.01, Q); - - w0 = ma.PI * cutoff; - alpha = sin(w0) / (2 * Qaux); - k = cos(w0); - - b0 = 1; - b1 = -2 * k; - b2 = 1; - a0 = 1 + alpha; - a1 = -2 * k; - a2 = 1 - alpha; - }; - - allpass2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - // Don't let Q go negative, which causes an unstable filter. - Qaux = max(0.01, Q); - - w0 = ma.PI * cutoff; - alpha = sin(w0) / (2 * Qaux); - k = cos(w0); - - b0 = 1 - alpha; - b1 = -2 * k; - b2 = 1 + alpha; - a0 = 1 + alpha; - a1 = -2 * k; - a2 = 1 - alpha; - }; - - peaking2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - // Don't let Q go negative, which causes an unstable filter. - Qaux = max(0.01, Q); - - A = pow(10.0, dBgain / 40); - w0 = ma.PI * cutoff; - alpha = sin(w0) / (2 * Qaux); - k = cos(w0); - - b0 = 1 + alpha * A; - b1 = -2 * k; - b2 = 1 - alpha * A; - a0 = 1 + alpha / A; - a1 = -2 * k; - a2 = 1 - alpha / A; - }; - - lowshelf2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - A = pow(10.0, dBgain / 40); - - w0 = ma.PI * cutoff; - S = 1; // filter slope (1 is max value) - alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2); - k = cos(w0); - k2 = 2 * sqrt(A) * alpha; - aPlusOne = A + 1; - aMinusOne = A - 1; - - b0 = A * (aPlusOne - aMinusOne * k + k2); - b1 = 2 * A * (aMinusOne - aPlusOne * k); - b2 = A * (aPlusOne - aMinusOne * k - k2); - a0 = aPlusOne + aMinusOne * k + k2; - a1 = -2 * (aMinusOne + aPlusOne * k); - a2 = aPlusOne + aMinusOne * k - k2; - }; - - highshelf2 = setNormCoeffs(b0, b1, b2, a0, a1, a2) - with { - A = pow(10.0, dBgain / 40); - - w0 = ma.PI * cutoff; - S = 1; // filter slope (1 is max value) - alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2); - k = cos(w0); - k2 = 2 * sqrt(A) * alpha; - aPlusOne = A + 1; - aMinusOne = A - 1; - - b0 = A * (aPlusOne - aMinusOne * k + k2); - b1 = 2 * A * (aMinusOne - aPlusOne * k); - b2 = A * (aPlusOne - aMinusOne * k - k2); - a0 = aPlusOne + aMinusOne * k + k2; - a1 = -2 * (aMinusOne + aPlusOne * k); - a2 = aPlusOne + aMinusOne * k - k2; - }; - - // --------------------- implementation ------------------------------ - - // Convert rbj coeffs to fi.tf2 coeffs - setNormCoeffs(b0,b1,b2,a0,a1,a2) = (b0/a0, b1/a0, b2/a0, a1/a0, a2/a0); - - nyquist = ma.SR * 0.5; - nFreq = (f0 / nyquist) * pow(2, aDetune / 1200); - - // Limit cutoff between 0.01 and 0.99. - cutoff = max(0.01, min(nFreq, 0.99)); - -}; - -//------------------------------------------------------------------------- -// Implementation of filters using BiquadFilter and fi.tf2 -//------------------------------------------------------------------------- - -//--------------`(wa.)lowpass2`-------------- -// Standard second-order resonant lowpass filter with 12dB/octave rolloff. -// Frequencies below the cutoff pass through, frequencies above it are attenuated. -// -// #### Usage -// -// ``` -// _: lowpass2(f0, Q, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `Q`: the quality factor -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -lowpass2(f0, Q, dtune, x) = BiquadFilter(f0, 1, Q, dtune).lowpass2, x : fi.tf2; - - -//--------------`(wa.)highpass2`-------------- -// Standard second-order resonant highpass filter with 12dB/octave rolloff. -// Frequencies below the cutoff are attenuated, frequencies above it pass through. -// -// #### Usage -// -// ``` -// _: highpass2(f0, Q, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `Q`: the quality factor -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -highpass2(f0, Q, dtune, x) = BiquadFilter(f0, 1, Q, dtune).highpass2, x : fi.tf2; - - -//--------------`(wa.)bandpass2`-------------- -// Standard second-order bandpass filter. -// Frequencies outside the given range of frequencies are attenuated, the frequencies inside it pass through. -// -// #### Usage -// -// ``` -// _: bandpass2(f0, Q, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `Q`: the quality factor -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -bandpass2(f0, Q, dtune, x) = BiquadFilter(f0, 1, Q, dtune).bandpass2, x : fi.tf2; - - -//--------------`(wa.)notch2`-------------- -// Standard notch filter, also called a band-stop or band-rejection filter. -// It is the opposite of a bandpass filter: frequencies outside the give range of frequencies -// pass through, frequencies inside it are attenuated. -// -// #### Usage -// -// ``` -// _: notch2(f0, Q, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `Q`: the quality factor -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -notch2(f0, Q, dtune, x) = BiquadFilter(f0, 1, Q, dtune).notch2, x : fi.tf2; - - -//--------------`(wa.)allpass2`-------------- -// Standard second-order allpass filter. It lets all frequencies through, -// but changes the phase-relationship between the various frequencies. -// -// #### Usage -// -// ``` -// _: allpass2(f0, Q, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `Q`: the quality factor -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -allpass2(f0, Q, dtune, x) = BiquadFilter(f0, 1, Q, dtune).allpass2, x : fi.tf2; - - -//--------------`(wa.)peaking2`-------------- -// Frequencies inside the range get a boost or an attenuation, frequencies outside it are unchanged. -// -// #### Usage -// -// ``` -// _: peaking2(f0, gain, Q, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `gain`: the gain in dB -// * `Q`: the quality factor -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -peaking2(f0, gain, Q, dtune, x) = BiquadFilter(f0, gain, Q, dtune).peaking2, x : fi.tf2; - - -//--------------`(wa.)lowshelf2`-------------- -// Standard second-order lowshelf filter. -// Frequencies lower than the frequency get a boost, or an attenuation, frequencies over it are unchanged. -// -// ``` -// _: lowshelf2(f0, gain, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `gain`: the gain in dB -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -lowshelf2(f0, gain, dtune, x) = BiquadFilter(f0, gain, 1, dtune).lowshelf2, x : fi.tf2; - - -//--------------`(wa.)highshelf2`-------------- -// Standard second-order highshelf filter. -// Frequencies higher than the frequency get a boost or an attenuation, frequencies lower than it are unchanged. -// -// ``` -// _: highshelf2(f0, gain, dtune) :_ -// ``` -// -// Where: -// -// * `f0`: cutoff frequency in Hz -// * `gain`: the gain in dB -// * `dtune`: detuning of the frequency in cents -// -// #### Reference -// -// -//-------------------------------------- - -highshelf2(f0, gain, dtune, x) = BiquadFilter(f0, gain, 1, dtune).highshelf2, x : fi.tf2; - diff --git a/dist/examples/SAM/16_channel_volume/16_channel_volume.dsp b/dist/examples/SAM/16_channel_volume/16_channel_volume.dsp deleted file mode 100644 index 73938681..00000000 --- a/dist/examples/SAM/16_channel_volume/16_channel_volume.dsp +++ /dev/null @@ -1,27 +0,0 @@ -//----------------------------------------------- -// MIDI controlled 16 channel volume control in db -//----------------------------------------------- - -import("stdfaust.lib"); -import("layout.dsp"); - -channel01 = v01(vslider("Volume-01 [midi:ctrl 1] [tooltip CC-1]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel02 = v02(vslider("Volume-02 [midi:ctrl 2] [tooltip CC-2]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel03 = v03(vslider("Volume-03 [midi:ctrl 3] [tooltip CC-3]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel04 = v04(vslider("Volume-04 [midi:ctrl 4] [tooltip CC-4]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel05 = v05(vslider("Volume-05 [midi:ctrl 5] [tooltip CC-5]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel06 = v06(vslider("Volume-06 [midi:ctrl 6] [tooltip CC-6]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel07 = v07(vslider("Volume-07 [midi:ctrl 7] [tooltip CC-7]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel08 = v08(vslider("Volume-08 [midi:ctrl 8] [tooltip CC-8]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel09 = v09(vslider("Volume-09 [midi:ctrl 9] [tooltip CC-9]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel10 = v10(vslider("Volume-10 [midi:ctrl 10] [tooltip CC-10]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel11 = v11(vslider("Volume-11 [midi:ctrl 11] [tooltip CC-11]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel12 = v12(vslider("Volume-12 [midi:ctrl 12] [tooltip CC-12]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel13 = v13(vslider("Volume-13 [midi:ctrl 13] [tooltip CC-13]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel14 = v14(vslider("Volume-14 [midi:ctrl 14] [tooltip CC-14]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel15 = v15(vslider("Volume-15 [midi:ctrl 15] [tooltip CC-15]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); -channel16 = v16(vslider("Volume-16 [midi:ctrl 16] [tooltip CC-16]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo); - - - -process = *(channel01), *(channel02), *(channel03), *(channel04), *(channel05), *(channel06), *(channel07), *(channel08), *(channel09), *(channel10), *(channel11), *(channel12), *(channel13), *(channel14), *(channel15), *(channel16); diff --git a/dist/examples/SAM/16_channel_volume/layout.dsp b/dist/examples/SAM/16_channel_volume/layout.dsp deleted file mode 100644 index c2a739a8..00000000 --- a/dist/examples/SAM/16_channel_volume/layout.dsp +++ /dev/null @@ -1,17 +0,0 @@ -mixer(x) = hgroup("",x); - v01(x) = mixer(hgroup("", x)); - v02(x) = mixer(hgroup("", x)); - v03(x) = mixer(hgroup("", x)); - v04(x) = mixer(hgroup("", x)); - v05(x) = mixer(hgroup("", x)); - v06(x) = mixer(hgroup("", x)); - v07(x) = mixer(hgroup("", x)); - v08(x) = mixer(hgroup("", x)); - v09(x) = mixer(hgroup("", x)); - v10(x) = mixer(hgroup("", x)); - v11(x) = mixer(hgroup("", x)); - v12(x) = mixer(hgroup("", x)); - v13(x) = mixer(hgroup("", x)); - v14(x) = mixer(hgroup("", x)); - v15(x) = mixer(hgroup("", x)); - v16(x) = mixer(hgroup("", x)); \ No newline at end of file diff --git a/dist/examples/SAM/chorus/chorus.dsp b/dist/examples/SAM/chorus/chorus.dsp deleted file mode 100644 index 102dc3f6..00000000 --- a/dist/examples/SAM/chorus/chorus.dsp +++ /dev/null @@ -1,35 +0,0 @@ -import("stdfaust.lib"); - -import("layout2.dsp"); - -voices = 8; // MUST BE EVEN -process = ba.bypass1to2(cbp,chorus_mono(dmax,curdel,rate,sigma,do2,voices)); - -dmax = 8192; -curdel = dmax * ckg(vslider("[0] Delay [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 1)) : si.smooth(0.999); -rateMax = 7.0; // Hz -rateMin = 0.01; -rateT60 = 0.15661; -rate = ckg(vslider("[1] Rate [midi:ctrl 2] [unit:Hz] [style:knob]", 0.5, rateMin, rateMax, 0.0001)) - : si.smooth(ba.tau2pole(rateT60/6.91)); - -depth = ckg(vslider("[4] Depth [midi:ctrl 3] [style:knob]", 0.5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -delayPerVoice = 0.5*curdel/voices; -sigma = delayPerVoice * ckg(vslider("[6] Deviation [midi:ctrl 58] [style:knob]",0.5,0,1,0.001)) : si.smooth(0.999); - -periodic = 1; - -do2 = depth; // use when depth=1 means "multivibrato" effect (no original => all are modulated) -cbp = 1-int(csg(vslider("[0] Enable [midi:ctrl 105][style:knob]",0,0,1,1))); - -chorus_mono(dmax,curdel,rate,sigma,do2,voices) - = _ <: (*(1-do2)<:_,_),(*(do2) <: par(i,voices,voice(i)) :> _,_) : ro.interleave(2,2) : +,+ - with { - angle(i) = 2*ma.PI*(i/2)/voices + (i%2)*ma.PI/2; - voice(i) = de.fdelay(dmax,min(dmax,del(i))) * cos(angle(i)); - del(i) = curdel*(i+1)/voices + dev(i); - rates(i) = rate/float(i+1); - dev(i) = sigma * os.oscp(rates(i),i*2*ma.PI/voices); - }; diff --git a/dist/examples/SAM/chorus/chorusForBrowser.dsp b/dist/examples/SAM/chorus/chorusForBrowser.dsp deleted file mode 100644 index 255a484a..00000000 --- a/dist/examples/SAM/chorus/chorusForBrowser.dsp +++ /dev/null @@ -1,160 +0,0 @@ -import("stdfaust.lib"); - -voices = 8; // MUST BE EVEN -process = ba.bypass1to2(cbp,chorus_mono(dmax,curdel,rate,sigma,do2,voices)); - -dmax = 8192; -curdel = dmax * ckg(vslider("[0] Delay [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 1)) : si.smooth(0.999); -rateMax = 7.0; // Hz -rateMin = 0.01; -rateT60 = 0.15661; -rate = ckg(vslider("[1] Rate [midi:ctrl 2] [unit:Hz] [style:knob]", 0.5, rateMin, rateMax, 0.0001)) - : si.smooth(ba.tau2pole(rateT60/6.91)); - -depth = ckg(vslider("[4] Depth [midi:ctrl 3] [style:knob]", 0.5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -delayPerVoice = 0.5*curdel/voices; -sigma = delayPerVoice * ckg(vslider("[6] Deviation [midi:ctrl 58] [style:knob]",0.5,0,1,0.001)) : si.smooth(0.999); - -periodic = 1; - -do2 = depth; // use when depth=1 means "multivibrato" effect (no original => all are modulated) -cbp = 1-int(csg(vslider("[0] Enable [midi:ctrl 105][style:knob]",0,0,1,1))); - -chorus_mono(dmax,curdel,rate,sigma,do2,voices) - = _ <: (*(1-do2)<:_,_),(*(do2) <: par(i,voices,voice(i)) :> _,_) : ro.interleave(2,2) : +,+ - with { - angle(i) = 2*ma.PI*(i/2)/voices + (i%2)*ma.PI/2; - voice(i) = de.fdelay(dmax,min(dmax,del(i))) * cos(angle(i)); - del(i) = curdel*(i+1)/voices + dev(i); - rates(i) = rate/float(i+1); - dev(i) = sigma * os.oscp(rates(i),i*2*ma.PI/voices); - }; - -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/chorus/layout2.dsp b/dist/examples/SAM/chorus/layout2.dsp deleted file mode 100644 index 531084cf..00000000 --- a/dist/examples/SAM/chorus/layout2.dsp +++ /dev/null @@ -1,126 +0,0 @@ -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/echo/echo.dsp b/dist/examples/SAM/echo/echo.dsp deleted file mode 100644 index b45766c5..00000000 --- a/dist/examples/SAM/echo/echo.dsp +++ /dev/null @@ -1,54 +0,0 @@ -// imported by echo.dsp and echomt.dsp - -import("stdfaust.lib"); -import("layout2.dsp"); - -echo_group(x) = x; // Let layout2.dsp lay us out - knobs_group(x) = ekg(x); - switches_group(x) = esg(x); - -dmax = 32768; // one and done -dmaxs = float(dmax)/44100.0; - -Nnines = 1.8; // Increase until you get the desired maximum amount of smoothing when fbs==1 -fastpow2 = ffunction(float fastpow2(float), "fast_pow2.h", ""); -fbspr(fbs) = 1.0 - fastpow2(-3.33219*Nnines*fbs); // pole radius of feedback smoother -inputSelect(gi) = _,0 : select2(gi); -echo_mono(dmax,curdel,tapdel,fb,fbspr,gi) = inputSelect(gi) : (+:si.smooth(fbspr) - <: de.fdelay(dmax,curdel), - de.fdelay(dmax,tapdel)) - ~(*(fb),!) : !,_; - -tau2pole(tau) = ba.if(tau>0, exp(-1.0/(tau*ma.SR)), 0.0); -t60smoother(dEchoT60) = si.smooth(tau2pole(dEchoT60/6.91)); - -dEchoT60 = knobs_group(vslider("[1] DelayT60 [midi:ctrl 60] [style:knob]", 0.5, 0, 100, 0.001)); -dEchoSamplesRaw = knobs_group(vslider("[0] Delay [midi:ctrl 4] [style:knob]", 0.5, 0.001, (dmaxs-0.001), 0.001)) * ma.SR; -dEchoSamples = dEchoSamplesRaw : t60smoother(dEchoT60); -warpRaw = knobs_group(vslider("[0] Warp [midi:ctrl 62] [style:knob]", 0, -1.0, 1.0, 0.001)); - -scrubAmpRaw = 0; - -scrubPhaseRaw = 0; -fb = knobs_group(vslider("[2] Feedback [midi:ctrl 3] [style:knob]", .3, 0.0, 1.0, 0.0001)); -amp = knobs_group(vslider("[3] Amp [midi:ctrl 2] [style:knob]", .5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(ampT60/6.91)); - -ampT60 = 0.15661; -fbs = knobs_group(vslider("[5] [midi:ctrl 76] FeedbackSm [style:knob]", 0, 0, 1, 0.00001)); -gi = switches_group(1-vslider("[7] [midi:ctrl 105] EnableEcho[style:knob]",0,0,1,1)); // "ground input" switches input to zeros - -// Warp and Scrubber stuff: -enableEcho = (scrubAmpRaw > 0.00001); -triggerScrubOn = (enableEcho - enableEcho') > 0; // enableEcho went 0 to 1 -triggerScrubOff = (enableEcho - enableEcho') < 0; // enableEcho went 1 to 0 -// Ramps up only during scrub "hold" time and is otherwise zero: -counter = (enableEcho * (triggerScrubOn : + ~ +(1) * enableEcho : -(2))) & (dmax-1); -// implementation that continues scrubbing where it left off: - -scrubPhase = scrubPhaseRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -scrubAmp = scrubAmpRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -warp = warpRaw : t60smoother(dEchoT60); -dTapSamplesRaw = dEchoSamplesRaw * (1.0 + warp + scrubPhase * scrubAmp) + float(counter); -dTapSamples = dTapSamplesRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); - -process = _ <: _, amp * echo_mono(dmax,dEchoSamples,dTapSamples,fb,fbspr(fbs),gi) : +; diff --git a/dist/examples/SAM/echo/echoForBrowser.dsp b/dist/examples/SAM/echo/echoForBrowser.dsp deleted file mode 100644 index 81aa422e..00000000 --- a/dist/examples/SAM/echo/echoForBrowser.dsp +++ /dev/null @@ -1,179 +0,0 @@ -// imported by echo.dsp and echomt.dsp - -import("stdfaust.lib"); - -echo_group(x) = x; // Let layout2.dsp lay us out - knobs_group(x) = ekg(x); - switches_group(x) = esg(x); - -dmax = 32768; // one and done -dmaxs = float(dmax)/44100.0; - -Nnines = 1.8; // Increase until you get the desired maximum amount of smoothing when fbs==1 -//fastpow2 = ffunction(float fastpow2(float), "fast_pow2.h", ""); -fbspr(fbs) = 1.0 - pow(2.0, (-3.33219*Nnines*fbs)); // pole radius of feedback smoother -inputSelect(gi) = _,0 : select2(gi); -echo_mono(dmax,curdel,tapdel,fb,fbspr,gi) = inputSelect(gi) : (+:si.smooth(fbspr) - <: de.fdelay(dmax,curdel), - de.fdelay(dmax,tapdel)) - ~(*(fb),!) : !,_; - -tau2pole(tau) = ba.if(tau>0, exp(-1.0/(tau*ma.SR)), 0.0); -t60smoother(dEchoT60) = si.smooth(tau2pole(dEchoT60/6.91)); - -dEchoT60 = knobs_group(vslider("[1] DelayT60 [midi:ctrl 60] [style:knob]", 0.5, 0, 100, 0.001)); -dEchoSamplesRaw = knobs_group(vslider("[0] Delay [midi:ctrl 4] [style:knob]", 0.5, 0.001, (dmaxs-0.001), 0.001)) * ma.SR; -dEchoSamples = dEchoSamplesRaw : t60smoother(dEchoT60); -warpRaw = knobs_group(vslider("[0] Warp [midi:ctrl 62] [style:knob]", 0, -1.0, 1.0, 0.001)); - -scrubAmpRaw = 0; - -scrubPhaseRaw = 0; -fb = knobs_group(vslider("[2] Feedback [midi:ctrl 3] [style:knob]", .3, 0.0, 1.0, 0.0001)); -amp = knobs_group(vslider("[3] Amp [midi:ctrl 2] [style:knob]", .5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(ampT60/6.91)); - -ampT60 = 0.15661; -fbs = knobs_group(vslider("[5] [midi:ctrl 76] FeedbackSm [style:knob]", 0, 0, 1, 0.00001)); -gi = switches_group(1-vslider("[7] [midi:ctrl 105] EnableEcho[style:knob]",0,0,1,1)); // "ground input" switches input to zeros - -// Warp and Scrubber stuff: -enableEcho = (scrubAmpRaw > 0.00001); -triggerScrubOn = (enableEcho - enableEcho') > 0; // enableEcho went 0 to 1 -triggerScrubOff = (enableEcho - enableEcho') < 0; // enableEcho went 1 to 0 -// Ramps up only during scrub "hold" time and is otherwise zero: -counter = (enableEcho * (triggerScrubOn : + ~ +(1) * enableEcho : -(2))) & (dmax-1); -// implementation that continues scrubbing where it left off: - -scrubPhase = scrubPhaseRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -scrubAmp = scrubAmpRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -warp = warpRaw : t60smoother(dEchoT60); -dTapSamplesRaw = dEchoSamplesRaw * (1.0 + warp + scrubPhase * scrubAmp) + float(counter); -dTapSamples = dTapSamplesRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); - -process = _ <: _, amp * echo_mono(dmax,dEchoSamples,dTapSamples,fb,fbspr(fbs),gi) : +; -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/echo/layout2.dsp b/dist/examples/SAM/echo/layout2.dsp deleted file mode 100644 index 531084cf..00000000 --- a/dist/examples/SAM/echo/layout2.dsp +++ /dev/null @@ -1,126 +0,0 @@ -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/effects/chorus.dsp b/dist/examples/SAM/effects/chorus.dsp deleted file mode 100644 index 37ec4e4b..00000000 --- a/dist/examples/SAM/effects/chorus.dsp +++ /dev/null @@ -1,35 +0,0 @@ -import("stdfaust.lib"); - -import("layout2.dsp"); - -voices = 8; // MUST BE EVEN -process = ba.bypass1to2(cbp,chorus_mono(dmax,curdel,rate,sigma,do2,voices)); - -dmax = 8192; -curdel = dmax * ckg(vslider("[0] Delay [midi:ctrl 55] [style:knob]", 0.5, 0, 1, 1)) : si.smooth(0.999); -rateMax = 7.0; // Hz -rateMin = 0.01; -rateT60 = 0.15661; -rate = ckg(vslider("[1] Rate [midi:ctrl 56] [unit:Hz] [style:knob]", 0.5, rateMin, rateMax, 0.0001)) - : si.smooth(ba.tau2pole(rateT60/6.91)); - -depth = ckg(vslider("[4] Depth [midi:ctrl 57] [style:knob]", 0.5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -delayPerVoice = 0.5*curdel/voices; -sigma = delayPerVoice * ckg(vslider("[6] Deviation [midi:ctrl 58] [style:knob]",0.5,0,1,0.001)) : si.smooth(0.999); - -periodic = 1; - -do2 = depth; // use when depth=1 means "multivibrato" effect (no original => all are modulated) -cbp = 1-int(csg(vslider("[0] Enable [midi:ctrl 103][style:knob]",0,0,1,1))); - -chorus_mono(dmax,curdel,rate,sigma,do2,voices) - = _ <: (*(1-do2)<:_,_),(*(do2) <: par(i,voices,voice(i)) :> _,_) : ro.interleave(2,2) : +,+ - with { - angle(i) = 2*ma.PI*(i/2)/voices + (i%2)*ma.PI/2; - voice(i) = de.fdelay(dmax,min(dmax,del(i))) * cos(angle(i)); - del(i) = curdel*(i+1)/voices + dev(i); - rates(i) = rate/float(i+1); - dev(i) = sigma * os.oscp(rates(i),i*2*ma.PI/voices); - }; diff --git a/dist/examples/SAM/effects/echo.dsp b/dist/examples/SAM/effects/echo.dsp deleted file mode 100644 index e3cbe0eb..00000000 --- a/dist/examples/SAM/effects/echo.dsp +++ /dev/null @@ -1,54 +0,0 @@ -// imported by echo.dsp and echomt.dsp - -import("stdfaust.lib"); -import("layout2.dsp"); - -echo_group(x) = x; // Let layout2.dsp lay us out - knobs_group(x) = ekg(x); - switches_group(x) = esg(x); - -dmax = 32768; // one and done -dmaxs = float(dmax)/44100.0; - -Nnines = 1.8; // Increase until you get the desired maximum amount of smoothing when fbs==1 -fastpow2 = ffunction(float fastpow2(float), "fast_pow2.h", ""); -fbspr(fbs) = 1.0 - fastpow2(-3.33219*Nnines*fbs); // pole radius of feedback smoother -inputSelect(gi) = _,0 : select2(gi); -echo_mono(dmax,curdel,tapdel,fb,fbspr,gi) = inputSelect(gi) : (+:si.smooth(fbspr) - <: de.fdelay(dmax,curdel), - de.fdelay(dmax,tapdel)) - ~(*(fb),!) : !,_; - -tau2pole(tau) = ba.if(tau>0, exp(-1.0/(tau*ma.SR)), 0.0); -t60smoother(dEchoT60) = si.smooth(tau2pole(dEchoT60/6.91)); - -dEchoT60 = knobs_group(vslider("[1] DelayT60 [midi:ctrl 60] [style:knob]", 0.5, 0, 100, 0.001)); -dEchoSamplesRaw = knobs_group(vslider("[0] Delay [midi:ctrl 61] [style:knob]", 0.5, 0.001, (dmaxs-0.001), 0.001)) * ma.SR; -dEchoSamples = dEchoSamplesRaw : t60smoother(dEchoT60); -warpRaw = knobs_group(vslider("[0] Warp [midi:ctrl 62] [style:knob]", 0, -1.0, 1.0, 0.001)); - -scrubAmpRaw = 0; - -scrubPhaseRaw = 0; -fb = knobs_group(vslider("[2] Feedback [midi:ctrl 2] [style:knob]", .3, 0.0, 1.0, 0.0001)); -amp = knobs_group(vslider("[3] Amp [midi:ctrl 75] [style:knob]", .5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(ampT60/6.91)); - -ampT60 = 0.15661; -fbs = knobs_group(vslider("[5] [midi:ctrl 76] FeedbackSm [style:knob]", 0, 0, 1, 0.00001)); -gi = switches_group(1-vslider("[7] [midi:ctrl 105] EnableEcho[style:knob]",0,0,1,1)); // "ground input" switches input to zeros - -// Warp and Scrubber stuff: -enableEcho = (scrubAmpRaw > 0.00001); -triggerScrubOn = (enableEcho - enableEcho') > 0; // enableEcho went 0 to 1 -triggerScrubOff = (enableEcho - enableEcho') < 0; // enableEcho went 1 to 0 -// Ramps up only during scrub "hold" time and is otherwise zero: -counter = (enableEcho * (triggerScrubOn : + ~ +(1) * enableEcho : -(2))) & (dmax-1); -// implementation that continues scrubbing where it left off: - -scrubPhase = scrubPhaseRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -scrubAmp = scrubAmpRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -warp = warpRaw : t60smoother(dEchoT60); -dTapSamplesRaw = dEchoSamplesRaw * (1.0 + warp + scrubPhase * scrubAmp) + float(counter); -dTapSamples = dTapSamplesRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); - -process = _ <: _, amp * echo_mono(dmax,dEchoSamples,dTapSamples,fb,fbspr(fbs),gi) : +; diff --git a/dist/examples/SAM/effects/effects.dsp b/dist/examples/SAM/effects/effects.dsp deleted file mode 100644 index 23f7a487..00000000 --- a/dist/examples/SAM/effects/effects.dsp +++ /dev/null @@ -1,10 +0,0 @@ -// All effects used by minimoog.dsp - -import("stdfaust.lib"); -import("layout2.dsp"); - -process = _,_ : + - : component("echo.dsp") - : component("flanger.dsp") - : component("chorus.dsp") - : component("freeverb.dsp"); diff --git a/dist/examples/SAM/effects/effectsForBrowser.dsp b/dist/examples/SAM/effects/effectsForBrowser.dsp deleted file mode 100644 index 80a8dfa6..00000000 --- a/dist/examples/SAM/effects/effectsForBrowser.dsp +++ /dev/null @@ -1,386 +0,0 @@ -// All effects used by minimoog.dsp - -import("stdfaust.lib"); - -process = _,_ : + - : component_echo - : component_flanger - : component_chorus - : component_freeverb; - -component_echo = environment { - -echo_group(x) = x; // Let layout2.dsp lay us out -knobs_group(x) = ekg(x); -switches_group(x) = esg(x); - -dmax = 32768; // one and done -dmaxs = float(dmax)/44100.0; - -Nnines = 1.8; // Increase until you get the desired maximum amount of smoothing when fbs==1 -//fastpow2 = ffunction(float fastpow2(float), "fast_pow2.h", ""); -fbspr(fbs) = 1.0 - pow(2.0, -3.33219*Nnines*fbs); // pole radius of feedback smoother -inputSelect(gi) = _,0 : select2(gi); -echo_mono(dmax,curdel,tapdel,fb,fbspr,gi) = inputSelect(gi) : (+:si.smooth(fbspr) -<: de.fdelay(dmax,curdel), -de.fdelay(dmax,tapdel)) -~(*(fb),!) : !,_; - -tau2pole(tau) = ba.if(tau>0, exp(-1.0/(tau*ma.SR)), 0.0); -t60smoother(dEchoT60) = si.smooth(tau2pole(dEchoT60/6.91)); - -dEchoT60 = knobs_group(vslider("[1] DelayT60 [midi:ctrl 60] [style:knob]", 0.5, 0, 100, 0.001)); -dEchoSamplesRaw = knobs_group(vslider("[0] Delay [midi:ctrl 61] [style:knob]", 0.5, 0.001, (dmaxs-0.001), 0.001)) * ma.SR; -dEchoSamples = dEchoSamplesRaw : t60smoother(dEchoT60); -warpRaw = knobs_group(vslider("[0] Warp [midi:ctrl 62] [style:knob]", 0, -1.0, 1.0, 0.001)); - -scrubAmpRaw = 0; - -scrubPhaseRaw = 0; -fb = knobs_group(vslider("[2] Feedback [midi:ctrl 2] [style:knob]", .3, 0.0, 1.0, 0.0001)); -amp = knobs_group(vslider("[3] Amp [midi:ctrl 75] [style:knob]", .5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(ampT60/6.91)); - -ampT60 = 0.15661; -fbs = knobs_group(vslider("[5] [midi:ctrl 76] FeedbackSm [style:knob]", 0, 0, 1, 0.00001)); -gi = switches_group(1-vslider("[7] [midi:ctrl 105] EnableEcho[style:knob]",0,0,1,1)); // "ground input" switches input to zeros - -// Warp and Scrubber stuff: -enableEcho = (scrubAmpRaw > 0.00001); -triggerScrubOn = (enableEcho - enableEcho') > 0; // enableEcho went 0 to 1 -triggerScrubOff = (enableEcho - enableEcho') < 0; // enableEcho went 1 to 0 -// Ramps up only during scrub "hold" time and is otherwise zero: -counter = (enableEcho * (triggerScrubOn : + ~ +(1) * enableEcho : -(2))) & (dmax-1); -// implementation that continues scrubbing where it left off: - -scrubPhase = scrubPhaseRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -scrubAmp = scrubAmpRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -warp = warpRaw : t60smoother(dEchoT60); -dTapSamplesRaw = dEchoSamplesRaw * (1.0 + warp + scrubPhase * scrubAmp) + float(counter); -dTapSamples = dTapSamplesRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); - -echo_process = _ <: _, amp * echo_mono(dmax,dEchoSamples,dTapSamples,fb,fbspr(fbs),gi) : +; - -}.echo_process; - -component_flanger = environment { - -// Created from flange.dsp 2015/06/21 - -flanger_mono(dmax,curdel,depth,fb,invert,lfoshape) - = _ <: _, (-:de.fdelay(dmax,curdel)) ~ *(fb) : _, *(select2(invert,depth,0-depth)) : + : *(1/(1+depth)); // ideal for dc and reinforced sinusoids (in-phase summed signals) - -flanger_process = ba.bypass1(fbp,flanger_mono_gui); - -// Kill the groups to save vertical space: -meter_group(x) = flsg(x); -ctl_group(x) = flkg(x); -del_group(x) = flkg(x); -lvl_group(x) = flkf(x); - -flangeview = lfo(freq); - -flanger_mono_gui = attach(flangeview) : flanger_mono(dmax,curdel,depth,fb,invert,lfoshape); - -sinlfo(freq) = (1 + os.oscrs(freq))/2; -trilfo(freq) = 1.0-abs(os.saw1(freq)); -lfo(f) = (lfoshape * trilfo(f)) + ((1-lfoshape) * sinlfo(f)); - -dmax = 2048; -odflange = 44; // ~1 ms at 44.1 kHz = min delay -dflange = ((dmax-1)-odflange)*del_group(vslider("[1] Delay [midi:ctrl 50][style:knob]", 0.22, 0, 1, 1)); -freq = ctl_group(vslider("[1] Rate [midi:ctrl 51] [unit:Hz] [style:knob]", 0.5, 0, 10, 0.01)) : si.smooth(ba.tau2pole(freqT60/6.91)); - -freqT60 = 0.15661; -depth = ctl_group(vslider("[3] Depth [midi:ctrl 52] [style:knob]", .75, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -fb = ctl_group(vslider("[5] Feedback [midi:ctrl 53] [style:knob]", 0, -0.995, 0.99, 0.001)) : si.smooth(ba.tau2pole(fbT60/6.91)); - -fbT60 = 0.15661; -lfoshape = ctl_group(vslider("[7] Waveshape [midi:ctrl 54] [style:knob]", 0, 0, 1, 0.001)); -curdel = odflange+dflange*lfo(freq); - -fbp = 1-int(flsg(vslider("[0] Enable [midi:ctrl 102][style:knob]",0,0,1,1))); - -invert = flsg(vslider("[1] Invert [midi:ctrl 49][style:knob]",0,0,1,1):int); - -}.flanger_process; - -component_chorus = environment { - -voices = 8; // MUST BE EVEN -chorus_process = ba.bypass1to2(cbp,chorus_mono(dmax,curdel,rate,sigma,do2,voices)); - -dmax = 8192; -curdel = dmax * ckg(vslider("[0] Delay [midi:ctrl 55] [style:knob]", 0.5, 0, 1, 1)) : si.smooth(0.999); -rateMax = 7.0; // Hz -rateMin = 0.01; -rateT60 = 0.15661; -rate = ckg(vslider("[1] Rate [midi:ctrl 56] [unit:Hz] [style:knob]", 0.5, rateMin, rateMax, 0.0001)) - : si.smooth(ba.tau2pole(rateT60/6.91)); - -depth = ckg(vslider("[4] Depth [midi:ctrl 57] [style:knob]", 0.5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -delayPerVoice = 0.5*curdel/voices; -sigma = delayPerVoice * ckg(vslider("[6] Deviation [midi:ctrl 58] [style:knob]",0.5,0,1,0.001)) : si.smooth(0.999); - -periodic = 1; - -do2 = depth; // use when depth=1 means "multivibrato" effect (no original => all are modulated) -cbp = 1-int(csg(vslider("[0] Enable [midi:ctrl 103][style:knob]",0,0,1,1))); - -chorus_mono(dmax,curdel,rate,sigma,do2,voices) - = _ <: (*(1-do2)<:_,_),(*(do2) <: par(i,voices,voice(i)) :> _,_) : ro.interleave(2,2) : +,+ - with { - angle(i) = 2*ma.PI*(i/2)/voices + (i%2)*ma.PI/2; - voice(i) = de.fdelay(dmax,min(dmax,del(i))) * cos(angle(i)); - del(i) = curdel*(i+1)/voices + dev(i); - rates(i) = rate/float(i+1); - dev(i) = sigma * os.oscp(rates(i),i*2*ma.PI/voices); - }; - -}.chorus_process; - -component_freeverb = environment { - -import("stdfaust.lib"); - -declare name "freeverb"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c) GRAME 2006 and MoForte Inc. 2017"; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Freeverb.html"; - -//====================================================== -// -// Freeverb -// Faster version using fixed delays (20% gain) -// -//====================================================== - -// Constant Parameters -//-------------------- - -fixedgain = 0.015; //value of the gain of fxctrl -scalewet = 3.0; -scaledry = 2.0; -scaledamp = 0.4; -scaleroom = 0.28; -offsetroom = 0.7; -initialroom = 0.5; -initialdamp = 0.5; -initialwet = 1.0/scalewet; -initialdry = 0; -initialwidth= 1.0; -initialmode = 0.0; -freezemode = 0.5; -stereospread= 23; -allpassfeed = 0.5; //feedback of the delays used in allpass filters - -// Filter Parameters -//------------------ - -combtuningL1 = 1116; -combtuningL2 = 1188; -combtuningL3 = 1277; -combtuningL4 = 1356; -combtuningL5 = 1422; -combtuningL6 = 1491; -combtuningL7 = 1557; -combtuningL8 = 1617; - -allpasstuningL1 = 556; -allpasstuningL2 = 441; -allpasstuningL3 = 341; -allpasstuningL4 = 225; - -// Control Sliders -//-------------------- -// Damp : filters the high frequencies of the echoes (especially active for great values of RoomSize) -// RoomSize : size of the reverberation room -// Dry : original signal -// Wet : reverberated signal - -dampSlider = rkg(vslider("Damp [midi:ctrl 3] [style:knob]",0.5, 0, 1, 0.025))*scaledamp; -roomsizeSlider = rkg(vslider("RoomSize [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 0.025))*scaleroom + offsetroom; -wetSlider = rkg(vslider("Wet [midi:ctrl 79] [style:knob]", 0.3333, 0, 1, 0.025)); -combfeed = roomsizeSlider; - -// Comb and Allpass filters -//------------------------- - -allpass(dt,fb) = (_,_ <: (*(fb),_:+:@(dt)), -) ~ _ : (!,_); - -comb(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb)); - -// Reverb components -//------------------ - -monoReverb(fb1, fb2, damp, spread) -= _ <: comb(combtuningL1+spread, fb1, damp), -comb(combtuningL2+spread, fb1, damp), -comb(combtuningL3+spread, fb1, damp), -comb(combtuningL4+spread, fb1, damp), -comb(combtuningL5+spread, fb1, damp), -comb(combtuningL6+spread, fb1, damp), -comb(combtuningL7+spread, fb1, damp), -comb(combtuningL8+spread, fb1, damp) -+> -allpass (allpasstuningL1+spread, fb2) -: allpass (allpasstuningL2+spread, fb2) -: allpass (allpasstuningL3+spread, fb2) -: allpass (allpasstuningL4+spread, fb2) -; - -monoReverbToStereo(fb1, fb2, damp, spread) -= + <: monoReverb(fb1, fb2, damp, 0) <: _,_; -stereoReverb(fb1, fb2, damp, spread) -= + <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); -monoToStereoReverb(fb1, fb2, damp, spread) -= _ <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); - -// fxctrl : add an input gain and a wet-dry control to a stereo FX -//---------------------------------------------------------------- - -fxctrl(g,w,Fx) = _,_ <: (*(g),*(g) : Fx : *(w),*(w)), *(1-w), *(1-w) +> _,_; - -rbp = 1-int(rsg(vslider("[0] Enable [midi:ctrl 104][style:knob]",0,0,1,1))); - -// Freeverb -//--------- - -//JOS:freeverb = fxctrl(fixedgain, wetSlider, stereoReverb(combfeed, allpassfeed, dampSlider, stereospread)); -freeverb = fxctrl(fixedgain, wetSlider, monoReverbToStereo(combfeed, allpassfeed, dampSlider, stereospread)); - -freeverb_process = ba.bypass2(rbp,freeverb); - -}.freeverb_process; - -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/effects/flanger.dsp b/dist/examples/SAM/effects/flanger.dsp deleted file mode 100644 index 33da2973..00000000 --- a/dist/examples/SAM/effects/flanger.dsp +++ /dev/null @@ -1,46 +0,0 @@ -// Created from flange.dsp 2015/06/21 - -import("stdfaust.lib"); -import("layout2.dsp"); - -flanger_mono(dmax,curdel,depth,fb,invert,lfoshape) - = _ <: _, (-:de.fdelay(dmax,curdel)) ~ *(fb) : _, - *(select2(invert,depth,0-depth)) - : + : *(1/(1+depth)); // ideal for dc and reinforced sinusoids (in-phase summed signals) - - -process = ba.bypass1(fbp,flanger_mono_gui); - - // Kill the groups to save vertical space: - meter_group(x) = flsg(x); - ctl_group(x) = flkg(x); - del_group(x) = flkg(x); - lvl_group(x) = flkf(x); - - flangeview = lfo(freq); - - flanger_mono_gui = attach(flangeview) : flanger_mono(dmax,curdel,depth,fb,invert,lfoshape); - - sinlfo(freq) = (1 + os.oscrs(freq))/2; - trilfo(freq) = 1.0-abs(os.saw1(freq)); - lfo(f) = (lfoshape * trilfo(f)) + ((1-lfoshape) * sinlfo(f)); - - dmax = 2048; - odflange = 44; // ~1 ms at 44.1 kHz = min delay - dflange = ((dmax-1)-odflange)*del_group(vslider("[1] Delay [midi:ctrl 50][style:knob]", 0.22, 0, 1, 1)); - freq = ctl_group(vslider("[1] Rate [midi:ctrl 51] [unit:Hz] [style:knob]", 0.5, 0, 10, 0.01)) : si.smooth(ba.tau2pole(freqT60/6.91)); - - freqT60 = 0.15661; - depth = ctl_group(vslider("[3] Depth [midi:ctrl 52] [style:knob]", .75, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - - depthT60 = 0.15661; - fb = ctl_group(vslider("[5] Feedback [midi:ctrl 53] [style:knob]", 0, -0.995, 0.99, 0.001)) : si.smooth(ba.tau2pole(fbT60/6.91)); - - fbT60 = 0.15661; - lfoshape = ctl_group(vslider("[7] Waveshape [midi:ctrl 54] [style:knob]", 0, 0, 1, 0.001)); - curdel = odflange+dflange*lfo(freq); - - fbp = 1-int(flsg(vslider("[0] Enable [midi:ctrl 102][style:knob]",0,0,1,1))); - - invert = flsg(vslider("[1] Invert [midi:ctrl 49][style:knob]",0,0,1,1):int); - diff --git a/dist/examples/SAM/effects/freeverb.dsp b/dist/examples/SAM/effects/freeverb.dsp deleted file mode 100644 index 27c73ffe..00000000 --- a/dist/examples/SAM/effects/freeverb.dsp +++ /dev/null @@ -1,116 +0,0 @@ -import("stdfaust.lib"); -import("layout2.dsp"); - -declare name "freeverb"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c) GRAME 2006 and MoForte Inc. 2017"; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Freeverb.html"; - -//====================================================== -// -// Freeverb -// Faster version using fixed delays (20% gain) -// -//====================================================== - -// Constant Parameters -//-------------------- - -fixedgain = 0.015; //value of the gain of fxctrl -scalewet = 3.0; -scaledry = 2.0; -scaledamp = 0.4; -scaleroom = 0.28; -offsetroom = 0.7; -initialroom = 0.5; -initialdamp = 0.5; -initialwet = 1.0/scalewet; -initialdry = 0; -initialwidth= 1.0; -initialmode = 0.0; -freezemode = 0.5; -stereospread= 23; -allpassfeed = 0.5; //feedback of the delays used in allpass filters - - -// Filter Parameters -//------------------ - -combtuningL1 = 1116; -combtuningL2 = 1188; -combtuningL3 = 1277; -combtuningL4 = 1356; -combtuningL5 = 1422; -combtuningL6 = 1491; -combtuningL7 = 1557; -combtuningL8 = 1617; - -allpasstuningL1 = 556; -allpasstuningL2 = 441; -allpasstuningL3 = 341; -allpasstuningL4 = 225; - - -// Control Sliders -//-------------------- -// Damp : filters the high frequencies of the echoes (especially active for great values of RoomSize) -// RoomSize : size of the reverberation room -// Dry : original signal -// Wet : reverberated signal - -dampSlider = rkg(vslider("Damp [midi:ctrl 3] [style:knob]",0.5, 0, 1, 0.025))*scaledamp; -roomsizeSlider = rkg(vslider("RoomSize [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 0.025))*scaleroom + offsetroom; -wetSlider = rkg(vslider("Wet [midi:ctrl 79] [style:knob]", 0.3333, 0, 1, 0.025)); -combfeed = roomsizeSlider; - - -// Comb and Allpass filters -//------------------------- - -allpass(dt,fb) = (_,_ <: (*(fb),_:+:@(dt)), -) ~ _ : (!,_); - -comb(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb)); - - -// Reverb components -//------------------ - -monoReverb(fb1, fb2, damp, spread) - = _ <: comb(combtuningL1+spread, fb1, damp), - comb(combtuningL2+spread, fb1, damp), - comb(combtuningL3+spread, fb1, damp), - comb(combtuningL4+spread, fb1, damp), - comb(combtuningL5+spread, fb1, damp), - comb(combtuningL6+spread, fb1, damp), - comb(combtuningL7+spread, fb1, damp), - comb(combtuningL8+spread, fb1, damp) - +> - allpass (allpasstuningL1+spread, fb2) - : allpass (allpasstuningL2+spread, fb2) - : allpass (allpasstuningL3+spread, fb2) - : allpass (allpasstuningL4+spread, fb2) - ; - -monoReverbToStereo(fb1, fb2, damp, spread) - = + <: monoReverb(fb1, fb2, damp, 0) <: _,_; -stereoReverb(fb1, fb2, damp, spread) - = + <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); -monoToStereoReverb(fb1, fb2, damp, spread) - = _ <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); - -// fxctrl : add an input gain and a wet-dry control to a stereo FX -//---------------------------------------------------------------- - -fxctrl(g,w,Fx) = _,_ <: (*(g),*(g) : Fx : *(w),*(w)), *(1-w), *(1-w) +> _,_; - -rbp = 1-int(rsg(vslider("[0] Enable [midi:ctrl 104][style:knob]",0,0,1,1))); - -// Freeverb -//--------- - -//JOS:freeverb = fxctrl(fixedgain, wetSlider, stereoReverb(combfeed, allpassfeed, dampSlider, stereospread)); -freeverb = fxctrl(fixedgain, wetSlider, monoReverbToStereo(combfeed, allpassfeed, dampSlider, stereospread)); - -process = ba.bypass2(rbp,freeverb); diff --git a/dist/examples/SAM/effects/layout2.dsp b/dist/examples/SAM/effects/layout2.dsp deleted file mode 100644 index 531084cf..00000000 --- a/dist/examples/SAM/effects/layout2.dsp +++ /dev/null @@ -1,126 +0,0 @@ -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/flanger/flanger.dsp b/dist/examples/SAM/flanger/flanger.dsp deleted file mode 100644 index ff36e648..00000000 --- a/dist/examples/SAM/flanger/flanger.dsp +++ /dev/null @@ -1,46 +0,0 @@ -// Created from flange.dsp 2015/06/21 - -import("stdfaust.lib"); -import("layout2.dsp"); - -flanger_mono(dmax,curdel,depth,fb,invert,lfoshape) - = _ <: _, (-:de.fdelay(dmax,curdel)) ~ *(fb) : _, - *(select2(invert,depth,0-depth)) - : + : *(1/(1+depth)); // ideal for dc and reinforced sinusoids (in-phase summed signals) - - -process = ba.bypass1(fbp,flanger_mono_gui); - - // Kill the groups to save vertical space: - meter_group(x) = flsg(x); - ctl_group(x) = flkg(x); - del_group(x) = flkg(x); - lvl_group(x) = flkf(x); - - flangeview = lfo(freq); - - flanger_mono_gui = attach(flangeview) : flanger_mono(dmax,curdel,depth,fb,invert,lfoshape); - - sinlfo(freq) = (1 + os.oscrs(freq))/2; - trilfo(freq) = 1.0-abs(os.saw1(freq)); - lfo(f) = (lfoshape * trilfo(f)) + ((1-lfoshape) * sinlfo(f)); - - dmax = 2048; - odflange = 44; // ~1 ms at 44.1 kHz = min delay - dflange = ((dmax-1)-odflange)*del_group(vslider("[1] Delay [midi:ctrl 50][style:knob]", 0.22, 0, 1, 1)); - freq = ctl_group(vslider("[1] Rate [midi:ctrl 2] [unit:Hz] [style:knob]", 0.5, 0, 10, 0.01)) : si.smooth(ba.tau2pole(freqT60/6.91)); - - freqT60 = 0.15661; - depth = ctl_group(vslider("[3] Depth [midi:ctrl 3] [style:knob]", .75, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - - depthT60 = 0.15661; - fb = ctl_group(vslider("[5] Feedback [midi:ctrl 4] [style:knob]", 0, -0.995, 0.99, 0.001)) : si.smooth(ba.tau2pole(fbT60/6.91)); - - fbT60 = 0.15661; - lfoshape = ctl_group(vslider("[7] Waveshape [midi:ctrl 54] [style:knob]", 0, 0, 1, 0.001)); - curdel = odflange+dflange*lfo(freq); - - fbp = 1-int(flsg(vslider("[0] Enable [midi:ctrl 105][style:knob]",0,0,1,1))); - - invert = flsg(vslider("[1] Invert [midi:ctrl 49][style:knob]",0,0,1,1):int); - diff --git a/dist/examples/SAM/flanger/flangerForBrowser.dsp b/dist/examples/SAM/flanger/flangerForBrowser.dsp deleted file mode 100644 index 9bc0d35c..00000000 --- a/dist/examples/SAM/flanger/flangerForBrowser.dsp +++ /dev/null @@ -1,171 +0,0 @@ -// Created from flange.dsp 2015/06/21 - -import("stdfaust.lib"); - -flanger_mono(dmax,curdel,depth,fb,invert,lfoshape) - = _ <: _, (-:de.fdelay(dmax,curdel)) ~ *(fb) : _, - *(select2(invert,depth,0-depth)) - : + : *(1/(1+depth)); // ideal for dc and reinforced sinusoids (in-phase summed signals) - - -process = ba.bypass1(fbp,flanger_mono_gui); - - // Kill the groups to save vertical space: - meter_group(x) = flsg(x); - ctl_group(x) = flkg(x); - del_group(x) = flkg(x); - lvl_group(x) = flkf(x); - - flangeview = lfo(freq); - - flanger_mono_gui = attach(flangeview) : flanger_mono(dmax,curdel,depth,fb,invert,lfoshape); - - sinlfo(freq) = (1 + os.oscrs(freq))/2; - trilfo(freq) = 1.0-abs(os.saw1(freq)); - lfo(f) = (lfoshape * trilfo(f)) + ((1-lfoshape) * sinlfo(f)); - - dmax = 2048; - odflange = 44; // ~1 ms at 44.1 kHz = min delay - dflange = ((dmax-1)-odflange)*del_group(vslider("[1] Delay [midi:ctrl 50][style:knob]", 0.22, 0, 1, 1)); - freq = ctl_group(vslider("[1] Rate [midi:ctrl 2] [unit:Hz] [style:knob]", 0.5, 0, 10, 0.01)) : si.smooth(ba.tau2pole(freqT60/6.91)); - - freqT60 = 0.15661; - depth = ctl_group(vslider("[3] Depth [midi:ctrl 3] [style:knob]", .75, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - - depthT60 = 0.15661; - fb = ctl_group(vslider("[5] Feedback [midi:ctrl 4] [style:knob]", 0, -0.995, 0.99, 0.001)) : si.smooth(ba.tau2pole(fbT60/6.91)); - - fbT60 = 0.15661; - lfoshape = ctl_group(vslider("[7] Waveshape [midi:ctrl 54] [style:knob]", 0, 0, 1, 0.001)); - curdel = odflange+dflange*lfo(freq); - - fbp = 1-int(flsg(vslider("[0] Enable [midi:ctrl 105][style:knob]",0,0,1,1))); - - invert = flsg(vslider("[1] Invert [midi:ctrl 49][style:knob]",0,0,1,1):int); - -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/flanger/layout2.dsp b/dist/examples/SAM/flanger/layout2.dsp deleted file mode 100644 index 531084cf..00000000 --- a/dist/examples/SAM/flanger/layout2.dsp +++ /dev/null @@ -1,126 +0,0 @@ -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/freeverb/freeverb.dsp b/dist/examples/SAM/freeverb/freeverb.dsp deleted file mode 100644 index 3c620019..00000000 --- a/dist/examples/SAM/freeverb/freeverb.dsp +++ /dev/null @@ -1,116 +0,0 @@ -import("stdfaust.lib"); -import("layout2.dsp"); - -declare name "freeverb"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c) GRAME 2006 and MoForte Inc. 2017"; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Freeverb.html"; - -//====================================================== -// -// Freeverb -// Faster version using fixed delays (20% gain) -// -//====================================================== - -// Constant Parameters -//-------------------- - -fixedgain = 0.015; //value of the gain of fxctrl -scalewet = 3.0; -scaledry = 2.0; -scaledamp = 0.4; -scaleroom = 0.28; -offsetroom = 0.7; -initialroom = 0.5; -initialdamp = 0.5; -initialwet = 1.0/scalewet; -initialdry = 0; -initialwidth= 1.0; -initialmode = 0.0; -freezemode = 0.5; -stereospread= 23; -allpassfeed = 0.5; //feedback of the delays used in allpass filters - - -// Filter Parameters -//------------------ - -combtuningL1 = 1116; -combtuningL2 = 1188; -combtuningL3 = 1277; -combtuningL4 = 1356; -combtuningL5 = 1422; -combtuningL6 = 1491; -combtuningL7 = 1557; -combtuningL8 = 1617; - -allpasstuningL1 = 556; -allpasstuningL2 = 441; -allpasstuningL3 = 341; -allpasstuningL4 = 225; - - -// Control Sliders -//-------------------- -// Damp : filters the high frequencies of the echoes (especially active for great values of RoomSize) -// RoomSize : size of the reverberation room -// Dry : original signal -// Wet : reverberated signal - -dampSlider = rkg(vslider("Damp [midi:ctrl 3] [style:knob]",0.5, 0, 1, 0.025))*scaledamp; -roomsizeSlider = rkg(vslider("RoomSize [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 0.025))*scaleroom + offsetroom; -wetSlider = rkg(vslider("Wet [midi:ctrl 2] [style:knob]", 0.3333, 0, 1, 0.025)); -combfeed = roomsizeSlider; - - -// Comb and Allpass filters -//------------------------- - -allpass(dt,fb) = (_,_ <: (*(fb),_:+:@(dt)), -) ~ _ : (!,_); - -comb(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb)); - - -// Reverb components -//------------------ - -monoReverb(fb1, fb2, damp, spread) - = _ <: comb(combtuningL1+spread, fb1, damp), - comb(combtuningL2+spread, fb1, damp), - comb(combtuningL3+spread, fb1, damp), - comb(combtuningL4+spread, fb1, damp), - comb(combtuningL5+spread, fb1, damp), - comb(combtuningL6+spread, fb1, damp), - comb(combtuningL7+spread, fb1, damp), - comb(combtuningL8+spread, fb1, damp) - +> - allpass (allpasstuningL1+spread, fb2) - : allpass (allpasstuningL2+spread, fb2) - : allpass (allpasstuningL3+spread, fb2) - : allpass (allpasstuningL4+spread, fb2) - ; - -monoReverbToStereo(fb1, fb2, damp, spread) - = + <: monoReverb(fb1, fb2, damp, 0) <: _,_; -stereoReverb(fb1, fb2, damp, spread) - = + <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); -monoToStereoReverb(fb1, fb2, damp, spread) - = _ <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); - -// fxctrl : add an input gain and a wet-dry control to a stereo FX -//---------------------------------------------------------------- - -fxctrl(g,w,Fx) = _,_ <: (*(g),*(g) : Fx : *(w),*(w)), *(1-w), *(1-w) +> _,_; - -rbp = 1-int(rsg(vslider("[0] Enable [midi:ctrl 105][style:knob]",0,0,1,1))); - -// Freeverb -//--------- - -//JOS:freeverb = fxctrl(fixedgain, wetSlider, stereoReverb(combfeed, allpassfeed, dampSlider, stereospread)); -freeverb = fxctrl(fixedgain, wetSlider, monoReverbToStereo(combfeed, allpassfeed, dampSlider, stereospread)); - -process = ba.bypass2(rbp,freeverb); diff --git a/dist/examples/SAM/freeverb/freeverbForBrowser.dsp b/dist/examples/SAM/freeverb/freeverbForBrowser.dsp deleted file mode 100644 index 62ae71f4..00000000 --- a/dist/examples/SAM/freeverb/freeverbForBrowser.dsp +++ /dev/null @@ -1,237 +0,0 @@ -import("stdfaust.lib"); - -declare name "freeverb"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c) GRAME 2006 and MoForte Inc. 2017"; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Freeverb.html"; - -//====================================================== -// -// Freeverb -// Faster version using fixed delays (20% gain) -// -//====================================================== - -// Constant Parameters -//-------------------- - -fixedgain = 0.015; //value of the gain of fxctrl -scalewet = 3.0; -scaledry = 2.0; -scaledamp = 0.4; -scaleroom = 0.28; -offsetroom = 0.7; -initialroom = 0.5; -initialdamp = 0.5; -initialwet = 1.0/scalewet; -initialdry = 0; -initialwidth= 1.0; -initialmode = 0.0; -freezemode = 0.5; -stereospread= 23; -allpassfeed = 0.5; //feedback of the delays used in allpass filters - -// Filter Parameters -//------------------ - -combtuningL1 = 1116; -combtuningL2 = 1188; -combtuningL3 = 1277; -combtuningL4 = 1356; -combtuningL5 = 1422; -combtuningL6 = 1491; -combtuningL7 = 1557; -combtuningL8 = 1617; - -allpasstuningL1 = 556; -allpasstuningL2 = 441; -allpasstuningL3 = 341; -allpasstuningL4 = 225; - -// Control Sliders -//-------------------- -// Damp : filters the high frequencies of the echoes (especially active for great values of RoomSize) -// RoomSize : size of the reverberation room -// Dry : original signal -// Wet : reverberated signal - -dampSlider = rkg(vslider("Damp [midi:ctrl 3] [style:knob]",0.5, 0, 1, 0.025))*scaledamp; -roomsizeSlider = rkg(vslider("RoomSize [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 0.025))*scaleroom + offsetroom; -wetSlider = rkg(vslider("Wet [midi:ctrl 2] [style:knob]", 0.3333, 0, 1, 0.025)); -combfeed = roomsizeSlider; - -// Comb and Allpass filters -//------------------------- - -allpass(dt,fb) = (_,_ <: (*(fb),_:+:@(dt)), -) ~ _ : (!,_); - -comb(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb)); - -// Reverb components -//------------------ - -monoReverb(fb1, fb2, damp, spread) - = _ <: comb(combtuningL1+spread, fb1, damp), - comb(combtuningL2+spread, fb1, damp), - comb(combtuningL3+spread, fb1, damp), - comb(combtuningL4+spread, fb1, damp), - comb(combtuningL5+spread, fb1, damp), - comb(combtuningL6+spread, fb1, damp), - comb(combtuningL7+spread, fb1, damp), - comb(combtuningL8+spread, fb1, damp) - +> - allpass (allpasstuningL1+spread, fb2) - : allpass (allpasstuningL2+spread, fb2) - : allpass (allpasstuningL3+spread, fb2) - : allpass (allpasstuningL4+spread, fb2) - ; - -monoReverbToStereo(fb1, fb2, damp, spread) - = + <: monoReverb(fb1, fb2, damp, 0) <: _,_; -stereoReverb(fb1, fb2, damp, spread) - = + <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); -monoToStereoReverb(fb1, fb2, damp, spread) - = _ <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); - -// fxctrl : add an input gain and a wet-dry control to a stereo FX -//---------------------------------------------------------------- - -fxctrl(g,w,Fx) = _,_ <: (*(g),*(g) : Fx : *(w),*(w)), *(1-w), *(1-w) +> _,_; - -rbp = 1-int(rsg(vslider("[0] Enable [midi:ctrl 105][style:knob]",0,0,1,1))); - -// Freeverb -//--------- - -//JOS:freeverb = fxctrl(fixedgain, wetSlider, stereoReverb(combfeed, allpassfeed, dampSlider, stereospread)); -freeverb = fxctrl(fixedgain, wetSlider, monoReverbToStereo(combfeed, allpassfeed, dampSlider, stereospread)); - -process = ba.bypass2(rbp,freeverb); -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/freeverb/layout2.dsp b/dist/examples/SAM/freeverb/layout2.dsp deleted file mode 100644 index 531084cf..00000000 --- a/dist/examples/SAM/freeverb/layout2.dsp +++ /dev/null @@ -1,126 +0,0 @@ -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/sawtooth_synth/sawtooth_synth.dsp b/dist/examples/SAM/sawtooth_synth/sawtooth_synth.dsp deleted file mode 100644 index a6297b80..00000000 --- a/dist/examples/SAM/sawtooth_synth/sawtooth_synth.dsp +++ /dev/null @@ -1,16 +0,0 @@ - -import("stdfaust.lib"); - - -normMIDI(mv) = mv/127.0; -vol = normMIDI(hslider("Ctrl Value IN (Ctrl 1) [midi:ctrl 1]", 60, 0, 127, 1)) ; - - -f = nentry("freq",200,40,2000,0.01); -bend = nentry("bend",1,0,10,0.01) : si.polySmooth(t,0.999,1); -g = nentry("gain",1,0,1,0.01); -t = button("gate"); -freq = f*bend; -envelope = t*g*vol : si.smoo; - -process = os.sawtooth(freq)*envelope <: _,_; diff --git a/dist/examples/SAM/sine_synth/sine_synth.dsp b/dist/examples/SAM/sine_synth/sine_synth.dsp deleted file mode 100644 index 76fe92c9..00000000 --- a/dist/examples/SAM/sine_synth/sine_synth.dsp +++ /dev/null @@ -1,7 +0,0 @@ -// tosc.dsp - test simple oscillator + MIDI bindings -import("stdfaust.lib"); -process = g * a * os.oscrs(f*b) <: _,_; -a = hslider("gain [midi:ctrl 7]",1,0,1,0.001); -f = hslider("freq",392.0,200.0,450.0,0.01); -b = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.001)); -g = button("gate"); diff --git a/dist/examples/SAM/virtualAnalog/layout2.dsp b/dist/examples/SAM/virtualAnalog/layout2.dsp deleted file mode 100644 index 531084cf..00000000 --- a/dist/examples/SAM/virtualAnalog/layout2.dsp +++ /dev/null @@ -1,126 +0,0 @@ -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/virtualAnalog/virtualAnalog.dsp b/dist/examples/SAM/virtualAnalog/virtualAnalog.dsp deleted file mode 100644 index c1e584fd..00000000 --- a/dist/examples/SAM/virtualAnalog/virtualAnalog.dsp +++ /dev/null @@ -1,207 +0,0 @@ -import("stdfaust.lib"); - -// These are now in a separate file ./effects.dsp -// echo = echog(component("echo.dsp")); // ./echo.dsp -// flanger = flg(component("flanger.dsp")); // ./flanger.dsp -// chorus = chg(component("chorus.dsp")); // ./chorus.dsp -// reverb = rg(component("freeverb.dsp")); - -process = main <: _,_; // Now separate: : echo : flanger : chorus : reverb; -main = (signal + extInput : filters : *(ampScaling)) ~ _; -signal = oscs + noise * noiseOff * namp; - -ampScaling = envelopeAmp * masterVolume; // masterVolume is redundant but easier to find -oscs = par(i,3,(oscamp(i+1)*osc(i+1))) :> _; - -controlSelect(1) = osc1(vrockerred); // ("[0] use as LFO")); -octaveSelect(1) = osc1(vslider("[1] Octave1 [midi:ctrl 23] [style:knob]",1,0,5,1):int); // LO, 32', 16', 8', 4', 2' -// Osc1 detunes like Osc2 and Osc3 (unlike in the Minimoog where it would be an expensive extra knob): -detuneOctaves(1) = osc1(vslider("[2] DeTuning1 [units:Octaves] [midi:ctrl 24] [style:knob]",0.0,-1.0,1.0,0.001)); -waveSelect(1) = osc1(vslider("[3] Waveform1 [midi:ctrl 25] [style:knob]",5,0,5,1):int); -amp1Enable = mr1(vslider("[1] On [midi:ctrl 12] [style:knob] [color:blue]",1,0,1,1)); -oscamp(1) = mr1(vslider("[0] Osc1 Amp [midi:ctrl 26] [style:knob]",0.5,0.0,1.0,0.001)) * amp1Enable; - -eei = mr2(vslider("[1] On [midi:ctrl 13] [style:knob] [color:blue]",0,0,1,1)); // External input = MAIN OUTPUT when "off" -sei = mr2(vslider("[0] Ext Input [midi:ctrl 27] [style: knob]",0,0,1.0,0.001)); -extInput(fb,extSig) = fb,extSig : select2(eei) : *(sei) : extClipLED; -extClipLED = _ <: _, (abs : >(0.95) : mr2(vbargraph("[2] Ext Input Clip [style:led]",0,1)):!); -keycLED = attach(mr2(vbargraph("[3] Keyboard Ctl [style:led]",0,1))); - -controlSelect(2) = osc2(vrockerred); // ("[0] use as LFO")); -octaveSelect(2) = osc2(vslider("[1] Octave2 [midi:ctrl 28] [style:knob]",1,0,5,1):int); // LO, 32', 16', 8', 4', 2' -detuneOctaves(2) = osc2(vslider("[2] DeTuning2 [units:Octaves] [midi:ctrl 29] [style:knob]",0.41667,-1.0,1.0,0.001)); -waveSelect(2) = osc2(vslider("[3] Waveform2 [midi:ctrl 30] [style:knob]",5,0,5,1):int); -amp2Enable = mr3(vslider("[1] On [midi:ctrl 14] [style:knob] [color:blue]",1,0,1,1)); -oscamp(2) = mr3(vslider("[0] Osc2 Amp [midi:ctrl 31] [style:knob]",0.5,0.0,1.0,0.001)) * amp2Enable; - -noise = select2(ntype,no.noise,10.0*no.pink_noise); // pink noise needs some "make-up gain" -namp = mr4(vslider("[0] Noise Amp [midi:ctrl 32] [style: knob]",0.0,0.0,1.0,0.001)); -noiseOff = mr4cbg(vslider("[0] On [midi:ctrl 15] [style:knob] [color:blue]",0,0,1,1)); -ntype = mr4cbg(vslider("[1] White/Pink [midi:ctrl 16] [tooltip: Choose either White or Pink Noise] [style: knob] [color:blue]",1,0,1,1)); - -controlSelect(3) = osc3(vrockerred); // ("[0] use as LFO")); -octaveSelect(3) = osc3(vslider("[1] Octave3 [midi:ctrl 33] [style:knob]",0,0,5,1):int); // LO, 32', 16', 8', 4', 2' -detuneOctaves(3) = osc3(vslider("[2] DeTuning3 [units:Octaves] [midi:ctrl 34] [style:knob]",0.3,-1.0,1.0,0.001)); -waveSelect(3) = osc3(vslider("[3] Waveform3 [midi:ctrl 35] [style:knob]",0,0,5,1):int); -amp3Enable = mr5(vslider("[1] On [midi:ctrl 17] [style:knob] [color:blue]",0,0,1,1)); -oscamp(3) = mr5(vslider("[0] Osc3 Amp [midi:ctrl 36] [style:knob]",0.5,0.0,1.0,0.001)) * amp3Enable; - -waveforms(i) = (tri(i), bent(i), saw(i), sq(i), ptm(i), ptn(i)); - -// compute oscillator frequency scale factor, staying in lg(Hz) as much as possible: -modWheelShift = 1.5*modWheel; // Manual says 0 to 1.5 octaves -modulationCenterShift = 0; // Leave this off until triangle-wave modulation is debugged -modulationShift = select2(oscModEnable, 0.0, - modWheelShift * ( modulationCenterShift + (1.0-modulationCenterShift) * oscNoiseModulation )); -octaveShift(i) = -2+int(octaveSelect(i)); -osc3FixedFreq = 369.994; // F# a tritone above middle C -keyFreqGlidedMaybe = select2(osc3Control,osc3FixedFreq,keyFreqGlided); -keyFreqModulatedShifted(3) = keyFreqGlidedMaybe; // osc3 not allowed to FM itself -keyFreqModulatedShifted(i) = keyFreqGlided * pow(2.0, modulationShift); // i=1,2 - -// When disconnected from the keyboard, Osc3 can detune 3 octaves up or down (Pat video): -detuneBoost(3) = select2(osc3Control,3.0,1.0); -detuneBoost(i) = 1.0; // i=1,2 -detuneOctavesFinal(i) = detuneOctaves(i)*detuneBoost(i); - -fBase(i) = keyFreqModulatedShifted(i) * pow(2.0, (masterTuneOctaves+octaveShift(i)+detuneOctavesFinal(i))) - : si.smooth(ba.tau2pole(0.016)); -fLFOBase(i) = 3.0 * pow(2.0, detuneOctavesFinal(i)); // used when osc3 (only) is in LFO mode -lfoMode(i) = (octaveSelect(i) == 0); -f(i) = select2(lfoMode(i), fBase(i), fLFOBase(i)); // lowest range setting is LFO mode for any osc - -// i is 1-based: -osc(i) = ba.selectn(6, int(waveSelect(i)), tri(i), bent(i), saw(i), sq(i), ptm(i), ptn(i)); -tri(i) = select2(lfoMode(i), - os.triangle(f(i)), - os.lf_triangle(f(i))); -bent(i) = 0.5*tri(i) + 0.5*saw(i); // from Minimoog manual -saw(i) = select2(lfoMode(i), - os.sawtooth(f(i)), - os.lf_saw(f(i))); -sq(i) = select2(lfoMode(i), - os.square(f(i)), - os.lf_squarewave(f(i))); -ptm(i) = select2(lfoMode(i), // Note: a Duty knob would be better than these two, or in addition - os.pulsetrain(f(i),0.25), - lf_pulsetrain(f(i),0.25)); -ptn(i) = select2(lfoMode(i), - os.pulsetrain(f(i),0.125), - lf_pulsetrain(f(i),0.125)); - -// Soon to appear in oscillators.lib: -lf_pulsetrain(freq,duty) = 2.0*os.lf_pulsetrainpos(freq,duty) - 1.0; - -import("layout2.dsp"); // follows the Mini Moog front panel: ./layout2.dsp - -filters = ba.bypass1(bp,vcf); // BYPASS WILL GO AWAY (I think you just open it up all the way to bypass): -bp = 0; // VCF is always on -fcLgHz = vcf1(vslider("[1] Corner Freq [unit:Log2(Hz)] - [tooltip: Corner resonance frequency in Log2(Hertz)] - [style: knob] - [midi:ctrl 74]", // Frequency Cutoff (aka Brightness ) - 10.6, log(40.0)/log(2), log(20000.0)/log(2), 0.000001)) // 9 octaves (from Minimoog manual) - //p: 40, 30, 80, 0.01)) - //p: : ba.pianokey2hz - : si.smooth(ba.tau2pole(0.016)); -res = vcf1(vslider("[2] Corner Resonance [midi:ctrl 37] [tooltip: Resonance Q at VCF corner frequency (0 to 1)] - [style: knob]", - 0.7, 0, 1, 0.01)); - -vcfKeyRange = vcf1cbg(vslider("[2] Kbd Ctl [midi:ctrl 38] [tooltip: Keyboard tracking of VCF corner-frequency (0=none, 1=full)] - [style: knob]", - 1, 0, 1, 0.001)); // was in mr2 -vcfModEnable = vcf1cbg(vslider("[1] Filter Mod. [midi:ctrl 19] [color:red] [style:knob] [tooltip: Filter Modulation => Route Modulation Mix output to VCF frequency]",1,0,1,1)); -// Note that VCF has three sources of corner-frequency setting that are added together: -// - Corner Freq knob (40 Hz to 20 kHz) -// - VCF Contour envelope (0 to 4 octaves) -// - Injection 32 of Modulation Mix (0 to 1.5 octaves) -// Manual says maximum vcf sweep spans 0 to 4 octaves: -// Original Knob went to 10, but we're going to 4 so we can say the knob is in "octaves" units: -vcfContourAmountOctaves = vcf1(vslider("[3] Amount of Contour (octaves) [midi:ctrl 39] [style: knob]", 1.2, 0, 4.0, 0.001)); -vcfContourOctaves = vcfContourAmountOctaves * envelopeVCF; // in octaves -// We are assuming that the modulation-mix range for the VCF freq is 1.5 octaves like it is for oscs 1 and 2: -vcfModMixModulationOctaves = select2(vcfModEnable, 0, (1.5 * oscNoiseModulation * modWheel)); // octaves -vcfModulationOctaves = vcfModMixModulationOctaves + vcfContourOctaves; -keyFreqLogHzGlided = log(keyFreqGlided)/log(2.0); // FIXME: Start w freqLogHz not freq so we don't need exp(log()) here -keyShiftOctaves = keyFreqLogHzGlided - log(261.625565)/log(2.0); // FIXME: ARBITRARILY centering on middle C - check device -vcfKeyShiftOctaves = vcfKeyRange * keyShiftOctaves; -modulatedFcLgHz = fcLgHz + vcfModulationOctaves + vcfKeyShiftOctaves; - -fc = min((0.5*ma.SR), pow(2.0,modulatedFcLgHz)); -vcf = ve.moog_vcf_2bn(res,fc); - -// Attack, Decay, and Sustain ranges are set according to the Minimoog manual: -attT60VCF = 0.001 * vcf2(vslider("[0] AttackF [midi:ctrl 40] [tooltip: Attack Time] [unit:ms] [style: knob]",1400,10,10000,1)); -decT60VCF = 0.001 * vcf2(vslider("[0] DecayF [midi:ctrl 41] [tooltip: Decay-to-Sustain Time] [unit:ms] [style: knob]",10,10,10000,1)); -susLvlVCF = 0.01 * vcf2(vslider("[0] SustainF [midi:ctrl 42] [tooltip: Sustain level as percent of max] [style: knob]",80,0,100,0.1)); -decayButton = wg(vslider("Decay [midi:ctrl 20] [tooltip:Envelope Release either Decay value or 0][style:knob]",1,0,1,1):int); // was Staccato -legatoButton = wg(vslider("Glide [midi:ctrl 65] [tooltip: Glide from note to note][style:knob]",1,0,1,1)); // was Legato -relT60VCF = select2(decayButton,0.010,decT60VCF); -envelopeVCF = en.adsre(attT60VCF,decT60VCF,susLvlVCF,relT60VCF,gate); - -// --- Smart Keyboard interface --- - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Keyboard 0 - Number of Keys':'13', - 'Keyboard 1 - Number of Keys':'13', - 'Keyboard 0 - Lowest Key':'72', - 'Keyboard 1 - Lowest Key':'60' -}"; - -// --- functions --- - -// Signal controls: - -keyDownHold = gg(vslider("[0] gateHold [tooltip: lock sustain pedal on (hold gate set at 1)][style:knob]",0,0,1,1)); - -keyDown = gg(button("[1] gate [tooltip: The gate signal is 1 during a - note and 0 otherwise. For MIDI, NoteOn occurs when the gate - transitions from 0 to 1, and NoteOff is an event corresponding - to the gate transition from 1 to 0. The name of this Faust - button must be 'gate'.]")); - -sustain = gg(button("[1] sustain [midi:ctrl 64] - [tooltip: extends the gate (keeps it set to 1)]")); // MIDI only (see smartkeyb doc) - -gate = keyDown + keyDownHold + sustain : min(1); - -attT60 = 0.001 * ng(vslider("[0] AttackA [midi:ctrl 43] [tooltip: Attack Time] [unit:ms] [style: knob]",2,0,5000,0.1)); -decT60 = 0.001 * ng(vslider("[0] DecayA [midi:ctrl 44] [tooltip: Decay-to-Sustain Time] [unit:ms] [style: knob]",10,0,10000,0.1)); -susLvl = 0.01 * ng(vslider("[0] SustainA [midi:ctrl 45] [tooltip: Sustain level as percent of max] [style: knob]",80,0,100,0.1)); -relT60 = select2(decayButton,0.010,decT60); // right? -envelopeAmpNoAM = en.adsre(attT60,decT60,susLvl,relT60,gate); -AMDepth = 0.5; -envelopeAmp = select2(oscModEnable, envelopeAmpNoAM, - envelopeAmpNoAM * (1.0 + AMDepth*modWheel * 0.5 * (1.0+oscNoiseModulation))); - -// Signal Parameters -ampL = volg(vslider("[1] gain [style:knob] [tooltip: Amplitude]",0.2,0,1.0,0.001)); -amp = ampL : si.smoo; // envelopeAmp is multiplied once on entire signal sum -//elecGuitar.dsp values used: -bend = wg(ba.semi2ratio(hslider("[0] bend [style:knob] [midi:pitchwheel]",0,-2,2,0.01))) : si.polySmooth(gate,0.999,1); -//Previous guess: -modWheel = wg(vslider("[1] mod [midi:ctrl 1] [style:knob] [tooltip: PitchModulation amplitude in octaves]", - 0,0,1.0,0.01)) : si.polySmooth(gate,0.999,1); -//p: MIDI requires frequency in Hz, not piano-keys as we had before -// Frequency Range is 0.1 Hz to 20 kHz according to the Minimoog manual: -// MIDI REQUIRES THE FOLLOWING PARAMETER TO BE NAMED 'freq': -keyFreqBent = bend * kg(hslider("[2] freq [unit:Hz] [style:knob]",220,0.1,20000,0.1)); -masterVolume = vg(vslider("MasterVolume [style:knob] [midi:ctrl 7] [tooltip: master volume, MIDI controlled]", - 0.7,0,1,0.001)) - : si.smooth(ba.tau2pole(0.16)); -masterTuneOctaves = dg(vslider("[0] Tune [midi:ctrl 47] [unit:Octaves] [style:knob] - [tooltip: Frequency-shift up or down for all oscillators in Octaves]", 0.0,-1.0,1.0,0.001)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output osc1&2 pitches -glide = gmmg(vslider("[0] Glide [midi:ctrl 5] [unit:sec/octave] [style:knob] [scale:log] - [tooltip: Portamento (frequency-glide) in seconds per octave]", - 0.008,0.001,1.0,0.001)); -legatoPole = select2(legatoButton,0.5,ba.tau2pole(glide*exp(1.0f)/2.0f)); // convert 1/e to 1/2 by slowing down exp -keyFreqGlided = keyFreqBent : si.smooth(legatoPole); - -mmix = gmmg(vslider("[1] Mod. Mix [midi:ctrl 48] [style:knob] [tooltip: Modulation Mix: Osc3 (0) to Noise (1)]", - 0.0,0.0,1.0,0.001)); -oscNoiseModulation = (mmix * noise) + ((1.0-mmix) * osc(3)); // noise amplitude and off-switch ignored here -oscModEnable = dsg(vslider("[0] Osc. Mod. [midi:ctrl 22] [color:red] [style:knob] [tooltip:Oscillator Modulation adds Modulation Mix output to osc1&2 frequencies",1,0,1,1)); // any offset? -osc3Control = dsg(vslider("[1] Osc. 3 Ctl [midi:ctrl 9] [color:red] [style:knob] [tooltip:Oscillator 3 frequency tracks the keyboard if on, else not",0,0,1,1):int); diff --git a/dist/examples/SAM/virtualAnalog/virtualAnalog.touchosc b/dist/examples/SAM/virtualAnalog/virtualAnalog.touchosc deleted file mode 100644 index be1c303b..00000000 Binary files a/dist/examples/SAM/virtualAnalog/virtualAnalog.touchosc and /dev/null differ diff --git a/dist/examples/SAM/virtualAnalog/virtualAnalogForBrowser.dsp b/dist/examples/SAM/virtualAnalog/virtualAnalogForBrowser.dsp deleted file mode 100644 index 12fcd3d5..00000000 --- a/dist/examples/SAM/virtualAnalog/virtualAnalogForBrowser.dsp +++ /dev/null @@ -1,331 +0,0 @@ -import("stdfaust.lib"); - -// These are now in a separate file ./effects.dsp -// echo = echog(component("echo.dsp")); // ./echo.dsp -// flanger = flg(component("flanger.dsp")); // ./flanger.dsp -// chorus = chg(component("chorus.dsp")); // ./chorus.dsp -// reverb = rg(component("freeverb.dsp")); - -process = main <: _,_; // Now separate: : echo : flanger : chorus : reverb; -main = (signal + attach(extInput,amp) : filters : *(ampScaling)) ~ _; -signal = oscs + noise * noiseOff * namp; - -ampScaling = envelopeAmp * masterVolume; // masterVolume is redundant but easier to find -oscs = par(i,3,(oscamp(i+1)*osc(i+1))) :> _; - -controlSelect(1) = osc1(vrockerred); // ("[0] use as LFO")); -octaveSelect(1) = osc1(vslider("[1] Octave1 [midi:ctrl 23] [style:knob]",1,0,5,1):int); // LO, 32', 16', 8', 4', 2' -// Osc1 detunes like Osc2 and Osc3 (unlike in the Minimoog where it would be an expensive extra knob): -detuneOctaves(1) = osc1(vslider("[2] DeTuning1 [units:Octaves] [midi:ctrl 24] [style:knob]",0.0,-1.0,1.0,0.001)); -waveSelect(1) = osc1(vslider("[3] Waveform1 [midi:ctrl 25] [style:knob]",5,0,5,1):int); -amp1Enable = mr1(vslider("[1] On [midi:ctrl 12] [style:knob] [color:blue]",1,0,1,1)); -oscamp(1) = mr1(vslider("[0] Osc1 Amp [midi:ctrl 26] [style:knob]",0.5,0.0,1.0,0.001)) * amp1Enable; - -eei = mr2(vslider("[1] On [midi:ctrl 13] [style:knob] [color:blue]",0,0,1,1)); // External input = MAIN OUTPUT when "off" -sei = mr2(vslider("[0] Ext Input [midi:ctrl 27] [style: knob]",0,0,1.0,0.001)); -extInput(fb,extSig) = fb,extSig : select2(eei) : *(sei) : extClipLED; -extClipLED = _ <: _, (abs : >(0.95) : mr2(vbargraph("[2] Ext Input Clip [style:led]",0,1)):!); -keycLED = attach(mr2(vbargraph("[3] Keyboard Ctl [style:led]",0,1))); - -controlSelect(2) = osc2(vrockerred); // ("[0] use as LFO")); -octaveSelect(2) = osc2(vslider("[1] Octave2 [midi:ctrl 28] [style:knob]",1,0,5,1):int); // LO, 32', 16', 8', 4', 2' -detuneOctaves(2) = osc2(vslider("[2] DeTuning2 [units:Octaves] [midi:ctrl 29] [style:knob]",0.41667,-1.0,1.0,0.001)); -waveSelect(2) = osc2(vslider("[3] Waveform2 [midi:ctrl 30] [style:knob]",5,0,5,1):int); -amp2Enable = mr3(vslider("[1] On [midi:ctrl 14] [style:knob] [color:blue]",1,0,1,1)); -oscamp(2) = mr3(vslider("[0] Osc2 Amp [midi:ctrl 31] [style:knob]",0.5,0.0,1.0,0.001)) * amp2Enable; - -noise = select2(ntype,no.noise,10.0*no.pink_noise); // pink noise needs some "make-up gain" -namp = mr4(vslider("[0] Noise Amp [midi:ctrl 32] [style: knob]",0.0,0.0,1.0,0.001)); -noiseOff = mr4cbg(vslider("[0] On [midi:ctrl 15] [style:knob] [color:blue]",0,0,1,1)); -ntype = mr4cbg(vslider("[1] White/Pink [midi:ctrl 16] [tooltip: Choose either White or Pink Noise] [style: knob] [color:blue]",1,0,1,1)); - -controlSelect(3) = osc3(vrockerred); // ("[0] use as LFO")); -octaveSelect(3) = osc3(vslider("[1] Octave3 [midi:ctrl 33] [style:knob]",0,0,5,1):int); // LO, 32', 16', 8', 4', 2' -detuneOctaves(3) = osc3(vslider("[2] DeTuning3 [units:Octaves] [midi:ctrl 34] [style:knob]",0.3,-1.0,1.0,0.001)); -waveSelect(3) = osc3(vslider("[3] Waveform3 [midi:ctrl 35] [style:knob]",0,0,5,1):int); -amp3Enable = mr5(vslider("[1] On [midi:ctrl 17] [style:knob] [color:blue]",0,0,1,1)); -oscamp(3) = mr5(vslider("[0] Osc3 Amp [midi:ctrl 36] [style:knob]",0.5,0.0,1.0,0.001)) * amp3Enable; - -waveforms(i) = (tri(i), bent(i), saw(i), sq(i), ptm(i), ptn(i)); - -// compute oscillator frequency scale factor, staying in lg(Hz) as much as possible: -modWheelShift = 1.5*modWheel; // Manual says 0 to 1.5 octaves -modulationCenterShift = 0; // Leave this off until triangle-wave modulation is debugged -modulationShift = select2(oscModEnable, 0.0, - modWheelShift * ( modulationCenterShift + (1.0-modulationCenterShift) * oscNoiseModulation )); -octaveShift(i) = -2+int(octaveSelect(i)); -osc3FixedFreq = 369.994; // F# a tritone above middle C -keyFreqGlidedMaybe = select2(osc3Control,osc3FixedFreq,keyFreqGlided); -keyFreqModulatedShifted(3) = keyFreqGlidedMaybe; // osc3 not allowed to FM itself -keyFreqModulatedShifted(i) = keyFreqGlided * pow(2.0, modulationShift); // i=1,2 - -// When disconnected from the keyboard, Osc3 can detune 3 octaves up or down (Pat video): -detuneBoost(3) = select2(osc3Control,3.0,1.0); -detuneBoost(i) = 1.0; // i=1,2 -detuneOctavesFinal(i) = detuneOctaves(i)*detuneBoost(i); - -fBase(i) = keyFreqModulatedShifted(i) * pow(2.0, (masterTuneOctaves+octaveShift(i)+detuneOctavesFinal(i))) - : si.smooth(ba.tau2pole(0.016)); -fLFOBase(i) = 3.0 * pow(2.0, detuneOctavesFinal(i)); // used when osc3 (only) is in LFO mode -lfoMode(i) = (octaveSelect(i) == 0); -f(i) = select2(lfoMode(i), fBase(i), fLFOBase(i)); // lowest range setting is LFO mode for any osc - -// i is 1-based: -osc(i) = ba.selectn(6, int(waveSelect(i)), tri(i), bent(i), saw(i), sq(i), ptm(i), ptn(i)); -tri(i) = select2(lfoMode(i), - os.triangle(f(i)), - os.lf_triangle(f(i))); -bent(i) = 0.5*tri(i) + 0.5*saw(i); // from Minimoog manual -saw(i) = select2(lfoMode(i), - os.sawtooth(f(i)), - os.lf_saw(f(i))); -sq(i) = select2(lfoMode(i), - os.square(f(i)), - os.lf_squarewave(f(i))); -ptm(i) = select2(lfoMode(i), // Note: a Duty knob would be better than these two, or in addition - os.pulsetrain(f(i),0.25), - lf_pulsetrain(f(i),0.25)); -ptn(i) = select2(lfoMode(i), - os.pulsetrain(f(i),0.125), - lf_pulsetrain(f(i),0.125)); - -// Soon to appear in oscillators.lib: -lf_pulsetrain(freq,duty) = 2.0*os.lf_pulsetrainpos(freq,duty) - 1.0; - -filters = ba.bypass1(bp,vcf); // BYPASS WILL GO AWAY (I think you just open it up all the way to bypass): -bp = 0; // VCF is always on -fcLgHz = vcf1(vslider("[1] Corner Freq [unit:Log2(Hz)] - [tooltip: Corner resonance frequency in Log2(Hertz)] - [style: knob] - [midi:ctrl 74]", // Frequency Cutoff (aka Brightness ) - 10.6, log(40.0)/log(2), log(20000.0)/log(2), 0.000001)) // 9 octaves (from Minimoog manual) - //p: 40, 30, 80, 0.01)) - //p: : ba.pianokey2hz - : si.smooth(ba.tau2pole(0.016)); -res = vcf1(vslider("[2] Corner Resonance [midi:ctrl 37] [tooltip: Resonance Q at VCF corner frequency (0 to 1)] - [style: knob]", - 0.7, 0, 1, 0.01)); - -vcfKeyRange = vcf1cbg(vslider("[2] Kbd Ctl [midi:ctrl 38] [tooltip: Keyboard tracking of VCF corner-frequency (0=none, 1=full)] - [style: knob]", - 1, 0, 1, 0.001)); // was in mr2 -vcfModEnable = vcf1cbg(vslider("[1] Filter Mod. [midi:ctrl 19] [color:red] [style:knob] [tooltip: Filter Modulation => Route Modulation Mix output to VCF frequency]",1,0,1,1)); -// Note that VCF has three sources of corner-frequency setting that are added together: -// - Corner Freq knob (40 Hz to 20 kHz) -// - VCF Contour envelope (0 to 4 octaves) -// - Injection 32 of Modulation Mix (0 to 1.5 octaves) -// Manual says maximum vcf sweep spans 0 to 4 octaves: -// Original Knob went to 10, but we're going to 4 so we can say the knob is in "octaves" units: -vcfContourAmountOctaves = vcf1(vslider("[3] Amount of Contour (octaves) [midi:ctrl 39] [style: knob]", 1.2, 0, 4.0, 0.001)); -vcfContourOctaves = vcfContourAmountOctaves * envelopeVCF; // in octaves -// We are assuming that the modulation-mix range for the VCF freq is 1.5 octaves like it is for oscs 1 and 2: -vcfModMixModulationOctaves = select2(vcfModEnable, 0, (1.5 * oscNoiseModulation * modWheel)); // octaves -vcfModulationOctaves = vcfModMixModulationOctaves + vcfContourOctaves; -keyFreqLogHzGlided = log(keyFreqGlided)/log(2.0); // FIXME: Start w freqLogHz not freq so we don't need exp(log()) here -keyShiftOctaves = keyFreqLogHzGlided - log(261.625565)/log(2.0); // FIXME: ARBITRARILY centering on middle C - check device -vcfKeyShiftOctaves = vcfKeyRange * keyShiftOctaves; -modulatedFcLgHz = fcLgHz + vcfModulationOctaves + vcfKeyShiftOctaves; - -fc = min((0.5*ma.SR), pow(2.0,modulatedFcLgHz)); -vcf = ve.moog_vcf_2bn(res,fc); - -// Attack, Decay, and Sustain ranges are set according to the Minimoog manual: -attT60VCF = 0.001 * vcf2(vslider("[0] AttackF [midi:ctrl 40] [tooltip: Attack Time] [unit:ms] [style: knob]",1400,10,10000,1)); -decT60VCF = 0.001 * vcf2(vslider("[0] DecayF [midi:ctrl 41] [tooltip: Decay-to-Sustain Time] [unit:ms] [style: knob]",10,10,10000,1)); -susLvlVCF = 0.01 * vcf2(vslider("[0] SustainF [midi:ctrl 42] [tooltip: Sustain level as percent of max] [style: knob]",80,0,100,0.1)); -decayButton = wg(vslider("Decay [midi:ctrl 20] [tooltip:Envelope Release either Decay value or 0][style:knob]",1,0,1,1):int); // was Staccato -legatoButton = wg(vslider("Glide [midi:ctrl 65] [tooltip: Glide from note to note][style:knob]",1,0,1,1)); // was Legato -relT60VCF = select2(decayButton,0.010,decT60VCF); -envelopeVCF = en.adsre(attT60VCF,decT60VCF,susLvlVCF,relT60VCF,gate); - -// --- Smart Keyboard interface --- - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Keyboard 0 - Number of Keys':'13', - 'Keyboard 1 - Number of Keys':'13', - 'Keyboard 0 - Lowest Key':'72', - 'Keyboard 1 - Lowest Key':'60' -}"; - -// --- functions --- - -// Signal controls: - -keyDownHold = gg(vslider("[0] gateHold [tooltip: lock sustain pedal on (hold gate set at 1)][style:knob]",0,0,1,1)); - -keyDown = gg(button("[1] gate [tooltip: The gate signal is 1 during a - note and 0 otherwise. For MIDI, NoteOn occurs when the gate - transitions from 0 to 1, and NoteOff is an event corresponding - to the gate transition from 1 to 0. The name of this Faust - button must be 'gate'.]")); - -sustain = gg(button("[1] sustain [midi:ctrl 64] - [tooltip: extends the gate (keeps it set to 1)]")); // MIDI only (see smartkeyb doc) - -gate = keyDown + keyDownHold + sustain : min(1); - -attT60 = 0.001 * ng(vslider("[0] AttackA [midi:ctrl 43] [tooltip: Attack Time] [unit:ms] [style: knob]",2,0,5000,0.1)); -decT60 = 0.001 * ng(vslider("[0] DecayA [midi:ctrl 44] [tooltip: Decay-to-Sustain Time] [unit:ms] [style: knob]",10,0,10000,0.1)); -susLvl = 0.01 * ng(vslider("[0] SustainA [midi:ctrl 45] [tooltip: Sustain level as percent of max] [style: knob]",80,0,100,0.1)); -relT60 = select2(decayButton,0.010,decT60); // right? -envelopeAmpNoAM = en.adsre(attT60,decT60,susLvl,relT60,gate); -AMDepth = 0.5; -envelopeAmp = select2(oscModEnable, envelopeAmpNoAM, - envelopeAmpNoAM * (1.0 + AMDepth*modWheel * 0.5 * (1.0+oscNoiseModulation))); - -// Signal Parameters -ampL = volg(vslider("[1] gain [style:knob] [tooltip: Amplitude]",0.2,0,1.0,0.001)); -amp = ampL : si.smoo; // envelopeAmp is multiplied once on entire signal sum -//elecGuitar.dsp values used: -bend = wg(ba.semi2ratio(hslider("[0] bend [style:knob] [midi:pitchwheel]",0,-2,2,0.01))) : si.polySmooth(gate,0.999,1); -//Previous guess: -modWheel = wg(vslider("[1] mod [midi:ctrl 1] [style:knob] [tooltip: PitchModulation amplitude in octaves]", - 0,0,1.0,0.01)) : si.polySmooth(gate,0.999,1); -//p: MIDI requires frequency in Hz, not piano-keys as we had before -// Frequency Range is 0.1 Hz to 20 kHz according to the Minimoog manual: -// MIDI REQUIRES THE FOLLOWING PARAMETER TO BE NAMED 'freq': -keyFreqBent = bend * kg(hslider("[2] freq [unit:Hz] [style:knob]",220,0.1,20000,0.1)); -masterVolume = vg(vslider("MasterVolume [style:knob] [midi:ctrl 7] [tooltip: master volume, MIDI controlled]", - 0.7,0,1,0.001)) - : si.smooth(ba.tau2pole(0.16)); -masterTuneOctaves = dg(vslider("[0] Tune [midi:ctrl 47] [unit:Octaves] [style:knob] - [tooltip: Frequency-shift up or down for all oscillators in Octaves]", 0.0,-1.0,1.0,0.001)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output osc1&2 pitches -glide = gmmg(vslider("[0] Glide [midi:ctrl 5] [unit:sec/octave] [style:knob] [scale:log] - [tooltip: Portamento (frequency-glide) in seconds per octave]", - 0.008,0.001,1.0,0.001)); -legatoPole = select2(legatoButton,0.5,ba.tau2pole(glide*exp(1.0f)/2.0f)); // convert 1/e to 1/2 by slowing down exp -keyFreqGlided = keyFreqBent : si.smooth(legatoPole); - -mmix = gmmg(vslider("[1] Mod. Mix [midi:ctrl 48] [style:knob] [tooltip: Modulation Mix: Osc3 (0) to Noise (1)]", - 0.0,0.0,1.0,0.001)); -oscNoiseModulation = (mmix * noise) + ((1.0-mmix) * osc(3)); // noise amplitude and off-switch ignored here -oscModEnable = dsg(vslider("[0] Osc. Mod. [midi:ctrl 22] [color:red] [style:knob] [tooltip:Oscillator Modulation adds Modulation Mix output to osc1&2 frequencies",1,0,1,1)); // any offset? -osc3Control = dsg(vslider("[1] Osc. 3 Ctl [midi:ctrl 9] [color:red] [style:knob] [tooltip:Oscillator 3 frequency tracks the keyboard if on, else not",0,0,1,1):int); -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/virtualAnalog/virtualAnalogWithEffectsForBrowser.dsp b/dist/examples/SAM/virtualAnalog/virtualAnalogWithEffectsForBrowser.dsp deleted file mode 100644 index 0afdf2b6..00000000 --- a/dist/examples/SAM/virtualAnalog/virtualAnalogWithEffectsForBrowser.dsp +++ /dev/null @@ -1,588 +0,0 @@ -import("stdfaust.lib"); - -// These are now in a separate file ./effects.dsp -// echo = echog(component("echo.dsp")); // ./echo.dsp -// flanger = flg(component("flanger.dsp")); // ./flanger.dsp -// chorus = chg(component("chorus.dsp")); // ./chorus.dsp -// reverb = rg(component("freeverb.dsp")); - -process = main <: _,_; // Now separate: : echo : flanger : chorus : reverb; -main = (signal + attach(extInput,amp) : filters : *(ampScaling)) ~ _; -signal = oscs + noise * noiseOff * namp; - -ampScaling = envelopeAmp * masterVolume; // masterVolume is redundant but easier to find -oscs = par(i,3,(oscamp(i+1)*osc(i+1))) :> _; - -controlSelect(1) = osc1(vrockerred); // ("[0] use as LFO")); -octaveSelect(1) = osc1(vslider("[1] Octave1 [midi:ctrl 23] [style:knob]",1,0,5,1):int); // LO, 32', 16', 8', 4', 2' -// Osc1 detunes like Osc2 and Osc3 (unlike in the Minimoog where it would be an expensive extra knob): -detuneOctaves(1) = osc1(vslider("[2] DeTuning1 [units:Octaves] [midi:ctrl 24] [style:knob]",0.0,-1.0,1.0,0.001)); -waveSelect(1) = osc1(vslider("[3] Waveform1 [midi:ctrl 25] [style:knob]",5,0,5,1):int); -amp1Enable = mr1(vslider("[1] On [midi:ctrl 12] [style:knob] [color:blue]",1,0,1,1)); -oscamp(1) = mr1(vslider("[0] Osc1 Amp [midi:ctrl 26] [style:knob]",0.5,0.0,1.0,0.001)) * amp1Enable; - -eei = mr2(vslider("[1] On [midi:ctrl 13] [style:knob] [color:blue]",0,0,1,1)); // External input = MAIN OUTPUT when "off" -sei = mr2(vslider("[0] Ext Input [midi:ctrl 27] [style: knob]",0,0,1.0,0.001)); -extInput(fb,extSig) = fb,extSig : select2(eei) : *(sei) : extClipLED; -extClipLED = _ <: _, (abs : >(0.95) : mr2(vbargraph("[2] Ext Input Clip [style:led]",0,1)):!); -keycLED = attach(mr2(vbargraph("[3] Keyboard Ctl [style:led]",0,1))); - -controlSelect(2) = osc2(vrockerred); // ("[0] use as LFO")); -octaveSelect(2) = osc2(vslider("[1] Octave2 [midi:ctrl 28] [style:knob]",1,0,5,1):int); // LO, 32', 16', 8', 4', 2' -detuneOctaves(2) = osc2(vslider("[2] DeTuning2 [units:Octaves] [midi:ctrl 29] [style:knob]",0.41667,-1.0,1.0,0.001)); -waveSelect(2) = osc2(vslider("[3] Waveform2 [midi:ctrl 30] [style:knob]",5,0,5,1):int); -amp2Enable = mr3(vslider("[1] On [midi:ctrl 14] [style:knob] [color:blue]",1,0,1,1)); -oscamp(2) = mr3(vslider("[0] Osc2 Amp [midi:ctrl 31] [style:knob]",0.5,0.0,1.0,0.001)) * amp2Enable; - -noise = select2(ntype,no.noise,10.0*no.pink_noise); // pink noise needs some "make-up gain" -namp = mr4(vslider("[0] Noise Amp [midi:ctrl 32] [style: knob]",0.0,0.0,1.0,0.001)); -noiseOff = mr4cbg(vslider("[0] On [midi:ctrl 15] [style:knob] [color:blue]",0,0,1,1)); -ntype = mr4cbg(vslider("[1] White/Pink [midi:ctrl 16] [tooltip: Choose either White or Pink Noise] [style: knob] [color:blue]",1,0,1,1)); - -controlSelect(3) = osc3(vrockerred); // ("[0] use as LFO")); -octaveSelect(3) = osc3(vslider("[1] Octave3 [midi:ctrl 33] [style:knob]",0,0,5,1):int); // LO, 32', 16', 8', 4', 2' -detuneOctaves(3) = osc3(vslider("[2] DeTuning3 [units:Octaves] [midi:ctrl 34] [style:knob]",0.3,-1.0,1.0,0.001)); -waveSelect(3) = osc3(vslider("[3] Waveform3 [midi:ctrl 35] [style:knob]",0,0,5,1):int); -amp3Enable = mr5(vslider("[1] On [midi:ctrl 17] [style:knob] [color:blue]",0,0,1,1)); -oscamp(3) = mr5(vslider("[0] Osc3 Amp [midi:ctrl 36] [style:knob]",0.5,0.0,1.0,0.001)) * amp3Enable; - -waveforms(i) = (tri(i), bent(i), saw(i), sq(i), ptm(i), ptn(i)); - -// compute oscillator frequency scale factor, staying in lg(Hz) as much as possible: -modWheelShift = 1.5*modWheel; // Manual says 0 to 1.5 octaves -modulationCenterShift = 0; // Leave this off until triangle-wave modulation is debugged -modulationShift = select2(oscModEnable, 0.0, - modWheelShift * ( modulationCenterShift + (1.0-modulationCenterShift) * oscNoiseModulation )); -octaveShift(i) = -2+int(octaveSelect(i)); -osc3FixedFreq = 369.994; // F# a tritone above middle C -keyFreqGlidedMaybe = select2(osc3Control,osc3FixedFreq,keyFreqGlided); -keyFreqModulatedShifted(3) = keyFreqGlidedMaybe; // osc3 not allowed to FM itself -keyFreqModulatedShifted(i) = keyFreqGlided * pow(2.0, modulationShift); // i=1,2 - -// When disconnected from the keyboard, Osc3 can detune 3 octaves up or down (Pat video): -detuneBoost(3) = select2(osc3Control,3.0,1.0); -detuneBoost(i) = 1.0; // i=1,2 -detuneOctavesFinal(i) = detuneOctaves(i)*detuneBoost(i); - -fBase(i) = keyFreqModulatedShifted(i) * pow(2.0, (masterTuneOctaves+octaveShift(i)+detuneOctavesFinal(i))) - : si.smooth(ba.tau2pole(0.016)); -fLFOBase(i) = 3.0 * pow(2.0, detuneOctavesFinal(i)); // used when osc3 (only) is in LFO mode -lfoMode(i) = (octaveSelect(i) == 0); -f(i) = select2(lfoMode(i), fBase(i), fLFOBase(i)); // lowest range setting is LFO mode for any osc - -// i is 1-based: -osc(i) = ba.selectn(6, int(waveSelect(i)), tri(i), bent(i), saw(i), sq(i), ptm(i), ptn(i)); -tri(i) = select2(lfoMode(i), - os.triangle(f(i)), - os.lf_triangle(f(i))); -bent(i) = 0.5*tri(i) + 0.5*saw(i); // from Minimoog manual -saw(i) = select2(lfoMode(i), - os.sawtooth(f(i)), - os.lf_saw(f(i))); -sq(i) = select2(lfoMode(i), - os.square(f(i)), - os.lf_squarewave(f(i))); -ptm(i) = select2(lfoMode(i), // Note: a Duty knob would be better than these two, or in addition - os.pulsetrain(f(i),0.25), - lf_pulsetrain(f(i),0.25)); -ptn(i) = select2(lfoMode(i), - os.pulsetrain(f(i),0.125), - lf_pulsetrain(f(i),0.125)); - -// Soon to appear in oscillators.lib: -lf_pulsetrain(freq,duty) = 2.0*os.lf_pulsetrainpos(freq,duty) - 1.0; - -filters = ba.bypass1(bp,vcf); // BYPASS WILL GO AWAY (I think you just open it up all the way to bypass): -bp = 0; // VCF is always on -fcLgHz = vcf1(vslider("[1] Corner Freq [unit:Log2(Hz)] - [tooltip: Corner resonance frequency in Log2(Hertz)] - [style: knob] - [midi:ctrl 74]", // Frequency Cutoff (aka Brightness ) - 10.6, log(40.0)/log(2), log(20000.0)/log(2), 0.000001)) // 9 octaves (from Minimoog manual) - //p: 40, 30, 80, 0.01)) - //p: : ba.pianokey2hz - : si.smooth(ba.tau2pole(0.016)); -res = vcf1(vslider("[2] Corner Resonance [midi:ctrl 37] [tooltip: Resonance Q at VCF corner frequency (0 to 1)] - [style: knob]", - 0.7, 0, 1, 0.01)); - -vcfKeyRange = vcf1cbg(vslider("[2] Kbd Ctl [midi:ctrl 38] [tooltip: Keyboard tracking of VCF corner-frequency (0=none, 1=full)] - [style: knob]", - 1, 0, 1, 0.001)); // was in mr2 -vcfModEnable = vcf1cbg(vslider("[1] Filter Mod. [midi:ctrl 19] [color:red] [style:knob] [tooltip: Filter Modulation => Route Modulation Mix output to VCF frequency]",1,0,1,1)); -// Note that VCF has three sources of corner-frequency setting that are added together: -// - Corner Freq knob (40 Hz to 20 kHz) -// - VCF Contour envelope (0 to 4 octaves) -// - Injection 32 of Modulation Mix (0 to 1.5 octaves) -// Manual says maximum vcf sweep spans 0 to 4 octaves: -// Original Knob went to 10, but we're going to 4 so we can say the knob is in "octaves" units: -vcfContourAmountOctaves = vcf1(vslider("[3] Amount of Contour (octaves) [midi:ctrl 39] [style: knob]", 1.2, 0, 4.0, 0.001)); -vcfContourOctaves = vcfContourAmountOctaves * envelopeVCF; // in octaves -// We are assuming that the modulation-mix range for the VCF freq is 1.5 octaves like it is for oscs 1 and 2: -vcfModMixModulationOctaves = select2(vcfModEnable, 0, (1.5 * oscNoiseModulation * modWheel)); // octaves -vcfModulationOctaves = vcfModMixModulationOctaves + vcfContourOctaves; -keyFreqLogHzGlided = log(keyFreqGlided)/log(2.0); // FIXME: Start w freqLogHz not freq so we don't need exp(log()) here -keyShiftOctaves = keyFreqLogHzGlided - log(261.625565)/log(2.0); // FIXME: ARBITRARILY centering on middle C - check device -vcfKeyShiftOctaves = vcfKeyRange * keyShiftOctaves; -modulatedFcLgHz = fcLgHz + vcfModulationOctaves + vcfKeyShiftOctaves; - -fc = min((0.5*ma.SR), pow(2.0,modulatedFcLgHz)); -vcf = ve.moog_vcf_2bn(res,fc); - -// Attack, Decay, and Sustain ranges are set according to the Minimoog manual: -attT60VCF = 0.001 * vcf2(vslider("[0] AttackF [midi:ctrl 40] [tooltip: Attack Time] [unit:ms] [style: knob]",1400,10,10000,1)); -decT60VCF = 0.001 * vcf2(vslider("[0] DecayF [midi:ctrl 41] [tooltip: Decay-to-Sustain Time] [unit:ms] [style: knob]",10,10,10000,1)); -susLvlVCF = 0.01 * vcf2(vslider("[0] SustainF [midi:ctrl 42] [tooltip: Sustain level as percent of max] [style: knob]",80,0,100,0.1)); -decayButton = wg(vslider("Decay [midi:ctrl 20] [tooltip:Envelope Release either Decay value or 0][style:knob]",1,0,1,1):int); // was Staccato -legatoButton = wg(vslider("Glide [midi:ctrl 65] [tooltip: Glide from note to note][style:knob]",1,0,1,1)); // was Legato -relT60VCF = select2(decayButton,0.010,decT60VCF); -envelopeVCF = en.adsre(attT60VCF,decT60VCF,susLvlVCF,relT60VCF,gate); - -// --- Smart Keyboard interface --- - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Keyboard 0 - Number of Keys':'13', - 'Keyboard 1 - Number of Keys':'13', - 'Keyboard 0 - Lowest Key':'72', - 'Keyboard 1 - Lowest Key':'60' -}"; - -// --- functions --- - -// Signal controls: - -keyDownHold = gg(vslider("[0] gateHold [tooltip: lock sustain pedal on (hold gate set at 1)][style:knob]",0,0,1,1)); - -keyDown = gg(button("[1] gate [tooltip: The gate signal is 1 during a - note and 0 otherwise. For MIDI, NoteOn occurs when the gate - transitions from 0 to 1, and NoteOff is an event corresponding - to the gate transition from 1 to 0. The name of this Faust - button must be 'gate'.]")); - -sustain = gg(button("[1] sustain [midi:ctrl 64] - [tooltip: extends the gate (keeps it set to 1)]")); // MIDI only (see smartkeyb doc) - -gate = keyDown + keyDownHold + sustain : min(1); - -attT60 = 0.001 * ng(vslider("[0] AttackA [midi:ctrl 43] [tooltip: Attack Time] [unit:ms] [style: knob]",2,0,5000,0.1)); -decT60 = 0.001 * ng(vslider("[0] DecayA [midi:ctrl 44] [tooltip: Decay-to-Sustain Time] [unit:ms] [style: knob]",10,0,10000,0.1)); -susLvl = 0.01 * ng(vslider("[0] SustainA [midi:ctrl 45] [tooltip: Sustain level as percent of max] [style: knob]",80,0,100,0.1)); -relT60 = select2(decayButton,0.010,decT60); // right? -envelopeAmpNoAM = en.adsre(attT60,decT60,susLvl,relT60,gate); -AMDepth = 0.5; -envelopeAmp = select2(oscModEnable, envelopeAmpNoAM, - envelopeAmpNoAM * (1.0 + AMDepth*modWheel * 0.5 * (1.0+oscNoiseModulation))); - -// Signal Parameters -ampL = volg(vslider("[1] gain [style:knob] [tooltip: Amplitude]",0.2,0,1.0,0.001)); -amp = ampL : si.smoo; // envelopeAmp is multiplied once on entire signal sum -//elecGuitar.dsp values used: -bend = wg(ba.semi2ratio(hslider("[0] bend [style:knob] [midi:pitchwheel]",0,-2,2,0.01))) : si.polySmooth(gate,0.999,1); -//Previous guess: -modWheel = wg(vslider("[1] mod [midi:ctrl 1] [style:knob] [tooltip: PitchModulation amplitude in octaves]", - 0,0,1.0,0.01)) : si.polySmooth(gate,0.999,1); -//p: MIDI requires frequency in Hz, not piano-keys as we had before -// Frequency Range is 0.1 Hz to 20 kHz according to the Minimoog manual: -// MIDI REQUIRES THE FOLLOWING PARAMETER TO BE NAMED 'freq': -keyFreqBent = bend * kg(hslider("[2] freq [unit:Hz] [style:knob]",220,0.1,20000,0.1)); -masterVolume = vg(vslider("MasterVolume [style:knob] [midi:ctrl 7] [tooltip: master volume, MIDI controlled]", - 0.7,0,1,0.001)) - : si.smooth(ba.tau2pole(0.16)); -masterTuneOctaves = dg(vslider("[0] Tune [midi:ctrl 47] [unit:Octaves] [style:knob] - [tooltip: Frequency-shift up or down for all oscillators in Octaves]", 0.0,-1.0,1.0,0.001)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output osc1&2 pitches -glide = gmmg(vslider("[0] Glide [midi:ctrl 5] [unit:sec/octave] [style:knob] [scale:log] - [tooltip: Portamento (frequency-glide) in seconds per octave]", - 0.008,0.001,1.0,0.001)); -legatoPole = select2(legatoButton,0.5,ba.tau2pole(glide*exp(1.0f)/2.0f)); // convert 1/e to 1/2 by slowing down exp -keyFreqGlided = keyFreqBent : si.smooth(legatoPole); - -mmix = gmmg(vslider("[1] Mod. Mix [midi:ctrl 48] [style:knob] [tooltip: Modulation Mix: Osc3 (0) to Noise (1)]", - 0.0,0.0,1.0,0.001)); -oscNoiseModulation = (mmix * noise) + ((1.0-mmix) * osc(3)); // noise amplitude and off-switch ignored here -oscModEnable = dsg(vslider("[0] Osc. Mod. [midi:ctrl 22] [color:red] [style:knob] [tooltip:Oscillator Modulation adds Modulation Mix output to osc1&2 frequencies",1,0,1,1)); // any offset? -osc3Control = dsg(vslider("[1] Osc. 3 Ctl [midi:ctrl 9] [color:red] [style:knob] [tooltip:Oscillator 3 frequency tracks the keyboard if on, else not",0,0,1,1):int); - -effect = _,_ : + -: component_echo -: component_flanger -: component_chorus -: component_freeverb; - -component_echo = environment { - -echo_group(x) = x; // Let layout2.dsp lay us out -knobs_group(x) = ekg(x); -switches_group(x) = esg(x); - -dmax = 32768; // one and done -dmaxs = float(dmax)/44100.0; - -Nnines = 1.8; // Increase until you get the desired maximum amount of smoothing when fbs==1 -//fastpow2 = ffunction(float fastpow2(float), "fast_pow2.h", ""); -fbspr(fbs) = 1.0 - pow(2.0, -3.33219*Nnines*fbs); // pole radius of feedback smoother -inputSelect(gi) = _,0 : select2(gi); -echo_mono(dmax,curdel,tapdel,fb,fbspr,gi) = inputSelect(gi) : (+:si.smooth(fbspr) -<: de.fdelay(dmax,curdel), -de.fdelay(dmax,tapdel)) -~(*(fb),!) : !,_; - -tau2pole(tau) = ba.if(tau>0, exp(-1.0/(tau*ma.SR)), 0.0); -t60smoother(dEchoT60) = si.smooth(tau2pole(dEchoT60/6.91)); - -dEchoT60 = knobs_group(vslider("[1] DelayT60 [midi:ctrl 60] [style:knob]", 0.5, 0, 100, 0.001)); -dEchoSamplesRaw = knobs_group(vslider("[0] Delay [midi:ctrl 61] [style:knob]", 0.5, 0.001, (dmaxs-0.001), 0.001)) * ma.SR; -dEchoSamples = dEchoSamplesRaw : t60smoother(dEchoT60); -warpRaw = knobs_group(vslider("[0] Warp [midi:ctrl 62] [style:knob]", 0, -1.0, 1.0, 0.001)); - -scrubAmpRaw = 0; - -scrubPhaseRaw = 0; -fb = knobs_group(vslider("[2] Feedback [midi:ctrl 2] [style:knob]", .3, 0.0, 1.0, 0.0001)); -amp = knobs_group(vslider("[3] Amp [midi:ctrl 75] [style:knob]", .5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(ampT60/6.91)); - -ampT60 = 0.15661; -fbs = knobs_group(vslider("[5] [midi:ctrl 76] FeedbackSm [style:knob]", 0, 0, 1, 0.00001)); -gi = switches_group(1-vslider("[7] [midi:ctrl 105] EnableEcho[style:knob]",0,0,1,1)); // "ground input" switches input to zeros - -// Warp and Scrubber stuff: -enableEcho = (scrubAmpRaw > 0.00001); -triggerScrubOn = (enableEcho - enableEcho') > 0; // enableEcho went 0 to 1 -triggerScrubOff = (enableEcho - enableEcho') < 0; // enableEcho went 1 to 0 -// Ramps up only during scrub "hold" time and is otherwise zero: -counter = (enableEcho * (triggerScrubOn : + ~ +(1) * enableEcho : -(2))) & (dmax-1); -// implementation that continues scrubbing where it left off: - -scrubPhase = scrubPhaseRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -scrubAmp = scrubAmpRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); -warp = warpRaw : t60smoother(dEchoT60); -dTapSamplesRaw = dEchoSamplesRaw * (1.0 + warp + scrubPhase * scrubAmp) + float(counter); -dTapSamples = dTapSamplesRaw : t60smoother(dEchoT60*(1-triggerScrubOff)); - -echo_process = _ <: _, amp * echo_mono(dmax,dEchoSamples,dTapSamples,fb,fbspr(fbs),gi) : +; - -}.echo_process; - -component_flanger = environment { - -// Created from flange.dsp 2015/06/21 - -flanger_mono(dmax,curdel,depth,fb,invert,lfoshape) = _ <: _, (-:de.fdelay(dmax,curdel)) ~ *(fb) : _,*(select2(invert,depth,0-depth)) : + : *(1/(1+depth)); // ideal for dc and reinforced sinusoids (in-phase summed signals) - -flanger_process = ba.bypass1(fbp,flanger_mono_gui); - -// Kill the groups to save vertical space: -meter_group(x) = flsg(x); -ctl_group(x) = flkg(x); -del_group(x) = flkg(x); -lvl_group(x) = flkf(x); - -flangeview = lfo(freq); - -flanger_mono_gui = attach(flangeview) : flanger_mono(dmax,curdel,depth,fb,invert,lfoshape); - -sinlfo(freq) = (1 + os.oscrs(freq))/2; -trilfo(freq) = 1.0-abs(os.saw1(freq)); -lfo(f) = (lfoshape * trilfo(f)) + ((1-lfoshape) * sinlfo(f)); - -dmax = 2048; -odflange = 44; // ~1 ms at 44.1 kHz = min delay -dflange = ((dmax-1)-odflange)*del_group(vslider("[1] Delay [midi:ctrl 50][style:knob]", 0.22, 0, 1, 1)); -freq = ctl_group(vslider("[1] Rate [midi:ctrl 51] [unit:Hz] [style:knob]", 0.5, 0, 10, 0.01)) : si.smooth(ba.tau2pole(freqT60/6.91)); - -freqT60 = 0.15661; -depth = ctl_group(vslider("[3] Depth [midi:ctrl 52] [style:knob]", .75, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -fb = ctl_group(vslider("[5] Feedback [midi:ctrl 53] [style:knob]", 0, -0.995, 0.99, 0.001)) : si.smooth(ba.tau2pole(fbT60/6.91)); - -fbT60 = 0.15661; -lfoshape = ctl_group(vslider("[7] Waveshape [midi:ctrl 54] [style:knob]", 0, 0, 1, 0.001)); -curdel = odflange+dflange*lfo(freq); - -fbp = 1-int(flsg(vslider("[0] Enable [midi:ctrl 102][style:knob]",0,0,1,1))); - -invert = flsg(vslider("[1] Invert [midi:ctrl 49][style:knob]",0,0,1,1):int); - -}.flanger_process; - -component_chorus = environment { - -voices = 8; // MUST BE EVEN -chorus_process = ba.bypass1to2(cbp,chorus_mono(dmax,curdel,rate,sigma,do2,voices)); - -dmax = 8192; -curdel = dmax * ckg(vslider("[0] Delay [midi:ctrl 55] [style:knob]", 0.5, 0, 1, 1)) : si.smooth(0.999); -rateMax = 7.0; // Hz -rateMin = 0.01; -rateT60 = 0.15661; -rate = ckg(vslider("[1] Rate [midi:ctrl 56] [unit:Hz] [style:knob]", 0.5, rateMin, rateMax, 0.0001)) - : si.smooth(ba.tau2pole(rateT60/6.91)); - -depth = ckg(vslider("[4] Depth [midi:ctrl 57] [style:knob]", 0.5, 0, 1, 0.001)) : si.smooth(ba.tau2pole(depthT60/6.91)); - -depthT60 = 0.15661; -delayPerVoice = 0.5*curdel/voices; -sigma = delayPerVoice * ckg(vslider("[6] Deviation [midi:ctrl 58] [style:knob]",0.5,0,1,0.001)) : si.smooth(0.999); - -periodic = 1; - -do2 = depth; // use when depth=1 means "multivibrato" effect (no original => all are modulated) -cbp = 1-int(csg(vslider("[0] Enable [midi:ctrl 103][style:knob]",0,0,1,1))); - -chorus_mono(dmax,curdel,rate,sigma,do2,voices) - = _ <: (*(1-do2)<:_,_),(*(do2) <: par(i,voices,voice(i)) :> _,_) : ro.interleave(2,2) : +,+ - with { - angle(i) = 2*ma.PI*(i/2)/voices + (i%2)*ma.PI/2; - voice(i) = de.fdelay(dmax,min(dmax,del(i))) * cos(angle(i)); - del(i) = curdel*(i+1)/voices + dev(i); - rates(i) = rate/float(i+1); - dev(i) = sigma * os.oscp(rates(i),i*2*ma.PI/voices); - }; - -}.chorus_process; - -component_freeverb = environment { - -import("stdfaust.lib"); - -declare name "freeverb"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c) GRAME 2006 and MoForte Inc. 2017"; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Freeverb.html"; - -//====================================================== -// -// Freeverb -// Faster version using fixed delays (20% gain) -// -//====================================================== - -// Constant Parameters -//-------------------- - -fixedgain = 0.015; //value of the gain of fxctrl -scalewet = 3.0; -scaledry = 2.0; -scaledamp = 0.4; -scaleroom = 0.28; -offsetroom = 0.7; -initialroom = 0.5; -initialdamp = 0.5; -initialwet = 1.0/scalewet; -initialdry = 0; -initialwidth= 1.0; -initialmode = 0.0; -freezemode = 0.5; -stereospread= 23; -allpassfeed = 0.5; //feedback of the delays used in allpass filters - -// Filter Parameters -//------------------ - -combtuningL1 = 1116; -combtuningL2 = 1188; -combtuningL3 = 1277; -combtuningL4 = 1356; -combtuningL5 = 1422; -combtuningL6 = 1491; -combtuningL7 = 1557; -combtuningL8 = 1617; - -allpasstuningL1 = 556; -allpasstuningL2 = 441; -allpasstuningL3 = 341; -allpasstuningL4 = 225; - -// Control Sliders -//-------------------- -// Damp : filters the high frequencies of the echoes (especially active for great values of RoomSize) -// RoomSize : size of the reverberation room -// Dry : original signal -// Wet : reverberated signal - -dampSlider = rkg(vslider("Damp [midi:ctrl 3] [style:knob]",0.5, 0, 1, 0.025))*scaledamp; -roomsizeSlider = rkg(vslider("RoomSize [midi:ctrl 4] [style:knob]", 0.5, 0, 1, 0.025))*scaleroom + offsetroom; -wetSlider = rkg(vslider("Wet [midi:ctrl 79] [style:knob]", 0.3333, 0, 1, 0.025)); -combfeed = roomsizeSlider; - -// Comb and Allpass filters -//------------------------- - -allpass(dt,fb) = (_,_ <: (*(fb),_:+:@(dt)), -) ~ _ : (!,_); - -comb(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb)); - -// Reverb components -//------------------ - -monoReverb(fb1, fb2, damp, spread) -= _ <: comb(combtuningL1+spread, fb1, damp), -comb(combtuningL2+spread, fb1, damp), -comb(combtuningL3+spread, fb1, damp), -comb(combtuningL4+spread, fb1, damp), -comb(combtuningL5+spread, fb1, damp), -comb(combtuningL6+spread, fb1, damp), -comb(combtuningL7+spread, fb1, damp), -comb(combtuningL8+spread, fb1, damp) -+> -allpass (allpasstuningL1+spread, fb2) -: allpass (allpasstuningL2+spread, fb2) -: allpass (allpasstuningL3+spread, fb2) -: allpass (allpasstuningL4+spread, fb2) -; - -monoReverbToStereo(fb1, fb2, damp, spread) -= + <: monoReverb(fb1, fb2, damp, 0) <: _,_; -stereoReverb(fb1, fb2, damp, spread) -= + <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); -monoToStereoReverb(fb1, fb2, damp, spread) -= _ <: monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread); - -// fxctrl : add an input gain and a wet-dry control to a stereo FX -//---------------------------------------------------------------- - -fxctrl(g,w,Fx) = _,_ <: (*(g),*(g) : Fx : *(w),*(w)), *(1-w), *(1-w) +> _,_; - -rbp = 1-int(rsg(vslider("[0] Enable [midi:ctrl 104][style:knob]",0,0,1,1))); - -// Freeverb -//--------- - -//JOS:freeverb = fxctrl(fixedgain, wetSlider, stereoReverb(combfeed, allpassfeed, dampSlider, stereospread)); -freeverb = fxctrl(fixedgain, wetSlider, monoReverbToStereo(combfeed, allpassfeed, dampSlider, stereospread)); - -freeverb_process = ba.bypass2(rbp,freeverb); - -}.freeverb_process; - - -// This layout loosely follows the MiniMoog-V -// Arturia-only features are labeled -// Original versions also added where different - -// Need vrocker and hrocker toggle switches in Faust! -// Need orange and blue color choices -// Orange => Connect modulation sources to their destinations -// Blue => Turn audio sources On and Off -// - and later - -// White => Turn performance features On and Off -// Black => Select between modulation sources -// Julius Smith for Analog Devices 3/1/2017 - -vrocker(x) = checkbox("%%x [style:vrocker]"); -hrocker(x) = checkbox("%%x [style:hrocker]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); -vrockerblue(x) = checkbox("%x [style:vrocker] [color:blue]"); - // USAGE: vrockerorange("[0] ModulationEnable"); - -hrockerblue(x) = checkbox("%%x [style:hrocker] [color:blue]"); -vrockerred(x) = checkbox("%%x [style:vrocker] [color:red]"); -hrockerred(x) = checkbox("%%x [style:hrocker] [color:red]"); - -declare designer "Robert A. Moog"; - -mmg(x) = hgroup("",x); // Minimoog + Effects - synthg(x) = mmg(vgroup("[0] Minimoog",x)); - fxg(x) = mmg(hgroup("[1] Effects",x)); - mg(x) = synthg(hgroup("[0]",x)); - cg(x) = mg(vgroup("[0] Controllers",x)); // Formerly named "Modules" but "Minimoog" group-title is enough - vg(x) = cg(hgroup("[0] Master Volume", x)); - dg(x) = cg(hgroup("[1] Oscillator Tuning & Switching", x)); - // Tune knob = master tune - dsg(x) = dg(vgroup("[1] Switches", x)); - // Oscillator Modulation HrockerRed => apply Modulation Mix output to osc1&2 pitches - // [MOVED here from osc3 group] Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - gmmg(x) = cg(hgroup("[2] Glide and ModMix", x)); - // Glide knob [0:10] = portamento speed - // Modulation Mix knob [0:10] (between Osc3 and Noise) = mix of noise and osc3 modulating osc1&2 pitch and/or VCF freq - og(x) = mg(vgroup("[1] Oscillator Bank", x)); - osc1(x) = og(hgroup("[1] Oscillator 1", x)); - // UNUSED Control switch (for alignment) - Could put Oscillator Modulation switch there - // Range rotary switch: LO (slow pulses or rhythm), 32', 16', 8', 4', 2' - // Frequency switch: LED to right - // Waveform rotary switch: tri, impulse/bent-triangle, saw, pulseWide, pulseMed, pulseNarrow - osc2(x) = og(hgroup("[2] Oscillator 2", x)); - // UNUSED (originall) or Osc 2 Control VrockerRed - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - osc3(x) = og(hgroup("[3] Oscillator 3", x)); - // Osc 3 Control VrockerRed => use osc3 as LFO instead of osc3 - // Range rotary switch: LO, 32', 16', 8', 4', 2' - // Detuning knob: -7 to 7 [NO SWITCH] - // Waveform rotary switch: tri, impulse(?), saw, pulseWide, pulseMed, pulseNarrow - mixg(x) = mg(vgroup("[2] Mixer", x)); - // Each row 5 slots to maintain alignment and include red rockers joining VCF area: - mr1(x) = mixg(hgroup("[0] Osc1", x)); // mixer row 1 = - // Osc1 Volume and Osc1 HrockerBlue & _ & _ & Filter Modulation HrockerRed - // Filter Modulation => Modulation Mix output to VCF freq - mr2(x) = mixg(hgroup("[1] Ext In, KeyCtl", x)); // row 2 = Ext In HrockerBlue and Vol and Overload LED and Keyboard Ctl HrockerRed 1 - mr3(x) = mixg(hgroup("[2] Osc2", x)); // = Osc2 Volume and Osc2 HrockerBlue and Keyboard Ctl HrockerRed 2 - // Keyboard Control Modulation 1&2 => 0, 1/3, 2/3, all of Keyboard Control Signal ("gate?") applied to VCF freq - mr4(x) = mixg(hgroup("[3] Noise", x)); // = Noise HrockerBlue and Volume and Noise Type VrockerBlue - mr4cbg(x) = mr4(vgroup("[1]", x)); // = Noise Off and White/Pink selection - // two rockers - mr5(x) = mixg(hgroup("[4] Osc3", x)); // Osc3 Volume and Osc3 HrockerBlue - modg(x) = mg(vgroup("[3] Modifiers", x)); - vcfg(x) = modg(vgroup("[0] Filter", x)); - vcf1(x) = vcfg(hgroup("[0] [tooltip:freq, Q, ContourScale]", x)); - vcf1cbg(x) = vcf1(vgroup("[0] [tooltip:two checkboxes]", x)); - // Filter Modulation switch - // VCF Off switch - // Corner Frequency knob - // Filter Emphasis knob - // Amount of Contour knob - vcf2(x) = vcfg(hgroup("[1] Filter Contour [tooltip:AttFilt, DecFilt, Sustain Level for Filter Contour]", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - ng(x) = modg(hgroup("[1] Loudness Contour", x)); - // Attack Time knob - // Decay Time knob - // Sustain Level knob - echog(x) = fxg(hgroup("[4] Echo",x)); - ekg(x) = echog(vgroup("[0] Knobs",x)); - esg(x) = echog(vgroup("[1] Switches",x)); - flg(x) = fxg(hgroup("[5] Flanger",x)); - flkg(x) = flg(vgroup("[0] Knobs",x)); - flsg(x) = flg(vgroup("[1] Switches",x)); - chg(x) = fxg(hgroup("[6] Chorus",x)); - ckg(x) = chg(vgroup("[0] Knobs",x)); - csg(x) = chg(vgroup("[1] Switches",x)); - rg(x) = fxg(hgroup("[7] Reverb",x)); - rkg(x) = rg(vgroup("[0] Knobs",x)); - rsg(x) = rg(vgroup("[1] Switches",x)); - outg(x) = fxg(vgroup("[8] Output", x)); - volg(x) = outg(hgroup("[0] Volume Main Output", x)); - // Volume knob [0-10] - // Unison switch (Arturia) or Output connect/disconnect switch (original) - // When set, all voices are stacked and instrument is in mono mode - tunerg(x) = outg(hgroup("[1] A-440 Switch", x)); - vdtpolyg(x) = outg(hgroup("[2] Voice Detune / Poly", x)); - // Voice Detune knob [0-10] (Arturia) or - // Polyphonic switch [red LED below] (Arturia) - // When set, instrument is in polyphonic mode with one oscillator per key - clipg(x) = fxg(vgroup("[9] Soft Clip", x)); - // Soft Clipping switch [red LED above] - kg(x) = synthg(hgroup("[1] Keyboard Group", x)); // Keyboard was 3 1/2 octaves - ws(x) = kg(vgroup("[0] Wheels and Switches", x)); - s1g(x) = ws(hgroup("[0] Jacks and Rockers", x)); - jg(x) = s1g(vgroup("[0] MiniJacks",x)); - gdlg(x) = s1g(vgroup("[1] Glide/Decay/Legato Enables",x)); // Arturia - // Glide Hrocker (see original Button version below) - // Decay Hrocker (see original Button version below) => Sets Release (R) of ADSR to either 0 or Decay (R) - // Legato Hrocker (not in original) - s2g(x) = ws(hgroup("[1] [tooltip:Wheels+]", x)); - bg(x) = s2g(vgroup("[0] [tooltip:Bend Enable and Range]", x)); - wg(x) = s2g(hgroup("[1] [tooltip:Bend and Mod Wheels]", x)); - // Using Glide/Decay/Legato enables above following Arturia: - // dg(x) = s2g(hgroup("[2] Glide and Decay momentary pushbuttons", x)); - // Glide Button injects portamento as set by Glide knob - // Decay Button uses decay of Loudness Contour (else 0) - keys(x) = kg(hgroup("[1] [tooltip:Keys]", x)); - gg(x) = keys(hgroup("[0] [tooltip: Gates]",x)); - // leave slot 1 open for sustain (below) diff --git a/dist/examples/SAM/volume/volume.dsp b/dist/examples/SAM/volume/volume.dsp deleted file mode 100644 index 90e45b9d..00000000 --- a/dist/examples/SAM/volume/volume.dsp +++ /dev/null @@ -1,9 +0,0 @@ -//--------------------------------------------------------- -// Volume control in dB with MIDI control (CC-1, modWheel) -//--------------------------------------------------------- - -import("stdfaust.lib"); - -gain = vslider("Volume[midi:ctrl 2] [tooltip CC-1]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo; - -process = _,_: *(gain), *(gain); diff --git a/dist/examples/ambisonics/fourSourcesToOcto.dsp b/dist/examples/ambisonics/fourSourcesToOcto.dsp deleted file mode 100644 index be29321c..00000000 --- a/dist/examples/ambisonics/fourSourcesToOcto.dsp +++ /dev/null @@ -1,20 +0,0 @@ -declare name "fourSourcesToOcto"; -declare version "1.0"; -declare author "CICM"; -declare license "BSD"; -declare copyright "(c)CICM 2013"; - -import("stdfaust.lib"); - -r1 = hslider("Radius1", 1.0, 0, 5, 0.001) : si.smooth(ba.tau2pole(0.02)); -a1 = hslider("Angle1", 0, ma.PI*(-2), ma.PI*2, 0.001) : si.smooth(ba.tau2pole(0.02)); -r2 = hslider("Radius2", 1.0, 0, 5, 0.001) : si.smooth(ba.tau2pole(0.02)); -a2 = hslider("Angle2", 0, ma.PI*(-2), ma.PI*2, 0.001) : si.smooth(ba.tau2pole(0.02)); -r3 = hslider("Radius3", 1.0, 0, 5, 0.001) : si.smooth(ba.tau2pole(0.02)); -a3 = hslider("Angle3", 0, ma.PI*(-2), ma.PI*2, 0.001) : si.smooth(ba.tau2pole(0.02)); -r4 = hslider("Radius4", 1.0, 0, 5, 0.001) : si.smooth(ba.tau2pole(0.02)); -a4 = hslider("Angle4", 0, ma.PI*(-2), ma.PI*2, 0.001) : si.smooth(ba.tau2pole(0.02)); - -process(sig1, sig2, sig3, sig4) = ho.map(3, sig1, r1, a1), ho.map(3, sig2, r2, a2), ho.map(3, sig3, r3, a3), ho.map(3, sig4, r4, a4) :> ho.optimInPhase(3) : ho.decoder(3, 8); - - diff --git a/dist/examples/ambisonics/oneSourceToStereo.dsp b/dist/examples/ambisonics/oneSourceToStereo.dsp deleted file mode 100644 index 0b8d1ba9..00000000 --- a/dist/examples/ambisonics/oneSourceToStereo.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "oneSourceToStereo"; -declare version "1.0"; -declare author "CICM"; -declare license "BSD"; -declare copyright "(c)CICM 2013"; - -import("stdfaust.lib"); - -r1 = hslider("Radius", 1.0, 0, 5, 0.001) : si.smooth(ba.tau2pole(0.02)); -a1 = hslider("Angle", 0, ma.PI*(-2), ma.PI*2, 0.001) : si.smooth(ba.tau2pole(0.02)); - -process(sig) = ho.map(7, sig, r1, a1) : ho.optimInPhase(7) : ho.decoderStereo(7); diff --git a/dist/examples/analysis/FFT.dsp b/dist/examples/analysis/FFT.dsp deleted file mode 100644 index 3589b4c8..00000000 --- a/dist/examples/analysis/FFT.dsp +++ /dev/null @@ -1,26 +0,0 @@ -// Radix 2 FFT, decimation in time, real and imag parts interleaved - -declare name "FFT"; // Faust Fourier Transform :-) -declare author "JOS"; -declare license "STK-4.3"; - -import("stdfaust.lib"); - -N=32; // FFT size (power of 2) -// Number of frequency bins (including dc and SR/2) is N/2+1 - -No2 = N>>1; -signal = amp * cosine with { - cosine = select2(k==0, - select2(k==No2, - 2.0*os.oscrc(f(k)), // 2x since negative-frequencies not displayed - 1-1':+~*(-1) // Alternating sequence: 1, -1, 1, -1 - ), - 1.0); // make sure phase is zero (freq jumps around) - f(k) = float(k) * ma.SR / float(N); // only test FFT bin frequencies - k = hslider("[2] FFT Bin Number",N/4,0,No2,0.001) : int <: _,dpy : attach; - dpy = hbargraph("[3] Measured FFT Bin Number",0,No2); - amp = hslider("[4] Amplitude",0.1,0,1,0.001); -}; - -process = signal : dm.fft_spectral_level_demo(N) <: _,_; diff --git a/dist/examples/analysis/dbmeter.dsp b/dist/examples/analysis/dbmeter.dsp deleted file mode 100644 index 6b3cb404..00000000 --- a/dist/examples/analysis/dbmeter.dsp +++ /dev/null @@ -1,19 +0,0 @@ -declare name "dbmeter"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------- -// A dB Vumeter -//------------------------------------------------- - -import("stdfaust.lib"); - - -vmeter(x) = attach(x, envelop(x) : vbargraph("[unit:dB]", -70, 10)); -hmeter(x) = attach(x, envelop(x) : hbargraph("[unit:dB]", -70, 10)); - -envelop = abs : max(ba.db2linear(-70)) : ba.linear2db : min(10) : max ~ -(80.0/ma.SR); -null(x) = attach(0,x); -process = hgroup("8 channels dB meter", par(i,8, vgroup("%i", vmeter : null))); diff --git a/dist/examples/analysis/spectralLevel.dsp b/dist/examples/analysis/spectralLevel.dsp deleted file mode 100644 index 3928d867..00000000 --- a/dist/examples/analysis/spectralLevel.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "spectralLevel"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "Demonstrates mth_octave_spectral_level in a standalone GUI."; - -import("stdfaust.lib"); - -process = dm.spectral_level_demo; diff --git a/dist/examples/analysis/spectralTiltLab.dsp b/dist/examples/analysis/spectralTiltLab.dsp deleted file mode 100644 index 5c9f3646..00000000 --- a/dist/examples/analysis/spectralTiltLab.dsp +++ /dev/null @@ -1,20 +0,0 @@ -// example exercising filters.lib's spectral_tilt_demo - -declare name "spectralTiltLab"; - -import("stdfaust.lib"); - -N = 10; // Number of pole-zero pairs to use - -process = sig(dm.sawtooth_demo) - : stg(ba.bypass1(bp,dm.spectral_tilt_demo(N))) - <: sag(dm.spectral_level_demo) -with { - bp = stg(checkbox("[0] Bypass Spectral Tilt")); - stg(x) = vgroup( - "[1] Spectral Tilt Filter [tooltip: See Faust's filters.lib for spectral_tilt_demo]",x); - sig(x) = vgroup( - "[2] Test Signal [tooltip: See Faust's oscillator.lib for sawtooth_demo]",x); - sag(x) = vgroup( - "[4] Spectrum Analyzer [tooltip: See Faust's filters.lib for spectral_level_demo]",x); -}; diff --git a/dist/examples/analysis/vumeter.dsp b/dist/examples/analysis/vumeter.dsp deleted file mode 100644 index cbaeefa0..00000000 --- a/dist/examples/analysis/vumeter.dsp +++ /dev/null @@ -1,19 +0,0 @@ -declare name "vumeter"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------- -// Simple vumeter -//------------------------------------------------- - -import("stdfaust.lib"); - - -vmeter(x) = attach(x, envelop(x) : vbargraph("[2][unit:dB]", -70, +5)); -hmeter(x) = attach(x, envelop(x) : hbargraph("[2][unit:dB]", -70, +5)); - -envelop = abs : max ~ -(1.0/ma.SR) : max(ba.db2linear(-70)) : ba.linear2db; - -process = hmeter,hmeter; diff --git a/dist/examples/bela/AdditiveSynth.dsp b/dist/examples/bela/AdditiveSynth.dsp deleted file mode 100644 index 607527e1..00000000 --- a/dist/examples/bela/AdditiveSynth.dsp +++ /dev/null @@ -1,43 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Additive synthesizer, must be used with OSC message to program sound. -// It as 8 harmonics. Each have it's own volume envelop. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// OSC messages (see BELA console for precise adress) -// For each harmonics (%rang indicate harmonic number, starting at 0) : -// vol%rang : General Volume (vol0 control the volume of the fundamental) -// A%rang : Attack -// D%rang : Decay -// S%rang : Sustain -// R%rang : Release -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// GENERAL -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 10, 0.01); - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -partiel(rang) = os.oscrs(gFreq*(rang+1))*volume - with { - // UI - vol = hslider("vol%rang", 1, 0, 1, 0.001); - - a = 0.01 * hslider("A%rang", 1, 0, 400, 0.001); - d = 0.01 * hslider("D%rang", 1, 0, 400, 0.001); - s = hslider("S%rang", 1, 0, 1, 0.001); - r = 0.01 * hslider("R%rang", 1, 0, 800, 0.001); - - volume = ((en.adsr(a,d,s,r,midigate))*vol) : max (0) : min (1); - }; - -process = par(i, 8, partiel(i)) :> / (8); diff --git a/dist/examples/bela/AdditiveSynth_Analog.dsp b/dist/examples/bela/AdditiveSynth_Analog.dsp deleted file mode 100644 index 94754d3c..00000000 --- a/dist/examples/bela/AdditiveSynth_Analog.dsp +++ /dev/null @@ -1,48 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Additive synthesizer, must be used with OSC message to program sound. -// It as 8 harmonics. Each have it's own volume envelope. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : vol0 (volum of fundamental) -// ANALOG_1 : vol1 -// ... -// ANALOG_7 : vol7 -// -// OSC messages (see BELA console for precise adress) -// For each harmonics (%rang indicate harmonic number, starting at 0) : -// A%rang : Attack -// D%rang : Decay -// S%rang : Sustain -// R%rang : Release -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// GENERAL -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 10, 0.01); - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -partiel(rang) = os.oscrs(gFreq*(rang+1))*volume - with { - // UI - vol = hslider("vol%rang[BELA: ANALOG_%rang]", 1, 0, 1, 0.001); - - a = 0.01 * hslider("A%rang", 1, 0, 400, 0.001); - d = 0.01 * hslider("D%rang", 1, 0, 400, 0.001); - s = hslider("S%rang", 1, 0, 1, 0.001); - r = 0.01 * hslider("R%rang", 1, 0, 800, 0.001); - - volume = ((en.adsr(a,d,s,r,midigate))*vol) : max (0) : min (1); - }; - -process = par(i, 8, partiel(i)) :> / (8); diff --git a/dist/examples/bela/FMSynth2.dsp b/dist/examples/bela/FMSynth2.dsp deleted file mode 100644 index 287fe64f..00000000 --- a/dist/examples/bela/FMSynth2.dsp +++ /dev/null @@ -1,59 +0,0 @@ -import("all.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple FM synthesizer. -// 2 oscillators and FM feedback on modulant oscillator -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// -// CC 1 : FM feedback on modulant oscillator. -// CC 14 : Modulator frequency ratio. -// -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// GENERAL, Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 1, 0, 1, 0.01); - -// modwheel: -feedb = (gFreq-1) * (hslider("feedb[midi:ctrl 1]", 0, 0, 1, 0.001) : si.smoo); -modFreqRatio = hslider("ratio[midi:ctrl 14]",2,0,20,0.01) : si.smoo; - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -//=================================== Parameters Mapping ================================= -//======================================================================================== -// Same for volum & modulation: -volA = hslider("A[midi:ctrl 73]",0.01,0.01,4,0.01); -volD = hslider("D[midi:ctrl 76]",0.6,0.01,8,0.01); -volS = hslider("S[midi:ctrl 77]",0.2,0,1,0.01); -volR = hslider("R[midi:ctrl 72]",0.8,0.01,8,0.01); -envelop = en.adsre(volA,volD,volS,volR,midigate); - -// modulator frequency -modFreq = gFreq*modFreqRatio; - -// modulation index -FMdepth = envelop * 1000 * midigain; - -// Out amplitude -vol = envelop; - -//============================================ DSP ======================================= -//======================================================================================== - -FMfeedback(frq) = (+(_,frq):os.osci ) ~ (* (feedb)); -FMall(f) = os.osci(f+(FMdepth*FMfeedback(f*modFreqRatio))); - -process = FMall(gFreq) * vol; diff --git a/dist/examples/bela/FMSynth2_Analog.dsp b/dist/examples/bela/FMSynth2_Analog.dsp deleted file mode 100644 index a3e16151..00000000 --- a/dist/examples/bela/FMSynth2_Analog.dsp +++ /dev/null @@ -1,57 +0,0 @@ -import("all.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple FM synthesizer. - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : Modulator frequency ratio -// ANALOG_1 : Attack -// ANALOG_2 : Decay/Release -// ANALOG_3 : Sustain -// -// MIDI: -// CC 1 : FM feedback on modulant oscillator. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// GENERAL, Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 1, 0, 1, 0.01); - -// modwheel: -feedb = (gFreq-1) * (hslider("feedb[midi:ctrl 1]", 0, 0, 1, 0.001) : si.smoo); -modFreqRatio = hslider("ratio[BELA: ANALOG_0]",2,0,20,0.01) : si.smoo; - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -//=================================== Parameters Mapping ================================= -//======================================================================================== -// Same for volume & modulation: -volA = hslider("A[BELA: ANALOG_1]",0.01,0.01,4,0.01); -volDR = hslider("DR[BELA: ANALOG_2]",0.6,0.01,8,0.01); -volS = hslider("S[BELA: ANALOG_3]",0.2,0,1,0.01); -envelop = en.adsre(volA,volDR,volS,volDR,midigate); - -// modulator frequency -modFreq = gFreq * modFreqRatio; - -// modulation index -FMdepth = envelop * 1000 * midigain; - -// Out amplitude -vol = envelop; - -//============================================ DSP ======================================= -//======================================================================================== - -FMfeedback(frq) = (+(_,frq):os.osci) ~ (* (feedb)); -FMall(f) = os.osci(f+ (FMdepth*FMfeedback(f*modFreqRatio))); - -process = FMall(gFreq) * vol; diff --git a/dist/examples/bela/FMSynth2_FX.dsp b/dist/examples/bela/FMSynth2_FX.dsp deleted file mode 100644 index e4255f41..00000000 --- a/dist/examples/bela/FMSynth2_FX.dsp +++ /dev/null @@ -1,138 +0,0 @@ -import("all.lib"); - - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple FM synthesizer. -// 2 oscillators and FM feedback on modulant oscillator -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// -// CC 1 : FM feedback on modulant oscillator. -// CC 14 : Modulator frequency ratio. -// -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// GENERAL, Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 1, 0, 1, 0.01); - -// modwheel: -feedb = (gFreq-1) * (hslider("feedb[midi:ctrl 1]", 0, 0, 1, 0.001) : si.smoo); -modFreqRatio = hslider("ratio[midi:ctrl 14]",2,0,20,0.01) : si.smoo; - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -//=================================== Parameters Mapping ================================= -//======================================================================================== -// Same for volum & modulation: -volA = hslider("A[midi:ctrl 73]",0.01,0.01,4,0.01); -volD = hslider("D[midi:ctrl 76]",0.6,0.01,8,0.01); -volS = hslider("S[midi:ctrl 77]",0.2,0,1,0.01); -volR = hslider("R[midi:ctrl 72]",0.8,0.01,8,0.01); -envelop = en.adsre(volA,volD,volS,volR,midigate); - -// modulator frequency -modFreq = gFreq*modFreqRatio; - -// modulation index -FMdepth = envelop * 1000 * midigain; - -// Out amplitude -vol = envelop; - -//============================================ DSP ======================================= -//======================================================================================== - -FMfeedback(frq) = ( +(_,frq):os.osci ) ~ (* (feedb)); -FMall(f) = os.osci(f+ (FMdepth*FMfeedback(f*modFreqRatio))); - -//#################################################################################################// -//##################################### EFFECT SECTION ############################################// -//#################################################################################################// -// Simple FX chain build for a mono synthesizer. -// It control general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// (All are available by OSC) -// -// CC 7 : Volume -// CC 10 : Pan -// -// CC 92 : Distortion Drive -// -// CC 13 : Flanger Delay -// CC 93 : Flanger Dry/Wet -// CC 94 : Flanger Feedback -// -// CC 12 : Reverberation Room size -// CC 91 : Reverberation Dry/Wet -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -volFX = hslider("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider("drive[midi:ctrl 92]",0.3,0,1,0.001); - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[midi:ctrl 93]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Pannoramique: -panno = _ : sp.panner(hslider("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[midi:ctrl 12]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[midi:ctrl 91]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effect = _ *(volFX) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -process = FMall(gFreq) * vol; diff --git a/dist/examples/bela/FMSynth2_FX_Analog.dsp b/dist/examples/bela/FMSynth2_FX_Analog.dsp deleted file mode 100644 index 2835fa16..00000000 --- a/dist/examples/bela/FMSynth2_FX_Analog.dsp +++ /dev/null @@ -1,142 +0,0 @@ -import("all.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple FM synthesizer. -// 2 oscillators and FM feedback on modulant oscillator -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : Modulator frequency ratio -// ANALOG_1 : Attack -// ANALOG_2 : Decay/Release -// ANALOG_3 : Sustain -// -// MIDI: -// CC 1 : FM feedback on modulant oscillator. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// GENERAL, Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 1, 0, 1, 0.01); - -// modwheel: -feedb = (gFreq-1) * (hslider("feedb[midi:ctrl 1]", 0, 0, 1, 0.001) : si.smoo); -modFreqRatio = hslider("ratio[BELA: ANALOG_0]",2,0,20,0.01) : si.smoo; - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -//=================================== Parameters Mapping ================================= -//======================================================================================== -// Same for volume & modulation: -volA = hslider("A[BELA: ANALOG_1]",0.01,0.01,4,0.01); -volDR = hslider("DR[BELA: ANALOG_2]",0.6,0.01,8,0.01); -volS = hslider("S[BELA: ANALOG_3]",0.2,0,1,0.01); -envelop = en.adsre(volA,volDR,volS,volDR,midigate); - -// modulator frequency -modFreq = gFreq * modFreqRatio; - -// modulation index -FMdepth = envelop * 1000 * midigain; - -// Out amplitude -vol = envelop; - -//============================================ DSP ======================================= -//======================================================================================== - -FMfeedback(frq) = (+(_,frq):os.osci) ~ (* (feedb)); -FMall(f) = os.osci(f+ (FMdepth*FMfeedback(f*modFreqRatio))); - -//#################################################################################################// -//##################################### EFFECT SECTION ############################################// -//#################################################################################################// -// -// Simple FX chaine build for a mono synthesizer. -// It controle general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -// This version use ANALOG IN to controle some of the parameters. -// Other parameters continue to be available by MIDI or OSC. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_4 : Distortion Drive -// ANALOG_5 : Flanger Dry/Wet -// ANALOG_6 : Reverberation Dry/Wet -// ANALOG_7 : Reverberation Room size -// -// MIDI: -// CC 7 : Volume -// CC 10 : Pan -// -// CC 13 : Flanger Delay -// CC 13 : Flanger Delay -// CC 94 : Flanger Feedback -// -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -volFX = hslider("volume[midi:ctrl 7]",1,0,1,0.001); // Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider("drive[BELA: ANALOG_4]",0.3,0,1,0.001); - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[BELA: ANALOG_5]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Pannoramique: -panno = _ : sp.panner(hslider("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[BELA: ANALOG_7]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[BELA: ANALOG_6]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effect = _ *(volFX) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -process = FMall(gFreq) * vol; - diff --git a/dist/examples/bela/FXChaine2.dsp b/dist/examples/bela/FXChaine2.dsp deleted file mode 100644 index 4b701c22..00000000 --- a/dist/examples/bela/FXChaine2.dsp +++ /dev/null @@ -1,145 +0,0 @@ -import("stdfaust.lib"); - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// A complete Stereo FX chain with: -// CHORUS -// PHASER -// DELAY -// REVERB -// -// Designed to use the Analog Input for parameters controls. -// -// CONTROLES //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// ANALOG IN: -// ANALOG 0 : Chorus Depth -// ANALOG 1 : Chorus Delay -// ANALOG 2 : Phaser Dry/Wet -// ANALOG 3 : Phaser Frequency ratio -// ANALOG 4 : Delay Dry/Wet -// ANALOG 5 : Delay Time -// ANALOG 6 : Reverberation Dry/Wet -// ANALOG 7 : Reverberation Room size -// -// Available by OSC : (see BELA console for precise adress) -// Rate : Chorus LFO modulation rate (Hz) -// Deviation : Chorus delay time deviation. -// -// InvertSum : Phaser inversion of phaser in sum. (On/Off) -// VibratoMode : Phaser vibrato Mode. (On/Off) -// Speed : Phaser LFO frequency -// NotchDepth : Phaser LFO depth -// Feedback : Phaser Feedback -// NotchWidth : Phaser Notch Width -// MinNotch1 : Phaser Minimal frequency -// MaxNotch1 : Phaser Maximal Frequency -// -// Damp : Reverberation Damp -// Stereo : Reverberation Stereo Width -// -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -process = chorus_stereo(dmax,curdel,rate,sigma,do2,voices) : phaserSt : xdelay : reverb; - -// CHORUS (from SAM demo lib) ////////////////////////////////////////////////////////////////////////////////////////////////////////// -voices = 8; // MUST BE EVEN - -pi = 4.0*atan(1.0); -periodic = 1; - -dmax = 8192; -curdel = dmax * vslider("Delay[BELA: ANALOG_1]", 0.5, 0, 1, 1) : si.smooth(0.999); -rateMax = 7.0; // Hz -rateMin = 0.01; -rateT60 = 0.15661; - -rate = vslider("Rate", 0.5, rateMin, rateMax, 0.0001): si.smooth(ba.tau2pole(rateT60/6.91)); -depth = vslider("Depth [BELA: ANALOG_0]", 0.5, 0, 1, 0.001) : si.smooth(ba.tau2pole(depthT60/6.91)); -// (dept = dry/wet) - -depthT60 = 0.15661; -delayPerVoice = 0.5*curdel/voices; -sigma = delayPerVoice * vslider("Deviation",0.5,0,1,0.001) : si.smooth(0.999); - -do2 = depth; // use when depth=1 means "multivibrato" effect (no original => all are modulated) - -chorus_stereo(dmax,curdel,rate,sigma,do2,voices) = - _,_ <: *(1-do2),*(1-do2),(*(do2),*(do2) <: par(i,voices,voice(i)):>_,_) : ro.interleave(2,2) : +,+; - voice(i) = de.fdelay(dmax,min(dmax,del(i)))/(i+1) - with { - angle(i) = 2*pi*(i/2)/voices + (i%2)*pi/2; - voice(i) = de.fdelay(dmax,min(dmax,del(i))) * cos(angle(i)); - - del(i) = curdel*(i+1)/voices + dev(i); - rates(i) = rate/float(i+1); - dev(i) = sigma * - os.oscp(rates(i),i*2*pi/voices); - }; - -// PHASER (from demo lib.) ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -phaserSt = _,_ <: _, _, phaser2_stereo : dry_wetST(dwPhaz) - with { - - invert = checkbox("InvertSum"); - vibr = checkbox("VibratoMode"); // In this mode you can hear any "Doppler" - - phaser2_stereo = pf.phaser2_stereo(Notches,width,frqmin,fratio,frqmax,speed,mdepth,fb,invert); - - Notches = 4; // Compile-time parameter: 2 is typical for analog phaser stomp-boxes - - speed = hslider("Speed", 0.5, 0, 10, 0.001); - depth = hslider("NotchDepth", 1, 0, 1, 0.001); - fb = hslider("Feedback", 0.7, -0.999, 0.999, 0.001); - - width = hslider("NotchWidth",1000, 10, 5000, 1); - frqmin = hslider("MinNotch1",100, 20, 5000, 1); - frqmax = hslider("MaxNotch1",800, 20, 10000, 1) : max(frqmin); - fratio = hslider("NotchFreqRatio[BELA: ANALOG_3]",1.5, 1.1, 4, 0.001); - dwPhaz = vslider("dryWetPhaser[BELA: ANALOG_2]", 0.5, 0, 1, 0.001); - - mdepth = select2(vibr,depth,2); // Improve "ease of use" - }; - -// DELAY (with feedback and crossfeeback) ////////////////////////////////////////////////////////////////////////////////////////////// -delay = ba.sec2samp(hslider("delay[BELA: ANALOG_5]", 1,0,2,0.001)); -preDelL = delay/2; -delL = delay; -delR = delay; - -crossLF = 1200; - -CrossFeedb = 0.6; -dwDel = vslider("dryWetDelay[BELA: ANALOG_4]", 0.5, 0, 1, 0.001); - -routeur(a,b,c,d) = ((a*CrossFeedb):fi.lowpass(2,crossLF))+c, - ((b*CrossFeedb):fi.lowpass(2,crossLF))+d; - -xdelay = _,_ <: _,_,((de.sdelay(65536, 512,preDelL),_): - (routeur : de.sdelay(65536, 512,delL) ,de.sdelay(65536, 512,delR) ) ~ (_,_)) : dry_wetST(dwDel); - -// REVERB (from freeverb_demo) ///////////////////////////////////////////////////////////////////////////////////////////////////////// -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[BELA: ANALOG_7]", 0.5, 0, 1, 0.001)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo",0.5,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[BELA: ANALOG_6]", 0.2, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wetST(dw,x1,x2,y1,y2) = (wet*y1 + dry*x1),(wet*y2 + dry*x2) - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; diff --git a/dist/examples/bela/Faust-complement.lib b/dist/examples/bela/Faust-complement.lib deleted file mode 100644 index c62211da..00000000 --- a/dist/examples/bela/Faust-complement.lib +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////// -// SCANNER = passing smoothly between 'n' input to 1 output. /////////////////////////////////////// - -// Version for a maximum of 4 inputs : -scanner4(nb, position) = -(_,soustraction) : *(_,coef) : cos : max(0) - with { - coef = 3.14159 * ((nb-1)*0.5); - soustraction = select2(position>0, 0, (position/(nb-1))); - }; - -// Version for more than 4 inputs. -scanner(nb, position) = _ <: (_ , scan) : compare - with { - coef = 3.14159 * ((nb-1)*0.5); - soustraction = select2(position>0, 0, (position/(nb-1))); - - minimum = ((1/(nb-1))*(position-1)); // - maximum = ((1/(nb-1))*(position+1)); // - compare(in, sig) = select2(in>minimum, 0, sig) : select2(in; - latch(S,R) = _~(ba.if(S>0.5,1,_) : ba.if(R>0.5, 0, _)); - }; - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// Count until a number, then wait until Reset to re-start ///////////////////////////////////////// - -counterUpReset(nb, in, reset) = (in:trig), reset : (routage : memo2,_)~_ - with { - trig = _<:_,mem: >; - memo2(a, b) = (ba.if(b>0.5, 0, _))~(+(a)); - compare(value) = ba.if(value>nb, 1, 0); // :trig; - routage(d,e,f) = e, (f, compare(d) : RSLatch : +(f) <: _,_); - }; diff --git a/dist/examples/bela/GrainGenerator.dsp b/dist/examples/bela/GrainGenerator.dsp deleted file mode 100644 index 85043c3f..00000000 --- a/dist/examples/bela/GrainGenerator.dsp +++ /dev/null @@ -1,98 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Grain Generator. -// Another granular synthesis example. -// This one is not finished, but ready for more features and improvements... -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// ANALOG IN: -// ANALOG 0 : Population: 0 = almost nothing. 1 = Full grain -// ANALOG 1 : Depth of each grain, in ms. -// ANALOG 2 : Position in the table = delay -// ANALOG 3 : Speed = pitch change of the grains -// ANALOG 4 : Feedback -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -import("all.lib"); - -// FOR 4 grains - MONO - -// UI ////////////////////////////////////////// -popul = 1 - hslider("population[BELA: ANALOG_0]", 1, 0, 1, 0.001); // Coef 1 = maximum; 0 = almost nothing (0.95) -taille = hslider("taille[BELA: ANALOG_1]", 100, 4, 200, 0.001 ); // Size in milliseconds -decal = 1 - hslider("decal[BELA: ANALOG_2]",0,0,1,0.001); // Read position compared to table write position - -speed = hslider("speed[BELA: ANALOG_3]", 1, 0.125, 4, 0.001); - -feedback = hslider("feedback[BELA: ANALOG_4]",0,0,2,0.001); - -freq = 1000/taille; -tmpTaille = taille*ma.SR/ 1000; -clocSize = int(tmpTaille + (tmpTaille*popul*10)); // duration between 2 clicks - -// CLK GENERAL ///////////////////////////////// -// 4 clicks for 4 grains generators. -// (idem clk freq/4 and a counter...) -detect1(x) = select2 (x < 10, 0, 1); -detect2(x) = select2 (x > clocSize*1/3, 0, 1) : select2 (x < (clocSize*1/3)+10, 0, _); -detect3(x) = select2 (x > clocSize*2/3, 0, 1) : select2 (x < (clocSize*2/3)+10, 0, _); -detect4(x) = select2 (x > clocSize-10, 0, 1); -cloc = (%(_,clocSize))~(+(1)) <: (detect1: trig),(detect2: trig),(detect3: trig),(detect4: trig); - -// SIGNAUX Ctrls Player //////////////////////// -trig = _<:_,mem: >; -envelop = *(2*PI):+(PI):cos:*(0.5):+(0.5); - -rampe(f, t) = delta : (+ : select2(t,_,delta<0) : max(0)) ~ _ : raz - with { - raz(x) = select2 (x > 1, x, 0); - delta = sh(f,t)/ma.SR; - sh(x,t) = ba.sAndH(t,x); - }; - -rampe2(speed, t) = delta : (+ : select2(t,_,delta<0) : max(0)) ~ _ - with { - delta = sh(speed,t); - sh(x,t) = ba.sAndH(t,x); - }; - -// RWTable ////////////////////////////////////// -unGrain(input, clk) = (linrwtable(wf , rindex) : *(0.2 * EnvGrain)) - with { - SR = 44100; - buffer_sec = 1; - size = int(SR * buffer_sec); - init = 0.; - - EnvGrain = clk : (rampe(freq) : envelop); - - windex = (%(_,size) ) ~ (+(1)); - posTabl = int(ba.sAndH(clk, windex)); - rindex = %(int(rampe2(speed, clk)) + posTabl + int(size * decal), size); - - wf = size, init, int(windex), input; - }; - -// LINEAR_INTERPOLATION_RWTABLE ////////////////////////////////// -// read rwtable with linear interpolation -// wf : waveform to read (wf is defined by (size_buffer,init, windex, input)) -// x : position to read (0 <= x < size(wf)) and float -// nota: rwtable(size, init, windex, input, rindex) - -linrwtable(wf,x) = linterpolation(y0,y1,d) - with { - x0 = int(x); // - x1 = int(x+1); // - d = x-x0; - y0 = rwtable(wf,x0); // - y1 = rwtable(wf,x1); // - linterpolation(v0,v1,c) = v0*(1-c)+v1*c; - }; - -// FINALISATION ///////////////////////////////////////////////////////////////////////////////////// -routeur(a, b, c, d, e) = a, b, a, c, a, d, a, e; - -processus = _, cloc : routeur : (unGrain, unGrain, unGrain, unGrain) :> fi.dcblockerat(20); -process = _,_: ((+(_,_) :processus) ~(*(feedback))),((+(_,_) :processus) ~(*(feedback))); diff --git a/dist/examples/bela/WaveSynth.dsp b/dist/examples/bela/WaveSynth.dsp deleted file mode 100644 index 25be16fb..00000000 --- a/dist/examples/bela/WaveSynth.dsp +++ /dev/null @@ -1,67 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple demo of wavetable synthesis. A LFO modulate the interpolation between 4 tables. -// It's possible to add more tables step. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// -// CC 1 : LFO Depth (wave travel modulation) -// CC 14 : LFO Frequency -// CC 70 : Wave travelling -// -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// GENERAL -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 1, 0.01); - -waveTravel = hslider("waveTravel [midi:ctrl]",0,0,1,0.01); - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -// LFO -lfoDepth = hslider("lfoDepth[midi:ctrl 1]",0,0.,1,0.001):si.smoo; -lfoFreq = hslider("lfoFreq[midi:ctrl 14]",0.1,0.01,10,0.001):si.smoo; -moov = ((os.lf_trianglepos(lfoFreq) * lfoDepth) + waveTravel) : min(1) : max(0); - -volA = hslider("A[midi:ctrl 73]",0.01,0.01,4,0.01); -volD = hslider("D[midi:ctrl 76]",0.6,0.01,8,0.01); -volS = hslider("S[midi:ctrl 77]",0.2,0,1,0.01); -volR = hslider("R[midi:ctrl 72]",0.8,0.01,8,0.01); -envelop = en.adsre(volA,volD,volS,volR,midigate); - -// Out Amplitude -vol = envelop * midigain; - -WF(tablesize, rang) = abs((fmod ((1+(float(ba.time)*rang)/float(tablesize)), 4.0))-2) -1.; - -// 4 WF maxi with this version: -scanner(nb, position) = -(_,soustraction) : *(_,coef) : cos : max(0) -with{ - coef = 3.14159 * ((nb-1)*0.5); - soustraction = select2( position>0, 0, (position/(nb-1)) ); -}; - -wfosc(freq) = (rdtable(tablesize, wt1, faze)*(moov : scanner(4,0)))+(rdtable(tablesize, wt2, faze)*(moov : scanner(4,1))) - + (rdtable(tablesize, wt3, faze)*(moov : scanner(4,2)))+(rdtable(tablesize, wt4, faze)*(moov : scanner(4,3))) -with { - tablesize = 1024; - wt1 = WF(tablesize, 16); - wt2 = WF(tablesize, 8); - wt3 = WF(tablesize, 6); - wt4 = WF(tablesize, 4); - faze = int(os.phasor(tablesize,freq)); -}; - -process = wfosc(gFreq) * vol; diff --git a/dist/examples/bela/WaveSynth_Analog.dsp b/dist/examples/bela/WaveSynth_Analog.dsp deleted file mode 100644 index 26fce371..00000000 --- a/dist/examples/bela/WaveSynth_Analog.dsp +++ /dev/null @@ -1,69 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple demo of wavetable synthesis. A LFO modulate the interpolation between 4 tables. -// It's possible to add more tables step. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : Wave travelling -// ANALOG_1 : LFO Frequency -// ANALOG_2 : LFO Depth (wave travel modulation) -// ANALOG_3 : Release -// -// MIDI: -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// GENERAL -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 1, 0.01); - -waveTravel = hslider("waveTravel[BELA: ANALOG_0]",0,0,1,0.01); - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -// LFO -lfoDepth = hslider("lfoDepth[BELA: ANALOG_2]",0,0.,1,0.001):si.smoo; -lfoFreq = hslider("lfoFreq[BELA: ANALOG_1]",0.1,0.01,10,0.001):si.smoo; -moov = ((os.lf_trianglepos(lfoFreq) * lfoDepth) + waveTravel) : min(1) : max(0); - -volA = hslider("A[midi:ctrl 73]",0.01,0.01,4,0.01); -volD = hslider("D[midi:ctrl 76]",0.6,0.01,8,0.01); -volS = hslider("S[midi:ctrl 77]",0.2,0,1,0.01); -volR = hslider("R[BELA: ANALOG_3]",0.8,0.01,8,0.01); -envelop = en.adsre(volA,volD,volS,volR,midigate); - -// Out amplitude -vol = envelop * midigain; - -WF(tablesize, rang) = abs((fmod((1+(float(ba.time)*rang)/float(tablesize)), 4.0))-2) -1.; - -// 4 WF maxi with this version: -scanner(nb, position) = -(_,soustraction) : *(_,coef) : cos : max(0) - with { - coef = 3.14159 * ((nb-1)*0.5); - soustraction = select2( position>0, 0, (position/(nb-1)) ); - }; - -wfosc(freq) = (rdtable(tablesize, wt1, faze)*(moov : scanner(4,0)))+(rdtable(tablesize, wt2, faze)*(moov : scanner(4,1))) - + (rdtable(tablesize, wt3, faze)*(moov : scanner(4,2)))+(rdtable(tablesize, wt4, faze)*(moov : scanner(4,3))) - with { - tablesize = 1024; - wt1 = WF(tablesize, 16); - wt2 = WF(tablesize, 8); - wt3 = WF(tablesize, 6); - wt4 = WF(tablesize, 4); - faze = int(os.phasor(tablesize,freq)); - }; - -process = wfosc(gFreq) * vol; - diff --git a/dist/examples/bela/WaveSynth_FX.dsp b/dist/examples/bela/WaveSynth_FX.dsp deleted file mode 100644 index 4380d055..00000000 --- a/dist/examples/bela/WaveSynth_FX.dsp +++ /dev/null @@ -1,145 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple demo of wavetable synthesis. A LFO modulate the interpolation between 4 tables. -// It's possible to add more tables step. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// -// CC 1 : LFO Depth (wave travel modulation) -// CC 14 : LFO Frequency -// CC 70 : Wave travelling -// -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// GENERAL -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 1, 0.01); - -waveTravel = hslider("waveTravel [midi:ctrl ]",0,0,1,0.01); - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -// LFO -lfoDepth = hslider("lfoDepth[midi:ctrl 1]",0,0.,1,0.001):si.smoo; -lfoFreq = hslider("lfoFreq[midi:ctrl 14]",0.1,0.01,10,0.001):si.smoo; -moov = ((os.lf_trianglepos(lfoFreq) * lfoDepth) + waveTravel) : min(1) : max(0); - -volA = hslider("A[midi:ctrl 73]",0.01,0.01,4,0.01); -volD = hslider("D[midi:ctrl 76]",0.6,0.01,8,0.01); -volS = hslider("S[midi:ctrl 77]",0.2,0,1,0.01); -volR = hslider("R[midi:ctrl 72]",0.8,0.01,8,0.01); -envelop = en.adsre(volA,volD,volS,volR,midigate); - -// Out Amplitude -vol = envelop * midigain; - -WF(tablesize, rang) = abs((fmod ((1+(float(ba.time)*rang)/float(tablesize)), 4.0 ))-2) -1.; - -// 4 WF maxi with this version: -scanner(nb, position) = -(_,soustraction) : *(_,coef) : cos : max(0) - with { - coef = 3.14159 * ((nb-1)*0.5); - soustraction = select2(position>0, 0, (position/(nb-1))); - }; - -wfosc(freq) = (rdtable(tablesize, wt1, faze)*(moov : scanner(4,0)))+(rdtable(tablesize, wt2, faze)*(moov : scanner(4,1))) - + (rdtable(tablesize, wt3, faze)*(moov : scanner(4,2)))+(rdtable(tablesize, wt4, faze)*(moov : scanner(4,3))) - with { - tablesize = 1024; - wt1 = WF(tablesize, 16); - wt2 = WF(tablesize, 8); - wt3 = WF(tablesize, 6); - wt4 = WF(tablesize, 4); - faze = int(os.phasor(tablesize,freq)); - }; - -//#################################################################################################// -//##################################### EFFECT SECTION ############################################// -//#################################################################################################// -// Simple FX chaine build for a mono synthesizer. -// It control general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// (All are available by OSC) -// -// CC 7 : Volume -// CC 10 : Pan -// -// CC 92 : Distortion Drive -// -// CC 13 : Flanger Delay -// CC 93 : Flanger Dry/Wet -// CC 94 : Flanger Feedback -// -// CC 12 : Reverberation Room size -// CC 91 : Reverberation Dry/Wet -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -volFX = hslider("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider("drive[midi:ctrl 92]",0.3,0,1,0.001); - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[midi:ctrl 93]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Pannoramique: -panno = _ : sp.panner(hslider("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[midi:ctrl 12]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[midi:ctrl 91]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effect = _ *(volFX) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -process = wfosc(gFreq) * vol; diff --git a/dist/examples/bela/WaveSynth_FX_Analog.dsp b/dist/examples/bela/WaveSynth_FX_Analog.dsp deleted file mode 100644 index 59cae9cb..00000000 --- a/dist/examples/bela/WaveSynth_FX_Analog.dsp +++ /dev/null @@ -1,151 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple demo of wavetable synthesis. A LFO modulate the interpolation between 4 tables. -// It's possible to add more tables step. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : Wave travelling -// ANALOG_1 : LFO Frequency -// ANALOG_2 : LFO Depth (wave travel modulation) -// ANALOG_3 : Release -// -// MIDI: -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// GENERAL -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 1, 0.01); - -waveTravel = hslider("waveTravel[BELA: ANALOG_0]",0,0,1,0.01); - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -gFreq = midifreq * bend; - -// LFO -lfoDepth = hslider("lfoDepth[BELA: ANALOG_2]",0,0.,1,0.001):si.smoo; -lfoFreq = hslider("lfoFreq[BELA: ANALOG_1]",0.1,0.01,10,0.001):si.smoo; -moov = ((os.lf_trianglepos(lfoFreq) * lfoDepth) + waveTravel) : min(1) : max(0); - -volA = hslider("A[midi:ctrl 73]",0.01,0.01,4,0.01); -volD = hslider("D[midi:ctrl 76]",0.6,0.01,8,0.01); -volS = hslider("S[midi:ctrl 77]",0.2,0,1,0.01); -volR = hslider("R[BELA: ANALOG_3]",0.8,0.01,8,0.01); -envelop = en.adsre(volA,volD,volS,volR,midigate); - -// Out amplitude -vol = envelop * midigain; - -WF(tablesize, rang) = abs((fmod ((1+(float(ba.time)*rang)/float(tablesize)), 4.0 ))-2) -1.; - -// 4 WF maxi with this version: -scanner(nb, position) = -(_,soustraction) : *(_,coef) : cos : max(0) - with { - coef = 3.14159 * ((nb-1)*0.5); - soustraction = select2( position>0, 0, (position/(nb-1)) ); - }; - -wfosc(freq) = (rdtable(tablesize, wt1, faze)*(moov : scanner(4,0)))+(rdtable(tablesize, wt2, faze)*(moov : scanner(4,1))) - + (rdtable(tablesize, wt3, faze)*(moov : scanner(4,2)))+(rdtable(tablesize, wt4, faze)*(moov : scanner(4,3))) - with { - tablesize = 1024; - wt1 = WF(tablesize, 16); - wt2 = WF(tablesize, 8); - wt3 = WF(tablesize, 6); - wt4 = WF(tablesize, 4); - faze = int(os.phasor(tablesize,freq)); - }; - -//#################################################################################################// -//##################################### EFFECT SECTION ############################################// -//#################################################################################################// -// -// Simple FX chaine build for a mono synthesizer. -// It control general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -// This version use ANALOG IN to controle some of the parameters. -// Other parameters continue to be available by MIDI or OSC. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_4 : Distortion Drive -// ANALOG_5 : Flanger Dry/Wet -// ANALOG_6 : Reverberation Dry/Wet -// ANALOG_7 : Reverberation Room size -// -// MIDI: -// CC 7 : Volume -// CC 10 : Pan -// -// CC 13 : Flanger Delay -// CC 13 : Flanger Delay -// CC 94 : Flanger Feedback -// -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -volFX = hslider("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider("drive[BELA: ANALOG_4]",0.3,0,1,0.001); - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[BELA: ANALOG_5]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Panoramic: -panno = _ : sp.panner(hslider("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[BELA: ANALOG_7]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[BELA: ANALOG_6]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effect = _ *(volFX) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -process = wfosc(gFreq) * vol; diff --git a/dist/examples/bela/crossDelay2.dsp b/dist/examples/bela/crossDelay2.dsp deleted file mode 100644 index 46fa2107..00000000 --- a/dist/examples/bela/crossDelay2.dsp +++ /dev/null @@ -1,51 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Stereo Delay with feedback and crossfeedback (L to R and R to L feedback). -// And pitch shifting on feedback. -// A pre-delay without feedback is added for a wider stereo effect. -// -// Designed to use the Analog Input for parameters controls. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// ANALOG IN: -// ANALOG 0 : Pre-Delay L -// ANALOG 1 : Pre-Delay R -// ANALOG 2 : Delay L -// ANALOG 3 : Delay R -// ANALOG 4 : Cross feedback -// ANALOG 5 : Feedback -// ANALOG 6 : Pitchshifter L -// ANALOG 7 : Pitchshifter R -// -// Available by OSC : (see BELA console for precise adress) -// Feedback filter: -// crossLF : Crossfeedback Lowpass -// crossHF : Crossfeedback Highpass -// feedbLF : Feedback Lowpass -// feedbHF : Feedback Highpass -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -preDelL = ba.sec2samp(hslider("preDelL[BELA: ANALOG_0]", 1,0,2,0.001)):si.smoo; -preDelR = ba.sec2samp(hslider("preDelR[BELA: ANALOG_1]", 1,0,2,0.001)):si.smoo; -delL = ba.sec2samp(hslider("delL[BELA: ANALOG_2]", 1,0,2,0.001)):si.smoo; -delR = ba.sec2samp(hslider("delR[BELA: ANALOG_3]", 1,0,2,0.001)):si.smoo; - -crossLF = hslider("crossLF", 12000, 20, 20000, 0.001); -crossHF = hslider("crossHF", 60, 20, 20000, 0.001); -feedbLF = hslider("feedbLF", 12000, 20, 20000, 0.001); -feedbHF = hslider("feedbHF", 60, 20, 20000, 0.001); - -CrossFeedb = hslider("CrossFeedb[BELA: ANALOG_4]", 0.0, 0., 1, 0.001):si.smoo; -feedback = hslider("feedback[BELA: ANALOG_5]", 0.0, 0., 1, 0.001):si.smoo; - -pitchL = hslider("shiftL[BELA: ANALOG_6]", 0,-12,12,0.001):si.smoo; -pitchR = hslider("shiftR[BELA: ANALOG_7]", 0,-12,12,0.001):si.smoo; - -routeur(a,b,c,d) = ((a*CrossFeedb):fi.lowpass(2,crossLF):fi.highpass(2,crossHF))+((b*feedback):fi.lowpass(2,feedbLF):fi.highpass(2,feedbHF))+c, - ((b*CrossFeedb):fi.lowpass(2,crossLF):fi.highpass(2,crossHF))+((a*feedback):fi.lowpass(2,feedbLF):fi.highpass(2,feedbHF))+d; - -process = (de.sdelay(65536, 512,preDelL),de.sdelay(65536, 512,preDelR)):(routeur : de.sdelay(65536, 512,delL), de.sdelay(65536, 512,delR))~(ef.transpose(512, 256, pitchL), ef.transpose(512, 256, pitchR)); diff --git a/dist/examples/bela/granulator.dsp b/dist/examples/bela/granulator.dsp deleted file mode 100644 index 80cfe173..00000000 --- a/dist/examples/bela/granulator.dsp +++ /dev/null @@ -1,69 +0,0 @@ -// FROM FAUST DEMO -// Designed to use the Analog Input for parameter controls. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// ANALOG IN: -// ANALOG 0 : Grain Size -// ANALOG 1 : Speed -// ANALOG 2 : Probability -// (others analog inputs are not used) -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -process = vgroup("Granulator", environment { - declare name "Granulator"; - declare author "Adapted from sfIter by Christophe Lebreton"; - - /* =========== DESCRIPTION ============= - - - The granulator takes very small parts of a sound, called GRAINS, and plays them at a varying speed - - Front = Medium size grains - - Back = short grains - - Left Slow rhythm - - Right = Fast rhythm - - Bottom = Regular occurrences - - Head = Irregular occurrences - */ - - import("stdfaust.lib"); - - process = hgroup("Granulator", *(excitation : ampf)); - - excitation = noiseburst(gate,P) * (gain); - ampf = an.amp_follower_ud(duree_env,duree_env); - - //----------------------- NOISEBURST ------------------------- - - noiseburst(gate,P) = no.noise : *(gate : trigger(P)) - with { - upfront(x) = (x-x') > 0; - decay(n,x) = x - (x>0)/n; - release(n) = + ~ decay(n); - trigger(n) = upfront : release(n) : > (0.0); - }; - - //------------------------------------------------------------- - - P = freq; // fundamental period in samples - freq = hslider("[1]GrainSize[BELA: ANALOG_0]", 200,5,2205,1); - // the frequency gives the white noise band width - Pmax = 4096; // maximum P (for de.delay-line allocation) - - // PHASOR_BIN ////////////////////////////// - phasor_bin(init) = (+(float(speed)/float(ma.SR)) : fmod(_,1.0)) ~ *(init); - gate = phasor_bin(1) :-(0.001):pulsar; - gain = 1; - - // PULSAR ////////////////////////////// - // Pulsar allows to create a more or less random 'pulse'(proba). - - pulsar = _<:((_<(ratio_env)):@(100))*(proba>(_,abs(no.noise):ba.latch)); - speed = hslider ("[2]Speed[BELA: ANALOG_1]", 10,1,20,0.0001):fi.lowpass(1,1); - - ratio_env = 0.5; - fade = (0.5); // min > 0 to avoid division by 0 - - proba = hslider ("[3]Probability[BELA: ANALOG_2]", 70,50,100,1) * (0.01):fi.lowpass(1,1); - duree_env = 1/(speed: / (ratio_env*(0.25)*fade)); -}.process); diff --git a/dist/examples/bela/repeater.dsp b/dist/examples/bela/repeater.dsp deleted file mode 100644 index 4968b821..00000000 --- a/dist/examples/bela/repeater.dsp +++ /dev/null @@ -1,74 +0,0 @@ -// REPEATER: -// Freeze and repeat a small part of input signal 'n' time' -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// ANALOG IN: -// ANALOG 0 : Duration (ms) between 2 repeat series (500 to 2000 ms) -// ANALOG 1 : Duration of one repeat (2 to 200 ms) -// ANALOG 2 : Number of repeat -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -import("all.lib"); - -process = _, _ , (pathClock : compteurUpReset2(nbRepet): rampePlayer, _) : routageIO : rec_play_table , rec_play_table; - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// General loop duration -MasterTaille =hslider("MasterTaille[BELA: ANALOG_0]", 500, 200, 2000,0.01); -MasterClocSize = int(MasterTaille*ma.SR/ 1000); - -// Depth of repeat fragments -taille = hslider("taille[BELA: ANALOG_1]", 50, 2, 200,0.01); -clocSize = int(taille*ma.SR/ 1000); - -// Number of repeat fragments -nbRepet = int (hslider("nbRepet[BELA: ANALOG_2]",4,1,16,1) ); - -trig = _<:_,mem: >; - -routageIO (a, b, c, d) = a, c, d, b, c, d; -rec_play_table(input, inReadIndex, reset) = (rwtable(wf , rindex):fi.dcblockerat(20)) - with { - SR = 44100; - buffer_sec = 2; - size = int(SR * buffer_sec); - init = 0.; - - windex = (%(_,size))~(+(1):*(1-reset)); - rindex = (%( int(inReadIndex),size)); - - wf = size, init, int(windex), input; - }; - -MasterClock = (%(_,MasterClocSize))~(+(1)) : detect - with { - detect(x) = select2 (x < 100, 0, 1); - }; - -SlaveClock(reset) = (%(_,clocSize))~(+(1):*(1-reset)); -detect1(x) = select2 (x < clocSize/2, 0, 1); - -pathClock = MasterClock <: trig, _ : SlaveClock, _ : detect1, _; - -compteurUpReset2(nb, in, reset) = ((in:trig), reset : (routage : memo2)~_), reset - with { - memo2(a, b) = (ba.if(b>0.5, 0, _) )~(+(a)); - compare(value) = ba.if(value>nb, 1, 0); // :trig; - routage(d,e,f) = e, (f, compare(d) : RSLatch <: +(f)); - }; - -RSLatch(R, S) = latch(S,R) - with { - trig = _<:_,mem: >; - latch(S,R) = _~(ba.if(R>0.5, 0, _) : ba.if(S>0.5,1,_)); - }; - -rampePlayer(reset) = rampe - with { - rst = reset : trig; - rampe = _~(+(1):*(1-rst)); - toZero = _ : ba.if(reset<0.5,0,_); - }; diff --git a/dist/examples/bela/simpleFX.dsp b/dist/examples/bela/simpleFX.dsp deleted file mode 100644 index 677491f7..00000000 --- a/dist/examples/bela/simpleFX.dsp +++ /dev/null @@ -1,80 +0,0 @@ -import("stdfaust.lib"); -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple FX chaine build for a mono synthesizer. -// It controle general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// (All are available by OSC) -// -// CC 7 : Volume -// CC 10 : Pan -// -// CC 92 : Distortion Drive -// -// CC 13 : Flanger Delay -// CC 93 : Flanger Dry/Wet -// CC 94 : Flanger Feedback -// -// CC 12 : Reverberation Room size -// CC 91 : Reverberation Dry/Wet -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -vol = hslider ("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider ("drive[midi:ctrl 92]",0.3,0,1,0.001); - -// Flanger -curdel = hslider ("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider ("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider ("dryWetFlang[midi:ctrl 93]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Panoramique: -panno = _ : sp.panner(hslider ("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[midi:ctrl 12]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[midi:ctrl 91]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effets = _ *(vol) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -process = effets; diff --git a/dist/examples/bela/simpleFX_Analog.dsp b/dist/examples/bela/simpleFX_Analog.dsp deleted file mode 100644 index dbb9010a..00000000 --- a/dist/examples/bela/simpleFX_Analog.dsp +++ /dev/null @@ -1,84 +0,0 @@ -import("stdfaust.lib"); -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Simple FX chain build for a mono synthesizer. -// It control general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -// This version use ANALOG IN to controle some of the parameters. -// Other parameters continue to be available by MIDI or OSC. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_4 : Distortion Drive -// ANALOG_5 : Flanger Dry/Wet -// ANALOG_6 : Reverberation Dry/Wet -// ANALOG_7 : Reverberation Room size -// -// MIDI: -// CC 7 : Volume -// CC 10 : Pan -// -// CC 13 : Flanger Delay -// CC 13 : Flanger Delay -// CC 94 : Flanger Feedback -// -// CC 95 : Reverberation Damp -// CC 90: Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -vol = hslider("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider ("drive[BELA: ANALOG_4]",0.3,0,1,0.001); - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[BELA: ANALOG_5]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Panoramic: -panno = _ : sp.panner(hslider ("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[BELA: ANALOG_7]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[BELA: ANALOG_6]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effets = _ *(vol) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -process = effets; diff --git a/dist/examples/bela/simpleSynth.dsp b/dist/examples/bela/simpleSynth.dsp deleted file mode 100644 index e6932e0c..00000000 --- a/dist/examples/bela/simpleSynth.dsp +++ /dev/null @@ -1,79 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// A very simple subtractive synthesizer with 1 VCO 1 VCF. -// The VCO Waveform is variable between Saw and Square -// The frequency is modulated by an LFO -// The envelope control volum and filter frequency -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// -// CC 70 : waveform (Saw to square) -// CC 71 : Filter resonance (Q) -// CC 74 : Filter Cutoff frequency -// CC 79 : Filter keyboard tracking (0 to X2, default 1) -// CC 75 : Filter Envelope Modulation -// -// Envelope -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -// CC 78 : LFO frequency (0.001Hz to 10Hz) -// CC 1 : LFO Amplitude (Modulation) -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// HUI ////////////////////////////////////////////////// -// Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 0.5, 0.01);// MIDI KEYBOARD - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -// VCO -wfFade = hslider("waveform[midi:ctrl 70]",0.5,0,1,0.001):si.smoo; - -// VCF -res = hslider("resonnance[midi:ctrl 71]",0.5,0,1,0.001):si.smoo; -fr = hslider("fc[midi:ctrl 74]", 15, 15, 12000, 0.001):si.smoo; -track = hslider("tracking[midi:ctrl 79]", 1, 0, 2, 0.001); -envMod = hslider("envMod[midi:ctrl 75]",50,0,100,0.01):si.smoo; - -// ENV -att = 0.01 * (hslider("attack[midi:ctrl 73]",0.1,0.1,400,0.001)); -dec = 0.01 * (hslider("decay[midi:ctrl 76]",60,0.1,400,0.001)); -sust = hslider("sustain[midi:ctrl 77]",0.1,0,1,0.001); -rel = 0.01 * (hslider("release[midi:ctrl 72]",100,0.1,400,0.001)); - -// LFO -lfoFreq = hslider("lfoFreq[midi:ctrl 78]",6,0.001,10,0.001):si.smoo; -modwheel = hslider("modwheel[midi:ctrl 1]",0,0,0.5,0.001):si.smoo; - -// PROCESS ///////////////////////////////////////////// -allfreq = (midifreq * bend) + LFO; -// VCF -cutoff = ((allfreq * track) + fr + (envMod * midigain * env)) : min(ma.SR/8); - -// VCO -oscillo(f) = (os.sawtooth(f)*(1-wfFade))+(os.square(f)*wfFade); - -// VCA -volume = midigain * env; - -// Enveloppe -env = en.adsre(att,dec,sust,rel,midigate); - -// LFO -LFO = os.lf_triangle(lfoFreq)*modwheel*10; - -// SYNTH //////////////////////////////////////////////// -synth = (oscillo(allfreq) :ve.moog_vcf(res,cutoff)) * volume; - -// PROCESS ///////////////////////////////////////////// -process = synth; diff --git a/dist/examples/bela/simpleSynth_Analog.dsp b/dist/examples/bela/simpleSynth_Analog.dsp deleted file mode 100644 index 3b9bb070..00000000 --- a/dist/examples/bela/simpleSynth_Analog.dsp +++ /dev/null @@ -1,81 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// A very simple subtractive synthesizer with 1 VCO 1 VCF. -// The VCO Waveform is variable between Saw and Square -// The frequency is modulated by an LFO -// The envelope control volum and filter frequency -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : waveform (Saw to square) -// ANALOG_1 : Filter Cutoff frequency -// ANALOG_2 : Filter resonance (Q) -// ANALOG_3 : Filter Envelope Modulation -// -// MIDI: -// CC 79 : Filter keyboard tracking (0 to X2, default 1) -// -// Envelope -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -// CC 78 : LFO frequency (0.001Hz to 10Hz) -// CC 1 : LFO Amplitude (Modulation) -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// HUI ////////////////////////////////////////////////// -// Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 0.5, 0.01);// MIDI KEYBOARD - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -// VCO -wfFade = hslider("waveform[BELA: ANALOG_0]",0.5,0,1,0.001):si.smoo; - -// VCF -res = hslider("resonnance[BELA: ANALOG_2]",0.5,0,1,0.001):si.smoo; -fr = hslider("fc[BELA: ANALOG_1]", 15, 15, 12000, 0.001):si.smoo; -track = hslider("tracking[midi:ctrl 79]", 1, 0, 2, 0.001); -envMod = hslider("envMod[BELA: ANALOG_3]",50,0,100,0.01):si.smoo; - -// ENV -att = 0.01 * (hslider("attack[midi:ctrl 73]",0.1,0.1,400,0.001)); -dec = 0.01 * (hslider("decay[midi:ctrl 76]",60,0.1,400,0.001)); -sust = hslider("sustain[midi:ctrl 77]",0.2,0,1,0.001); -rel = 0.01 * (hslider("release[midi:ctrl 72]",100,0.1,400,0.001)); - -// LFO -lfoFreq = hslider("lfoFreq[midi:ctrl 78]",6,0.001,10,0.001):si.smoo; -modwheel = hslider("modwheel[midi:ctrl 1]",0,0,0.5,0.001):si.smoo; - -// PROCESS ///////////////////////////////////////////// -allfreq = (midifreq * bend) + LFO; -// VCF -cutoff = ((allfreq * track) + fr + (envMod * midigain * env)) : min(ma.SR/8); - -// VCO -oscillo(f) = (os.sawtooth(f)*(1-wfFade))+(os.square(f)*wfFade); - -// VCA -volume = midigain * env; - -// Enveloppe -env = en.adsre(att,dec,sust,rel,midigate); - -// LFO -LFO = os.lf_triangle(lfoFreq)*modwheel*10; - -// SYNTH //////////////////////////////////////////////// -synth = (oscillo(allfreq) :ve.moog_vcf(res,cutoff)) * volume; - -// PROCESS ///////////////////////////////////////////// -process = synth; diff --git a/dist/examples/bela/simpleSynth_FX.dsp b/dist/examples/bela/simpleSynth_FX.dsp deleted file mode 100644 index 2e83ff28..00000000 --- a/dist/examples/bela/simpleSynth_FX.dsp +++ /dev/null @@ -1,158 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// A very simple subtractive synthesizer with 1 VCO 1 VCF. -// The VCO Waveform is variable between Saw and Square -// The frequency is modulated by an LFO -// The envelope control volum and filter frequency -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// -// CC 70 : waveform (Saw to square) -// CC 71 : Filter resonance (Q) -// CC 74 : Filter Cutoff frequency -// CC 79 : Filter keyboard tracking (0 to X2, default 1) -// CC 75 : Filter Envelope Modulation -// -// Envelope -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -// CC 78 : LFO frequency (0.001Hz to 10Hz) -// CC 1 : LFO Amplitude (Modulation) -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// HUI ////////////////////////////////////////////////// -// Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 0.5, 0.01);// MIDI KEYBOARD - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -// VCO -wfFade = hslider("waveform[midi:ctrl 70]",0.5,0,1,0.001):si.smoo; - -// VCF -res = hslider("resonnance[midi:ctrl 71]",0.5,0,1,0.001):si.smoo; -fr = hslider("fc[midi:ctrl 74]", 15, 15, 12000, 0.001):si.smoo; -track = hslider("tracking[midi:ctrl 79]", 1, 0, 2, 0.001); -envMod = hslider("envMod[midi:ctrl 75]",50,0,100,0.01):si.smoo; - -// ENV -att = 0.01 * (hslider("attack[midi:ctrl 73]",0.1,0.1,400,0.001)); -dec = 0.01 * (hslider("decay[midi:ctrl 76]",60,0.1,400,0.001)); -sust = hslider("sustain[midi:ctrl 77]",0.1,0,1,0.001); -rel = 0.01 * (hslider("release[midi:ctrl 72]",100,0.1,400,0.001)); - -// LFO -lfoFreq = hslider("lfoFreq[midi:ctrl 78]",6,0.001,10,0.001):si.smoo; -modwheel = hslider("modwheel[midi:ctrl 1]",0,0,0.5,0.001):si.smoo; - -// PROCESS ///////////////////////////////////////////// -allfreq = (midifreq * bend) + LFO; - -// VCF -cutoff = ((allfreq * track) + fr + (envMod * midigain * env)) : min(ma.SR/8); - -// VCO -oscillo(f) = (os.sawtooth(f)*(1-wfFade))+(os.square(f)*wfFade); - -// VCA -volume = midigain * env; - -// Enveloppe -env = en.adsre(att,dec,sust,rel,midigate); - -// LFO -LFO = os.lf_triangle(lfoFreq)*modwheel*10; - -// SYNTH //////////////////////////////////////////////// -synth = (oscillo(allfreq) :ve.moog_vcf(res,cutoff)) * volume; - -//#################################################################################################// -//##################################### EFFECT SECTION ############################################// -//#################################################################################################// -// Simple FX chaine build for a mono synthesizer. -// It controle general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// MIDI IMPLEMENTATION: -// (All are available by OSC) -// -// CC 7 : Volume -// CC 10 : Pan -// -// CC 92 : Distortion Drive -// -// CC 13 : Flanger Delay -// CC 93 : Flanger Dry/Wet -// CC 94 : Flanger Feedback -// -// CC 12 : Reverberation Room size -// CC 91 : Reverberation Dry/Wet -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -volFX = hslider("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider("drive[midi:ctrl 92]",0.3,0,1,0.001); - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[midi:ctrl 93]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Pannoramique: -panno = _ : sp.panner(hslider("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[midi:ctrl 12]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[midi:ctrl 91]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effect = _ *(volFX) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -// PROCESS ///////////////////////////////////////////// -process = synth; diff --git a/dist/examples/bela/simpleSynth_FX_Analog.dsp b/dist/examples/bela/simpleSynth_FX_Analog.dsp deleted file mode 100644 index 3ccbfffe..00000000 --- a/dist/examples/bela/simpleSynth_FX_Analog.dsp +++ /dev/null @@ -1,165 +0,0 @@ -import("stdfaust.lib"); - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// A very simple subtractive synthesizer with 1 VCO 1 VCF. -// The VCO Waveform is variable between Saw and Square -// The frequency is modulated by an LFO -// The envelope control volum and filter frequency -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_0 : waveform (Saw to square) -// ANALOG_1 : Filter Cutoff frequency -// ANALOG_2 : Filter resonance (Q) -// ANALOG_3 : Filter Envelope Modulation -// -// MIDI: -// CC 79 : Filter keyboard tracking (0 to X2, default 1) -// -// Envelope -// CC 73 : Attack -// CC 76 : Decay -// CC 77 : Sustain -// CC 72 : Release -// -// CC 78 : LFO frequency (0.001Hz to 10Hz) -// CC 1 : LFO Amplitude (Modulation) -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// HUI ////////////////////////////////////////////////// -// Keyboard -midigate = button("gate"); -midifreq = nentry("freq[unit:Hz]", 440, 20, 20000, 1); -midigain = nentry("gain", 0.5, 0, 0.5, 0.01);// MIDI KEYBOARD - -// pitchwheel -bend = ba.semi2ratio(hslider("bend [midi:pitchwheel]",0,-2,2,0.01)); - -// VCO -wfFade = hslider("waveform[BELA: ANALOG_0]",0.5,0,1,0.001):si.smoo; - -// VCF -res = hslider("resonnance[BELA: ANALOG_2]",0.5,0,1,0.001):si.smoo; -fr = hslider("fc[BELA: ANALOG_1]", 15, 15, 12000, 0.001):si.smoo; -track = hslider("tracking[midi:ctrl 79]", 1, 0, 2, 0.001); -envMod = hslider("envMod[BELA: ANALOG_3]",50,0,100,0.01):si.smoo; - -// ENV -att = 0.01 * (hslider("attack[midi:ctrl 73]",0.1,0.1,400,0.001)); -dec = 0.01 * (hslider("decay[midi:ctrl 76]",60,0.1,400,0.001)); -sust = hslider ("sustain[midi:ctrl 77]",0.2,0,1,0.001); -rel = 0.01 * (hslider("release[midi:ctrl 72]",100,0.1,400,0.001)); - -// LFO -lfoFreq = hslider("lfoFreq[midi:ctrl 78]",6,0.001,10,0.001):si.smoo; -modwheel = hslider("modwheel[midi:ctrl 1]",0,0,0.5,0.001):si.smoo; - -// PROCESS ///////////////////////////////////////////// -allfreq = (midifreq * bend) + LFO; -// VCF -cutoff = ((allfreq * track) + fr + (envMod * midigain * env)) : min(ma.SR/8); - -// VCO -oscillo(f) = (os.sawtooth(f)*(1-wfFade))+(os.square(f)*wfFade); - -// VCA -volume = midigain * env; - -// Enveloppe -env = en.adsre(att,dec,sust,rel,midigate); - -// LFO -LFO = os.lf_triangle(lfoFreq)*modwheel*10; - -// SYNTH //////////////////////////////////////////////// -synth = (oscillo(allfreq) :ve.moog_vcf(res,cutoff)) * volume; - -//#################################################################################################// -//##################################### EFFECT SECTION ############################################// -//#################################################################################################// -// -// Simple FX chaine build for a mono synthesizer. -// It controle general volume and pan. -// FX Chaine is: -// Drive -// Flanger -// Reverberation -// -// This version use ANALOG IN to controle some of the parameters. -// Other parameters continue to be available by MIDI or OSC. -// -/////////////////////////////////////////////////////////////////////////////////////////////////// -// ANALOG IMPLEMENTATION: -// -// ANALOG_4 : Distortion Drive -// ANALOG_5 : Flanger Dry/Wet -// ANALOG_6 : Reverberation Dry/Wet -// ANALOG_7 : Reverberation Room size -// -// MIDI: -// CC 7 : Volume -// CC 10 : Pan -// -// CC 13 : Flanger Delay -// CC 13 : Flanger Delay -// CC 94 : Flanger Feedback -// -// CC 95 : Reverberation Damp -// CC 90 : Reverberation Stereo Width -// -/////////////////////////////////////////////////////////////////////////////////////////////////// - -// VOLUME: -volFX = hslider("volume[midi:ctrl 7]",1,0,1,0.001);// Should be 7 according to MIDI CC norm. - -// EFFECTS ///////////////////////////////////////////// -drive = hslider("drive[BELA: ANALOG_4]",0.3,0,1,0.001); - - -// Flanger -curdel = hslider("flangDel[midi:ctrl 13]",4,0.001,10,0.001); -fb = hslider("flangFeedback[midi:ctrl 94]",0.7,0,1,0.001); -fldw = hslider("dryWetFlang[BELA: ANALOG_5]",0.5,0,1,0.001); -flanger = efx - with { - fldel = (curdel + (os.lf_triangle(1) * 2) ) : min(10); - efx = _ <: _, pf.flanger_mono(10,fldel,1,fb,0) : dry_wet(fldw); - }; - -// Pannoramique: -panno = _ : sp.panner(hslider("pan[midi:ctrl 10]",0.5,0,1,0.001)) : _,_; - -// REVERB (from freeverb_demo) -reverb = _,_ <: (*(g)*fixedgain,*(g)*fixedgain : - re.stereo_freeverb(combfeed, allpassfeed, damping, spatSpread)), - *(1-g), *(1-g) :> _,_ - with { - scaleroom = 0.28; - offsetroom = 0.7; - allpassfeed = 0.5; - scaledamp = 0.4; - fixedgain = 0.1; - origSR = 44100; - - damping = vslider("Damp[midi:ctrl 95]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR; - combfeed = vslider("RoomSize[BELA: ANALOG_7]", 0.7, 0, 1, 0.025)*scaleroom*origSR/ma.SR + offsetroom; - spatSpread = vslider("Stereo[midi:ctrl 90]",0.6,0,1,0.01)*46*ma.SR/origSR; - g = vslider("dryWetReverb[BELA: ANALOG_6]", 0.4, 0, 1, 0.001); - // (g = Dry/Wet) - }; - -// Dry-Wet (from C. LEBRETON) -dry_wet(dw,x,y) = wet*y + dry*x - with { - wet = 0.5*(dw+1.0); - dry = 1.0-wet; - }; - -// ALL -effect = _ *(volFX) : ef.cubicnl_nodc(drive, 0.1) : flanger : panno : reverb; - -// PROCESS ///////////////////////////////////////////// -process = synth; diff --git a/dist/examples/delayEcho/echo.dsp b/dist/examples/delayEcho/echo.dsp deleted file mode 100644 index 760b458d..00000000 --- a/dist/examples/delayEcho/echo.dsp +++ /dev/null @@ -1,15 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check misceffects.lib -// for more accurate examples of echo functions - -declare name "echo"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; -//----------------------------------------------- -// A Simple Echo -//----------------------------------------------- - -import("stdfaust.lib"); - -process = vgroup("echo-simple", ef.echo1s); diff --git a/dist/examples/delayEcho/quadEcho.dsp b/dist/examples/delayEcho/quadEcho.dsp deleted file mode 100644 index afbbdc53..00000000 --- a/dist/examples/delayEcho/quadEcho.dsp +++ /dev/null @@ -1,21 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check misceffects.lib -// for more accurate examples of echo functions - -declare name "quadEcho"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2007"; - -//----------------------------------------------- -// A 1 second quadriphonic Echo -//----------------------------------------------- - -import("stdfaust.lib"); - -process = vgroup("stereo echo", multi(ef.echo1s, 4)) - with{ - multi(f,1) = f; - multi(f,n) = f,multi(f,n-1); - }; - diff --git a/dist/examples/delayEcho/smoothDelay.dsp b/dist/examples/delayEcho/smoothDelay.dsp deleted file mode 100644 index 90b74727..00000000 --- a/dist/examples/delayEcho/smoothDelay.dsp +++ /dev/null @@ -1,27 +0,0 @@ -declare name "smoothDelay"; -declare author "Yann Orlarey"; -declare copyright "Grame"; -declare version "1.0"; -declare license "STK-4.3"; - -//--------------------------process---------------------------- -// -// A stereo smooth delay with a feedback control -// -// This example shows how to use sdelay, a delay that doesn't -// click and doesn't transpose when the delay time is changed -//------------------------------------------------------------- - -import("stdfaust.lib"); - -process = par(i, 2, voice) - with - { - voice = (+ : de.sdelay(N, interp, dtime)) ~ *(fback); - N = int(2^19); - interp = hslider("interpolation[unit:ms][style:knob]",10,1,100,0.1)*ma.SR/1000.0; - dtime = hslider("delay[unit:ms][style:knob]", 0, 0, 5000, 0.1)*ma.SR/1000.0; - fback = hslider("feedback[style:knob]",0,0,100,0.1)/100.0; - }; - - diff --git a/dist/examples/delayEcho/stereoEcho.dsp b/dist/examples/delayEcho/stereoEcho.dsp deleted file mode 100644 index d57d7e81..00000000 --- a/dist/examples/delayEcho/stereoEcho.dsp +++ /dev/null @@ -1,16 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check misceffects.lib -// for more accurate examples of echo functions - -declare name "stereoEcho"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2007"; - -//----------------------------------------------- -// A 1 second Stereo Echo -//----------------------------------------------- - -import("stdfaust.lib"); - -process = vgroup("stereo echo", (ef.echo1s, ef.echo1s)); diff --git a/dist/examples/delayEcho/tapiir.dsp b/dist/examples/delayEcho/tapiir.dsp deleted file mode 100644 index e4ead082..00000000 --- a/dist/examples/delayEcho/tapiir.dsp +++ /dev/null @@ -1,44 +0,0 @@ -declare name "tapiir"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//====================================================== -// -// TAPIIR -// (from Maarten de Boer's Tapiir) -// -//====================================================== - -import("stdfaust.lib"); - -dsize = 524288; - -// user interface -//--------------- -tap(n) = vslider("tap %n", 0,0,1,0.1); -in(n) = vslider("input %n", 1,0,1,0.1); -gain = vslider("gain", 1,0,1,0.1); -del = vslider("delay (sec)", 0, 0, 5, 0.01) * ma.SR; - -// mixer and matrix -//----------------------------------------------------------- -mixer(taps,lines) = par(i,taps,*(tap(i))), par(i,lines,*(in(i))) :> *(gain); - -matrix(taps,lines) = (si.bus(lines+taps) - <: tgroup("", - par(i, taps, hgroup("Tap %i", mixer(taps,lines) : de.delay(dsize,del)))) - ) ~ si.bus(taps); - -// tapiir -//-------- -tapiir(taps,lines) = vgroup("Tapiir", - si.bus(lines) - <: (matrix(taps,lines), si.bus(lines)) - <: vgroup( "outputs", par( i, lines, hgroup("output %i", mixer(taps,lines)) ) ) - ); - -process = tapiir(6,2); - - diff --git a/dist/examples/dynamic/compressor.dsp b/dist/examples/dynamic/compressor.dsp deleted file mode 100644 index 545eca27..00000000 --- a/dist/examples/dynamic/compressor.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "compressor"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "Compressor demo application"; - -import("stdfaust.lib"); - -process = dm.compressor_demo; diff --git a/dist/examples/dynamic/distortion.dsp b/dist/examples/dynamic/distortion.dsp deleted file mode 100644 index 24852baf..00000000 --- a/dist/examples/dynamic/distortion.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "distortion"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "Distortion demo application."; - -import("stdfaust.lib"); - -process = dm.cubicnl_demo; diff --git a/dist/examples/dynamic/gateCompressor.dsp b/dist/examples/dynamic/gateCompressor.dsp deleted file mode 100644 index 40382798..00000000 --- a/dist/examples/dynamic/gateCompressor.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "gateCompressor"; - -import("stdfaust.lib"); - -process = -// ol.sawtooth_demo <: -// el.gate_demo : ef.compressor_demo :> fi.spectral_level_demo <: _,_; - vgroup("[1]", dm.sawtooth_demo) <: - vgroup("[2]", dm.gate_demo) : - vgroup("[3]", dm.compressor_demo) :> - vgroup("[4]", dm.spectral_level_demo) <: - _,_; diff --git a/dist/examples/dynamic/noiseGate.dsp b/dist/examples/dynamic/noiseGate.dsp deleted file mode 100644 index 8d76d5ac..00000000 --- a/dist/examples/dynamic/noiseGate.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "noiseGate"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "Gate demo application."; - -import("stdfaust.lib"); - -process = dm.gate_demo; diff --git a/dist/examples/dynamic/volume.dsp b/dist/examples/dynamic/volume.dsp deleted file mode 100644 index c8d986e5..00000000 --- a/dist/examples/dynamic/volume.dsp +++ /dev/null @@ -1,15 +0,0 @@ -declare name "volume"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//----------------------------------------------- -// Volume control in dB -//----------------------------------------------- - -import("stdfaust.lib"); - -gain = vslider("[1]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo; - -process = *(gain); diff --git a/dist/examples/fft/fft_bandpass.dsp b/dist/examples/fft/fft_bandpass.dsp deleted file mode 100644 index c7d8d194..00000000 --- a/dist/examples/fft/fft_bandpass.dsp +++ /dev/null @@ -1,11 +0,0 @@ -import("stdfaust.lib"); -fftSize = hslider("fftSize", 1024, 2, 16384, 1); // global variable set by the processor itself -center = hslider("center", 440, 0, 24000, 0.1); // Band-pass center frequency in Hz -width = hslider("width", 100, 0, 12000, 0.1); // Band-pass width in Hz -centerBin = center / (ma.SR / fftSize); // fft bin of the center freq -widthBin = width / (ma.SR / fftSize); // fft bins of band-pass width -fftproc(rIn, iIn, bin) = out with { // 3 inputs for each audio channel: real, imaginary, current bin - inRange = (bin > centerBin - widthBin) & (bin < centerBin + widthBin); // is the current bin in range? - out = rIn * inRange, iIn * inRange; // 2 outputs for ifft: real, imaginary -}; -process = fftproc; diff --git a/dist/examples/fft/fft_centroid.dsp b/dist/examples/fft/fft_centroid.dsp deleted file mode 100644 index 7b432d47..00000000 --- a/dist/examples/fft/fft_centroid.dsp +++ /dev/null @@ -1,19 +0,0 @@ -import("stdfaust.lib"); - -fftSize = hslider("fftSize", 1024, 2, 16384, 1); // global variable set by the processor itself -fftHopSize = hslider("fftHopSize", 1024, 2, 16384, 1); // global variable set by the processor itself -bufferSize = fftSize / 2 + 1; // Bins from 0Hz to Nyquist freq -freqPerBin = ma.SR / fftSize; -binToFreq = *(freqPerBin); -freqToBin = /(freqPerBin); - -cartopol(x, y) = x * x + y * y : sqrt, atan2(y, x); // cartesian to polar -poltocar(r, theta) = r * cos(theta), r * sin(theta); // polar to cartesian - -fftproc(rIn, iIn, bin) = out, out with { // 3 inputs for each audio channel: real, imaginary, current bin - mag = rIn * rIn + iIn * iIn : sqrt; - centroid = mag : *(bin) : + ~ *(bin > 0); - weight = mag : + ~ *(bin > 0); - out = centroid / weight * freqPerBin : ba.sAndH(bin == bufferSize - 1); -}; -process = fftproc; diff --git a/dist/examples/fft/fft_delay.dsp b/dist/examples/fft/fft_delay.dsp deleted file mode 100644 index adc90160..00000000 --- a/dist/examples/fft/fft_delay.dsp +++ /dev/null @@ -1,22 +0,0 @@ -import("stdfaust.lib"); - -fftSize = hslider("fftSize", 1024, 2, 16384, 1); // global variable set by the processor itself -fftHopSize = hslider("fftHopSize", 1024, 2, 16384, 1); // global variable set by the processor itself -bufferSize = fftSize / 2 + 1; // Bins from 0Hz to Nyquist freq -freqPerBin = ma.SR / fftSize; - -cartopol(x, y) = x * x + y * y : sqrt, atan2(y, x); // cartesian to polar -poltocar(r, theta) = r * cos(theta), r * sin(theta); // polar to cartesian - -feedback = hslider("feedback", 0, 0, 1, 0.01); -delay = hslider("delay", 1, 0, 10, 0.01); -delayFrames = int(ma.SR * delay / fftHopSize) : max(1); -delaySmps = delayFrames * bufferSize : min(ma.SR * 10); - -delayLine = + ~ (@(delaySmps - 1) : *(feedback)); - -fftproc(rIn, iIn, bin) = out with { // 3 inputs for each audio channel: real, imaginary, current bin - - out = (rIn : delayLine), (iIn : delayLine); -}; -process = fftproc; diff --git a/dist/examples/fft/fft_gain.dsp b/dist/examples/fft/fft_gain.dsp deleted file mode 100644 index 138cb020..00000000 --- a/dist/examples/fft/fft_gain.dsp +++ /dev/null @@ -1,2 +0,0 @@ -gain = hslider("gain", 1, 0, 1, 0.01); -process = *(gain), *(gain); \ No newline at end of file diff --git a/dist/examples/fft/fft_remove_phase.dsp b/dist/examples/fft/fft_remove_phase.dsp deleted file mode 100644 index b867b87a..00000000 --- a/dist/examples/fft/fft_remove_phase.dsp +++ /dev/null @@ -1,17 +0,0 @@ -import("stdfaust.lib"); - -fftSize = hslider("fftSize", 1024, 2, 16384, 1); // global variable set by the processor itself -fftHopSize = hslider("fftHopSize", 1024, 2, 16384, 1); // global variable set by the processor itself -bufferSize = fftSize / 2 + 1; // Bins from 0Hz to Nyquist freq -freqPerBin = ma.SR / fftSize; -binToFreq = *(freqPerBin); -freqToBin = /(freqPerBin); - -cartopol(x, y) = x * x + y * y : sqrt, atan2(y, x); // cartesian to polar -poltocar(r, theta) = r * cos(theta), r * sin(theta); // polar to cartesian - -fftproc(rIn, iIn, bin) = out, out with { // 3 inputs for each audio channel: real, imaginary, current bin - mag = rIn * rIn + iIn * iIn : sqrt; - out = poltocar(mag, 0); -}; -process = fftproc; diff --git a/dist/examples/fft/fft_synth.dsp b/dist/examples/fft/fft_synth.dsp deleted file mode 100644 index 01a181c4..00000000 --- a/dist/examples/fft/fft_synth.dsp +++ /dev/null @@ -1,4 +0,0 @@ -process(r, i, b) = a, a, a, a with { - k = (b == 0) : + ~ %(20); - a = (b == k) * 0.01; -}; \ No newline at end of file diff --git a/dist/examples/filtering/APF.dsp b/dist/examples/filtering/APF.dsp deleted file mode 100644 index 8228d333..00000000 --- a/dist/examples/filtering/APF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "APF"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = APF(x,F,G,Q); - diff --git a/dist/examples/filtering/BPF.dsp b/dist/examples/filtering/BPF.dsp deleted file mode 100644 index 7d817e29..00000000 --- a/dist/examples/filtering/BPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "BPF"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = BPF(x,F,G,Q); - diff --git a/dist/examples/filtering/DNN.dsp b/dist/examples/filtering/DNN.dsp deleted file mode 100644 index cd3c4b9b..00000000 --- a/dist/examples/filtering/DNN.dsp +++ /dev/null @@ -1,25 +0,0 @@ -// Forward Deep Neural Net (DNN), any number of layers of any size each - -declare name "DNN"; -declare author "JOS"; -declare license "STK-4.3"; - -import("stdfaust.lib"); - -layerSizes = (8,5,8); // autoencoder with 8 in & out, 5-state hidden layer -w(m,n,k) = m*100+n*10+k; // placeholder weights: m=layer, n=fromNode, k=destNode - -M = ba.count(layerSizes); -N(l) = ba.take(l+1,layerSizes); // Nodes per layer - -process = seq(m, M-1, layer(m)) -// look at weights: -// process = par(m,M,par(n,N(m),par(k,N(m),w(m,n,k)))) -with { - layer(m) = weights(m) :> nonlinearities(m); - nonlinearities(m) = bus(N(m)*N(m+1)) :> par(n,N(m+1),nl(n)); - weights(m) = bus(N(m)) <: par(n,N(m),(bus(N(m+1))<:wts(m,n))); - wts(m,n) = bus(N(m+1)) : par(k,N(m+1),*(w(m,n,k))); - nl(n,x) = x * (x>0); // ReLU - bus(N) = par(k,N,_); -}; diff --git a/dist/examples/filtering/HPF.dsp b/dist/examples/filtering/HPF.dsp deleted file mode 100644 index df04a35d..00000000 --- a/dist/examples/filtering/HPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "HPF"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = HPF(x,F,G,Q); - diff --git a/dist/examples/filtering/LPF.dsp b/dist/examples/filtering/LPF.dsp deleted file mode 100644 index e1351be3..00000000 --- a/dist/examples/filtering/LPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "LPF"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = LPF(x,F,G,Q); - diff --git a/dist/examples/filtering/bandFilter.dsp b/dist/examples/filtering/bandFilter.dsp deleted file mode 100644 index d2f12a2b..00000000 --- a/dist/examples/filtering/bandFilter.dsp +++ /dev/null @@ -1,44 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "bandFilter"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -import("stdfaust.lib"); - -//---------------------second order filter-------------------------- -// filter(Q,F,G) -// Q : quality factor [1..100] -// F : frequency (Hz) -// G : gain [0..1] -//------------------------------------------------------------------ - -filter(Q,F,G) = fi.TF2( (1 + K/Q + K*K) / D, - 2 * (K*K - 1) / D, - (1 - K/Q + K*K) / D, - 2 * (K*K - 1) / D, - (1 - V*K/Q + K*K) / D - ) - with { - V = ba.db2linear(G); - K = tan(ma.PI*F/ma.SR); - D = 1 + V*K/Q + K*K; - }; - -//--------------- Band Filter with user interface ------------------ -// bandfilter(F) -// F : default frequency (Hz) -// -//------------------------------------------------------------------ - -bandfilter(F) = filter( nentry("Q factor [style:knob]",50,0.1,100,0.1), - nentry("freq [unit:Hz][style:knob]", F, 20, 20000, 1), - 0 - vslider("gain [unit:dB]", 0, -50, 50, 0.1) - ); - -//------------------------- Process -------------------------------- - -process = vgroup("Bandfilter", bandfilter(1000)); diff --git a/dist/examples/filtering/cryBaby.dsp b/dist/examples/filtering/cryBaby.dsp deleted file mode 100644 index 16449734..00000000 --- a/dist/examples/filtering/cryBaby.dsp +++ /dev/null @@ -1,4 +0,0 @@ -declare name "cryBaby"; -declare description "Application demonstrating the CryBaby wah pedal emulation"; -import("stdfaust.lib"); -process = dm.crybaby_demo; diff --git a/dist/examples/filtering/diodeLadder.dsp b/dist/examples/filtering/diodeLadder.dsp deleted file mode 100644 index 64c5dfa0..00000000 --- a/dist/examples/filtering/diodeLadder.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "diodeLadder"; -declare description "Demonstration of diodeLadder"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.7072,25,0.01); -normFreq = hslider("freq",0.1,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); -inputSignal = (no.noise *switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.diodeLadder(normFreq,Q) <:_,_; \ No newline at end of file diff --git a/dist/examples/filtering/filterBank.dsp b/dist/examples/filtering/filterBank.dsp deleted file mode 100644 index 20d65660..00000000 --- a/dist/examples/filtering/filterBank.dsp +++ /dev/null @@ -1,6 +0,0 @@ -declare name "filterBank"; -declare description "Graphic Equalizer consisting of a filter-bank driving a bank of faders"; - -import("stdfaust.lib"); - -process = dm.filterbank_demo; diff --git a/dist/examples/filtering/graphicEqLab.dsp b/dist/examples/filtering/graphicEqLab.dsp deleted file mode 100644 index cbb2790a..00000000 --- a/dist/examples/filtering/graphicEqLab.dsp +++ /dev/null @@ -1,11 +0,0 @@ -declare name "graphicEqLab"; -declare description "Signal generators through a filter bank with spectrum analysis display"; - -import("stdfaust.lib"); - -process = -// ol.sawtooth_demo : fl.filterbank_demo : fl.spectral_level_demo <: _,_; - vgroup("[1]",dm.sawtooth_demo) : - vgroup("[2]",dm.filterbank_demo) : - vgroup("[3]",dm.spectral_level_demo) <: - _,_; diff --git a/dist/examples/filtering/highShelf.dsp b/dist/examples/filtering/highShelf.dsp deleted file mode 100644 index 332bec6b..00000000 --- a/dist/examples/filtering/highShelf.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "highShelf"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = highShelf(x,F,G,Q); - diff --git a/dist/examples/filtering/korg35HPF.dsp b/dist/examples/filtering/korg35HPF.dsp deleted file mode 100644 index 61427d68..00000000 --- a/dist/examples/filtering/korg35HPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "korg35HPF"; -declare description "Demonstration of the Korg 35 HPF"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise *switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.korg35HPF(normFreq,Q) <:_,_; \ No newline at end of file diff --git a/dist/examples/filtering/korg35LPF.dsp b/dist/examples/filtering/korg35LPF.dsp deleted file mode 100644 index 8cf0b922..00000000 --- a/dist/examples/filtering/korg35LPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "korg35LPF"; -declare description "Demonstration of the Korg 35 LPF"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise *switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.korg35LPF(normFreq,Q) <:_,_; \ No newline at end of file diff --git a/dist/examples/filtering/lfBoost.dsp b/dist/examples/filtering/lfBoost.dsp deleted file mode 100644 index 0d16af56..00000000 --- a/dist/examples/filtering/lfBoost.dsp +++ /dev/null @@ -1,40 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "lfboost"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------------------------ -// DAFX, Digital Audio Effects (Wiley ed.) -// chapter 2 : filters -// section 2.3 : Equalizers -// page 53 : second order shelving filter design -//------------------------------------------------------------------ - -import("stdfaust.lib"); - -//----------------------low frequency boost filter ------------------------------- -// lfboost(F,G) -// F : frequency (in Hz) -// G : gain (in dB) -// -//-------------------------------------------------------------------------------- - -lfboost(F,G) = fi.TF2((1 + sqrt(2*V)*K + V*K*K) / denom, - 2 * (V*K*K - 1) / denom, - (1 - sqrt(2*V)*K + V*K*K) / denom, - 2 * (K*K - 1) / denom, - (1 - sqrt(2)*K + K*K) / denom) - with { - V = ba.db2linear(G); - K = tan(ma.PI*F/ma.SR); - denom = 1 + sqrt(2)*K + K*K; - }; - -//====================low frequency boost process =============================== - -process = vgroup("lowboost", lfboost(nentry("freq [unit:Hz][style:knob]", 100, 20, 150, 1), - vslider("gain [unit:dB]", 0, -20, 20, 0.1))); diff --git a/dist/examples/filtering/lowBoost.dsp b/dist/examples/filtering/lowBoost.dsp deleted file mode 100644 index cdf70b00..00000000 --- a/dist/examples/filtering/lowBoost.dsp +++ /dev/null @@ -1,40 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "lowboost"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------------------------ -// DAFX, Digital Audio Effects (Wiley ed.) -// chapter 2 : filters -// section 2.3 : Equalizers -// page 53 : second order shelving filter design -//------------------------------------------------------------------ - -import("stdfaust.lib"); - -//------------------- low-frequency shelving boost (table 2.3) -------------------- - -V0(g) = pow(10,g/20.0); -K(fc) = tan(ma.PI*fc/ma.SR); -square(x) = x*x; -denom(fc) = 1 + sqrt(2)*K(fc) + square(K(fc)); - -lfboost(fc, g) = fi.TF2((1 + sqrt(2*V0(g))*K(fc) + V0(g)*square(K(fc))) / denom(fc), - 2 * (V0(g)*square(K(fc)) - 1) / denom(fc), - (1 - sqrt(2*V0(g))*K(fc) + V0(g)*square(K(fc))) / denom(fc), - 2 * (square(K(fc)) - 1) / denom(fc), - (1 - sqrt(2)*K(fc) + square(K(fc))) / denom(fc)); - -//------------------------------ User Interface ----------------------------------- - -freq = hslider("[1]freq [unit:Hz][style:knob]", 1000, 20, 20000, 0.1); -gain = hslider("[2]gain [unit:dB][style:knob]", 0, -20, 20, 0.1); - -//----------------------------------- Process ------------------------------------- - -process = vgroup("low-freq shelving boost", lfboost(freq,gain)); - diff --git a/dist/examples/filtering/lowCut.dsp b/dist/examples/filtering/lowCut.dsp deleted file mode 100644 index c9d12ebb..00000000 --- a/dist/examples/filtering/lowCut.dsp +++ /dev/null @@ -1,40 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "lowcut"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------------------------ -// DAFX, Digital Audio Effects (Wiley ed.) -// chapter 2 : filters -// section 2.3 : Equalizers -// page 53 : second order shelving filter design -//------------------------------------------------------------------ - -import("stdfaust.lib"); - -//------------------- low-frequency shelving cut (table 2.3) -------------------- - -V0(g) = pow(10,g/-20.0); -K(fc) = tan(ma.PI*fc/ma.SR); -squ(x) = x*x; -denom(fc,g) = 1 + sqrt(2*V0(g))*K(fc) + V0(g)*squ(K(fc)); - -lfcut(fc, g) = fi.TF2((1 + sqrt(2)*K(fc) + squ(K(fc))) / denom(fc,g), - 2 * (squ(K(fc)) - 1) / denom(fc,g), - (1 - sqrt(2)*K(fc) + squ(K(fc))) / denom(fc,g), - 2 * (V0(g)*squ(K(fc)) - 1) / denom(fc,g), - (1 - sqrt(2*V0(g))*K(fc) + V0(g)*squ(K(fc))) / denom(fc,g)); - -//------------------------------ User Interface ----------------------------------- - -freq = hslider("freq [unit:Hz][style:knob]", 100, 20, 5000, 1); -att = hslider("attenuation [unit:dB][style:knob]", 0, -96, 10, 0.1); - -//----------------------------------- Process ------------------------------------- - -process = vgroup("low-freq shelving cut", lfcut(freq,att)); - diff --git a/dist/examples/filtering/lowShelf.dsp b/dist/examples/filtering/lowShelf.dsp deleted file mode 100644 index 3b4d0ec1..00000000 --- a/dist/examples/filtering/lowShelf.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "lowShelf"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = lowShelf(x,F,G,Q); - diff --git a/dist/examples/filtering/moogHalfLadder.dsp b/dist/examples/filtering/moogHalfLadder.dsp deleted file mode 100644 index 8e88c1d0..00000000 --- a/dist/examples/filtering/moogHalfLadder.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "moogHalfLadder"; -declare description "Demonstration of moogHalfLadder"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.7072,25,0.01); -normFreq = hslider("freq",0.1,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); -inputSignal = (no.noise *switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.moogHalfLadder(normFreq,Q) <:_,_; \ No newline at end of file diff --git a/dist/examples/filtering/moogLadder.dsp b/dist/examples/filtering/moogLadder.dsp deleted file mode 100644 index 4da02680..00000000 --- a/dist/examples/filtering/moogLadder.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "moogLadder"; -declare description "Demonstration of moogLadder"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.7072,25,0.01); -normFreq = hslider("freq",0.1,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); -inputSignal = (no.noise *switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.moogLadder(normFreq,Q) <:_,_; \ No newline at end of file diff --git a/dist/examples/filtering/moogVCF.dsp b/dist/examples/filtering/moogVCF.dsp deleted file mode 100644 index 45f256ec..00000000 --- a/dist/examples/filtering/moogVCF.dsp +++ /dev/null @@ -1,6 +0,0 @@ -declare name "moogVCF"; -declare description "Exercise and compare three Moog VCF implementations"; - -import("stdfaust.lib"); - -process = dm.moog_vcf_demo; diff --git a/dist/examples/filtering/multibandFilter.dsp b/dist/examples/filtering/multibandFilter.dsp deleted file mode 100644 index 6afa6453..00000000 --- a/dist/examples/filtering/multibandFilter.dsp +++ /dev/null @@ -1,14 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "multibandFilter"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//---------------------------Multi Band Filter----------------------------- -// -//------------------------------------------------------------------------- - -process = hgroup("Multi Band Filter", seq(i, 10, vgroup("peak %i", component("bandFilter.dsp").bandfilter(1000*(1+i))))); diff --git a/dist/examples/filtering/notch.dsp b/dist/examples/filtering/notch.dsp deleted file mode 100644 index dcab9ecd..00000000 --- a/dist/examples/filtering/notch.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "notch"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = notch(x,F,G,Q); - diff --git a/dist/examples/filtering/oberheim.dsp b/dist/examples/filtering/oberheim.dsp deleted file mode 100644 index 8e5d5964..00000000 --- a/dist/examples/filtering/oberheim.dsp +++ /dev/null @@ -1,14 +0,0 @@ -declare name "oberheimBSF"; -declare description "Demonstration of the Oberheim generic multi-outputs Filter"; -declare author "Eric Tarr, GRAME"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -// The BSF, BPF, HPF and LPF outputs are produced -process = inputSignal : ve.oberheim(normFreq,Q); diff --git a/dist/examples/filtering/oberheimBPF.dsp b/dist/examples/filtering/oberheimBPF.dsp deleted file mode 100644 index c61e5cb0..00000000 --- a/dist/examples/filtering/oberheimBPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "oberheimBPF"; -declare description "Demonstration of the Oberheim Band-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.oberheimBPF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/oberheimBSF.dsp b/dist/examples/filtering/oberheimBSF.dsp deleted file mode 100644 index e048a03f..00000000 --- a/dist/examples/filtering/oberheimBSF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "oberheimBSF"; -declare description "Demonstration of the Oberheim Band-Stop Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.oberheimBSF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/oberheimHPF.dsp b/dist/examples/filtering/oberheimHPF.dsp deleted file mode 100644 index bfcc2feb..00000000 --- a/dist/examples/filtering/oberheimHPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "oberheimHPF"; -declare description "Demonstration of the Oberheim High-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.oberheimHPF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/oberheimLPF.dsp b/dist/examples/filtering/oberheimLPF.dsp deleted file mode 100644 index a75d443f..00000000 --- a/dist/examples/filtering/oberheimLPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "oberheimLPF"; -declare description "Demonstration of the Oberheim Low-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.oberheimLPF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/parametricEqLab.dsp b/dist/examples/filtering/parametricEqLab.dsp deleted file mode 100644 index 39c1d781..00000000 --- a/dist/examples/filtering/parametricEqLab.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "parametricEqLab"; -declare description "Demonstrate the Parametric Equalizer sections on test signals with spectrum analysis display"; - -import("stdfaust.lib"); - -//process = ol.sawtooth_demo : fl.parametric_eq_demo : -// fl.mth_octave_spectral_level_demo(2) <: _,_; -process = - vgroup("[1]", dm.sawtooth_demo) : - vgroup("[2]", dm.parametric_eq_demo) : - vgroup("[3]", dm.mth_octave_spectral_level_demo(2)) - <: _,_; diff --git a/dist/examples/filtering/parametricEqualizer.dsp b/dist/examples/filtering/parametricEqualizer.dsp deleted file mode 100644 index a9ceacd4..00000000 --- a/dist/examples/filtering/parametricEqualizer.dsp +++ /dev/null @@ -1,6 +0,0 @@ -declare name "parametricEqualizer"; -declare description "Exercise and compare Parametric Equalizer sections on test signals"; - -import("stdfaust.lib"); - -process = dm.parametric_eq_demo; diff --git a/dist/examples/filtering/peakNotch.dsp b/dist/examples/filtering/peakNotch.dsp deleted file mode 100644 index 67141013..00000000 --- a/dist/examples/filtering/peakNotch.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "peakNotch"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit: lin]", 1, 0, 8, 0.01); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = peakNotch(x,F,G,Q); - diff --git a/dist/examples/filtering/peakingEQ.dsp b/dist/examples/filtering/peakingEQ.dsp deleted file mode 100644 index cf234cf6..00000000 --- a/dist/examples/filtering/peakingEQ.dsp +++ /dev/null @@ -1,13 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check filters.lib -// for more accurate examples of filter functions - -declare name "peakingEQ"; - -import("maxmsp.lib"); - -G = hslider("Gain [unit:dB]", 0, -10, 10, 0.1); -F = hslider("Freq", 1000, 100, 10000, 1); -Q = hslider("Q", 1, 0.01, 100, 0.01); - -process(x) = peakingEQ(x,F,G,Q); - diff --git a/dist/examples/filtering/sallenKey2ndOrder.dsp b/dist/examples/filtering/sallenKey2ndOrder.dsp deleted file mode 100644 index cc227421..00000000 --- a/dist/examples/filtering/sallenKey2ndOrder.dsp +++ /dev/null @@ -1,14 +0,0 @@ -declare name "sallenKey2ndOrderBPF"; -declare description "Demonstration of the Sallen-Key Second Order generic multi-ourputs Filter"; -declare author "Eric Tarr, GRAME"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _ ; - -// The LPF and HPF outputs are produced -process = inputSignal : ve.sallenKey2ndOrder(normFreq,Q); diff --git a/dist/examples/filtering/sallenKey2ndOrderBPF.dsp b/dist/examples/filtering/sallenKey2ndOrderBPF.dsp deleted file mode 100644 index 21548577..00000000 --- a/dist/examples/filtering/sallenKey2ndOrderBPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "sallenKey2ndOrderBPF"; -declare description "Demonstration of the Sallen-Key Second Order Band-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.sallenKey2ndOrderBPF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/sallenKey2ndOrderHPF.dsp b/dist/examples/filtering/sallenKey2ndOrderHPF.dsp deleted file mode 100644 index 882bb7eb..00000000 --- a/dist/examples/filtering/sallenKey2ndOrderHPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "sallenKey2ndOrderHPF"; -declare description "Demonstration of the Sallen-Key Second Order Low-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.sallenKey2ndOrderHPF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/sallenKey2ndOrderLPF.dsp b/dist/examples/filtering/sallenKey2ndOrderLPF.dsp deleted file mode 100644 index 3b29b0b9..00000000 --- a/dist/examples/filtering/sallenKey2ndOrderLPF.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "sallenKey2ndOrderLPF"; -declare description "Demonstration of the Sallen-Key Second Order Low-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -Q = hslider("Q",1,0.5,10,0.01); -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.sallenKey2ndOrderLPF(normFreq,Q) <:_,_; diff --git a/dist/examples/filtering/sallenKeyOnePole.dsp b/dist/examples/filtering/sallenKeyOnePole.dsp deleted file mode 100644 index d64a3823..00000000 --- a/dist/examples/filtering/sallenKeyOnePole.dsp +++ /dev/null @@ -1,13 +0,0 @@ -declare name "sallenKeyOnePoleLPF"; -declare description "Demonstration of the Sallen-Key One Pole generic multi-ouputs Filter"; -declare author "Eric Tarr, GRAME"; - -import("stdfaust.lib"); - -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -// The LPF, BPF and HPF outputs are produced -process = inputSignal : ve.sallenKeyOnePole(normFreq); diff --git a/dist/examples/filtering/sallenKeyOnePoleHPF.dsp b/dist/examples/filtering/sallenKeyOnePoleHPF.dsp deleted file mode 100644 index 17197424..00000000 --- a/dist/examples/filtering/sallenKeyOnePoleHPF.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "sallenKeyOnePoleHPF"; -declare description "Demonstration of the Sallen-Key One Pole High-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.sallenKeyOnePoleHPF(normFreq) <:_,_; diff --git a/dist/examples/filtering/sallenKeyOnePoleLPF.dsp b/dist/examples/filtering/sallenKeyOnePoleLPF.dsp deleted file mode 100644 index 7704e819..00000000 --- a/dist/examples/filtering/sallenKeyOnePoleLPF.dsp +++ /dev/null @@ -1,12 +0,0 @@ -declare name "sallenKeyOnePoleLPF"; -declare description "Demonstration of the Sallen-Key One Pole Low-Pass Filter"; -declare author "Eric Tarr"; - -import("stdfaust.lib"); - -normFreq = hslider("freq",0.5,0,1,0.001):si.smoo; -switch = checkbox("Saw/Noise"); - -inputSignal = (no.noise*switch) , (os.sawtooth(100)*(1-switch)) :> _; - -process = inputSignal : ve.sallenKeyOnePoleLPF(normFreq) <:_,_; diff --git a/dist/examples/filtering/spectralTilt.dsp b/dist/examples/filtering/spectralTilt.dsp deleted file mode 100644 index 397c85ad..00000000 --- a/dist/examples/filtering/spectralTilt.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "spectralTilt"; -declare description "Demonstrate the Spectral Tilt effect on test signals"; - -import("stdfaust.lib"); - -O = 2; // filter order - -process = dm.spectral_tilt_demo(2); diff --git a/dist/examples/filtering/vcfWahLab.dsp b/dist/examples/filtering/vcfWahLab.dsp deleted file mode 100644 index 247b898b..00000000 --- a/dist/examples/filtering/vcfWahLab.dsp +++ /dev/null @@ -1,15 +0,0 @@ -import("stdfaust.lib"); -declare description "Demonstrate competing variable-lowpass-filter effects on test signals with spectrum analysis display"; - -declare name "vcfWahLab"; - -// process = ol.sawtooth_demo : -// el.crybaby_demo : el.moog_vcf_demo : el.wah4_demo : -// fl.spectral_level_demo <: _,_; -process = - vgroup("[1]", dm.sawtooth_demo) : - vgroup("[2]", dm.crybaby_demo) : - vgroup("[3]", dm.wah4_demo) : - vgroup("[4]", dm.moog_vcf_demo) : - vgroup("[5]", dm.spectral_level_demo) <: - _,_; diff --git a/dist/examples/filtering/vocoder.dsp b/dist/examples/filtering/vocoder.dsp deleted file mode 100644 index 3cc8ca4e..00000000 --- a/dist/examples/filtering/vocoder.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Vocoder"; -declare version "0.0"; -declare author "RM"; -declare description "Use example of the vocoder function where an impulse train is used as excitation."; - -import("stdfaust.lib"); - -process = dm.vocoder_demo; diff --git a/dist/examples/filtering/wahPedal.dsp b/dist/examples/filtering/wahPedal.dsp deleted file mode 100644 index 802fbe68..00000000 --- a/dist/examples/filtering/wahPedal.dsp +++ /dev/null @@ -1,6 +0,0 @@ -declare name "wahPedal"; -declare description "Demonstrate the Fourth-Order Wah pedal (similar to the Moog VCF)"; - -import("stdfaust.lib"); - -process = dm.wah4_demo; diff --git a/dist/examples/gameaudio/bubble.dsp b/dist/examples/gameaudio/bubble.dsp deleted file mode 100644 index 91044846..00000000 --- a/dist/examples/gameaudio/bubble.dsp +++ /dev/null @@ -1,43 +0,0 @@ -declare name "bubble"; -declare description "Production of a water drop bubble sound."; -declare license "MIT"; -declare copyright "(c) 2017: Yann Orlarey, GRAME"; - -import("stdfaust.lib"); - - -//---------------------------`bubble`-------------------------- -// bubble(f0, trig) : produces a water drop bubble sound -// -// #### Usage -// -// ``` -// bubble(f0, trig) : _ -// ``` -// -// Where: -// -// * ` f0 `: base frequency of bubble sound -// * `trig`: trigs the bubble sound on the rising front -// -// #### Example -// -// ``` -// button("drop") : bubble(600) : _ -// ``` -// -// #### Reference: -// -// -//------------------------------------------------------------ - -bubble(f0,trig) = os.osc(f) * (exp(-damp*time) : si.smooth(0.99)) - with { - damp = 0.043*f0 + 0.0014*f0^(3/2); - f = f0*(1+sigma*time); - sigma = eta * damp; - eta = 0.075; - time = 0 : (select2(trig>trig'):+(1)) ~ _ : ba.samp2sec; - }; - -process = button("drop") : bubble(hslider("v:bubble/freq", 600, 150, 2000, 1)) <: dm.freeverb_demo; diff --git a/dist/examples/gameaudio/rain.dsp b/dist/examples/gameaudio/rain.dsp deleted file mode 100644 index e9a8a5f1..00000000 --- a/dist/examples/gameaudio/rain.dsp +++ /dev/null @@ -1,27 +0,0 @@ -//----------------------`rain`-------------------------- -// A very simple rain simulator -// -// #### Usage -// -// ``` -// rain(d,l) : _,_ -// ``` -// -// Where: -// -// * `d`: is the density of the rain: between 0 and 1 -// * `l`: is the level (volume) of the rain: between 0 and 1 -// -//---------------------------------------------------------- - -import("stdfaust.lib"); - -rain(density,level) = no.multinoise(2) : par(i, 2, drop) : par(i, 2, *(level)) - with { - drop = _ <: @(1), (abs < density) : *; - }; - -process = rain ( - hslider("v:rain/density", 300, 0, 1000, 1) / 1000, - hslider("v:rain/volume", 0.5, 0, 1, 0.01) - ); diff --git a/dist/examples/gameaudio/wind.dsp b/dist/examples/gameaudio/wind.dsp deleted file mode 100644 index 37e5872b..00000000 --- a/dist/examples/gameaudio/wind.dsp +++ /dev/null @@ -1,23 +0,0 @@ -//----------------------`wind`-------------------------- -// A very simple wind simulator, based on a filtered white noise -// -// #### Usage -// -// ``` -// wind(f) : _ -// ``` -// -// Where: -// -// * `f`: is the force of the wind: between 0 and 1 -// -//---------------------------------------------------------- - -import("stdfaust.lib"); - -wind(force) = no.multinoise(2) : par(i, 2, ve.moog_vcf_2bn(force,freq)) : par(i, 2, *(force)) - with { - freq = (force*87)+1 : ba.pianokey2hz; - }; - -process = wind ( hslider("v:wind/force",0.66,0,1,0.01) : si.smooth (0.997) ); diff --git a/dist/examples/generator/filterOsc.dsp b/dist/examples/generator/filterOsc.dsp deleted file mode 100644 index 5169367f..00000000 --- a/dist/examples/generator/filterOsc.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "filterOSC"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "Simple application demoing filter based oscillators."; - -import("stdfaust.lib"); - -process = dm.oscrs_demo; diff --git a/dist/examples/generator/noise.dsp b/dist/examples/generator/noise.dsp deleted file mode 100644 index 8544f4a6..00000000 --- a/dist/examples/generator/noise.dsp +++ /dev/null @@ -1,52 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check noises.lib -// for more accurate examples of noise functions - -declare name "Noise"; -declare version "1.1"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2009"; - -//----------------------------------------------------------------- -// Noise generator and demo file for the Faust math documentation -//----------------------------------------------------------------- - - -\section{Presentation of the "noise.dsp" Faust program} -This program describes a white noise generator with an interactive volume, using a random function. - -\subsection{The random function} -The \texttt{random} function describes a generator of random numbers, which equation follows. You should notice hereby the use of an integer arithmetic on 32 bits, relying on integer wrapping for big numbers. -random - -\subsection{The noise function} -The white noise then corresponds to: -noise - - -random = +(12345)~*(1103515245); -noise = random/2147483647.0; - - -\subsection{Just add a user interface element to play volume!} -Endly, the sound level of this program is controlled by a user slider, which gives the following equation: -process - - - -\section{Block-diagram schema of process} -This process is illustrated on figure 1. -process - - -process = noise * vslider("Volume[style:knob][acc: 0 0 -10 0 10]", 0.5, 0, 1, 0.1); - - -\section{Notice of this documentation} -You might be careful of certain information and naming conventions used in this documentation: - - -\section{Listing of the input code} -The following listing shows the input Faust code, parsed to compile this mathematical documentation. -- diff --git a/dist/examples/generator/noiseMetadata.dsp b/dist/examples/generator/noiseMetadata.dsp deleted file mode 100644 index 26ba20dd..00000000 --- a/dist/examples/generator/noiseMetadata.dsp +++ /dev/null @@ -1,74 +0,0 @@ -// WARNING: This a "legacy example based on a deprecated library". Check noises.lib -// for more accurate examples of noise functions - - -\title{name} -\author{author} -\date{\today} -\maketitle - -\begin{tabular}{ll} - \hline - \textbf{name} & name \\ - \textbf{version} & version \\ - \textbf{author} & author \\ - \textbf{license} & license \\ - \textbf{copyright} & copyright \\ - \hline -\end{tabular} -\bigskip - -//----------------------------------------------------------------- -// Noise generator and demo file for the Faust math documentation -//----------------------------------------------------------------- - -declare name "noiseMetadata"; // avoid same name as in noise.dsp -declare version "1.1"; -declare author "Grame"; -declare author "Yghe"; -declare license "BSD"; -declare copyright "(c)GRAME 2009"; - - -\section{Presentation of the "noise.dsp" Faust program} -This program describes a white noise generator with an interactive volume, using a random function. - -\subsection{The random function} - - -random = +(12345)~*(1103515245); - - -The \texttt{random} function describes a generator of random numbers, which equation follows. You should notice hereby the use of an integer arithmetic on 32 bits, relying on integer wrapping for big numbers. -random - -\subsection{The noise function} - - -noise = random/2147483647.0; - - -The white noise then corresponds to: -noise - -\subsection{Just add a user interface element to play volume!} - - -process = noise * vslider("Volume[style:knob]", 0, 0, 1, 0.1); - - -Endly, the sound level of this program is controlled by a user slider, which gives the following equation: -process - -\section{Block-diagram schema of process} -This process is illustrated on figure 1. -process - -\section{Notice of this documentation} -You might be careful of certain information and naming conventions used in this documentation: - - -\section{Listing of the input code} -The following listing shows the input Faust code, parsed to compile this mathematical documentation. -- diff --git a/dist/examples/generator/osc.dsp b/dist/examples/generator/osc.dsp deleted file mode 100644 index e1860af4..00000000 --- a/dist/examples/generator/osc.dsp +++ /dev/null @@ -1,17 +0,0 @@ -declare name "osc"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2009"; - -//----------------------------------------------- -// Sinusoidal Oscillator -//----------------------------------------------- - -import("stdfaust.lib"); - -vol = hslider("volume [unit:dB]", 0, -96, 0, 0.1) : ba.db2linear : si.smoo; -freq = hslider("freq [unit:Hz]", 1000, 20, 24000, 1); - -process = vgroup("Oscillator", os.osc(freq) * vol); - diff --git a/dist/examples/generator/osci.dsp b/dist/examples/generator/osci.dsp deleted file mode 100644 index 87695300..00000000 --- a/dist/examples/generator/osci.dsp +++ /dev/null @@ -1,17 +0,0 @@ -declare name "osci"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2009"; - -//----------------------------------------------- -// Sinusoidal Oscillator -// (with linear interpolation) -//----------------------------------------------- - -import("stdfaust.lib"); - -vol = hslider("volume [unit:dB]", 0, -96, 0, 0.1) : ba.db2linear : si.smoo ; -freq = hslider("freq [unit:Hz]", 1000, 20, 24000, 1); - -process = vgroup("Oscillator", os.osci(freq) * vol); diff --git a/dist/examples/generator/sawtoothLab.dsp b/dist/examples/generator/sawtoothLab.dsp deleted file mode 100644 index 8cf5ca86..00000000 --- a/dist/examples/generator/sawtoothLab.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "sawtoothLab"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "An application demonstrating the different sawtooth oscillators of Faust."; - -import("stdfaust.lib"); - -process = dm.sawtooth_demo; diff --git a/dist/examples/generator/virtualAnalog.dsp b/dist/examples/generator/virtualAnalog.dsp deleted file mode 100644 index b45eb3a0..00000000 --- a/dist/examples/generator/virtualAnalog.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "VirtualAnalog"; -declare version "0.0"; -declare author "JOS, revised by RM"; -declare description "Virtual analog oscillator demo application."; - -import("stdfaust.lib"); - -process = dm.virtual_analog_oscillator_demo; diff --git a/dist/examples/generator/virtualAnalogLab.dsp b/dist/examples/generator/virtualAnalogLab.dsp deleted file mode 100644 index 0fabf73b..00000000 --- a/dist/examples/generator/virtualAnalogLab.dsp +++ /dev/null @@ -1,10 +0,0 @@ -declare name "virtualAnalogLab"; - -import("stdfaust.lib"); - -process = - vgroup("[1]", dm.virtual_analog_oscillator_demo) : - vgroup("[2]", dm.moog_vcf_demo) : - vgroup("[3]", dm.spectral_level_demo) - // See also: vgroup("[3]", dm.fft_spectral_level_demo(32)) - <: _,_; diff --git a/dist/examples/misc/UITester.dsp b/dist/examples/misc/UITester.dsp deleted file mode 100644 index f86cdd15..00000000 --- a/dist/examples/misc/UITester.dsp +++ /dev/null @@ -1,71 +0,0 @@ -declare name "UITester"; -declare version "1.0"; -declare author "O. Guillerminet"; -declare license "BSD"; -declare copyright "(c) O. Guillerminet 2012"; - -vbox = vgroup("vbox", - checkbox("check1"), - checkbox("check2"), - nentry("knob0[style:knob]", 60, 0, 127, 0.1)); - -sliders = hgroup("sliders", - vslider("vslider1", 60, 0, 127, 0.1), - vslider("vslider2", 60, 0, 127, 0.1), - vslider("vslider3", 60, 0, 127, 0.1)); - -knobs = hgroup("knobs", - vslider("knob1[style:knob]", 60, 0, 127, 0.1), - vslider("knob2[style:knob]", 60, 0, 127, 0.1), - vslider("knob3[style:knob]", 60, 0, 127, 0.1)); - -smallhbox1 = hgroup("small box 1", - vslider("vslider5 [unit:Hz]", 60, 0, 127, 0.1), - vslider("vslider6 [unit:Hz]", 60, 0, 127, 0.1), - vslider("knob4[style:knob]", 60, 0, 127, 0.1), - nentry("num1 [unit:f]", 60, 0, 127, 0.1), - vbargraph("vbar1", 0, 127)); - -smallhbox2 = hgroup("small box 2", - vslider("vslider7 [unit:Hz]", 60, 0, 127, 0.1), - vslider("vslider8 [unit:Hz]", 60, 0, 127, 0.1), - vslider("knob5[style:knob]", 60, 0, 127, 0.1), - nentry("num2 [unit:f]", 60, 0, 127, 0.1), - vbargraph("vbar2", 0, 127)); - -smallhbox3 = hgroup("small box 3", - vslider("vslider9 [unit:Hz]", 60, 0, 127, 0.1), - vslider("vslider10 [unit:m]", 60, 0, 127, 0.1), - vslider("knob6[style:knob]", 60, 0, 127, 0.1), - nentry("num3 [unit:f]", 60, 0, 127, 0.1), - vbargraph("vbar3", 0, 127)); - -subhbox1 = hgroup("sub box 1", - smallhbox2, - smallhbox3); - -vmisc = vgroup("vmisc", - vslider("vslider4 [unit:Hz]", 60, 0, 127, 0.1), - button("button"), - hslider("hslider [unit:Hz]", 60, 0, 127, 0.1), - smallhbox1, - subhbox1, - hbargraph("hbar", 0, 127)); - -hmisc = hgroup("hmisc", - vslider("vslider4 [unit:f]", 60, 0, 127, 0.1), - button("button"), - hslider("hslider", 60, 0, 127, 0.1), - nentry("num [unit:f]", 60, 0, 127, 0.1), - vbargraph("vbar", 0, 127), - hbargraph("hbar", 0, 127)); - -//------------------------- Process -------------------------------- - -process = tgroup("grp 1", - vbox, - sliders, - knobs, - vmisc, - hmisc); - diff --git a/dist/examples/misc/capture.dsp b/dist/examples/misc/capture.dsp deleted file mode 100644 index a6b507d8..00000000 --- a/dist/examples/misc/capture.dsp +++ /dev/null @@ -1,25 +0,0 @@ -declare name "capture"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------- -// Capture : record up to 8s of sound and -// playback the recorded sound in loop -//------------------------------------------------- - -import("stdfaust.lib"); - -B = button("Capture"); // Capture sound while pressed -I = int(B); // convert button signal from float to integer -R = (I-I') <= 0; // Reset capture when button is pressed -D = (+(I):*(R))~_; // Compute capture duration while button is pressed: 0..NNNN0..MMM - - -capture = *(B) : (+ : de.delay(8*65536, D-1)) ~ *(1.0-B); - -level = hslider("level (db)", 0, -96, 4, 0.1) : ba.db2linear : si.smoo; - -process = vgroup("Audio Capture", capture : *(level)); - diff --git a/dist/examples/misc/guitarix.dsp b/dist/examples/misc/guitarix.dsp deleted file mode 100644 index 76bd22dc..00000000 --- a/dist/examples/misc/guitarix.dsp +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert - * Copyright (C) 2011 Pete Shorthose - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * ---------------------------------------------------------------------------- - * Adapted version from guitarixlite (v.0.28) using foreign functions - * to this self-contained Faust version (v.0.29) - * Adapted by GRAME - 2014 - * ---------------------------------------------------------------------------- - */ - -declare name "guitarix"; -declare version "0.29"; -declare author "Guitarix project (http://guitarix.sourceforge.net/)"; -declare copyright "Guitarix project"; -declare license "LGPL"; - -ba = library("basics.lib"); -si = library("signals.lib"); - -import("tubes.lib"); -import("tonestacks.lib"); - -process = preamp; - -/**************************************************************** - ** Tube Preamp Emulation with - * tubescreamer - tube stage 1 - 2 - tonestack - cabinet - */ -preamp = hgroup("Guitarix", - hgroup("[0]TubeScreamer",ts9sim) : - hgroup("[1]preamp: 12AX7", stage1 : stage2): - hgroup("[2]tonestack: jcm2000", tstack) : - hgroup("[3]Cabinet", cab)) -with { - - stage1 = T1_12AX7 : *(preamp) : fi.lowpass(1,6531.0) : T2_12AX7 : *(preamp) - with { - preamp = vslider("[0] Pregain [style:knob]",-6,-20,20,0.1) : ba.db2linear : si.smoo; - }; - - stage2 = fi.lowpass(1,6531.0) : T3_12AX7 : *(gain) - with { - gain = vslider("[1] Gain [style:knob]",-6,-20.0,20.0,0.1) : ba.db2linear : si.smoo; - }; - - tstack = jcm2000(t, m, l) - with { - t = vslider("[2] Treble [style:knob]",0.5,0,1,0.01); - m = vslider("[3] Middle [style:knob]",0.5,0,1,0.01); - l = vslider("[4] Bass [style:knob]",0.5,0,1,0.01); - }; - - /* - // Dynamically choose between several 'tstack' - tstack = ba.selectmulti(ma.SR/100, (tjcm2000, tjtm45, tjcm800), - nentry("tstack [style:menu{'tjcm2000':0;'tjtm45':1;'tjcm800':2}]", 0, 0, 2, 1)) - with { - tjcm2000 = jcm2000(t, m, l); - tjtm45 = jtm45(t, m, l); - tjcm800 = jcm800(t, m, l); - t = vslider("[2] Treble [style:knob]",0.5,0,1,0.01); - m = vslider("[3] Middle [style:knob]",0.5,0,1,0.01); - l = vslider("[4] Bass [style:knob]",0.5,0,1,0.01); - }; - */ -}; - - -/**************************************************************************************** - * 1-dimensional function tables for nonlinear interpolation -****************************************************************************************/ -nonlininterpolation(table, low, high, step, size, x) = ts9(low, step, size, table, x),inverse(x) : ccopysign; - -//-- Interpolate value from table -ts9(low, step, size, table, x) = interpolation(table, getCoef(low, step, size, x), - nonlinindex(low, step, x) : boundIndex(size)); - -//-- Calculate non linear index -nonlinindex(low, step, x) = (abs(x)/(3.0 + abs(x)) - low) * step; - -//--Get interpolation factor -getCoef(low, step, size, x) = boundFactor(size, nonlinindex(low, step, x), nonlinindex(low, step, x) : boundIndex(size)); - -/********* Faust Version of ts9nonlin.cc, generated by tools/ts9sim.py ****************/ - -ts9comp = nonlininterpolation(ts9table, low, high, step, size) -with { - -// Characteristics of the wavetable -low = 0.0; -high = 0.970874; -step = 101.97; -size = 99; // (real size = 100, set the actual size at 100-1 for interpolation to work at the last point) - -ts9table = waveform{0.0,-0.0296990148227,-0.0599780676992,-0.0908231643281,-0.122163239629, - -0.15376009788,-0.184938007182,-0.214177260107,-0.239335434213,-0.259232575019, - -0.274433909887,-0.286183308354,-0.29553854444,-0.303222323477,-0.309706249977, - -0.315301338712,-0.320218440785,-0.324604982281,-0.328567120703,-0.332183356975, - -0.335513124719,-0.33860236542,-0.34148724693,-0.344196707008,-0.346754233717, - -0.34917913798,-0.351487480543,-0.35369275887,-0.355806424152,-0.357838275995, - -0.359796767655,-0.361689244919,-0.363522135105,-0.365301098113,-0.367031148289, - -0.368716753588,-0.370361916943,-0.371970243537,-0.373544996828,-0.375089145544, - -0.376605403346,-0.378096262548,-0.379564022938,-0.381010816596,-0.382438629377, - -0.383849319643,-0.385244634694,-0.386626225283,-0.387995658543,-0.389354429565, - -0.39070397188,-0.392045667012,-0.393380853288,-0.39471083403,-0.396036885269, - -0.397360263098,-0.398682210753,-0.400003965547,-0.401326765733,-0.402651857394, - -0.403980501471,-0.405313980999,-0.406653608692,-0.40800073496,-0.409356756504, - -0.410723125631,-0.412101360439,-0.413493056085,-0.414899897347,-0.416323672745, - -0.417766290556,-0.419229797097,-0.420716397759,-0.422228481377,-0.423768648654, - -0.425339745558,-0.426944902828,-0.428587583057,-0.430271637224,-0.432001373102, - -0.433781638746,-0.435617925286,-0.437516494692,-0.439484540257,-0.441530390423, - -0.443663770898,-0.445896146322,-0.448241172434,-0.450715304661,-0.453338632988, - -0.45613605235,-0.45913894467,-0.46238766699,-0.465935359011,-0.469854010456, - -0.474244617411,-0.479255257451,-0.48511588606,-0.492212726244,-0.501272723631 - }; -}; -/****************************************************************************************/ - -/**************************************************************************************** -* declare id "ts9sim"; -* declare name "Tube Screamer"; -* declare category "Distortion"; -* -** based on a circuit diagram of the Ibanez TS-9 and -** a mathematical analysis published by Tamás Kenéz -****************************************************************************************/ - -ts9sim = ts9nonlin : lowpassfilter : *(gain) -with { - - R1 = 4700; - R2 = 51000 + 500000 * vslider("drive[name:Drive][style:knob]", 0.5, 0, 1, 0.01); - C = 0.047 * 1e-6; - a1 = (R1 + R2) * C * 2 * ma.SR; - a2 = R1 * C * 2 * ma.SR; - B0 = (1 + a1) / (1 + a2); - B1 = (1 - a1) / (1 + a2); - A1 = (1 - a2) / (1 + a2); - X2 = fi.tf1(B0, B1, A1); - - ts9nonlin = _ <: _ ,(X2,_ : - : ts9comp) : - :> _; - - fc = vslider("tone[log][name:Tone][style:knob]", 400, 100, 1000, 1.03); - lowpassfilter = fi.lowpass(1,fc); - gain = vslider("level[name:Level][style:knob]", -16, -20, 4, 0.1) : ba.db2linear : si.smoo; -}; - -/**************************************************************************************** -* declare name "cabinet"; -* -** based on a circuit diagram of the Ibanez TS-9 and -** a mathematical analysis published by Tamás Kenéz -****************************************************************************************/ - -wetdry = vslider("[5] amount[style:knob]", 100, 0, 100, 1) : /(100); -dry = 1 - wetdry; - -cab = _<:(*(dry):_), (*(wetdry):fi.conv((0.000488281, -0.0020752, 0.000561523, -0.00231934, 0.000634766, -0.00247803, 0.000512695, -0.00247803, 0.000146484, -0.00219727, -0.000622559, -0.00145264, -0.00202637, - -2.44141e-05, -0.00438232, 0.00247803, -0.00822754, 0.00706787, -0.0159546, 0.0202148, -0.0471558, 0.0953003, -0.208582, 0.312427, 0.75, -0.26803, - 0.399963, 0.200696, -0.146655, -0.29303, -0.222168, -0.113098, 0.0267334, 0.0312134, 0.164685, 0.0443481, 0.186621, 0.0540039, 0.123303, - 0.0805054, 0.0739868, 0.0591797, 0.0661743, 0.0400391, 0.0429932, 0.0339844, 0.0320557, 0.02323, 0.0217285, 0.0182007, 0.0157227, 0.0130005, - 0.0103882, 0.00942383, 0.00718994, 0.0067749, 0.00458984, 0.00455322, 0.00272217, 0.00294189, 0.00140381, 0.00170898, 0.000402832, 0.000720215, -0.000354004, - -2.44141e-05, -0.000915527, -0.000610352, -0.00134277, -0.0010498, -0.00166016, -0.0013916, -0.0019043, -0.00166016, -0.0020874, -0.00187988, -0.00224609, -0.00203857, - -0.00235596, -0.00217285, -0.0024292, -0.0022583, -0.00247803, -0.00233154, -0.00252686, -0.00238037, -0.00256348, -0.0024292, 0.75, -0.00246582, -0.0026001, - -0.00247803, -0.0026001, -0.00249023, -0.0026001, -0.00250244, -0.0026001, -0.00251465, -0.0026001, -0.00251465, -0.0026001, -0.00251465, -0.0026001, -0.00252686, - -0.00258789, -0.00252686, -0.00258789, -0.00251465, -0.00257568, -0.00251465, -0.00256348, -0.00251465, -0.00256348, -0.00251465, -0.00256348, -0.00251465, -0.00256348, - -0.00251465, -0.00256348, -0.00251465, -0.00256348, -0.00252686, -0.00256348, -0.00252686, -0.00255127, -0.00252686, -0.00255127, -0.00252686, -0.00255127, -0.00252686, - -0.00255127, -0.00252686, -0.00256348 - ))):>_; diff --git a/dist/examples/misc/matrix.dsp b/dist/examples/misc/matrix.dsp deleted file mode 100644 index 8c9ff168..00000000 --- a/dist/examples/misc/matrix.dsp +++ /dev/null @@ -1,17 +0,0 @@ -declare name "matrix"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//----------------------------------------------- -// Audio Matrix : N inputs x M outputs -//----------------------------------------------- - -import("stdfaust.lib"); - -Fader(in) = ba.db2linear(vslider("Input %in", -10, -96, 4, 0.1)); -Mixer(N,out) = hgroup("Output %out", par(in, N, *(Fader(in)) ) :> _ ); -Matrix(N,M) = tgroup("Matrix %N x %M", par(in, N, _) <: par(out, M, Mixer(N, out))); - -process = Matrix(8, 8); diff --git a/dist/examples/misc/midiTester.dsp b/dist/examples/misc/midiTester.dsp deleted file mode 100644 index f4eb1758..00000000 --- a/dist/examples/misc/midiTester.dsp +++ /dev/null @@ -1,122 +0,0 @@ -declare name "midiTester"; -declare version "1.0"; -declare author "Vincent Rateau, GRAME"; -declare license "GPL v3"; -declare reference "www.sonejo.net"; - -// FAUST MIDI TESTER - -process = _*0, (vgroup("FAUST MIDI TESTER", hgroup("[1]", controltester, controlchantester, noteontester, noteonchantester, noteofftester, noteoffchantester, keypresschantester, midiclocktester), hgroup("[2]", kattester, katchantester, pctester, pcchantester, chattester, chatchantester, pitchwheeltester, pitchwheelchantester) :> _)) : attach; - -/////////////////////////// - -//Ctrl tester (ctrl ): tester(midi in, midi out) -controltester = vgroup("CTRL IN/OUT", valuetest(50,51), booltest(100,101)) -with{ -valuetest(i,o) = hslider("Ctrl Value IN (Ctrl %i) [midi:ctrl %i]", 60, 0, 127, 1) : hbargraph("Ctrl Value OUT (Ctrl %o) [midi:ctrl %o]", 0, 127); -booltest(i,o) = checkbox("Ctrl Bool IN (Ctrl %i) [midi:ctrl %i]") : hbargraph("Ctrl Bool OUT (Ctrl %o) [midi:ctrl %o]", 0, 1); -}; - -//Ctrl Chan tester (ctrl chan): tester(midi in, midi out) -controlchantester = vgroup("CTRL CHAN IN/OUT", valuetest(50,2,74,3)) -with{ -valuetest(i,ic,o,oc) = hslider("Ctrl Value IN (Ctrl %i Channel %ic) [midi:ctrl %i %ic]", 60, 0, 127, 1) : hbargraph("Ctrl Value OUT (Ctrl %o) Channel OUT(Chan %oc) [midi:ctrl %o %oc]", 0, 127); -}; - -//Note tester (keyon) : tester(midi in, midi out) -noteontester = vgroup("NOTE ON IN/OUT", valuetest(50,51), booltest(100,101)) -with{ -valuetest(i,o) = hslider("NoteOn Value IN (Note %i) [midi:keyon %i]", 60, 0, 127, 1) : hbargraph("NoteOn Value OUT (Note %o) [midi:keyon %o]", 0, 127); -booltest(i,o) = checkbox("NoteOn Bool IN (Note %i) [midi:keyon %i]") : hbargraph("NoteOn Bool OUT (Note %o) [midi:keyon %o]", 0, 1); -}; - -//Note Chan tester (keyon) : tester(midi in, midi out) -noteonchantester = vgroup("NOTE ON CHAN IN/OUT", valuetest(50, 2, 51, 3), booltest(50, 2, 101, 3)) -with{ -valuetest(i, ic, o, oc) = hslider("NoteOn Value IN (Note %i Channel %ic) [midi:keyon %i %ic]", 60, 0, 127, 1) : hbargraph("NoteOn Value OUT (Note %o Chan %oc) [midi:keyon %o %oc]", 0, 127); -booltest(i, ic, o, oc) = checkbox("NoteOn Chan Bool IN (Note %i Channel %ic) [midi:keyon %i %ic]") : hbargraph("NoteOn Chan Bool OUT (Note %o Channel %oc) [midi:keyon %o %oc]", 0, 1); -}; - -//Note tester (keyoff) : tester(midi in, midi out) -noteofftester = vgroup("NOTE OFF IN/OUT", valuetest(50,51), booltest(100,101)) -with{ -valuetest(i,o) = hslider("NoteOff Value IN (Note %i) [midi:keyoff %i]", 60, 0, 127, 1) : hbargraph("NoteOff Value OUT (Note %o) [midi:keyoff %o]", 0, 127); -booltest(i,o) = checkbox("NoteOff Bool IN (Note %i) [midi:keyoff %i]") : hbargraph("NoteOff Bool OUT (Note %o) [midi:keyoff %o]", 0, 1); -}; - -//Note Chan tester (keyoff) : tester(midi in, midi out) -noteoffchantester = vgroup("NOTE OFF CHAN IN/OUT", valuetest(50, 2, 51, 3), booltest(50, 2, 101, 3)) -with{ -valuetest(i, ic, o, oc) = hslider("NoteOff Value IN (Note %i Channel %ic) [midi:keyoff %i %ic]", 60, 0, 127, 1) : hbargraph("NoteOff Value OUT (Note %o Channel %oc) [midi:keyoff %o %oc]", 0, 127); -booltest(i, ic, o, oc) = checkbox("NoteOff Bool IN (Note %i Channel %ic) [midi:keyoff %i %ic]") : hbargraph("NoteOff Bool OUT (Note %o Channel %oc) [midi:keyoff %o %oc]", 0, 1); -}; - -//KeyPress Chan tester (keypress) : tester(midi in, midi out) -keypresschantester = vgroup("KEY PRESS CHAN IN/OUT", valuetest(50, 2, 51, 3), booltest(50, 2, 101, 3)) -with{ -valuetest(i, ic, o, oc) = hslider("Pressure Value IN (Note %i Channel %ic) [midi:keypress %i %ic]", 60, 0, 127, 1) : hbargraph("Note Value OUT (Note %o Channel %oc) [midi:keypress %o %oc]", 0, 127); -booltest(i, ic, o, oc) = checkbox("Pressure Bool IN (Note %i Channel %ic) [midi:keypress %i %ic]") : hbargraph("Pressure Bool OUT (Note %o Channel %oc) [midi:keypress %o %oc]", 0, 1); -}; - -//Midisync tester -midiclocktester = vgroup("MIDI SYNC (IN)", clock, startstop) -with{ -clock = checkbox("MIDI clock signal [midi:clock]"); -startstop = checkbox("MIDI START/STOP [midi:start] [midi:stop]"); -}; - -//Key Aftertouch tester (keypress) : tester(midi in, midi out) -kattester = vgroup("KEY AFTERTOUCH (KAT) IN/OUT",valuetest(50,51), booltest(100,101)) -with{ -valuetest(i,o) = hslider("Note KAT Value IN (Note %i) [midi:keypress %i]", 60, 0, 127, 1) : hbargraph("Note KAT Value OUT (Note %o) [midi:keypress %o]", 0, 127); -booltest(i,o) = checkbox("Note KAT Bool IN (Note %i) [midi:keypress %i]") : hbargraph("Note KAT Bool OUT (Note %o) [midi:keypress %o]", 0, 1); -}; - -//Key Aftertouch tester (keypress) : tester(midi in, midi out) -katchantester = vgroup("KEY AFTERTOUCH CHAN (KAT) IN/OUT",valuetest(50,2,51,3), booltest(100,2,101,3)) -with{ -valuetest(i,ic,o,oc) = hslider("Note KAT Value IN (Note %i) (Chan %ic) [midi:keypress %i %ic]", 60, 0, 127, 1) : hbargraph("Note KAT Value OUT (Note %o) (Chan %oc) [midi:keypress %o %oc]", 0, 127); -booltest(i,ic,o,oc) = checkbox("Note KAT Bool IN (Note %i) (Chan %ic) [midi:keypress %i %ic]") : hbargraph("Note KAT Bool OUT (Note %o) (Chan %oc)[midi:keypress %o %oc]", 0, 1); -}; - -//ProgramChange tester (pgm) : tester(midi in, midi out) -pctester = vgroup("PROGRAM CHANGE (PC) IN/OUT",valuetest(1,2), booltest(1,2)) -with{ -valuetest(i,o) = hslider("ProgramChange Value IN (PC %i) [midi:pgm %i]", 60, 0, 127, 1) : hbargraph("ProgramChange Value OUT (PC %o) [midi:pgm %o]", 0, 127); -booltest(i,o) = checkbox("ProgramChange Bool IN (PC %i) [midi:pgm %i]") : hbargraph("ProgramChange Bool OUT (PC %o) [midi:pgm %o]", 0, 1); -}; - -//ProgramChange Chan tester (pgm) : tester(midi in, midi out) -pcchantester = vgroup("PROGRAM CHANGE CHAN (PC) IN/OUT",valuetest(1, 2, 2, 3), booltest(1, 2, 2, 3)) -with{ -valuetest(i,ic,o,oc) = hslider("ProgramChange Value IN (PC %i) (CHAN %ic) [midi:pgm %i %ic]", 60, 0, 127, 1) : hbargraph("ProgramChange Value OUT (PC %o) (CHAN %oc) [midi:pgm %o %oc]", 0, 127); -booltest(i,ic,o,oc) = checkbox("ProgramChange Bool IN (PC %i) (CHAN %ic) [midi:pgm %i %ic]") : hbargraph("ProgramChange Bool OUT (PC %o) (CHAN %oc) [midi:pgm %o %oc]", 0, 1); -}; - -//Channel Aftertourch tester (chanpress) : tester(midi in, midi out) -chattester = vgroup("CHANNEL AFTERTOUCH (CHAT) IN/OUT",valuetest(50,51), booltest(100,101)) -with{ -valuetest(i,o) = hslider("Note CHAT Value IN (Note %i) [midi:chanpress %i]", 60, 0, 127, 1) : hbargraph("Note CHAT Value OUT (Note %o) [midi:chanpress %o]", 0, 127); -booltest(i,o) = checkbox("Note CHAT Bool IN (Note %i) [midi:chanpress %i]") : hbargraph("Note CHAT Bool OUT (Note %o) [midi:chanpress %o]", 0, 1); -}; - -//Channel Aftertourch tester (chanpress) : tester(midi in, midi out) -chatchantester = vgroup("CHANNEL AFTERTOUCH CHAN (CHAT) IN/OUT",valuetest(50,2,51,3), booltest(100,2,101,3)) -with{ -valuetest(i,ic,o,oc) = hslider("Note CHAT Chan Value IN (Note %i) (Chan %ic) [midi:chanpress %i %ic]", 60, 0, 127, 1) : hbargraph("Note CHAT Value OUT (Note %o) (Chan %oc) [midi:chanpress %o %oc]", 0, 127); -booltest(i,ic,o,oc) = checkbox("Note CHAT Bool IN (Note %i) (Chan %ic) [midi:chanpress %i %ic]") : hbargraph("Note CHAT Bool OUT (Note %o) (Chan %oc) [midi:chanpress %o %oc]", 0, 1); -}; - -//Pitchwheel tester (pitchwheel) : tester(midi in, midi out) -pitchwheeltester = vgroup("PITCHWHEEL IN/OUT",valuetest, booltest) -with{ -valuetest = hslider("Pitchwheel Value IN [midi:pitchwheel]", 0, -8192, 8191, 1) : hbargraph("Pitchwheel Value OUT[midi:pitchwheel]", -8192, 8191); -booltest = checkbox("Pitchwheel Bool IN [midi:pitchwheel]") : hbargraph("Pitchwheel Bool OUT [midi:pitchwheel]", 0, 1); -}; - -//Pitchwheel Chan tester (pitchwheel) : tester(midi in, midi out) -pitchwheelchantester = vgroup("PITCHWHEEL CHAN IN/OUT",valuetest(2, 15), booltest(2, 15)) -with{ -valuetest(ic, oc) = hslider("Pitchwheel Value IN (Chan %ic) [midi:pitchwheel %ic]", 0, -8192, 8191, 1) : hbargraph("Pitchwheel Value OUT (Chan %oc)[midi:pitchwheel %oc]", -8192, 8191); -booltest(ic, oc) = checkbox("Pitchwheel Bool IN (Chan %ic) [midi:pitchwheel %ic]") : hbargraph("Pitchwheel Bool OUT (Chan %oc) [midi:pitchwheel %oc]", 0, 1); -}; diff --git a/dist/examples/misc/mixer.dsp b/dist/examples/misc/mixer.dsp deleted file mode 100644 index 93e2b93f..00000000 --- a/dist/examples/misc/mixer.dsp +++ /dev/null @@ -1,21 +0,0 @@ -declare name "mixer"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------- -// Simple 8x2 mixer -//------------------------------------------------- - -vol = component("../dynamic/volume.dsp"); -pan = component("../spat/panpot.dsp"); -vumeter = component("../analysis/vumeter.dsp").vmeter; -mute = *(1 - checkbox("mute")); - -voice(v) = vgroup("Ch %v", mute : hgroup("[2]", vol : vumeter) : pan); -stereo = hgroup("stereo out", (vol, vol : vgroup("L", vumeter), vgroup("R", vumeter))); - -process = hgroup("mixer", par(i, 8, voice(i)) :> stereo ); - - diff --git a/dist/examples/misc/switcher.dsp b/dist/examples/misc/switcher.dsp deleted file mode 100644 index a174185e..00000000 --- a/dist/examples/misc/switcher.dsp +++ /dev/null @@ -1,22 +0,0 @@ -declare name "switcher"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2007"; - -//----------------------------------------------- -// Switch between two stereo sources. -// Useful to compare these two sources -// The parameter c\in{0,1} indicates the -// channels to select -//----------------------------------------------- - -switch(c,x0,x1,y0,y1) = sel(c,x0,y0), sel(c,x1,y1) - with { - sel(c,x,y) = (1-c)*x + c*y; - }; - -process = switch(hslider("source 0 <-> source 1",0,0,1,1)); - - - diff --git a/dist/examples/misc/tester.dsp b/dist/examples/misc/tester.dsp deleted file mode 100644 index 39b8998a..00000000 --- a/dist/examples/misc/tester.dsp +++ /dev/null @@ -1,35 +0,0 @@ -declare name "tester"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//----------------------------------------------- -// Tester : tests louspeakers -// Send a test signal( sine, noise, pink) to one -// of 8 loudspeakers -//----------------------------------------------- - -import("stdfaust.lib"); - -// TODO: this should be rewritten with the pink noise function of noises.lib -pink = f : (+ ~ g) with { - f(x) = 0.04957526213389*x - 0.06305581334498*x' + 0.01483220320740*x''; - g(x) = 1.80116083982126*x - 0.80257737639225*x'; -}; - -// User interface -//---------------- -vol = hslider("[2] volume [unit:dB]", -96, -96, 0, 1): ba.db2linear : si.smoo; -freq = hslider("[1] freq [unit:Hz]", 1000, 10, 20000, 1); -dest = hslider("[3] destination", 0, 0, 8, 1); - -testsignal = os.osci(freq)*checkbox("sine wave") - + no.noise * checkbox("white noise") - + pink(no.noise) * ba.db2linear(20) * checkbox("pink noise"); - -process = vgroup( "Audio Tester", - testsignal*vol - <: par(i, 8, *(dest==i)) - ); - diff --git a/dist/examples/misc/tester2.dsp b/dist/examples/misc/tester2.dsp deleted file mode 100644 index f07893e4..00000000 --- a/dist/examples/misc/tester2.dsp +++ /dev/null @@ -1,34 +0,0 @@ -declare name "tester2"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2014"; - -//----------------------------------------------- -// Stereo Audio Tester : send a test signal (sine, -// noise, pink) on a stereo channel -//----------------------------------------------- - -import("stdfaust.lib"); - -pink = f : (+ ~ g) with { - f(x) = 0.04957526213389*x - 0.06305581334498*x' + 0.01483220320740*x''; - g(x) = 1.80116083982126*x - 0.80257737639225*x'; -}; - -// User interface -//---------------- -transition(n) = \(old,new).(ba.if(old fl.spectral_level_demo <: _,_; - -fx_stack = - vgroup("[1]", dm.sawtooth_demo) <: - vgroup("[2]", dm.flanger_demo) : - vgroup("[3]", dm.phaser2_demo); - -level_viewer(x,y) = attach(x, vgroup("[4]", dm.spectral_level_demo(x+y))),y; - -process = fx_stack : level_viewer; diff --git a/dist/examples/physicalModeling/brass.dsp b/dist/examples/physicalModeling/brass.dsp deleted file mode 100644 index db73aa8d..00000000 --- a/dist/examples/physicalModeling/brass.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Brass"; -declare description "Simple brass instrument physical model with physical parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.brass_ui <: _,_; diff --git a/dist/examples/physicalModeling/brassMIDI.dsp b/dist/examples/physicalModeling/brassMIDI.dsp deleted file mode 100644 index b550b9ab..00000000 --- a/dist/examples/physicalModeling/brassMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "BrassMIDI"; -declare description "Simple MIDI-controllable brass instrument physical model with physical parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.brass_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/churchBell.dsp b/dist/examples/physicalModeling/churchBell.dsp deleted file mode 100644 index 6bdaece5..00000000 --- a/dist/examples/physicalModeling/churchBell.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "ChurchBell"; -declare description "Generic church bell physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.churchBell_ui <: _,_; diff --git a/dist/examples/physicalModeling/clarinet.dsp b/dist/examples/physicalModeling/clarinet.dsp deleted file mode 100644 index dc4588fc..00000000 --- a/dist/examples/physicalModeling/clarinet.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Clarinet"; -declare description "Simple clarinet physical model with physical parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.clarinet_ui <: _,_; diff --git a/dist/examples/physicalModeling/clarinetMIDI.dsp b/dist/examples/physicalModeling/clarinetMIDI.dsp deleted file mode 100644 index a0905099..00000000 --- a/dist/examples/physicalModeling/clarinetMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "ClarinetMIDI"; -declare description "Simple MIDI-controllable clarinet physical model with physical parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.clarinet_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/djembeMIDI.dsp b/dist/examples/physicalModeling/djembeMIDI.dsp deleted file mode 100644 index 2205c7fb..00000000 --- a/dist/examples/physicalModeling/djembeMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "DjembeMIDI"; -declare description "Simple MIDI-controllable djembe physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.djembe_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/elecGuitarMIDI.dsp b/dist/examples/physicalModeling/elecGuitarMIDI.dsp deleted file mode 100644 index 7231a0c5..00000000 --- a/dist/examples/physicalModeling/elecGuitarMIDI.dsp +++ /dev/null @@ -1,10 +0,0 @@ -declare name "ElecGuitarMidi"; -declare description "Simple electric guitar model without effect chain."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -// TODO: We could potentially add an audio effect chain here - -process = pm.elecGuitar_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/englishBell.dsp b/dist/examples/physicalModeling/englishBell.dsp deleted file mode 100644 index 63b4eb64..00000000 --- a/dist/examples/physicalModeling/englishBell.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "EnglishChurchBell"; -declare description "English church bell physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.englishBell_ui <: _,_; diff --git a/dist/examples/physicalModeling/faust-stk/NLFeks.dsp b/dist/examples/physicalModeling/faust-stk/NLFeks.dsp deleted file mode 100644 index be0dd05a..00000000 --- a/dist/examples/physicalModeling/faust-stk/NLFeks.dsp +++ /dev/null @@ -1,91 +0,0 @@ -declare name "NLFeks"; -declare author "Julius Smith and Romain Michon"; -declare version "1.0"; -declare license "STK-4.3"; -declare copyright "Julius Smith"; -declare reference "http://ccrma.stanford.edu/~jos/pasp/vegf.html"; -// -> Virtual\_Electric\_Guitars\_Faust.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -// standard MIDI voice parameters: -// NOTE: The labels MUST be "freq", "gain", and "gate" for faust2pd -freq = nentry("freq", 440, 20, 7040, 1); // Hz -gain = nentry("gain", 1, 0, 10, 0.01); // 0 to 1 -gate = button("gate"); // 0 or 1 - -// Additional parameters (MIDI "controllers"): - -// Pick angle in [0,0.9]: -pickangle = 0.9 * hslider("pick_angle",0,0,0.9,0.1); - -// Normalized pick-position in [0,0.5]: -beta = hslider("pick_position [midi: ctrl 0x81]", 0.13, 0.02, 0.5, 0.01); - // MIDI Control 0x81 often "highpass filter frequency" - -// String decay time in seconds: -t60 = hslider("decaytime_T60", 4, 0, 10, 0.01); // -60db decay time (sec) - -// Normalized brightness in [0,1]: -B = hslider("brightness [midi:ctrl 0x74]", 0.5, 0, 1, 0.01);// 0-1 - // MIDI Controller 0x74 is often "brightness" - // (or VCF lowpass cutoff freq) - -// Dynamic level specified as dB level desired at Nyquist limit: -L = hslider("dynamic_level", -10, -60, 0, 1) : ba.db2linear; -// Note: A lively clavier is obtained by tying L to gain (MIDI velocity). - -//Nonlinear filter parameters -typeModulation = nentry("v:Nonlinear Filter/typeMod",0,0,4,1); -nonLinearity = hslider("Nonlinearity",0,0,1,0.01) : si.smoo; -frequencyMod = hslider("freqMod",220,20,1000,0.1) : si.smoo; - -//==================== SIGNAL PROCESSING ================ - -//----------------------- noiseburst ------------------------- -// White noise burst (adapted from Faust's karplus.dsp example) -// Requires music.lib (for noise) -noiseburst(gate,P) = no.noise : *(gate : trigger(P)) -with { - diffgtz(x) = (x-x') > 0; - decay(n,x) = x - (x>0)/n; - release(n) = + ~ decay(n); - trigger(n) = diffgtz : release(n) : > (0.0); -}; - -nlfOrder = 6; -P = ma.SR/freq ; // fundamental period in samples -Pmax = 4096; // maximum P (for delay-line allocation) - -ppdel = beta*P; // pick position delay -pickposfilter = fi.ffcombfilter(Pmax,ppdel,-1); - -excitation = noiseburst(gate,P) : *(gain); // defined in route.lib - -rho = pow(0.001,1.0/(freq*t60)); // multiplies loop-gain - -// Original EKS damping filter: -b1 = 0.5*B; b0 = 1.0-b1; // S and 1-S -dampingfilter1(x) = rho * ((b0 * x) + (b1 * x')); - -// Linear phase FIR3 damping filter: -h0 = (1.0 + B)/2; h1 = (1.0 - B)/4; -dampingfilter2(x) = rho * (h0 * x' + h1*(x+x'')); - -loopfilter = dampingfilter2; // or dampingfilter1 - -filtered_excitation = excitation : si.smooth(pickangle) - : pickposfilter;// : levelfilter(L,freq); - -//nonlinear allpass filter (nonLinearModulator is declared in instruments.lib) -NLFM = nonLinearModulator(nonLinearity,1,freq,typeModulation,frequencyMod,nlfOrder); - -//declared in instruments.lib -stereo = stereoizer(P); - -stringloop = (+ : de.fdelay4(Pmax, P-2)) ~ (loopfilter : NLFM); - -process = filtered_excitation : stringloop : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/NLFfm.dsp b/dist/examples/physicalModeling/faust-stk/NLFfm.dsp deleted file mode 100644 index 63d8447a..00000000 --- a/dist/examples/physicalModeling/faust-stk/NLFfm.dsp +++ /dev/null @@ -1,70 +0,0 @@ -declare name "NLFfm"; -declare description "FM synthesizer implemented with a nonlinear passive allpass filter"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[2][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[2][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[2][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[2][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[3][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[3][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[3][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[3][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[4][unit:s][tooltip:Envelope attack duration]",0.05,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[4][unit:s][tooltip:Envelope decay duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[4][unit:s][tooltip:Envelope release duration]",0.05,0,2,0.01); - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 3; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Algorithm implementation ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//vibrato gain is controlled by envVibrato (declared in instruments.lib) -vibrato = os.osc(vibratoFreq)*vibratoGain*envVibrato(0.1*2*vibratoAttack,0.9*2*vibratoAttack,100,vibratoRelease,gate); - -//output gain is controlled by an adsr envelope -envelope = en.adsr(envelopeAttack,envelopeDecay,0.9,envelopeRelease,gate)*gain; -breath = envelope + envelope*vibrato; - -process = os.osc(freq)*breath : NLFM : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/bass.dsp b/dist/examples/physicalModeling/faust-stk/bass.dsp deleted file mode 100644 index 2d0ca240..00000000 --- a/dist/examples/physicalModeling/faust-stk/bass.dsp +++ /dev/null @@ -1,84 +0,0 @@ -declare name "Bass"; -declare description "Nonlinear WaveGuide Acoustic Bass"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",120,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -touchLength = hslider("v:Physical_Parameters/Touch_Length -[2][tooltip:A value between 0 and 1]",0.15,0,1,0.01)*2; - -typeModulation = nentry("v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); - -//==================== SIGNAL PROCESSING ====================== - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//delay length in number of samples -delayLength = float(ma.SR)/freq; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLength); - -//string excitation -excitation = asympT60(-0.5,-0.985,0.02,gate),no.noise*asympT60(gain,0,touchLength,gate) : - onePoleSwep : excitationFilter : excitationFilter - with{ - //the exitation filter is a one pole filter (declared in instruments.lib) - excitationFilter = onePole(0.035,-0.965); - }; - -//the bodyfilter is a bandpass filter (declared in instruments.lib) -bodyFilter = bandPass(108,0.997); - -//the reflexion filter is pole zero filter (declared in instruments.lib) whose coefficients are -//modulated in function of the tone being played -reflexionFilter = poleZero(b0,b1,a1) - with{ - //filter coefficients are stored in a C++ function - loopFilterb0 = ffunction(float getValueBassLoopFilterb0(float), ,""); - loopFilterb1 = ffunction(float getValueBassLoopFilterb1(float), ,""); - loopFiltera1 = ffunction(float getValueBassLoopFiltera1(float), ,""); - freqToNoteNumber = (log - log(440))/log(2)*12 + 69 + 0.5 : int; - freqn = freq : freqToNoteNumber; - b0 = loopFilterb0(freqn); - b1 = loopFilterb1(freqn); - a1 = loopFiltera1(freqn); - }; - -delayLine = asympT60(0,delayLength,0.01,gate),_ : de.fdelay(4096); - -//the resonance duration is different whether a note-on signal is sent or not -resonanceGain = gate + (gate < 1 <: *(asympT60(1,0.9,0.05))); - -process = excitation : - (+)~(delayLine : NLFM : reflexionFilter*resonanceGain) <: - bodyFilter*1.5 + *(0.5) : *(4) : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/blowBottle.dsp b/dist/examples/physicalModeling/faust-stk/blowBottle.dsp deleted file mode 100644 index e4d9e867..00000000 --- a/dist/examples/physicalModeling/faust-stk/blowBottle.dsp +++ /dev/null @@ -1,102 +0,0 @@ -declare name "blowBottle"; -declare description "Blown Bottle Instrument"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This object implements a helmholtz resonator (biquad filter) with a polynomial jet excitation (a la Cook)."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain -[2][tooltip:Breath noise gain (value between 0 and 1)]",0.5,0,1,0.01)*2; -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value bewteen 0 and 1)]",1,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.01,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.01,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.5,0,2,0.01); - - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//botlle radius -bottleRadius = 0.999; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -bandPassFilter = bandPass(freq,bottleRadius); - -//----------------------- Algorithm implementation ---------------------------- - -//global envelope is of type attack - decay - sustain - release -envelopeG = gain*en.adsr(gain*envelopeAttack,envelopeDecay,1,envelopeRelease,gate); - -//pressure envelope is also ADSR -envelope = pressure*en.adsr(gain*0.02,0.01,1,gain*0.2,gate); - -//vibrato -vibrato = os.osc(vibratoFreq)*vibratoGain*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*os.osc(vibratoFreq); - -//breat pressure -breathPressure = envelope + vibrato; - -//breath noise -randPressure = noiseGain*no.noise*breathPressure ; - -process = - //differential pressure - (-(breathPressure) <: - ((+(1))*randPressure : +(breathPressure)) - *(jetTable),_ : bandPassFilter,_)~NLFM : !,_ : - //signal scaling - fi.dcblocker*envelopeG*0.5 : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/bowed.dsp b/dist/examples/physicalModeling/faust-stk/bowed.dsp deleted file mode 100644 index ba46ce6e..00000000 --- a/dist/examples/physicalModeling/faust-stk/bowed.dsp +++ /dev/null @@ -1,114 +0,0 @@ -declare name "bowed"; -declare description "Nonlinear WaveGuide Bowed Instrument"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A bowed string model, a la Smith (1986), after McIntyre, Schumacher, Woodhouse (1983)."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Bowed_Strings.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position along the string (value between 0 and 1)]",0.7,0.01,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the string (value between 0 and 1)]",0.75,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.01,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.01,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.1,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//Parameters for the bow table -tableOffset = 0; -tableSlope = 5 - (4*bowPressure); - -//the bow table is declared in instruments.lib -bowTable = bow(tableOffset,tableSlope); - -//a attack - decay - sustain - release envelope is used -envelope = en.adsr(gain*envelopeAttack,envelopeDecay,1, (1-gain)*envelopeRelease,gate); -maxVelocity = 0.03 + (0.2 * gain); - -//Delay lines declaration and vibrato, the length of the two delay lines are evolving propotionally -betaRatio = 0.027236 + (0.2*bowPosition); -fdelneck = (ma.SR/freq-4)*(1 - betaRatio); -vibratoEnvelope = envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate); -vibrato = fdelneck + ((ma.SR/freq - 4)*vibratoGain*vibratoEnvelope*os.osc(vibratoFreq)); -neckDelay = de.fdelay(4096,vibrato); -fdelbridge = (ma.SR/freq - 4)*betaRatio; -bridgeDelay = de.delay(4096,fdelbridge); - -//Body Filter: a biquad filter with a normalized pick gain (declared in instruments.lib) -bodyFilter = bandPass(500,0.85); - -//String Filter: a lowpass filter (declared in instruments.lib) -stringFilter = *(0.95) : -onePole(b0,a1) - with{ - pole = 0.6 - (0.1*22050/ma.SR); - gain = 0.95; - b0 = 1-pole; - a1 = -pole; - }; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -bowVelocity = envelope*maxVelocity; -instrumentBody(feedBckBridge) = (*(-1) <: +(feedBckBridge),_ : (bowVelocity-_ <: *(bowTable) <: _,_),_ : - _, + : +(feedBckBridge),_) ~ (neckDelay) : !,_; - -process = (stringFilter : instrumentBody) ~ (bridgeDelay : NLFM) : bodyFilter(*(0.2)) : - _*gain*8 : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/brass.dsp b/dist/examples/physicalModeling/faust-stk/brass.dsp deleted file mode 100644 index 357c0a1c..00000000 --- a/dist/examples/physicalModeling/faust-stk/brass.dsp +++ /dev/null @@ -1,103 +0,0 @@ -declare name "brass"; -declare description "WaveGuide Brass instrument from STK"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple brass instrument waveguide model, a la Cook (TBone, HosePlayer)."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Brasses.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:A value between 0 and 1]",1,0.01,1,0.01); -lipTension = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Lip_Tension -[2][tooltip:A value between 0 and 1]",0.780,0.01,1,0.001); -slideLength = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Slide_Length -[2][tooltip:A value between 0 and 1]",0.041,0.01,1,0.001); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.05,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.005,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.001,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.07,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//lips are simulated by a biquad filter whose output is squared and hard-clipped, bandPassH and saturationPos are declared in instruments.lib -lipFilterFrequency = freq*pow(4,(2*lipTension)-1); -lipFilter = *(0.03) : bandPassH(lipFilterFrequency,0.997) <: * : saturationPos; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//delay times in number of samples -slideTarget = ((ma.SR/freq)*2 + 3)*(0.5 + slideLength); -boreDelay = de.fdelay(4096,slideTarget); - -//----------------------- Algorithm implementation ---------------------------- - -//vibrato -vibrato = vibratoGain*os.osc(vibratoFreq)*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate); - -//envelope (Attack / Decay / Sustain / Release), breath pressure and vibrato -breathPressure = pressure*en.adsr(envelopeAttack,envelopeDecay,1,envelopeRelease,gate) + vibrato; -mouthPressure = 0.3*breathPressure; - -//scale the delay feedback -borePressure = *(0.85); - -//differencial presure -deltaPressure = mouthPressure - _; - -process = (borePressure <: deltaPressure,_ : - (lipFilter <: *(mouthPressure),(1-_)),_ : _, * :> + : - fi.dcblocker) ~ (boreDelay : NLFM) : - *(gain)*4 : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/clarinet.dsp b/dist/examples/physicalModeling/faust-stk/clarinet.dsp deleted file mode 100644 index 4adb679b..00000000 --- a/dist/examples/physicalModeling/faust-stk/clarinet.dsp +++ /dev/null @@ -1,110 +0,0 @@ -declare name "clarinet"; -declare description "Nonlinear WaveGuide Clarinet"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple clarinet physical model, as discussed by Smith (1986), McIntyre, Schumacher, Woodhouse (1983), and others."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Woodwinds.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -reedStiffness = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Reed_Stiffness -[2][tooltip:Reed stiffness (value between 0 and 1)]",0.5,0,1,0.01); -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain -[2][tooltip:Breath noise gain (value between 0 and 1)]",0,0,1,0.01); -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value bewteen 0 and 1)]",1,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.01,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.1,0,2,0.01); - -//==================== SIGNAL PROCESSING ====================== - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//reed table parameters -reedTableOffset = 0.7; -reedTableSlope = -0.44 + (0.26*reedStiffness); - -//the reed function is declared in instruments.lib -reedTable = reed(reedTableOffset,reedTableSlope); - -//delay line with a length adapted in function of the order of nonlinear filter -delayLength = ma.SR/freq*0.5 - 1.5 - (nlfOrder*nonLinearity)*(typeModulation < 2); -delayLine = de.fdelay(4096,delayLength); - -//one zero filter used as a allpass: pole is set to -1 -filter = oneZero0(0.5,0.5); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -//Breath pressure + vibrato + breath noise + envelope (Attack / Decay / Sustain / Release) -envelope = en.adsr(envelopeAttack,envelopeDecay,1,envelopeRelease,gate)*pressure*0.9; - -vibrato = os.osc(vibratoFreq)*vibratoGain* - envVibrato(0.1*2*vibratoAttack,0.9*2*vibratoAttack,100,vibratoRelease,gate); -breath = envelope + envelope*no.noise*noiseGain; -breathPressure = breath + breath*vibrato; - -process = - //Commuted Loss Filtering - (_,(breathPressure <: _,_) : (filter*-0.95 - _ <: - - //Non-Linear Scattering - *(reedTable)) + _) ~ - - //Delay with Feedback - (delayLine : NLFM) : - - //scaling and stereo - *(gain)*1.5 : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/flute.dsp b/dist/examples/physicalModeling/faust-stk/flute.dsp deleted file mode 100644 index e01a8623..00000000 --- a/dist/examples/physicalModeling/faust-stk/flute.dsp +++ /dev/null @@ -1,116 +0,0 @@ -declare name "flute"; -declare description "Nonlinear WaveGuide Flute"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple flute based on Smith algorithm: https://ccrma.stanford.edu/~jos/pasp/Flutes_Recorders_Pipe_Organs.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]") : int; - -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value bewteen 0 and 1)]",0.9,0,1.5,0.01) : si.smoo; -breathAmp = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise Gain -[2][tooltip:Breath noise gain (value between 0 and 1)]",0.1,0,1,0.01)/10; - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.1,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.2,0,2,0.01); - -pressureEnvelope = checkbox("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Pressure_Env -[5][unit:s][tooltip:Activate Pressure envelope]") : int; -env1Attack = hslider("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Press_Env_Attack -[5][unit:s][tooltip:Pressure envelope attack duration]",0.05,0,2,0.01); -env1Decay = hslider("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Press_Env_Decay -[5][unit:s][tooltip:Pressure envelope decay duration]",0.2,0,2,0.01); -env1Release = hslider("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Press_Env_Release -[5][unit:s][tooltip:Pressure envelope release duration]",1,0,2,0.01); - -env2Attack = hslider("h:Envelopes_and_Vibrato/v:Global_Envelope_Parameters/Glob_Env_Attack -[6][unit:s][tooltip:Global envelope attack duration]",0.1,0,2,0.01); -env2Release = hslider("h:Envelopes_and_Vibrato/v:Global_Envelope_Parameters/Glob_Env_Release -[6][unit:s][tooltip:Global envelope release duration]",0.1,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,0.1,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//Loops feedbacks gains -feedBack1 = 0.4; -feedBack2 = 0.4; - -//Delay Lines -embouchureDelayLength = (ma.SR/freq)/2-2; -boreDelayLength = ma.SR/freq-2; -embouchureDelay = de.fdelay(4096,embouchureDelayLength); -boreDelay = de.fdelay(4096,boreDelayLength); - -//Polynomial -poly = _ <: _ - _*_*_; - -//jet filter is a lowpass filter (declared in miscfilter.lib) -reflexionFilter = fi.lowpass(1,2000); - -//stereoizer is declared in instruments.lib and implement a stereo spatialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -//Pressure envelope -env1 = en.adsr(env1Attack,env1Decay,0.9,env1Release,(gate | pressureEnvelope))*pressure*1.1; - -//Global envelope -env2 = en.asr(env2Attack,1,env2Release,gate)*0.5; - -//Vibrato Envelope -vibratoEnvelope = envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*vibratoGain; - -vibrato = os.osc(vibratoFreq)*vibratoEnvelope; - -breath = no.noise*env1; - -flow = env1 + breath*breathAmp + vibrato; - -//instrReverb is declared in instruments.lib -process = (_ <: (flow + *(feedBack1) : embouchureDelay : poly) + *(feedBack2) : reflexionFilter)~(boreDelay : NLFM) : *(env2)*gain : -stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/fluteStk.dsp b/dist/examples/physicalModeling/faust-stk/fluteStk.dsp deleted file mode 100644 index 83f432dd..00000000 --- a/dist/examples/physicalModeling/faust-stk/fluteStk.dsp +++ /dev/null @@ -1,121 +0,0 @@ -declare name "fluteStk"; -declare description "Nonlinear WaveGuide Flute from STK"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple flute physical model, as discussed by Karjalainen, Smith, Waryznyk, etc. The jet model uses a polynomial, a la Cook."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Flutes_Recorders_Pipe_Organs.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -embouchureAjust = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Embouchure_Ajust -[2][tooltip:A value between 0 and 1]",0.5,0,1,0.01); -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain -[2][tooltip:A value between 0 and 1]",0.03,0,1,0.01); -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value between 0 and 1)]",1,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.05,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.03,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.01,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.3,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -jetReflexion = 0.5; -//jetRatio = 0.08 + (0.48*embouchureAjust); //original stk function -jetRatio = 1+(0.5-embouchureAjust); //corrected function -endReflexion = 0.5; - -//Delay lines lengths in number of samples -//jetDelayLength = (SR/freq-2)*jetRatio; //original stk function for jet delay length -jetDelayLength = (ma.SR/(freq*2)-2)*jetRatio; //corrected function for jet delay length -boreDelayLength = ma.SR/(freq*2)-2; //original function for bore delay length -//boreDelayLength = SR/(freq)-2; //corrected function for bore delay length -filterPole = 0.7 - (0.1*22050/ma.SR); - -//One Pole Filter (declared in instruments.lib) -onePoleFilter = _*gain : onePole(b0,a1) - with{ - gain = -1; - pole = 0.7 - (0.1*22050/ma.SR); - b0 = 1 - pole; - a1 = -pole; - }; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -//the vibrato amplitude is controlled by an envelope generator (declared in instruments.lib) -vibrato = vibratoGain*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*os.osc(vibratoFreq); - -//Breath pressure is controlled by an Attack / Decay / Sustain / Release envelope -envelopeBreath = pressure*en.adsr(pressure*envelopeAttack,envelopeDecay,0.8,envelopeRelease,gate); -breathPressure = envelopeBreath + envelopeBreath*(noiseGain*no.noise + vibrato) + 10.0^(-15.0); - -//delay lines -jetDelay = de.fdelay(4096,jetDelayLength); -boreDelay = de.fdelay(4096,boreDelayLength); - -//reflexion filter is a one pole and a dcblocker -reflexionFilters = onePoleFilter : fi.dcblocker; - -process = - (reflexionFilters <: - //Differential Pressure - ((breathPressure - _*jetReflexion) : - jetDelay : jetTable) + (_*endReflexion)) ~ (boreDelay : NLFM) : - //output scaling and stereo signal - *(0.3*gain) : stereo : instrReverb; - - diff --git a/dist/examples/physicalModeling/faust-stk/glassHarmonica.dsp b/dist/examples/physicalModeling/faust-stk/glassHarmonica.dsp deleted file mode 100644 index f7e874d8..00000000 --- a/dist/examples/physicalModeling/faust-stk/glassHarmonica.dsp +++ /dev/null @@ -1,131 +0,0 @@ -declare name "glassHarmonica"; -declare description "Nonlinear Banded Waveguide Modeled Glass Harmonica"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 3; - -nMode(3) = 6; - -modes(3,0) = 1.0; -basegains(3,0) = pow(0.999,1); -excitation(3,0) = 1*gain*gate/(nMode(3) - 1); - -modes(3,1) = 2.32; -basegains(3,1) = pow(0.999,2); -excitation(3,1) = 1*gain*gate/(nMode(3) - 1); - -modes(3,2) = 4.25; -basegains(3,2) = pow(0.999,3); -excitation(3,2) = 1*gain*gate/(nMode(3) - 1); - -modes(3,3) = 6.63; -basegains(3,3) = pow(0.999,4); -excitation(3,3) = 1*gain*gate/(nMode(3) - 1); - -modes(3,4) = 9.38; -basegains(3,4) = pow(0.999,5); -excitation(3,4) = 1*gain*gate/(nMode(3) - 1); - -modes(3,5) = 9 : float; -basegains(3,5) = 0 : float; -excitation(3,5) = 0 : float; - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,1,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - *(4) : NLFM : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/harpsi.dsp b/dist/examples/physicalModeling/faust-stk/harpsi.dsp deleted file mode 100644 index 4dd259ee..00000000 --- a/dist/examples/physicalModeling/faust-stk/harpsi.dsp +++ /dev/null @@ -1,90 +0,0 @@ -declare name "harpsi"; -declare description "Nonlinear WaveGuide Commuted Harpsichord"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A commuted WaveGuide Harpsichord."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[2][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[2][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[2][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); - -//==================== PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//convert a frequency in a midi note number -freqToNoteNumber = (log-log(440))/log(2)*12+69+0.5 : int; -freqn = freq : freqToNoteNumber; - -//string excitation -soundBoard = dryTapAmp*no.noise - with{ - dryTapAmpT60 = ffunction(float getValueDryTapAmpT60(float), ,""); - noteCutOffTime = freqn : dryTapAmpT60*gain; - dryTapAmp = asympT60(0.15,0,noteCutOffTime,gate); - }; - -//loopfilter is a biquad filter whose coefficients are extracted from a C++ file using the foreign function mechanism -loopFilter = fi.TF2(b0,b1,b2,a1,a2) - with{ - //functions are imported from the C++ file - loopFilterb0 = ffunction(float getValueLoopFilterb0(float), ,""); - loopFilterb1 = ffunction(float getValueLoopFilterb1(float), ,""); - loopFilterb2 = ffunction(float getValueLoopFilterb2(float), ,""); - loopFiltera1 = ffunction(float getValueLoopFiltera1(float), ,""); - loopFiltera2 = ffunction(float getValueLoopFiltera2(float), ,""); - //coefficients are extracted from the functions - b0 = loopFilterb0(freqn); - b1 = loopFilterb1(freqn); - b2 = loopFilterb2(freqn); - a1 = loopFiltera1(freqn); - a2 = loopFiltera2(freqn); - }; - -//delay length as a number of samples -delayLength = ma.SR/freq; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLength); - -//----------------------- Algorithm implementation ---------------------------- - -//envelope for string loop resonance time -stringLoopGainT = gate*0.9996 + (gate<1)*releaseLoopGain(freqn)*0.9 : si.smoo - with{ - releaseLoopGain = ffunction(float getValueReleaseLoopGain(float), ,""); - }; - -//one string -string = (*(stringLoopGainT)+_ : de.delay(4096,delayLength) : loopFilter)~NLFM; - -process = soundBoard : string : stereo : instrReverb; - - diff --git a/dist/examples/physicalModeling/faust-stk/modalBar.dsp b/dist/examples/physicalModeling/faust-stk/modalBar.dsp deleted file mode 100644 index c949ad80..00000000 --- a/dist/examples/physicalModeling/faust-stk/modalBar.dsp +++ /dev/null @@ -1,122 +0,0 @@ -declare name "modalBar"; -declare description "Nonlinear Modal percussive instruments"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A number of different struck bar instruments. Presets numbers: 0->Marimba, 1->Vibraphone, 2->Agogo, 3->Wood1, 4->Reso, 5->Wood2, 6->Beats, 7->2Fix; 8->Clump"; - -import("instruments.lib"); - -//========================= WAVE TABLES =============================== - -//----------------------- STICK IMPACT ---------------------------- -// Stick impact table. -// -// USAGE: -// index : readMarmstk1 : _ - -readMarmstk1 = ffunction(float readMarmstk1 (int), ,""); -marmstk1TableSize = 246; - - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -stickHardness = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Stick_Hardness -[2][tooltip:A value between 0 and 1]",0.25,0,1,0.01); -reson = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Resonance -[2][tooltip:A value between 0 and 1]",1,0,1,1); -presetNumber = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Preset -[2][tooltip:0->Marimba, 1->Vibraphone, 2->Agogo, 3->Wood1, 4->Reso, 5->Wood2, 6->Beats, 7->2Fix; 8->Clump]",1,0,8,1); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//check if the vibraphone is used -vibratoOn = presetNumber == 1; - -//vibrato -vibrato = 1 + os.osc(vibratoFreq)*vibratoGain*vibratoOn; - -//filter bank output gain -directGain = loadPreset(presetNumber,3,2); - -//modal values for the filter bank -loadPreset = ffunction(float loadPreset (int,int,int), ,""); - -//filter bank using biquad filters -biquadBank = _ <: sum(i, 4, oneFilter(i)) - with{ - condition(x) = x<0 <: *(-x),((-(1))*-1)*x*freq :> +; - dampCondition = (gate < 1) & (reson != 1); - - //the filter coefficients are interpolated when changing of preset - oneFilter(j,y) = (loadPreset(presetNumber,0,j : si.smoo) : condition), - loadPreset(presetNumber,1,j : si.smoo)*(1-(gain*0.03*dampCondition)), - y*(loadPreset(presetNumber,2,j) : si.smoo) : bandPassH; - }; - -//one pole filter with pole set at 0.9 for pre-filtering, onePole is declared in instruments.lib -sourceFilter = onePole(b0,a1) - with{ - b0 = 1 - 0.9; - a1 = -0.9; - }; - -//excitation signal -excitation = counterSamples < (marmstk1TableSize*rate) : *(marmstk1Wave*gate) - with{ - //readMarmstk1 and marmstk1TableSize are both declared in instruments.lib - marmstk1 = ba.time%marmstk1TableSize : int : readMarmstk1; - - dataRate(readRate) = readRate : (+ : ma.decimal) ~ _ : *(float(marmstk1TableSize)); - - //the reading rate of the stick table is defined in function of the stickHardness - rate = 0.25*pow(4,stickHardness); - - counterSamples = (*(gate)+1)~_ : -(1); - marmstk1Wave = rdtable(marmstk1TableSize,marmstk1,int(dataRate(rate)*gate)); - }; - -process = excitation : sourceFilter : *(gain) <: - //resonance - (biquadBank <: -(*(directGain))) + (directGain*_) : - //vibrato for the vibraphone - *(vibrato) : NLFM*0.6 : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/piano.dsp b/dist/examples/physicalModeling/faust-stk/piano.dsp deleted file mode 100644 index 30adfe82..00000000 --- a/dist/examples/physicalModeling/faust-stk/piano.dsp +++ /dev/null @@ -1,255 +0,0 @@ -declare name "piano"; -declare description "WaveGuide Commuted Piano"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A commuted WaveGuide piano."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -brightnessFactor = hslider("v:Physical_Parameters/Brightness_Factor -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -detuningFactor = hslider("v:Physical_Parameters/Detuning_Factor -[2][tooltip:A value between 0 and 1]",0.1,0,1,0.01)*10; -stiffnessFactor = hslider("v:Physical_Parameters/Stiffness_Factor -[2][tooltip:A value between 0 and 1]",0.28,0,1,0.01)*3.7; -hammerHardness = hslider("v:Physical_Parameters/Hammer_Hardness -[2][tooltip:A value between 0 and 1]",0.1,0,1,0.01)*0.1; - -//==================== COMMUTED PIANO PARAMETERS ================ - -//variables to set keybord splitting zone -DCB2_TURNOFF_KEYNUM = 92; -FIRST_HIGH_NOTE = 88; -PEDAL_ENVELOPE_T60 = 7; - -//convert an amplitude in db -dbinv(x) = pow(10,0.05*x); - -//convert a frequency in a midi note number -freqToNoteNumber = (log-log(440))/log(2)*12+69+0.5 : int; -freqn = freq : freqToNoteNumber; - -//a counter that restart a every note-on -cntSample = *(gate)+1~_ : -(1); - -//==================== PIANO SOUND BOARD ================ - -//exponential envelope with 3 phases for the pedal excitation -asympT60pedal(value,T60) = (*(factor) + constant)~_ - with{ - attDur = hammerHardness*float(ma.SR); - target = value*((cntSample < attDur) & (gate > 0)); - factorAtt = exp (-1/(attDur)); - factorG = exp(-1/(2*float(ma.SR))); - factorT60 = exp(-7/(T60*float(ma.SR))); - factor = factorAtt*gate*(cntSample < attDur) + (cntSample >= attDur)*gate*factorG + ((gate-1)*-1)*factorT60; - constant = (1 - factor)*target; - }; - -//the sound of the piano sound board is generated by noise generator whose output gain is shaped by -//an exponential envelope -soundBoard = dryTapAmp*no.noise + pedalEnv*no.noise : *(0.5) - with{ - //the values of the envelope cut-off time are stored in an external C++ function - dryTapAmpT60 = ffunction(float getValueDryTapAmpT60(float), ,""); - sustainPedalLevel = ffunction(float getValueSustainPedalLevel(float), ,""); - - pedalEnvCutOffTime = 1.4; - noteCutOffTime = freqn : dryTapAmpT60*gain; - pedalEnvValue = freqn : sustainPedalLevel*0.2; - noteEnvValue = 0.15; - dryTapAmp = asympT60(noteEnvValue,0,noteCutOffTime,gate); - pedalEnv = asympT60pedal(pedalEnvValue,pedalEnvCutOffTime); - }; - -//==================== HAMMER MODELING ================ - -//To model the exitation hammer, we filter the sound from the soundboard with a serie of 4 one pole filters -//connected in serie - -//onePole is declared in instruments.lib -calcHammer = onePole((1-hammerPole)*hammerGain,-hammerPole) - with{ - //filter gains and coefficients are stored in external C++ files - loudPole = ffunction(float getValueLoudPole(float), ,""); - softPole = ffunction(float getValuePoleValue(float), ,""); - loudGain = ffunction(float getValueLoudGain(float), ,""); - softGain = ffunction(float getValueSoftGain(float), ,""); - - loudPoleValue = loudPole(freqn) + (brightnessFactor*-0.25) + 0.02; - softPoleValue = softPole(freqn); - normalizedVelocityValue = 1; - loudGainValue = loudGain(freqn); - softGainValue = softGain(freqn); - overallGain = 1; - hammerPole = softPoleValue + (loudPoleValue - softPoleValue)*normalizedVelocityValue; - hammerGain = overallGain*(softGainValue + (loudGainValue - softGainValue)*normalizedVelocityValue); - }; - -hammer = seq(i,4,calcHammer); - -//==================== DC BLOCKERS ================ - -//the values for the dcblockers a1 are stored in an external C++ file -DCBa1 = ffunction(float getValueDCBa1(float), ,""); -dCBa1Value = freqn : DCBa1; -dCBb0Value = 1 - dCBa1Value; - -dcBlock1 = poleZero((dCBb0Value*0.5),(dCBb0Value*-0.5),dCBa1Value); - -dcBlock2a = oneZero1(0.5,-0.5); - -dcBlock2b = onePole(dCBb0Value,dCBa1Value); - -//==================== HIGH TUNING CALCULATION ================ - -//high tones are not generated with the waveguide technique but with a serie of biquad filters - -r1_1 = ffunction(float getValuer1_1db(float), ,""); -r1_2 = ffunction(float getValuer1_2db(float), ,""); -r2 = ffunction(float getValuer2db(float), ,""); -r3 = ffunction(float getValuer3db(float), ,""); -e = ffunction(float getValueSecondStageAmpRatio(float), ,""); -second_partial_factor = ffunction(float getValueSecondPartialFactor(float), ,""); -third_partial_factor = ffunction(float getValueThirdPartialFactor(float), ,""); -bq4_gEarBalled = ffunction(float getValueBq4_gEarBalled(float), ,""); - -r1_1Value = r1_1(freqn)/ma.SR : dbinv; -r1_2Value = r1_2(freqn)/ma.SR : dbinv; -r2Value = r2(freqn)/ma.SR : dbinv; -r3Value = r3(freqn)/ma.SR : dbinv; -eValue = e(freqn) : dbinv; -second_partial_factorValue = second_partial_factor(freqn); -third_partial_factorValue = third_partial_factor(freqn); - -//set biquad gains and coeffs -gainHighBq(0) = bq4_gEarBalled(freqn)/0.5; -gainHighBq(1) = bq4_gEarBalled(freqn)/0.5; -gainHighBq(2) = 1; -gainHighBq(3) = 1; - -b0HighBq(0) = 1; -b0HighBq(1) = 1; -b0HighBq(2) = 1; -b0HighBq(3) = 1; - -b1HighBq(0) = 0; -b1HighBq(1) = 0; -b1HighBq(2) = -2*(eValue*r1_1Value+(1-eValue)*r1_2Value)*cos(2*ma.PI*freq/ma.SR); -b1HighBq(3) = 0; - -b2HighBq(0) = 0; -b2HighBq(1) = 0; -b2HighBq(2) = eValue*r1_1Value*r1_1Value+(1-eValue)*r1_2Value*r1_2Value; -b2HighBq(3) = 0; - -a1HighBq(0) = -2*r3Value*cos(2*ma.PI*freq*third_partial_factorValue/ma.SR); -a1HighBq(1) = -2*r2Value*cos(2*ma.PI*freq*second_partial_factorValue/ma.SR); -a1HighBq(2) = -2*r1_1Value*cos(2*ma.PI*freq/ma.SR); -a1HighBq(3) = -2*r1_2Value*cos(2*ma.PI*freq/ma.SR); - -a2HighBq(0) = r3Value*r3Value; -a2HighBq(1) = r2Value*r2Value; -a2HighBq(2) = r1_1Value*r1_1Value; -a2HighBq(3) = r1_2Value*r1_2Value; - -highBqs = seq(i,4,*(gainHighBq(i)) : fi.TF2(b0HighBq(i),b1HighBq(i),b2HighBq(i),a1HighBq(i),a2HighBq(i))); - -hiPass = oneZero1(b0,b1) - with{ - b0 = -0.5; - b1 = -0.5; - }; - -//==================== STRIKE POSITION COMB FILTER EQ ================ - -eq = _*filterGain : fi.TF2(b0,b1,b2,a1,a2) - with{ - strikePosition = ffunction(float getValueStrikePosition(float), ,""); - bandwidthFactors = ffunction(float getValueEQBandWidthFactor(float), ,""); - eq_gain = ffunction(float getValueEQGain(float), ,""); - eq_tuning = freq/strikePosition(freqn); - eq_bandwidth = bandwidthFactors(freqn)*freq; - filterGain = eq_gain(freqn); - a2 = (eq_bandwidth / ma.SR) * (eq_bandwidth / ma.SR); - a1 = -2*(eq_bandwidth / ma.SR)*cos(2*ma.PI*eq_tuning/ma.SR); - b0 = 0.5 - 0.5 * a2; - b1 = 0; - b2 = -b0; - }; - -//==================== PIANO COUPLED STRINGS ================ - -//values for the couple strings are stored in externals C++ functions -singleStringDecRate = ffunction(float getValueSingleStringDecayRate(float), ,""); -singleStringZero = ffunction(float getValueSingleStringZero(float), ,""); -singleStringPole = ffunction(float getValueSingleStringPole(float), ,""); -stiffnessCoefficient = ffunction(float getValueStiffnessCoefficient(float), ,""); - -//coupling filter parameters -g = pow(10,((singleStringDecRate(freqn)/freq)/20)); //attenuation per period -b = singleStringZero(freqn); -a = singleStringPole(freqn); -tempd = 3*(1-b)-g*(1-a); -b0Coupling = 2*(g*(1-a)-(1-b))/tempd; -b1Coupling = 2*(a*(1-b)-g*(1-a)*b)/tempd; -a1Coupling = (g*(1-a)*b - 3*a*(1-b))/tempd; - -//string stiffness -stiffness = stiffnessFactor*stiffnessCoefficient(freqn); - -stiffnessAP = poleZero(b0s,b1s,a1s) - with{ - b0s = stiffness; - b1s = 1; - a1s = stiffness; - }; - -delayG(frequency,stiffnessCoefficient) = de.fdelay(4096,delayLength) - with{ - allPassPhase(a1,WT) = atan2((a1*a1-1.0)*sin(WT),(2.0*a1+(a1*a1+1.0)*cos(WT))); - poleZeroPhase(b0,b1,a1,WT) = atan2(-b1*sin(WT)*(1 + a1*cos(WT)) + a1*sin(WT)*(b0 + b1*cos(WT)), - (b0 + b1*cos(WT))*(1 + a1*cos(WT)) + b1*sin(WT)*a1*sin(WT)); - wT = frequency*2*ma.PI/ma.SR; - delayLength = (2*ma.PI + 3*allPassPhase(stiffnessCoefficient, wT) + - poleZeroPhase((1+2*b0Coupling), - a1Coupling + 2*b1Coupling, a1Coupling, wT)) / wT; - }; - -coupledStrings = (parallelStrings <: (_,(_+_ <: _,_),_ : _,_,(_ : couplingFilter),_ : adder))~(_,_) : !,!,_ - with{ - releaseLoopGain = ffunction(float getValueReleaseLoopGain(float), ,""); - hz = ffunction(float getValueDetuningHz(float), ,""); - coupledStringLoopGain = gate*0.9996 + ((gate-1)*-1)*releaseLoopGain(freqn)*0.9 : si.smoo; - couplingFilter = poleZero(b0Coupling,b1Coupling,a1Coupling); - hzValue = hz(freqn); - freq1 = freq + 0.5*hzValue*detuningFactor; - freq2 = freq - 0.5*hzValue*detuningFactor; - delay1 = delayG(freq1,stiffness); - delay2 = delayG(freq2,stiffness); - parallelStrings(x,y) = _ <: (+(x)*coupledStringLoopGain : seq(i,3,stiffnessAP) : delay1), - (_+y*coupledStringLoopGain : seq(i,3,stiffnessAP) : delay2); - adder(w,x,y,z) = (y <: +(w),+(z)),x ; - }; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//==================== PROCESSING ================ - -conditionLowNote = freqn < FIRST_HIGH_NOTE; -conditionHighNote = freqn >= FIRST_HIGH_NOTE; - -process = soundBoard <: (*(conditionLowNote)*6 : hammer : dcBlock1 : coupledStrings <: +(eq)), -(*(conditionHighNote) : hiPass : dcBlock1 : hammer : dcBlock2a : highBqs : dcBlock2b) :> + : *(12) : -stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/saxophony.dsp b/dist/examples/physicalModeling/faust-stk/saxophony.dsp deleted file mode 100644 index b6bac050..00000000 --- a/dist/examples/physicalModeling/faust-stk/saxophony.dsp +++ /dev/null @@ -1,114 +0,0 @@ -declare name "saxophony"; -declare description "Nonlinear WaveGuide Saxophone"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This class implements a hybrid digital waveguide instrument that can generate a variety of wind-like sounds. It has also been referred to as the blowed string model. The waveguide section is essentially that of a string, with one rigid and one lossy termination. The non-linear function is a reed table. The string can be blown at any point between the terminations, though just as with strings, it is impossible to excite the system at either end. If the excitation is placed at the string mid-point, the sound is that of a clarinet. At points closer to the bridge, the sound is closer to that of a saxophone. See Scavone (2002) for more details."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Woodwinds.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (a value between 0 and 1)]",1,0,1,0.01); -reedStiffness = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Reed_Stiffness -[2][tooltip:A value between 0 and 1]",0.3,0,1,0.01); -blowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Blow_Position -[2][tooltip:A value between 0 and 1]",0.5,0,1,0.01); -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain",0.05,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.3,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.01,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//reed table parameters -reedTableOffset = 0.7; -reedTableSlope = 0.1 + (0.4*reedStiffness); - -//the reed function is declared in instruments.lib -reedTable = reed(reedTableOffset,reedTableSlope); - -//Delay lines length in number of samples -fdel1 = (1-blowPosition) * (ma.SR/freq - 3); -fdel2 = (ma.SR/freq - 3)*blowPosition +1 ; - -//Delay lines -delay1 = de.fdelay(4096,fdel1); -delay2 = de.fdelay(4096,fdel2); - -//Breath pressure is controlled by an attack / sustain / release envelope (asr is declared in instruments.lib) -envelope = (0.55+pressure*0.3)*en.asr(pressure*envelopeAttack,1,pressure*envelopeRelease,gate); -breath = envelope + envelope*noiseGain*no.noise; - -//envVibrato is decalred in instruments.lib -vibrato = vibratoGain*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*osc(vibratoFreq); -breathPressure = breath + breath*vibratoGain*os.osc(vibratoFreq); - -//Body filter is a one zero filter (declared in instruments.lib) -bodyFilter = *(gain) : oneZero1(b0,b1) - with{ - gain = -0.95; - b0 = 0.5; - b1 = 0.5; - }; - -instrumentBody(delay1FeedBack,breathP) = delay1FeedBack <: -(delay2) <: - ((breathP - _ <: breathP - _*reedTable) - delay1FeedBack),_; - -process = - (bodyFilter,breathPressure : instrumentBody) ~ - (delay1 : NLFM) : !, - //Scaling Output and stereo - *(gain) : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/sitar.dsp b/dist/examples/physicalModeling/faust-stk/sitar.dsp deleted file mode 100644 index 0b4b1af2..00000000 --- a/dist/examples/physicalModeling/faust-stk/sitar.dsp +++ /dev/null @@ -1,48 +0,0 @@ -declare name "Sitar"; -declare description "WaveGuide Sitar"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument implements a sitar plucked string physical model based on the Karplus-Strong algorithm using a randomly modulated delay line."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -resonance = hslider("v:Physical_Parameters/Resonance -[2][tooltip:A value between 0 and 1]",0.7,0,1,0.01)*0.1; - -//==================== SIGNAL PROCESSING ================ - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//excitation envelope (adsr) -envelope = en.adsr(0.001,0.04,1,0.5,gate); - -//the delay length is randomly modulated -targetDelay = ma.SR/freq; -delayLength = targetDelay*((1+(0.5*no.noise)) : si.smooth(0.9992)); -delayLine = de.delay(4096,delayLength); - -//the loop gain control the resonance duration -loopGain = 0.895 + resonance + (freq*0.0000005); -amGain = 0.1*gain; - -//feedback filter is a one zero (declared in instruments.lib) -filter = oneZero1(b0,b1) - with{ - zero = 0.01; - b0 = 1/(1 + zero); - b1 = -zero*b0; - }; - -process = (*(loopGain) : filter + (envelope*no.noise*amGain))~delayLine : *(8) : -stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/tibetanBowl.dsp b/dist/examples/physicalModeling/faust-stk/tibetanBowl.dsp deleted file mode 100644 index ce13307e..00000000 --- a/dist/examples/physicalModeling/faust-stk/tibetanBowl.dsp +++ /dev/null @@ -1,155 +0,0 @@ -declare name "tibetanBowl"; -declare description "Banded Waveguide Modeld Tibetan Bowl"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 0; - -nMode(0) = 12; - -modes(0,0) = 0.996108344; -basegains(0,0) = 0.999925960128219; -excitation(0,0) = 11.900357 / 10; - -modes(0,1) = 1.0038916562; -basegains(0,1) = 0.999925960128219; -excitation(0,1) = 11.900357 / 10; - -modes(0,2) = 2.979178; -basegains(0,2) = 0.999982774366897; -excitation(0,2) = 10.914886 / 10; - -modes(0,3) = 2.99329767; -basegains(0,3) = 0.999982774366897; -excitation(0,3) = 10.914886 / 10; - -modes(0,4) = 5.704452; -basegains(0,4) = 1.0; -excitation(0,4) = 42.995041 / 10; - -modes(0,5) = 5.704452; -basegains(0,5) = 1.0; -excitation(0,5) = 42.995041 / 10; - -modes(0,6) = 8.9982; -basegains(0,6) = 1.0; -excitation(0,6) = 40.063034 / 10; - -modes(0,7) = 9.01549726; -basegains(0,7) = 1.0; -excitation(0,7) = 40.063034 / 10; - -modes(0,8) = 12.83303; -basegains(0,8) = 0.999965497558225; -excitation(0,8) = 7.063034 / 10; - -modes(0,9) = 12.807382; -basegains(0,9) = 0.999965497558225; -excitation(0,9) = 7.063034 / 10; - -modes(0,10) = 17.2808219; -basegains(0,10) = 0.9999999999999999999965497558225; -excitation(0,10) = 57.063034 / 10; - -modes(0,11) = 21.97602739726; -basegains(0,11) = 0.999999999999999965497558225; -excitation(0,11) = 57.063034 / 10; - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,1,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - NLFM : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/tunedBar.dsp b/dist/examples/physicalModeling/faust-stk/tunedBar.dsp deleted file mode 100644 index 1dd6b15b..00000000 --- a/dist/examples/physicalModeling/faust-stk/tunedBar.dsp +++ /dev/null @@ -1,123 +0,0 @@ -declare name "tunedBar"; -declare description "Nonlinear Banded Waveguide Models"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 2; - -nMode(2) = 4; - -modes(2,0) = 1; -basegains(2,0) = pow(0.999,1); -excitation(2,0) = 1*gain*gate/nMode(2); - -modes(2,1) = 4.0198391420; -basegains(2,1) = pow(0.999,2); -excitation(2,1) = 1*gain*gate/nMode(2); - -modes(2,2) = 10.7184986595; -basegains(2,2) = pow(0.999,3); -excitation(2,2) = 1*gain*gate/nMode(2); - -modes(2,3) = 18.0697050938; -basegains(2,3) = pow(0.999,4); -excitation(2,3) = 1*gain*gate/nMode(2); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,0.9,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - *(4) : NLFM : stereo : instrReverb; - diff --git a/dist/examples/physicalModeling/faust-stk/uniBar.dsp b/dist/examples/physicalModeling/faust-stk/uniBar.dsp deleted file mode 100644 index c485f93d..00000000 --- a/dist/examples/physicalModeling/faust-stk/uniBar.dsp +++ /dev/null @@ -1,100 +0,0 @@ -declare name "UniBar"; -declare description "Nonlinear Banded Waveguide Models"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 1; - -nMode(1) = 4; - -modes(1,0) = 1; -basegains(1,0) = pow(0.9,1); -excitation(1,0) = 1*gain/nMode(1); - -modes(1,1) = 2.756; -basegains(1,1) = pow(0.9,2); -excitation(1,1) = 1*gain/nMode(1); - -modes(1,2) = 5.404; -basegains(1,2) = pow(0.9,3); -excitation(1,2) = 1*gain/nMode(1); - -modes(1,3) = 8.933; -basegains(1,3) = pow(0.9,4); -excitation(1,3) = 1*gain/nMode(1); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,0.9,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - *(14) : stereo : instrReverb; diff --git a/dist/examples/physicalModeling/faust-stk/voiceForm.dsp b/dist/examples/physicalModeling/faust-stk/voiceForm.dsp deleted file mode 100644 index 7e297df6..00000000 --- a/dist/examples/physicalModeling/faust-stk/voiceForm.dsp +++ /dev/null @@ -1,125 +0,0 @@ -declare name "voiceForm"; -declare description "Voice Formant Instrument"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument contains an excitation singing wavetable (looping wave with random and periodic vibrato, smoothing on frequency, etc.), excitation noise, and four sweepable complex resonances. Phoneme preset numbers: 0->eee (beet), 1->ihh (bit), 2->ehh (bet), 3->aaa (bat), 4->ahh (father), 5->aww (bought), 6->ohh (bone), 7->uhh (but), 8->uuu (foot), 9->ooo (boot), 10->rrr (bird), 11->lll (lull), 12->mmm (mom), 13->nnn (nun), 14->nng (sang), 15->ngg (bong), 16->fff, 17->sss, 18->thh, 19->shh, 20->xxx, 21->hee (beet), 22->hoo (boot), 23->hah (father), 24->bbb, 25->ddd, 26->jjj, 27->ggg, 28->vvv, 29->zzz, 30->thz, 31->zhh"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -phoneme = hslider("v:Physical_Parameters/Phoneme -[2][tooltip:0->eee, 1->ihh, 2->ehh, 3->aaa, 4->ahh, 5->aww, 6->ohh, 7->uhh, 8->uuu, 9->ooo, 10->rrr, 11->lll, 12->mmm, 13->nnn, 14->nng, 15->ngg, 16->fff, 17->sss, 18->thh, 19->shh, 20->xxx, 21->hee, 22->hoo, 23->hah, 24->bbb, 25->ddd, 26->jjj, 27->ggg, 28->vvv, 29->zzz, 30->thz, 31->zhh]",4,0,31,1); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[3][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[3][tooltip:A value between 0 and 1]",0.05,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[3][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[3][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[3][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -voicedEnvelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Voiced_Attack -[4][unit:s][tooltip:Voiced sounds attack duration]",0.01,0,2,0.01); -voicedEnvelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Voiced_Release -[4][unit:s][tooltip:Voiced sounds release duration]",0.01,0,2,0.01); - -noiseEnvelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Noised_Attack -[4][unit:s][tooltip:Noised sounds attack duration]",0.001,0,2,0.001); -noiseEnvelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Noised_Release -[4][unit:s][tooltip:Noised sounds release duration]",0.001,0,2,0.001); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//exitation filters (declared in instruments.lib) -onePoleFilter = onePole(b0,a1) - with{ - pole = 0.97 - (gain*0.2); - b0 = 1 - pole; - a1 = -pole; - }; -oneZeroFilter = oneZero1(b0,b1) - with{ - zero = -0.9; - b0 = 1/(1 - zero); - b1 = -zero*b0; - }; - -//implements a formant (resonance) which can be "swept" over time from one frequency setting to another -formSwep(frequency,radius,filterGain) = *(gain_) : bandPass(frequency_,radius) - with{ - //filter's radius, gain and frequency are interpolated - radius_ = radius : si.smoo; - frequency_ = frequency : si.smoo; - gain_ = filterGain : si.smoo; - }; - -//formants parameters are countained in a C++ file -phonemeGains = ffunction(float loadPhonemeGains(int,int), ,""); -phonemeParameters = ffunction(float loadPhonemeParameters(int,int,int), ,""); - -//formants frequencies -ffreq0 = phonemeParameters(phoneme,0,0); -ffreq1 = phonemeParameters(phoneme,1,0); -ffreq2 = phonemeParameters(phoneme,2,0); -ffreq3 = phonemeParameters(phoneme,3,0); - -//formants radius -frad0 = phonemeParameters(phoneme,0,1); -frad1 = phonemeParameters(phoneme,1,1); -frad2 = phonemeParameters(phoneme,2,1); -frad3 = phonemeParameters(phoneme,3,1); - -//formants gains -fgain0 = phonemeParameters(phoneme,0,2) : pow(10,(_/20)); -fgain1 = phonemeParameters(phoneme,1,2) : pow(10,(_/20)); -fgain2 = phonemeParameters(phoneme,2,2) : pow(10,(_/20)); -fgain3 = phonemeParameters(phoneme,3,2) : pow(10,(_/20)); - -//gain of the voiced part od the sound -voiceGain = phonemeGains(phoneme,0) : si.smoo; - -//gain of the fricative part of the sound -noiseGain = phonemeGains(phoneme,1) : si.smoo; - -//formants filters -filter0 = formSwep(ffreq0,frad0,fgain0); -filter1 = formSwep(ffreq1,frad1,fgain1); -filter2 = formSwep(ffreq2,frad2,fgain2); -filter3 = formSwep(ffreq3,frad3,fgain3); - -//----------------------- Algorithm implementation ---------------------------- - -//envelopes (declared in instruments.lib) and vibrato -vibratoEnvelope = envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate); -voicedEnvelope = en.asr(voicedEnvelopeAttack,1,voicedEnvelopeRelease,gate); -noiseEnvelope = en.asr(noiseEnvelopeAttack,1,noiseEnvelopeRelease,gate); -vibrato = os.osc(vibratoFreq)*vibratoGain*100*vibratoEnvelope; - -//the voice source is generated by an impulse train -//(imptrain defined in oscillator.lib) that is lowpass filtered -voiced = os.imptrain(freq+vibrato) : fi.lowpass3e(3300) : *(voiceGain*voicedEnvelope); - -//ficative sounds are produced by a noise generator -frica = no.noise*noiseEnvelope*noiseGain; - -process = voiced : oneZeroFilter : onePoleFilter : - +(frica) <: filter0,filter1,filter2,filter3 :> + : stereo : - instrReverb; - - diff --git a/dist/examples/physicalModeling/fds/1dDampedWaveEquation.dsp b/dist/examples/physicalModeling/fds/1dDampedWaveEquation.dsp deleted file mode 100644 index 70160493..00000000 --- a/dist/examples/physicalModeling/fds/1dDampedWaveEquation.dsp +++ /dev/null @@ -1,43 +0,0 @@ -import("stdfaust.lib"); - -declare name "1dDampedWaveEquation"; -declare description "1D wave equation with added frequency independent damping."; -declare author "Riccardo Russo"; - -//--------------------------------Model Settings-----------------------------// -nPoints = 100; - -k = 1/ma.SR; -c = 344; -h = c*k; -sigma0 = 5; -lambda = c*k/h; - -//----------------------------------Equations--------------------------------// -A = 2*(1-lambda^2)/C1; -B = lambda^2/C1; -C = C2/C1; - -C1 = (sigma0*k) + 1; -C2 = (sigma0*k) - 1; - -midCoeff = B,A,B; -midCoeffDel = 0,C,0; - -r = 1; -t = 1; - -scheme(points) = par(i,points,midCoeff,midCoeffDel); - -//----------------------------------Controls---------------------------------// -play = button("Play"); -inPoint = hslider("Input Point",floor(nPoints/2),0,nPoints-1,0.01); -outPoint = hslider("Output Point",floor(nPoints/2),0,nPoints-1,0.01):si.smoo; - -//----------------------------------Force---------------------------------// -forceModel = play:ba.impulsify; - -//----------------------------------Process---------------------------------// -process = forceModel<:fd.linInterp1D(nPoints,inPoint): - fd.model1D(nPoints,r,t,scheme(nPoints)): - fd.linInterp1DOut(nPoints,outPoint)<:_,_; diff --git a/dist/examples/physicalModeling/fds/2dKirchhoffThinPlate.dsp b/dist/examples/physicalModeling/fds/2dKirchhoffThinPlate.dsp deleted file mode 100644 index 240a6856..00000000 --- a/dist/examples/physicalModeling/fds/2dKirchhoffThinPlate.dsp +++ /dev/null @@ -1,75 +0,0 @@ -import("stdfaust.lib"); - -/* -WARNING: -- At the moment, 2D models with more than 30x20 points might crash the c++ - compiler. - -- 2D models need to be compiled with the command line compiler, the online - compiler might not work. -*/ - -declare name "2dKirchhoffThinPlate"; -declare description "Linear plate model with impulse excitation based on Kirchhoff-Love plates theory with added damping."; -declare author "Riccardo Russo"; - -//--------------------------------Model Settings-----------------------------// -nPointsX = 20; -nPointsY = 10; - -k = 1/ma.SR; -K = 20; //Plate stiffness parameter -s0 = 2; //Frequency independent damping -s1 = 0.05; //Frequency dependent damping -c=344; //Speed of sound in the plate - -coeff = c^2*k^2+4*s1*k; -h = sqrt((coeff+sqrt(coeff*coeff+16*K*K*k*k))); - -lambda = c*k/h; - -//----------------------------------Equations--------------------------------// -mu = K*K*k*k/(h^4); -den = 1+s0*k; -A = 2*(1-10*mu-2*lambda*lambda-4*s1*k*k)/den; -B = (s0*k+4*k*k-1)/den; -C = (8*mu + lambda*lambda + 2*s1*k*k)/den; -D = -2*mu/den; -E = -mu/den; -F = -2*s1*k*k/den; - -midCoeff = 0,0,E,0,0, - 0,D,C,D,0, - E,C,A,C,E, - 0,D,C,D,0, - 0,0,E,0,0; - -midCoeffDelay1 = 0,0,0,0,0, - 0,0,F,0,0, - 0,F,B,F,0, - 0,0,F,0,0, - 0,0,0,0,0; - -r = 2; -t = 1; - -coefficients = midCoeff,midCoeffDelay1; - -scheme(pointsX,pointsY) = par(i, pointsX, - par(j,pointsY, coefficients)); - -//----------------------------------Controls---------------------------------// -inPointX=hslider("Input Point X",floor(nPointsX/2),0,nPointsX-1,0.01); -inPointY=hslider("Input Point Y",floor(nPointsY/2),0,nPointsY-1,0.01); -outPointX=hslider("Output Point X",floor(nPointsX/2),0,nPointsX-1,0.01); -outPointY=hslider("Output Point Y",floor(nPointsY/2),0,nPointsY-1,0.01); -hit = button("Play"); - -//----------------------------------Force---------------------------------// -forceModel = hit:ba.impulsify; - -//----------------------------------Process---------------------------------// -process = - forceModel<:fd.linInterp2D(nPointsX,nPointsY,inPointX,inPointY): - fd.model2D(nPointsX,nPointsY,r,t,scheme(nPointsX,nPointsY)): - fd.linInterp2DOut(nPointsX,nPointsY,outPointX,outPointY); diff --git a/dist/examples/physicalModeling/fds/BowedString.dsp b/dist/examples/physicalModeling/fds/BowedString.dsp deleted file mode 100644 index 2482b716..00000000 --- a/dist/examples/physicalModeling/fds/BowedString.dsp +++ /dev/null @@ -1,61 +0,0 @@ -import("stdfaust.lib"); - -declare name "BowedString"; -declare description "Linear string model coupled with a bowing model for excitation."; -declare author "Riccardo Russo"; - -//----------------------------------String Settings---------------------------// -// Generic string - -//nPoints=int(Length/h); -nPoints1 = 100; - -k = 1/ma.SR; -//Stability condition -coeff = c^2*k^2 + 4*sigma1*k; -h =sqrt((coeff + sqrt((coeff)^2 + 16*k^2*K^2))/2); - -T = 150; // Tension [N] -radius = 3.5560e-04; // Radius (0.016 gauge) [m] -rho = 8.05*10^3; // Density [kg/m^3]; -Area = ma.PI*radius^2; // Area of string section -I = (ma.PI*radius^4)/ 4; // Moment of Inertia -Emod = 174e4; // Young modulus [Pa] -K = sqrt(Emod*I/rho/Area);// Stiffness parameter -c = sqrt(T/rho/Area); // Wave speed -sigma1 = 0.01; // Frequency dependent damping -sigma0 = 0.0005; - -//----------------------------------Equations--------------------------------// -den = 1+sigma0*k; -A = (2*h^4-2*c^2*k^2*h^2-4*sigma1*k*h^2-6*K^2*k^2)/den/h^4; -B = (sigma0*k*h^2-h^2+4*sigma1*k)/den/h^2; -C = (c^2*k^2*h^2+2*sigma1*k*h^2+4*K^2*k^2)/den/h^4; -D = -2*sigma1*k/den/h^2; -E = -K^2*k^2/den/h^4; - -midCoeff = E,C,A,C,E; -midCoeffDel = 0,D,B,D,0; - -r = 2; -t = 1; - -scheme(points) = par(i,points,midCoeff,midCoeffDel); - -//----------------------------------Controls---------------------------------// -play = button("hit"); -inPoint = hslider("input point",floor(nPoints1/2),0,nPoints1-1,1); -outPoint = hslider("output point",floor(nPoints1/2),0,nPoints1-1,0.01):si.smoo; - -//----------------------------------Force---------------------------------// -Vb = hslider("bow vel", 0,-10,10,0.01); //bow velocity [m/s] -Fb = 1000000; //[m/s^2] -J = Fb*k^2/den/h; -alpha = 0.0001; - -//----------------------------------Process---------------------------------// -//TODO: lin interp in input causes 0 output at .5 due to opposite phase -process = - (fd.stairsInterp1D(nPoints1,inPoint):>fd.bow(J,alpha,k,Vb)<:fd.linInterp1D(nPoints1,inPoint): - fd.model1D(nPoints1,r,t,scheme(nPoints1)))~si.bus(nPoints1):fd.linInterp1DOut(nPoints1,outPoint) - <:_,_; diff --git a/dist/examples/physicalModeling/fds/ControllableNonPhysicalString.dsp b/dist/examples/physicalModeling/fds/ControllableNonPhysicalString.dsp deleted file mode 100644 index 5c6fd10d..00000000 --- a/dist/examples/physicalModeling/fds/ControllableNonPhysicalString.dsp +++ /dev/null @@ -1,72 +0,0 @@ -import("stdfaust.lib"); - -/*DISCLAMER: - This is a creative "non physical" finite difference scheme physical model - of a string, intended to show how changing the different physical - parameters has an impact on the sounding characteristics of the string. - - I have to say that to make things physically correct, the number of - string points should change according to the variations of each - parameter. However, this cannot be done at run time, so physically - correct models can become a bit boring. You can use this model to - get an idea on how the parameters work, and then try with values even - outside these sliders range, to explore new sounds. - - Beware that, being non physical, some parameters configurations could - blow up the model. In case that happens, simply re-run the program - to reset the dsp. - Have fun! -*/ - -declare name "ControllableNonPhysicalString"; -declare description "Linear string model with controllable (non physical) parameters."; -declare author "Riccardo Russo"; - -//----------------------------------String Settings---------------------------// -//nPoints=int(Length/h); -nPoints = 100; - -k = 1/ma.SR; -//Stability condition -coeff = c^2*k^2 + 4*sigma1*k; -h = sqrt((coeff + sqrt((coeff)^2 + 16*k^2*K^2))/2); - -T = hslider("[4]String Tension (N)", 150,20,1000,0.1); // Tension [N] -radius = hslider("[5]String Radius (m)", 3.6e-04,2e-5,1e-3,0.00001); // Radius (0.016 gauge) [m] -rho = hslider("[6]String Material Density (kg/m^3)", 8.05*10^3,1e1,1e6,1); // Density [kg/m^3]; -Emod = hslider("[7]String Young Modulus (Pa)",174e4,1e-3,1e8,1); // Young modulus [Pa] -Area = ma.PI*radius^2; // Area of string section -I = (ma.PI*radius^4)/ 4; // Moment of Inertia -K = sqrt(Emod*I/rho/Area); // Stiffness parameter -c = sqrt(T/rho/Area); // Wave speed -sigma1 = hslider("[9]Frequency Dependent Damping", 0.01,1e-5,1,0.0001); // Frequency dependent damping -sigma0 = hslider("[8]Damping", 0.0005,1e-6,100,0.0001); // Frequency independent damping - -//----------------------------------Equations--------------------------------// -den = 1+sigma0*k; -A = (2*h^4-2*c^2*k^2*h^2-4*sigma1*k*h^2-6*K^2*k^2)/den/h^4; -B = (sigma0*k*h^2-h^2+4*sigma1*k)/den/h^2; -C = (c^2*k^2*h^2+2*sigma1*k*h^2+4*K^2*k^2)/den/h^4; -D = -2*sigma1*k/den/h^2; -E = -K^2*k^2/den/h^4; - -midCoeff = E,C,A,C,E; -midCoeffDel = 0,D,B,D,0; - -r = 2; -t = 1; - -scheme(points) = par(i,points,midCoeff,midCoeffDel); - -//----------------------------------Controls---------------------------------// -play = button("[3]Play"); -inPoint = hslider("[1]Input Point",floor(nPoints/2),0,nPoints-1,0.01); -outPoint = hslider("[2]Output Point",floor(nPoints/2),0,nPoints-1,0.01):si.smoo; - -//----------------------------------Force---------------------------------// -forceModel = play:ba.impulsify; - -//----------------------------------Process---------------------------------// -process = forceModel<:fd.linInterp1D(nPoints,inPoint): - fd.model1D(nPoints,r,t,scheme(nPoints)): - fd.linInterp1DOut(nPoints,outPoint)<:_,_; \ No newline at end of file diff --git a/dist/examples/physicalModeling/fds/HammeredString.dsp b/dist/examples/physicalModeling/fds/HammeredString.dsp deleted file mode 100644 index 5e4a5229..00000000 --- a/dist/examples/physicalModeling/fds/HammeredString.dsp +++ /dev/null @@ -1,74 +0,0 @@ -import("stdfaust.lib"); - -declare name "HammeredString"; -declare description "Linear string model coupled with a hammer model for excitation."; -declare author "Riccardo Russo"; - -//----------------------------------String Settings---------------------------// -//nPoints=int(Length/h); -nPoints = 100; - -k = 1/ma.SR; -//Stability condition -coeff = c^2*k^2 + 4*sigma1*k; -h = sqrt((coeff + sqrt((coeff)^2 + 16*k^2*K^2))/2); - -T = 150; // Tension [N] -radius = 3.5560e-04; // Radius (0.016 gauge) [m] -rho = 8.05*10^3; // Density [kg/m^3]; -Area = ma.PI*radius^2; // Area of string section -I = (ma.PI*radius^4)/ 4; // Moment of Inertia -Emod = 174e4; // Young modulus [Pa] -K = sqrt(Emod*I/rho/Area); // Stiffness parameter -c = sqrt(T/rho/Area); // Wave speed -sigma1 = 0.01; // Frequency dependent damping -sigma0 = 0.0005; // Frequency independent damping - -//----------------------------------Equations--------------------------------// -den = 1+sigma0*k; -A = (2*h^4-2*c^2*k^2*h^2-4*sigma1*k*h^2-6*K^2*k^2)/den/h^4; -B = (sigma0*k*h^2-h^2+4*sigma1*k)/den/h^2; -C = (c^2*k^2*h^2+2*sigma1*k*h^2+4*K^2*k^2)/den/h^4; -D = -2*sigma1*k/den/h^2; -E = -K^2*k^2/den/h^4; - -midCoeff = E,C,A,C,E; -midCoeffDel = 0,D,B,D,0; - -r = 2; -t = 1; - -scheme(points) = par(i,points,midCoeff,midCoeffDel); - -//----------------------------------Controls---------------------------------// -play = button("Play"):ba.impulsify; -inPoint = hslider("Input Point", floor(nPoints/2),0,nPoints-1,0.01); -outPoint = hslider("Output Point",floor(nPoints/2),0,nPoints-1,0.01):si.smoo; - -//----------------------------------Force---------------------------------// -/*Hammer stiffness from: -A. Sutlov, -Experimental and theoretical studies of piano hammer, -Proceedings of SMAC 03, -pages 175-178*/ - -KHammer = 30000; - -JCoeff = (k^2/den/rho/Area); - -KH = 1000; -mH = 0.9; -omega0SqrH = KH/mH; -sigma0H = 14; -alpha = 2.5; -offset = 0.23; -forceScaling = 0.01; - -//----------------------------------Process---------------------------------// -gain = 600; - -process = (fd.linInterp1D(nPoints,inPoint):> - fd.hammer(JCoeff,omega0SqrH,sigma0H,KHammer,alpha,k,offset,play*forceScaling)<: - fd.linInterp1D(nPoints,inPoint): - fd.model1D(nPoints,r,t,scheme(nPoints)))~si.bus(nPoints): - fd.linInterp1DOut(nPoints,outPoint)*gain<:_,_; diff --git a/dist/examples/physicalModeling/fds/PianoHammeredString.dsp b/dist/examples/physicalModeling/fds/PianoHammeredString.dsp deleted file mode 100644 index 203b27da..00000000 --- a/dist/examples/physicalModeling/fds/PianoHammeredString.dsp +++ /dev/null @@ -1,85 +0,0 @@ -import("stdfaust.lib"); - -//----------------------------------String Settings---------------------------// -/* Data: - Music wire ASTM A 228 -https://materials.gelsonluz.com/2020/09/astm-a228-properties-chem-mech-rankings.html - -A. Stulov, -Physical modelling of the piano string scale, -Applied Acoustics, -Volume 69, Issue 11, -2008, -Pages 977-984, -ISSN 0003-682X,*/ - -L = 0.77; //[m] -//nPoints=int(Length/h); -nPoints = 77; - -k = 1/ma.SR; -//Stability condition -coeff = c^2*k^2 + 4*sigma1*k; -h = sqrt((coeff + sqrt((coeff)^2 + 16*k^2*K^2))/2); - -T = 667.1; // Tension [N] -radius = 0.5e-03; // Radius (0.016 gauge) [m] -rho = 7.9*10^3; // Density [kg/m^3]; -Area = ma.PI*radius^2; // Area of string section -I = (ma.PI*radius^4)/ 4; // Moment of Inertia -Emod = 200e9; // Young modulus [Pa] -K = sqrt(Emod*I/rho/Area); // Stiffness parameter -c = sqrt(T/rho/Area); // Wave speed -sigma1 = 0.01; // Frequency dependent damping -sigma0 = 0.05; // Frequency independent damping - -mass = Area*L*rho; - -//----------------------------------Equations--------------------------------// -den = 1+sigma0*k; -A = (2*h^4-2*c^2*k^2*h^2-4*sigma1*k*h^2+6*K^2*k^2)/den/h^4; -B = (sigma0*k*h^2-h^2+4*sigma1*k)/den/h^2; -C = (c^2*k^2*h^2+2*sigma1*k*h^2-4*K^2*k^2)/den/h^4; -D = -2*sigma1*k/den/h^2; -E = K^2*k^2/den/h^4; - -midCoeff = E,C,A,C,E; -midCoeffDel = 0,D,B,D,0; - -r = 2; -t = 1; - -scheme(points) = par(i,points,midCoeff,midCoeffDel); - -//----------------------------------Controls---------------------------------// -play = button("Play"):ba.impulsify; -inPoint = hslider("Input Point", floor(nPoints/2),0,nPoints-1,0.01); -outPoint = hslider("Output Point",floor(nPoints/2),0,nPoints-1,0.01):si.smoo; - -//----------------------------------Force---------------------------------// -/*Hammer stiffness from: -A. Sutlov, -Experimental and theoretical studies of piano hammer, -Proceedings of SMAC 03, -pages 175-178*/ - -KHammer = 30000; - -JCoeff = (k^2/den/rho/Area); - -KH = 1000; -mH = 0.9; -omega0SqrH = KH/mH; -sigma0H = 14; -alpha = 2.5; -offset = 0.23; -forceScaling = 0.01; - -//----------------------------------Process---------------------------------// -gain = 600; - -process = (fd.linInterp1D(nPoints,inPoint):> - fd.hammer(JCoeff,omega0SqrH,sigma0H,KHammer,alpha,k,offset,play*forceScaling)<: - fd.linInterp1D(nPoints,inPoint): - fd.model1D(nPoints,r,t,scheme(nPoints)))~si.bus(nPoints): - fd.linInterp1DOut(nPoints,outPoint)*gain<:_,_; diff --git a/dist/examples/physicalModeling/fds/StiffString.dsp b/dist/examples/physicalModeling/fds/StiffString.dsp deleted file mode 100644 index 569db926..00000000 --- a/dist/examples/physicalModeling/fds/StiffString.dsp +++ /dev/null @@ -1,54 +0,0 @@ -import("stdfaust.lib"); - -declare name "StiffString"; -declare description "Linear string model with impulse excitation."; -declare author "Riccardo Russo"; - -//----------------------------------String Settings---------------------------// -//nPoints=int(Length/h); -nPoints = 100; - -k = 1/ma.SR; -//Stability condition -coeff = c^2*k^2 + 4*sigma1*k; -h = sqrt((coeff + sqrt((coeff)^2 + 16*k^2*K^2))/2); - -T = 150; // Tension [N] -radius = 3.5560e-04; // Radius (0.016 gauge) [m] -rho = 8.05*10^3; // Density [kg/m^3]; -Area = ma.PI*radius^2; // Area of string section -I = (ma.PI*radius^4)/ 4; // Moment of Inertia -Emod = 174e4; // Young modulus [Pa] -K = sqrt(Emod*I/rho/Area); // Stiffness parameter -c = sqrt(T/rho/Area); // Wave speed -sigma1 = 0.01; // Frequency dependent damping -sigma0 = 0.0005; // Frequency independent damping - -//----------------------------------Equations--------------------------------// -den = 1+sigma0*k; -A = (2*h^4-2*c^2*k^2*h^2-4*sigma1*k*h^2-6*K^2*k^2)/den/h^4; -B = (sigma0*k*h^2-h^2+4*sigma1*k)/den/h^2; -C = (c^2*k^2*h^2+2*sigma1*k*h^2+4*K^2*k^2)/den/h^4; -D = -2*sigma1*k/den/h^2; -E = -K^2*k^2/den/h^4; - -midCoeff = E,C,A,C,E; -midCoeffDel = 0,D,B,D,0; - -r = 2; -t = 1; - -scheme(points) = par(i,points,midCoeff,midCoeffDel); - -//----------------------------------Controls---------------------------------// -play = button("Play"); -inPoint = hslider("Input Point",floor(nPoints/2),0,nPoints-1,0.01); -outPoint = hslider("Output Point",floor(nPoints/2),0,nPoints-1,0.01):si.smoo; - -//----------------------------------Force---------------------------------// -forceModel = play:ba.impulsify; - -//----------------------------------Process---------------------------------// -process = forceModel<:fd.linInterp1D(nPoints,inPoint): - fd.model1D(nPoints,r,t,scheme(nPoints)): - fd.linInterp1DOut(nPoints,outPoint)<:_,_; diff --git a/dist/examples/physicalModeling/flute.dsp b/dist/examples/physicalModeling/flute.dsp deleted file mode 100644 index 9fa8bcd4..00000000 --- a/dist/examples/physicalModeling/flute.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Flute"; -declare description "Simple flute physical model with physical parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.flute_ui <: _,_; diff --git a/dist/examples/physicalModeling/fluteMIDI.dsp b/dist/examples/physicalModeling/fluteMIDI.dsp deleted file mode 100644 index 18fa0669..00000000 --- a/dist/examples/physicalModeling/fluteMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "FluteMIDI"; -declare description "Simple MIDI-controllable flute physical model with physical parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.flute_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/frenchBell.dsp b/dist/examples/physicalModeling/frenchBell.dsp deleted file mode 100644 index 52bb8df2..00000000 --- a/dist/examples/physicalModeling/frenchBell.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "FrenchChurchBell"; -declare description "French church bell physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.frenchBell_ui <: _,_; diff --git a/dist/examples/physicalModeling/germanBell.dsp b/dist/examples/physicalModeling/germanBell.dsp deleted file mode 100644 index b6376532..00000000 --- a/dist/examples/physicalModeling/germanBell.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "GermanChurchBell"; -declare description "German church bell physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.germanBell_ui <: _,_; diff --git a/dist/examples/physicalModeling/guitarMIDI.dsp b/dist/examples/physicalModeling/guitarMIDI.dsp deleted file mode 100644 index d374d6b9..00000000 --- a/dist/examples/physicalModeling/guitarMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "GuitarMidi"; -declare description "Simple acoustic guitar model with steel strings."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.guitar_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/karplus.dsp b/dist/examples/physicalModeling/karplus.dsp deleted file mode 100644 index 2c5421c8..00000000 --- a/dist/examples/physicalModeling/karplus.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "KarplusStrong"; -declare description "Simple call of the Karplus-Strong model for the Faust physical modeling library"; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.ks_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/marimbaMIDI.dsp b/dist/examples/physicalModeling/marimbaMIDI.dsp deleted file mode 100644 index 1ebabd07..00000000 --- a/dist/examples/physicalModeling/marimbaMIDI.dsp +++ /dev/null @@ -1,10 +0,0 @@ -// WARNING: this model is incomplete and is only here for testing purposes - -declare name "MarimbaMIDI"; -declare description "Simple MIDI-controllable marimba physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.marimba_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/modularInterpInstrMIDI.dsp b/dist/examples/physicalModeling/modularInterpInstrMIDI.dsp deleted file mode 100644 index ecc3f38a..00000000 --- a/dist/examples/physicalModeling/modularInterpInstrMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "ModularInterpInstrMidi"; -declare description "String instrument with a modular body"; -declare license "MIT"; -declare copyright "(c)Romain Michon & John Granzow, CCRMA (Stanford University), GRAME, University of Michigan"; - -import("stdfaust.lib"); - -process = pm.modularInterpInstr_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/nylonGuitarMIDI.dsp b/dist/examples/physicalModeling/nylonGuitarMIDI.dsp deleted file mode 100644 index d1e43173..00000000 --- a/dist/examples/physicalModeling/nylonGuitarMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "NylonGuitarMidi"; -declare description "Simple acoustic guitar model with nylon strings."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.nylonGuitar_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/russianBell.dsp b/dist/examples/physicalModeling/russianBell.dsp deleted file mode 100644 index db3e3a91..00000000 --- a/dist/examples/physicalModeling/russianBell.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "RussianChurchBell"; -declare description "Russian church bell physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.russianBell_ui <: _,_; diff --git a/dist/examples/physicalModeling/standardBell.dsp b/dist/examples/physicalModeling/standardBell.dsp deleted file mode 100644 index f8adaf77..00000000 --- a/dist/examples/physicalModeling/standardBell.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "StandardChurchBell"; -declare description "Standard church bell physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.standardBell_ui <: _,_; diff --git a/dist/examples/physicalModeling/violin.dsp b/dist/examples/physicalModeling/violin.dsp deleted file mode 100644 index 2a62fcb1..00000000 --- a/dist/examples/physicalModeling/violin.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Violin"; -declare description "Simple violin physical model controlled with continuous parameters."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.violin_ui <: _,_; diff --git a/dist/examples/physicalModeling/violinMIDI.dsp b/dist/examples/physicalModeling/violinMIDI.dsp deleted file mode 100644 index f432ab86..00000000 --- a/dist/examples/physicalModeling/violinMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "ViolinMidi"; -declare description "Simple MIDI-controllable violin physical model."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.violin_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/vocalBP.dsp b/dist/examples/physicalModeling/vocalBP.dsp deleted file mode 100644 index d2db5f28..00000000 --- a/dist/examples/physicalModeling/vocalBP.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Vocal BandPass"; -declare description "Simple source-filter vocal synthesizer."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.SFFormantModelBP_ui <: _,_; diff --git a/dist/examples/physicalModeling/vocalBPMIDI.dsp b/dist/examples/physicalModeling/vocalBPMIDI.dsp deleted file mode 100644 index 11eb0a83..00000000 --- a/dist/examples/physicalModeling/vocalBPMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Vocal BandPass MIDI"; -declare description "Simple MIDI-controllable source-filter vocal synthesizer."; -declare license "MIT"; -declare copyright "(c)Romain Michon, CCRMA (Stanford University), GRAME"; - -import("stdfaust.lib"); - -process = pm.SFFormantModelBP_ui_MIDI <: _,_; diff --git a/dist/examples/physicalModeling/vocalFOF.dsp b/dist/examples/physicalModeling/vocalFOF.dsp deleted file mode 100644 index c832a0c9..00000000 --- a/dist/examples/physicalModeling/vocalFOF.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Vocal FOF"; -declare description "FOF vocal synthesizer."; -declare license "MIT"; -declare copyright "(c)Mike Olsen, CCRMA (Stanford University)"; - -import("stdfaust.lib"); - -process = pm.SFFormantModelFofSmooth_ui <: _,_; diff --git a/dist/examples/physicalModeling/vocalFOFMIDI.dsp b/dist/examples/physicalModeling/vocalFOFMIDI.dsp deleted file mode 100644 index 799f80b5..00000000 --- a/dist/examples/physicalModeling/vocalFOFMIDI.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "Vocal FOF MIDI"; -declare description "MIDI-controllable FOF vocal synthesizer."; -declare license "MIT"; -declare copyright "(c)Mike Olsen, CCRMA (Stanford University)"; - -import("stdfaust.lib"); - -process = pm.SFFormantModelFofSmooth_ui_MIDI <: _,_; diff --git a/dist/examples/pitchShifting/pitchShifter.dsp b/dist/examples/pitchShifting/pitchShifter.dsp deleted file mode 100644 index c84a3e22..00000000 --- a/dist/examples/pitchShifting/pitchShifter.dsp +++ /dev/null @@ -1,20 +0,0 @@ -declare name "pitchShifter"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - - //-------------------------------------- - // very simple real time pitch shifter - //-------------------------------------- - -import("stdfaust.lib"); - -pitchshifter = vgroup("Pitch Shifter", ef.transpose( - hslider("window (samples)", 1000, 50, 10000, 1), - hslider("xfade (samples)", 10, 1, 10000, 1), - hslider("shift (semitones) ", 0, -12, +12, 0.1) - ) - ); - -process = pitchshifter; diff --git a/dist/examples/psychoacoustic/harmonicExciter.dsp b/dist/examples/psychoacoustic/harmonicExciter.dsp deleted file mode 100644 index 54303ee9..00000000 --- a/dist/examples/psychoacoustic/harmonicExciter.dsp +++ /dev/null @@ -1,10 +0,0 @@ -declare exciter_name "harmonicExciter"; -declare exciter_author "Priyanka Shekar (pshekar@ccrma.stanford.edu), revised by RM"; -declare exciter_copyright "Copyright (c) 2013 Priyanka Shekar"; -declare exciter_version "1.0"; -declare exciter_license "MIT License (MIT)"; -declare description "Psychoacoustic harmonic exciter, with GUI"; - -import("stdfaust.lib"); - -process = dm.exciter; diff --git a/dist/examples/reverb/dattorro.dsp b/dist/examples/reverb/dattorro.dsp deleted file mode 100644 index cddabe86..00000000 --- a/dist/examples/reverb/dattorro.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "dattorro"; -declare version "0.1"; -declare author "Jakob Zerbian"; -declare description "Dattorro demo application."; - -import("stdfaust.lib"); - -process = dm.dattorro_rev_demo; diff --git a/dist/examples/reverb/fdnRev.dsp b/dist/examples/reverb/fdnRev.dsp deleted file mode 100644 index 13d9a268..00000000 --- a/dist/examples/reverb/fdnRev.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "fdnRev"; -declare version "0.0"; -declare author "JOS, Revised by RM"; -declare description "A feedback delay network reverb."; - -import("stdfaust.lib"); - -process = dm.fdnrev0_demo(16,5,3); diff --git a/dist/examples/reverb/freeverb.dsp b/dist/examples/reverb/freeverb.dsp deleted file mode 100644 index 61494404..00000000 --- a/dist/examples/reverb/freeverb.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "freeverb"; -declare version "0.0"; -declare author "RM"; -declare description "Freeverb demo application."; - -import("stdfaust.lib"); - -process = dm.freeverb_demo; diff --git a/dist/examples/reverb/greyhole.dsp b/dist/examples/reverb/greyhole.dsp deleted file mode 100644 index d6e943a1..00000000 --- a/dist/examples/reverb/greyhole.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "greyhole"; -declare version "0.1"; -declare author "GRAME"; -declare description "Greyhole demo application."; - -import("stdfaust.lib"); - -process = dm.greyhole_demo; diff --git a/dist/examples/reverb/jprev.dsp b/dist/examples/reverb/jprev.dsp deleted file mode 100644 index 33425412..00000000 --- a/dist/examples/reverb/jprev.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "jprev"; -declare version "0.1"; -declare author "GRAME"; -declare description "Jprev demo application."; - -import("stdfaust.lib"); - -process = dm.jprev_demo; diff --git a/dist/examples/reverb/reverbDesigner.dsp b/dist/examples/reverb/reverbDesigner.dsp deleted file mode 100644 index 32369921..00000000 --- a/dist/examples/reverb/reverbDesigner.dsp +++ /dev/null @@ -1,9 +0,0 @@ -declare name "reverbDesigner"; - -import("stdfaust.lib"); - -N = 16; // Feedback Delay Network (FDN) order (power of 2, 2 to 16) -NB = 5; // Number of T60-controlled frequency-bands (3 or more) -BSO = 3; // Order of each lowpass/highpass bandsplit (odd positive integer) - -process = dm.fdnrev0_demo(N,NB,BSO); diff --git a/dist/examples/reverb/reverbTester.dsp b/dist/examples/reverb/reverbTester.dsp deleted file mode 100644 index 70a1adf0..00000000 --- a/dist/examples/reverb/reverbTester.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "reverbTester"; -declare version "0.0"; -declare author "RM"; -declare description "Handy test inputs for reverberator demos below."; - -import("stdfaust.lib"); - -process = dm.stereo_reverb_tester; diff --git a/dist/examples/reverb/zitaRev.dsp b/dist/examples/reverb/zitaRev.dsp deleted file mode 100644 index c9fb3b5f..00000000 --- a/dist/examples/reverb/zitaRev.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "zitaRev"; -declare version "0.0"; -declare author "JOS, Revised by RM"; -declare description "Example GUI for `zita_rev1_stereo` (mostly following the Linux `zita-rev1` GUI)."; - -import("stdfaust.lib"); - -process = dm.zita_rev1; diff --git a/dist/examples/reverb/zitaRevFDN.dsp b/dist/examples/reverb/zitaRevFDN.dsp deleted file mode 100644 index c51ddc9f..00000000 --- a/dist/examples/reverb/zitaRevFDN.dsp +++ /dev/null @@ -1,8 +0,0 @@ -declare name "zitaRevFDN"; -declare version "0.0"; -declare author "JOS, Revised by RM"; -declare description "Reverb demo application based on `zita_rev_fdn`."; - -import("stdfaust.lib"); - -process = dm.zita_rev_fdn_demo; diff --git a/dist/examples/smartKeyboard/acGuitar.dsp b/dist/examples/smartKeyboard/acGuitar.dsp deleted file mode 100644 index 81c84dab..00000000 --- a/dist/examples/smartKeyboard/acGuitar.dsp +++ /dev/null @@ -1,100 +0,0 @@ -//############################### acGuitar.dsp ################################# -// Faust instrument specifically designed for `faust2smartkeyb` where 6 virtual -// nylon strings can be strummed and plucked using a dedicated keyboard. The -// extra "strumming keyboard" could be easily replaced by an external strumming -// interface while the touch screen could keep being used to change the pitch -// of the strings. -// -// ## `SmartKeyboard` Use Strategy -// -// The first 6 keyboards implement each individual string of the instrument. A -// seventh keybaord is used a strumming/plucking interface. As mentionned -// previously, it could be easily replaced by an external interface. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. -// However it was specifically designed to be used with `faust2smartkeyb`. For -// best results, we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp acGuitar.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Aug. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//############################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'7', - 'Max Keyboard Polyphony':'0', - 'Rounding Mode':'2', - 'Keyboard 0 - Number of Keys':'14', - 'Keyboard 1 - Number of Keys':'14', - 'Keyboard 2 - Number of Keys':'14', - 'Keyboard 3 - Number of Keys':'14', - 'Keyboard 4 - Number of Keys':'14', - 'Keyboard 5 - Number of Keys':'14', - 'Keyboard 6 - Number of Keys':'6', - 'Keyboard 0 - Lowest Key':'52', - 'Keyboard 1 - Lowest Key':'57', - 'Keyboard 2 - Lowest Key':'62', - 'Keyboard 3 - Lowest Key':'67', - 'Keyboard 4 - Lowest Key':'71', - 'Keyboard 5 - Lowest Key':'76', - 'Keyboard 0 - Send Keyboard Freq':'1', - 'Keyboard 1 - Send Keyboard Freq':'1', - 'Keyboard 2 - Send Keyboard Freq':'1', - 'Keyboard 3 - Send Keyboard Freq':'1', - 'Keyboard 4 - Send Keyboard Freq':'1', - 'Keyboard 5 - Send Keyboard Freq':'1', - 'Keyboard 6 - Piano Keyboard':'0', - 'Keyboard 6 - Send Key Status':'1', - 'Keyboard 6 - Key 0 - Label':'S0', - 'Keyboard 6 - Key 1 - Label':'S1', - 'Keyboard 6 - Key 2 - Label':'S2', - 'Keyboard 6 - Key 3 - Label':'S3', - 'Keyboard 6 - Key 4 - Label':'S4', - 'Keyboard 6 - Key 5 - Label':'S5' -}"; - -import("stdfaust.lib"); - -// SMARTKEYBOARD PARAMS -kbfreq(0) = hslider("kb0freq",164.8,20,10000,0.01); -kbbend(0) = hslider("kb0bend",1,0,10,0.01); -kbfreq(1) = hslider("kb1freq",220,20,10000,0.01); -kbbend(1) = hslider("kb1bend",1,0,10,0.01); -kbfreq(2) = hslider("kb2freq",293.7,20,10000,0.01); -kbbend(2) = hslider("kb2bend",1,0,10,0.01); -kbfreq(3) = hslider("kb3freq",392,20,10000,0.01); -kbbend(3) = hslider("kb3bend",1,0,10,0.01); -kbfreq(4) = hslider("kb4freq",493.9,20,10000,0.01); -kbbend(4) = hslider("kb4bend",1,0,10,0.01); -kbfreq(5) = hslider("kb5freq",659.2,20,10000,0.01); -kbbend(5) = hslider("kb5bend",1,0,10,0.01); -kb6kstatus(0) = hslider("kb6k0status",0,0,1,1) <: ==(1) | ==(4) : int; -kb6kstatus(1) = hslider("kb6k1status",0,0,1,1) <: ==(1) | ==(4) : int; -kb6kstatus(2) = hslider("kb6k2status",0,0,1,1) <: ==(1) | ==(4) : int; -kb6kstatus(3) = hslider("kb6k3status",0,0,1,1) <: ==(1) | ==(4) : int; -kb6kstatus(4) = hslider("kb6k4status",0,0,1,1) <: ==(1) | ==(4) : int; -kb6kstatus(5) = hslider("kb6k5status",0,0,1,1) <: ==(1) | ==(4) : int; - -// MODEL PARAMETERS -// strings length -sl(i) = kbfreq(i)*kbbend(i) : pm.f2l : si.smoo; -// pluck position is controlled by the x axis of the accel -pluckPosition = - hslider("pluckPosition[acc: 1 0 -10 0 10]",0.5,0,1,0.01) : si.smoo; - -// ASSEMBLING MODELS -// number of strings -nStrings = 6; -guitar = par(i,nStrings, - kb6kstatus(i) : ba.impulsify : // using "raw" impulses to drive the models - pm.nylonGuitarModel(sl(i),pluckPosition)) :> _; - -process = guitar <: _,_; diff --git a/dist/examples/smartKeyboard/associatedEffects/elecGuitarEffect.dsp b/dist/examples/smartKeyboard/associatedEffects/elecGuitarEffect.dsp deleted file mode 100644 index e73f299f..00000000 --- a/dist/examples/smartKeyboard/associatedEffects/elecGuitarEffect.dsp +++ /dev/null @@ -1,8 +0,0 @@ -// a stereo distortion effect connected to a stereo reverb - -import("stdfaust.lib"); - -distDrive = 0.8; -distOffset = 0; - -process = par(i,2,ef.cubicnl(distDrive,distOffset)) : dm.zita_rev1; \ No newline at end of file diff --git a/dist/examples/smartKeyboard/associatedEffects/myEffect.dsp b/dist/examples/smartKeyboard/associatedEffects/myEffect.dsp deleted file mode 100644 index 1755f4b6..00000000 --- a/dist/examples/smartKeyboard/associatedEffects/myEffect.dsp +++ /dev/null @@ -1,5 +0,0 @@ -// Just calling zita_rev1 from demo.lib - -import("stdfaust.lib"); - -process = dm.zita_rev1; \ No newline at end of file diff --git a/dist/examples/smartKeyboard/associatedEffects/reverb.dsp b/dist/examples/smartKeyboard/associatedEffects/reverb.dsp deleted file mode 100644 index 1755f4b6..00000000 --- a/dist/examples/smartKeyboard/associatedEffects/reverb.dsp +++ /dev/null @@ -1,5 +0,0 @@ -// Just calling zita_rev1 from demo.lib - -import("stdfaust.lib"); - -process = dm.zita_rev1; \ No newline at end of file diff --git a/dist/examples/smartKeyboard/bells.dsp b/dist/examples/smartKeyboard/bells.dsp deleted file mode 100644 index c3cc877b..00000000 --- a/dist/examples/smartKeyboard/bells.dsp +++ /dev/null @@ -1,80 +0,0 @@ -//################################ bells.dsp ################################### -// Faust instrument specifically designed for `faust2smartkeyb` where the -// physical models of 4 different bells can be played using screen pads. The -// models are taken from `physmodels.lib`. -// -// ## `SmartKeyboard` Use Strategy -// -// The `SmartKeyboard` interface is used to implement percussion pads where -// the X/Y position of fingers is retrieved to control the strike position on -// the bells. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. -// However it was specifically designed to be used with `faust2smartkeyb`. For -// best results, we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp bells.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Aug. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//############################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Max Keyboard Polyphony':'0', - 'Keyboard 0 - Number of Keys':'2', - 'Keyboard 1 - Number of Keys':'2', - 'Keyboard 0 - Send Freq':'0', - 'Keyboard 1 - Send Freq':'0', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 0 - Send Key Status':'1', - 'Keyboard 1 - Send Key Status':'1', - 'Keyboard 0 - Send X':'1', - 'Keyboard 0 - Send Y':'1', - 'Keyboard 1 - Send X':'1', - 'Keyboard 1 - Send Y':'1', - 'Keyboard 0 - Key 0 - Label':'English Bell', - 'Keyboard 0 - Key 1 - Label':'French Bell', - 'Keyboard 1 - Key 0 - Label':'German Bell', - 'Keyboard 1 - Key 1 - Label':'Russian Bell' -}"; - -import("stdfaust.lib"); - -// SMARTKEYBOARD PARAMS -kb0k0status = hslider("kb0k0status",0,0,1,1) : min(1) : int; -kb0k1status = hslider("kb0k1status",0,0,1,1) : min(1) : int; -kb1k0status = hslider("kb1k0status",0,0,1,1) : min(1) : int; -kb1k1status = hslider("kb1k1status",0,0,1,1) : min(1) : int; -x = hslider("x",1,0,1,0.001); -y = hslider("y",1,0,1,0.001); - -// MODEL PARAMETERS -strikeCutoff = 6500; -strikeSharpness = 0.5; -strikeGain = 1; -// synthesize 10 modes out of 50 -nModes = 10; -// resonance duration is 30s -t60 = 30; -// number of excitation pos (retrieved from model) -nExPos = 7; -// computing excitation position from X and Y -exPos = min((x*2-1 : abs),(y*2-1 : abs))*(nExPos-1) : int; - -// ASSEMBLING MODELS -bells = - (kb0k0status : pm.strikeModel(10,strikeCutoff,strikeSharpness,strikeGain) : pm.englishBellModel(nModes,exPos,t60,1,3)) + - (kb0k1status : pm.strikeModel(10,strikeCutoff,strikeSharpness,strikeGain) : pm.frenchBellModel(nModes,exPos,t60,1,3)) + - (kb1k0status : pm.strikeModel(10,strikeCutoff,strikeSharpness,strikeGain) : pm.germanBellModel(nModes,exPos,t60,1,2.5)) + - (kb1k1status : pm.strikeModel(10,strikeCutoff,strikeSharpness,strikeGain) : pm.russianBellModel(nModes,exPos,t60,1,3)) :> *(0.2); - -process = bells <: _,_; diff --git a/dist/examples/smartKeyboard/bowed.dsp b/dist/examples/smartKeyboard/bowed.dsp deleted file mode 100644 index b567f41b..00000000 --- a/dist/examples/smartKeyboard/bowed.dsp +++ /dev/null @@ -1,87 +0,0 @@ -//##################################### bowed.dsp ######################################## -// Faust instrument specifically designed for `faust2smartkeyb` implementing a -// non-polyphonic synthesizer (e.g., physical model; etc.) using a combination of -// different types of UI elements. -// -// ## `SmartKeyboard` Use Strategy -// -// 5 keyboards are declared (4 actual keyboards and 1 control surface). We want to -// disable the voice allocation system and we want to activate a voice on start-up -// so that all strings are constantly running so we set `Max Keyboard Polyphony` to -// 0. Since we don't want the first 4 keyboards to send the X and Y position of -// fingers on the screen, we set `Send X` and `Send Y` to 0 for all these keyboards. -// Similarly, we don't want the fifth keyboard to send pitch information to the synth -// so we set `Send Freq` to 0 for that keyboard. Finally, we deactivate piano keyboard -// mode for the fifth keyboard to make sure that color doesn't change when the key is -// touch and that note names are not displayed. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp midiOnly.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'5', - 'Max Keyboard Polyphony':'0', - 'Rounding Mode':'1', - 'Keyboard 0 - Number of Keys':'19', - 'Keyboard 1 - Number of Keys':'19', - 'Keyboard 2 - Number of Keys':'19', - 'Keyboard 3 - Number of Keys':'19', - 'Keyboard 4 - Number of Keys':'1', - 'Keyboard 4 - Send Freq':'0', - 'Keyboard 0 - Send X':'0', - 'Keyboard 1 - Send X':'0', - 'Keyboard 2 - Send X':'0', - 'Keyboard 3 - Send X':'0', - 'Keyboard 0 - Send Y':'0', - 'Keyboard 1 - Send Y':'0', - 'Keyboard 2 - Send Y':'0', - 'Keyboard 3 - Send Y':'0', - 'Keyboard 0 - Lowest Key':'55', - 'Keyboard 1 - Lowest Key':'62', - 'Keyboard 2 - Lowest Key':'69', - 'Keyboard 3 - Lowest Key':'76', - 'Keyboard 4 - Piano Keyboard':'0', - 'Keyboard 4 - Key 0 - Label':'Bow' -}"; - -import("stdfaust.lib"); - -// parameters -f = hslider("freq",400,50,2000,0.01); -bend = hslider("bend",1,0,10,0.01); -keyboard = hslider("keyboard",0,0,5,1) : int; -key = hslider("key",0,0,18,1) : int; -x = hslider("x",0.5,0,1,0.01) : si.smoo; -y = hslider("y",0,0,1,0.01) : si.smoo; - -// mapping -freq = f*bend; -// dirty motion tracker -velocity = x-x' : abs : an.amp_follower_ar(0.1,1) : *(8000) : min(1); - -// 4 "strings" -synthSet = par(i,4,synth(localFreq(i),velocity)) :> _ -with{ - localFreq(i) = freq : ba.sAndH(keyboard == i) : si.smoo; - synth(freq,velocity) = sy.fm((freq,freq + freq*modFreqRatio),index*velocity)*velocity - with{ - index = 1000; - modFreqRatio = y*0.3; - }; -}; - -process = synthSet <: _,_; \ No newline at end of file diff --git a/dist/examples/smartKeyboard/brass.dsp b/dist/examples/smartKeyboard/brass.dsp deleted file mode 100644 index d4ed673c..00000000 --- a/dist/examples/smartKeyboard/brass.dsp +++ /dev/null @@ -1,82 +0,0 @@ -//############################### brass.dsp ################################### -// Faust instrument specifically designed for `faust2smartkeyb` where a -// trumpet physical model is controlled using some of the built-in sensors of -// the device and the touchscreen. Some of these elements could be replaced by -// external controllers (e.g., breath/mouth piece controller). -// -// ## `SmartKeyboard` Use Strategy -// -// 1 keyboard is used to implement the pistons of the trumpet (3 keys) and the -// other allows to control the lips tension. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. -// However it was specifically designed to be used with `faust2smartkeyb`. For -// best results, we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp brass.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Aug. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//############################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Max Keyboard Polyphony':'0', - 'Keyboard 0 - Number of Keys':'1', - 'Keyboard 1 - Number of Keys':'3', - 'Keyboard 0 - Send Freq':'0', - 'Keyboard 1 - Send Freq':'0', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 0 - Send Key X':'1', - 'Keyboard 1 - Send Key Status':'1', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Key 0 - Label':'Lips Tension', - 'Keyboard 1 - Key 0 - Label':'P1', - 'Keyboard 1 - Key 1 - Label':'P2', - 'Keyboard 1 - Key 2 - Label':'P3' -}"; - -import("stdfaust.lib"); - -// SMARTKEYBOARD PARAMS -kb0k0x = hslider("kb0k0x",0,0,1,1); -kb1k0status = hslider("kb1k0status",0,0,1,1) : min(1) : int; -kb1k1status = hslider("kb1k1status",0,0,1,1) : min(1) : int; -kb1k2status = hslider("kb1k2status",0,0,1,1) : min(1) : int; - -// MODEL PARAMETERS -// pressure is controlled by accelerometer -pressure = hslider("pressure[acc: 1 1 -10 0 10]",0,0,1,0.01) : si.smoo; -breathGain = 0.005; breathCutoff = 2000; -vibratoFreq = 5; vibratoGain = 0; -//pitch when no pistons are pushed -basePitch = 48; // C4 -// calculate pitch shift in function of piston combination -pitchShift = - ((kb1k0status == 0) & (kb1k1status == 1) & (kb1k2status == 0))*(1) + - ((kb1k0status == 1) & (kb1k1status == 0) & (kb1k2status == 0))*(2) + - ((kb1k0status == 1) & (kb1k1status == 1) & (kb1k2status == 0))*(3) + - ((kb1k0status == 0) & (kb1k1status == 1) & (kb1k2status == 1))*(4) + - ((kb1k0status == 1) & (kb1k1status == 0) & (kb1k2status == 1))*(5) + - ((kb1k0status == 1) & (kb1k1status == 1) & (kb1k2status == 1))*(6); -// tube length is calculated based on piston combination -tubeLength = basePitch-pitchShift : ba.midikey2hz : pm.f2l : si.smoo; -// lips tension is controlled using pad on screen -lipsTension = kb0k0x : si.smoo; -// default mute value -mute = 0.5; - -// ASSEMBLING MODEL -model = - pm.blower(pressure,breathGain,breathCutoff,vibratoFreq,vibratoGain) : - pm.brassModel(tubeLength,lipsTension,mute); - -process = model <: _,_; diff --git a/dist/examples/smartKeyboard/clarinet.dsp b/dist/examples/smartKeyboard/clarinet.dsp deleted file mode 100644 index 84122f5c..00000000 --- a/dist/examples/smartKeyboard/clarinet.dsp +++ /dev/null @@ -1,113 +0,0 @@ -//############################### clarinet.dsp ################################# -// Faust instrument specifically designed for `faust2smartkeyb` where a -// clarinet physical model is controlled by an interface implementing -// fingerings similar to that of a the real instrument. The pressure of the -// breath in the mouthpiece of the clarinet is controlled by blowing on the -// built-in microphone of the device. -// -// ## `SmartKeyboard` Use Strategy -// -// The device is meant to be held with 2 hands vertically in order to put all -// fingers on the screen at the same time. Key combinations determine the -// pitch of the instrument. A single voice is constantly ran. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. -// However it was specifically designed to be used with `faust2smartkeyb`. For -// best results, we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] clarinet.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Aug. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//############################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Max Keyboard Polyphony':'0', - 'Keyboard 0 - Number of Keys':'4', - 'Keyboard 1 - Number of Keys':'5', - 'Keyboard 0 - Send Freq':'0', - 'Keyboard 1 - Send Freq':'0', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 0 - Send Key Status':'1', - 'Keyboard 1 - Send Key Status':'1', - 'Keyboard 0 - Key 3 - Label':'O+', - 'Keyboard 1 - Key 4 - Label':'O-' -}"; - -import("stdfaust.lib"); - -// SMARTKEYBOARD PARAMS -kb0k0status = hslider("kb0k0status",0,0,1,1) : min(1) : int; -kb0k1status = hslider("kb0k1status",0,0,1,1) : min(1) : int; -kb0k2status = hslider("kb0k2status",0,0,1,1) : min(1) : int; -kb0k3status = hslider("kb0k3status",0,0,1,1) : min(1) : int; -kb1k0status = hslider("kb1k0status",0,0,1,1) : min(1) : int; -kb1k1status = hslider("kb1k1status",0,0,1,1) : min(1) : int; -kb1k2status = hslider("kb1k2status",0,0,1,1) : min(1) : int; -kb1k3status = hslider("kb1k3status",0,0,1,1) : min(1) : int; -kb1k4status = hslider("kb1k4status",0,0,1,1) : min(1) : int; - -// MODEL PARAMETERS -reedStiffness = hslider("reedStiffness[acc: 1 1 -10 0 10]",0,0,1,0.01) : si.smoo; -basePitch = 73; // C#4 -pitchShift = // calculate pitch shfit in function of "keys" combination - ((kb0k0status == 0) & (kb0k1status == 1) & (kb0k2status == 0) & - (kb1k0status == 0) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-1) + // C - ((kb0k0status == 1) & (kb0k1status == 0) & (kb0k2status == 0) & - (kb1k0status == 0) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-2) + // B - ((kb0k0status == 1) & (kb0k1status == 0) & (kb0k2status == 1) & - (kb1k0status == 0) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-3) + // Bb - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 0) & - (kb1k0status == 0) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-4) + // A - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 0) & - (kb1k0status == 1) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-5) + // G# - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 0) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-6) + // G - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 0) & (kb1k1status == 1) & (kb1k2status == 0) & - (kb1k3status == 0))*(-7) + // F# - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 1) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 0))*(-8) + // F - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 1) & (kb1k1status == 1) & (kb1k2status == 0) & - (kb1k3status == 0))*(-9) + // E - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 1) & (kb1k1status == 1) & (kb1k2status == 0) & - (kb1k3status == 1))*(-10) + // Eb - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 1) & (kb1k1status == 1) & (kb1k2status == 1) & - (kb1k3status == 0))*(-11) + // D - ((kb0k0status == 0) & (kb0k1status == 0) & (kb0k2status == 0) & - (kb1k0status == 0) & (kb1k1status == 0) & (kb1k2status == 0) & - (kb1k3status == 1))*(-12) + // C# - ((kb0k0status == 1) & (kb0k1status == 1) & (kb0k2status == 1) & - (kb1k0status == 1) & (kb1k1status == 1) & (kb1k2status == 1) & - (kb1k3status == 1))*(-13); // C -octaveShiftUp = +(kb0k3status : ba.impulsify)~_; // counting up -octaveShiftDown = +(kb1k4status : ba.impulsify)~_; // counting down -octaveShift = (octaveShiftUp-octaveShiftDown)*(12); -// tube length is just smoothed: could be improved -tubeLength = basePitch+pitchShift+octaveShift : ba.midikey2hz : pm.f2l : si.smoo; -bellOpening = 0.5; - -// ASSEMBLING MODEL -model(pressure) = pm.clarinetModel(tubeLength,pressure,reedStiffness,bellOpening); - -// pressure is estimated from mic signal -process = an.amp_follower_ud(0.02,0.02)*0.7 : model <: _,_; diff --git a/dist/examples/smartKeyboard/crazyGuiro.dsp b/dist/examples/smartKeyboard/crazyGuiro.dsp deleted file mode 100644 index 33492dc6..00000000 --- a/dist/examples/smartKeyboard/crazyGuiro.dsp +++ /dev/null @@ -1,96 +0,0 @@ -//################################### crazyGuiro.dsp ##################################### -// A simple smart phone "Guiro" where the touch screen is used to drive the instrument and -// select its pitch and where the x and y axis of the accelerometer control the -// resonance properties of the instrument. -// -// ## `SmartKeyboard` Use Strategy -// -// Since the sounds generated by this synth are very short, the strategy here is to take -// advantage of the polyphony capabilities of the iOSKeyboard architecture by creating -// a new voice every time a new key is pressed. Since the `SmartKeyboard` interface has a -// large number of keys here (128), lots of sounds are generated when sliding a -// finger across the keyboard. Also, it's interesting to notice that the `freq` parameter -// is not used here. Instead `keyboard` and `key` are used which allows us to easily -// make custom mappings. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] crazyGuiro.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -import("stdfaust.lib"); - - -//========================= Smart Keyboard Configuration ================================= -// 8 keyboards, each has 16 keys, none of them display key names. -//======================================================================================== - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'8', - 'Keyboard 0 - Number of Keys':'16', - 'Keyboard 1 - Number of Keys':'16', - 'Keyboard 2 - Number of Keys':'16', - 'Keyboard 3 - Number of Keys':'16', - 'Keyboard 4 - Number of Keys':'16', - 'Keyboard 5 - Number of Keys':'16', - 'Keyboard 6 - Number of Keys':'16', - 'Keyboard 7 - Number of Keys':'16', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 2 - Piano Keyboard':'0', - 'Keyboard 3 - Piano Keyboard':'0', - 'Keyboard 4 - Piano Keyboard':'0', - 'Keyboard 5 - Piano Keyboard':'0', - 'Keyboard 6 - Piano Keyboard':'0', - 'Keyboard 7 - Piano Keyboard':'0' -}"; - - -//================================ Instrument Parameters ================================= -// Creates the connection between the synth and the mobile device -//======================================================================================== - -// the current keyboard -keyboard = hslider("keyboard",0,0,2,1); -// the current key of the current keyboard -key = hslider("key",0,0,2,1); -// the wet factor of the reverb -wet = hslider("wet[acc: 0 0 -10 0 10]",0,0,1,0.01); -// the resonance factor of the reverb -res = hslider("res[acc: 1 0 -10 0 10]",0.5,0,1,0.01); -// smart keyboard gate parameter -gate = button("gate"); - - -//=================================== Parameters Mapping ================================= -//======================================================================================== - -// the resonance frequency of each click of the Guiro changes in function of -// the selected keyboard and key on it -minKey = 50; // min key of lowest keyboard -keySkipKeyboard = 8; // key skip per keyboard -drumResFreq = (key+minKey)+(keyboard*keySkipKeyboard) : ba.midikey2hz; -reverbWet = wet : si.smoo; -reverbRes = wet : si.smoo; - -// filter q -q = 8; - -//============================================ DSP ======================================= -//======================================================================================== - -reverb(wet,res) = _ <: *(1-wet),(*(wet) : re.mono_freeverb(res, 0.5, 0.5, 0)) :> _; - -process = sy.popFilterDrum(drumResFreq,q,gate) : reverb(wet,res) <: _,_; diff --git a/dist/examples/smartKeyboard/drums.dsp b/dist/examples/smartKeyboard/drums.dsp deleted file mode 100644 index 441c9571..00000000 --- a/dist/examples/smartKeyboard/drums.dsp +++ /dev/null @@ -1,74 +0,0 @@ -//##################################### drums.dsp ######################################## -// Faust instrument specifically designed for `faust2smartkeyb` where 3 drums can -// be controlled using pads. The X/Y postion of fingers is detected on each key -// and use to control the strike postion on the virtual membrane. -// -// ## `SmartKeyboard` Use Strategy -// -// The drum physical model used here is implemented to be generic so that its -// fundamental frequency can be changed for each voice. `SmartKeyboard` is used -// in polyphonic mode so each new strike on the interface corresponds to a new -// new voice. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp drums.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -// Interface with 2 keyboards of 2 and 1 keys (3 pads) -// Static mode is used so that keys don't change color when touched -// Note labels are hidden -// Piano Keyboard mode is deactivated so all the keys look the same -declare interface "SmartKeyboard{ - 'Number of Keyboards':'2', - 'Keyboard 0 - Number of Keys':'2', - 'Keyboard 1 - Number of Keys':'1', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 1 - Static Mode':'1', - 'Keyboard 0 - Send X':'1', - 'Keyboard 0 - Send Y':'1', - 'Keyboard 1 - Send X':'1', - 'Keyboard 1 - Send Y':'1', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 0 - Key 0 - Label':'High', - 'Keyboard 0 - Key 1 - Label':'Mid', - 'Keyboard 1 - Key 0 - Label':'Low' -}"; - -import("stdfaust.lib"); - -// standard parameters -gate = button("gate"); -x = hslider("x",1,0,1,0.001); -y = hslider("y",1,0,1,0.001); -keyboard = hslider("keyboard",0,0,1,1) : int; -key = hslider("key",0,0,1,1) : int; - -drumModel = pm.djembe(rootFreq,exPos,strikeSharpness,gain,gate) -with{ - // frequency of the lowest drum - bFreq = 60; - // retrieving pad ID (0-2) - padID = 2-(keyboard*2+key); - // drum root freq is computed in function of pad number - rootFreq = bFreq*(padID+1); - // excitation position - exPos = min((x*2-1 : abs),(y*2-1 : abs)); - strikeSharpness = 0.5; - gain = 2; -}; - -process = drumModel <: _,_; diff --git a/dist/examples/smartKeyboard/dubDub.dsp b/dist/examples/smartKeyboard/dubDub.dsp deleted file mode 100644 index 5744a907..00000000 --- a/dist/examples/smartKeyboard/dubDub.dsp +++ /dev/null @@ -1,87 +0,0 @@ -//################################### dubDub.dsp ##################################### -// A simple smartphone abstract instrument than can be controlled using the touch -// screen and the accelerometers of the device. -// -// ## `SmartKeyboard` Use Strategy -// -// The idea here is to use the `SmartKeyboard` interface as an X/Y control pad by just -// creating one keyboard with on key and by retrieving the X and Y position on that single -// key using the `x` and `y` standard parameters. Keyboard mode is deactivated so that -// the color of the pad doesn't change when it is pressed. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] dubDub.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -declare name "dubDub"; - -import("stdfaust.lib"); - -//========================= Smart Keyboard Configuration ================================= -// (1 keyboards with 1 key configured as a pad. -//======================================================================================== - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'1', - 'Keyboard 0 - Number of Keys':'1', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Send X':'1', - 'Keyboard 0 - Send Y':'1' -}"; - - -//================================ Instrument Parameters ================================= -// Creates the connection between the synth and the mobile device -//======================================================================================== - -// SmartKeyboard X parameter -x = hslider("x",0,0,1,0.01); -// SmartKeyboard Y parameter -y = hslider("y",0,0,1,0.01); -// SmartKeyboard gate parameter -gate = button("gate"); -// modulation frequency is controlled with the x axis of the accelerometer -modFreq = hslider("modFeq[acc: 0 0 -10 0 10]",9,0.5,18,0.01); -// general gain is controlled with the y axis of the accelerometer -gain = hslider("gain[acc: 1 0 -10 0 10]",0.5,0,1,0.01); - - -//=================================== Parameters Mapping ================================= -//======================================================================================== - -// sawtooth frequency -minFreq = 80; -maxFreq = 500; -freq = x*(maxFreq-minFreq) + minFreq : si.polySmooth(gate,0.999,1); - -// filter q -q = 8; - -// filter cutoff frequency is modulate with a triangle wave -minFilterCutoff = 50; -maxFilterCutoff = 5000; -filterModFreq = modFreq : si.smoo; -filterCutoff = (1-os.lf_trianglepos(modFreq)*(1-y))*(maxFilterCutoff-minFilterCutoff)+minFilterCutoff; - -// general gain of the synth -generalGain = gain : ba.lin2LogGain : si.smoo; - - -//============================================ DSP ======================================= -//======================================================================================== - -process = sy.dubDub(freq,filterCutoff,q,gate)*generalGain <: _,_; diff --git a/dist/examples/smartKeyboard/elecGuitar.dsp b/dist/examples/smartKeyboard/elecGuitar.dsp deleted file mode 100644 index 52f3562d..00000000 --- a/dist/examples/smartKeyboard/elecGuitar.dsp +++ /dev/null @@ -1,67 +0,0 @@ -//################################### elecGuitar.dsp ##################################### -// Faust instruments specifically designed for `faust2smartkeyb` where an electric -// guitar physical model is controlled using an isomorphic keyboard. Rock on! -// -// ## `SmartKeyboard` Use Strategy -// -// we want to create an isomorphic keyboard where each keyboard is monophonic and -// implements a "string". Keyboards should be one fourth apart from each other -// (more or less like on a guitar). We want to be able to slide between keyboards -// (strum) to trigger a new note (voice) and we want new fingers on a keyboard to -// "steal" the pitch from the previous finger (sort of hammer on). -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect elecGuitarEffecr.dsp elecGuitar.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017: -// https://ccrma.stanford.edu/~rmichon -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -// Interface with 6 monophonic keyboards one fourth apart from each other -declare interface "SmartKeyboard{ - 'Number of Keyboards':'6', - 'Max Keyboard Polyphony':'1', - 'Keyboard 0 - Number of Keys':'13', - 'Keyboard 1 - Number of Keys':'13', - 'Keyboard 2 - Number of Keys':'13', - 'Keyboard 3 - Number of Keys':'13', - 'Keyboard 4 - Number of Keys':'13', - 'Keyboard 5 - Number of Keys':'13', - 'Keyboard 0 - Lowest Key':'72', - 'Keyboard 1 - Lowest Key':'67', - 'Keyboard 2 - Lowest Key':'62', - 'Keyboard 3 - Lowest Key':'57', - 'Keyboard 4 - Lowest Key':'52', - 'Keyboard 5 - Lowest Key':'47', - 'Rounding Mode':'2' -}"; - -import("stdfaust.lib"); - -// standard parameters -f = hslider("freq",300,50,2000,0.01); -bend = hslider("bend[midi:pitchwheel]",1,0,10,0.01) : si.polySmooth(gate,0.999,1); -gain = hslider("gain",1,0,1,0.01); -s = hslider("sustain[midi:ctrl 64]",0,0,1,1); // for sustain pedal -t = button("gate"); - -// mapping params -gate = t+s : min(1); -freq = f*bend : max(60); // min freq is 60 Hz - -stringLength = freq : pm.f2l; -pluckPosition = 0.8; -mute = gate : si.polySmooth(gate,0.999,1); - -process = pm.elecGuitar(stringLength,pluckPosition,mute,gain,gate) <: _,_; diff --git a/dist/examples/smartKeyboard/fm.dsp b/dist/examples/smartKeyboard/fm.dsp deleted file mode 100644 index a5629b55..00000000 --- a/dist/examples/smartKeyboard/fm.dsp +++ /dev/null @@ -1,78 +0,0 @@ -//###################################### fm.dsp ########################################## -// A simple smart phone percussion abstract sound toy based on an FM synth. -// -// ## `SmartKeyboard` Use Strategy -// -// The idea here is to use the `SmartKeyboard` interface as an X/Y control pad by just -// creating one keyboard with on key and by retrieving the X and Y position on that single -// key using the `x` and `y` standard parameters. Keyboard mode is deactivated so that -// the color of the pad doesn't change when it is pressed. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] crazyGuiro.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -declare name "fm"; - -import("stdfaust.lib"); - -//========================= Smart Keyboard Configuration ================================= -// (1 keyboards with 1 key configured as a pad. -//======================================================================================== - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'1', - 'Keyboard 0 - Number of Keys':'1', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Send X':'1', - 'Keyboard 0 - Send Y':'1' -}"; - -//================================ Instrument Parameters ================================= -// Creates the connection between the synth and the mobile device -//======================================================================================== - -// SmartKeyboard X parameter -x = hslider("x",0,0,1,0.01); -// SmartKeyboard Y parameter -y = hslider("y",0,0,1,0.01); -// SmartKeyboard gate parameter -gate = button("gate") ; -// mode resonance duration is controlled with the x axis of the accelerometer -modFreqRatio = hslider("res[acc: 0 0 -10 0 10]",1,0,2,0.01) : si.smoo; - -//=================================== Parameters Mapping ================================= -//======================================================================================== - -// carrier frequency -minFreq = 80; -maxFreq = 500; -cFreq = x*(maxFreq-minFreq) + minFreq : si.polySmooth(gate,0.999,1); - -// modulator frequency -modFreq = cFreq*modFreqRatio; - -// modulation index -modIndex = y*1000 : si.smoo; - -//============================================ DSP ======================================= -//======================================================================================== - -// since the generated sound is pretty chaotic, there is no need for an envelope generator -fmSynth = sy.fm((cFreq,modFreq),(modIndex))*(gate : si.smoo)*0.5; - -process = fmSynth; diff --git a/dist/examples/smartKeyboard/frog.dsp b/dist/examples/smartKeyboard/frog.dsp deleted file mode 100644 index cf3c7077..00000000 --- a/dist/examples/smartKeyboard/frog.dsp +++ /dev/null @@ -1,74 +0,0 @@ -//################################### frog.dsp ##################################### -// A simple smart phone abstract instrument than can be controlled using the touch -// screen and the accelerometers of the device. -// -// ## `SmartKeyboard` Use Strategy -// -// The idea here is to use the `SmartKeyboard` interface as an X/Y control pad by just -// creating one keyboard with on key and by retrieving the X and Y position on that single -// key using the `x` and `y` standard parameters. Keyboard mode is deactivated so that -// the color of the pad doesn't change when it is pressed. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] frog.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -declare name "frog"; - -import("stdfaust.lib"); - -//========================= Smart Keyboard Configuration ================================= -// (1 keyboards with 1 key configured as a pad. -//======================================================================================== - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'1', - 'Keyboard 0 - Number of Keys':'1', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Send X':'1', - 'Keyboard 0 - Send Y':'1' -}"; - -//================================ Instrument Parameters ================================= -// Creates the connection between the synth and the mobile device -//======================================================================================== - -// SmartKeyboard X parameter -x = hslider("x",0,0,1,0.01); -// SmartKeyboard Y parameter -y = hslider("y",0,0,1,0.01); -// SmartKeyboard gate parameter -gate = button("gate"); -// the cutoff frequency of the filter is controlled with the x axis of the accelerometer -cutoff = hslider("cutoff[acc: 0 0 -10 0 10]",2500,50,5000,0.01); - -//=================================== Parameters Mapping ================================= -//======================================================================================== - -maxFreq = 100; -minFreq = 1; -freq = x*(maxFreq-minFreq) + minFreq : si.polySmooth(gate,0.999,1); - -maxQ = 40; -minQ = 1; -q = (1-y)*(maxQ-minQ) + minQ : si.smoo; -filterCutoff = cutoff : si.smoo; - -//============================================ DSP ======================================= -//======================================================================================== - -process = sy.dubDub(freq,filterCutoff,q,gate) <: _,_; diff --git a/dist/examples/smartKeyboard/harp.dsp b/dist/examples/smartKeyboard/harp.dsp deleted file mode 100644 index bd4bd251..00000000 --- a/dist/examples/smartKeyboard/harp.dsp +++ /dev/null @@ -1,84 +0,0 @@ -//######################################## harp.dsp ###################################### -// A simple smart phone based harp (if we dare to call it like that). -// -// ## `SmartKeyboard` Use Strategy -// -// Since the sounds generated by this synth are very short, the strategy here is to take -// advantage of the polyphony capabilities of the iOSKeyboard architecture by creating -// a new voice every time a new key is pressed. Since the `SmartKeyboard` interface has a -// large number of keys here (128), lots of sounds are generated when sliding a -// finger across the keyboard. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] harp.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -declare name "harp"; - -import("stdfaust.lib"); - -//========================= Smart Keyboard Configuration ================================= -// (8 keyboards with 16 keys configured as a pitch matrix. -//======================================================================================== - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'8', - 'Keyboard 0 - Number of Keys':'16', - 'Keyboard 1 - Number of Keys':'16', - 'Keyboard 2 - Number of Keys':'16', - 'Keyboard 3 - Number of Keys':'16', - 'Keyboard 4 - Number of Keys':'16', - 'Keyboard 5 - Number of Keys':'16', - 'Keyboard 6 - Number of Keys':'16', - 'Keyboard 7 - Number of Keys':'16', - 'Keyboard 0 - Lowest Key':'40', - 'Keyboard 1 - Lowest Key':'45', - 'Keyboard 2 - Lowest Key':'50', - 'Keyboard 3 - Lowest Key':'55', - 'Keyboard 4 - Lowest Key':'60', - 'Keyboard 5 - Lowest Key':'65', - 'Keyboard 6 - Lowest Key':'70', - 'Keyboard 7 - Lowest Key':'75', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 2 - Piano Keyboard':'0', - 'Keyboard 3 - Piano Keyboard':'0', - 'Keyboard 4 - Piano Keyboard':'0', - 'Keyboard 5 - Piano Keyboard':'0', - 'Keyboard 6 - Piano Keyboard':'0', - 'Keyboard 7 - Piano Keyboard':'0' -}"; - -//================================ Instrument Parameters ================================= -// Creates the connection between the synth and the mobile device -//======================================================================================== - -// the string resonance in second is controlled by the x axis of the accelerometer -res = hslider("res[acc: 0 0 -10 0 10]",2,0.1,4,0.01); -// Smart Keyboard frequency parameter -freq = hslider("freq",400,50,2000,0.01); -// Smart Keyboard gate parameter -gate = button("gate"); - -//=================================== Parameters Mapping ================================= -//======================================================================================== - -stringFreq = freq; - -//============================================ DSP ======================================= -//======================================================================================== - -process = sy.combString(freq,res,gate); diff --git a/dist/examples/smartKeyboard/midiOnly.dsp b/dist/examples/smartKeyboard/midiOnly.dsp deleted file mode 100644 index 53f478fc..00000000 --- a/dist/examples/smartKeyboard/midiOnly.dsp +++ /dev/null @@ -1,62 +0,0 @@ -//################################### midiOnly.dsp ###################################### -// Faust instrument specifically designed for `faust2smartkeyb` implementing a MIDI -// controllable app where the mobile device's touch screen is used to control -// specific parameters of the synth continuously using two separate X/Y control surfaces. -// -// ## `SmartKeyboard` Use Strategy -// -// The `SmartKeyboard` configuration for this instrument consists in a single keyboard -// with two keys. Each key implements a control surface. `Piano Keyboard` mode is -// disabled so that key names are not displayed and that keys don't change color when -// touched. Finally, `Send Freq` is set to 0 so that new voices are not allocated by -// the touch screen and that the `freq` and `bend` parameters are not computed. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp midiOnly.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -// Interface with 4 polyphnic keyboards of 13 keys with the same config -declare interface "SmartKeyboard{ - 'Number of Keyboards':'1', - 'Keyboard 0 - Number of Keys':'2', - 'Keyboard 0 - Send Freq':'0', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Send Key X':'1', - 'Keyboard 0 - Key 0 - Label':'Mod Index', - 'Keyboard 0 - Key 1 - Label':'Mod Freq' -}"; - -import("stdfaust.lib"); - -f = hslider("freq",300,50,2000,0.01); -bend = ba.semi2ratio(hslider("bend[midi:pitchwheel]",0,-2,2,0.001)) : si.polySmooth(gate,0.999,1); -gain = hslider("gain",1,0,1,0.01); -key = hslider("key",0,0,1,1) : int; -kb0k0x = hslider("kb0k0x[midi:ctrl 1]",0.5,0,1,0.01) : si.smoo; -kb0k1x = hslider("kb0k1x[midi:ctrl 1]",0.5,0,1,0.01) : si.smoo; -s = hslider("sustain[midi:ctrl 64]",0,0,1,1); -t = button("gate"); - -// fomating parameters -gate = t+s : min(1); -freq = f*bend; -index = kb0k0x*1000; -modFreqRatio = kb0k1x; - -envelope = gain*gate : si.smoo; - -process = sy.fm((freq,freq + freq*modFreqRatio),index*envelope)*envelope <: _,_; diff --git a/dist/examples/smartKeyboard/multiSynth.dsp b/dist/examples/smartKeyboard/multiSynth.dsp deleted file mode 100644 index 36a65254..00000000 --- a/dist/examples/smartKeyboard/multiSynth.dsp +++ /dev/null @@ -1,75 +0,0 @@ -//################################### multiSynth.dsp ###################################### -// Faust instrument specifically designed for `faust2smartkeyb` where 4 keyboards -// are used to control 4 independent synths. -// -// ## `SmartKeyboard` Use Strategy -// -// The `SmartKeyboard` configuration is relatively simple for this example and -// only consists in four polyphonic keyboards in parallel. The `keyboard` standard -// parameter is used to activate specific elements of the synthesizer. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp multiSynth.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -// Interface with 4 polyphnic keyboards of 13 keys with the same config -declare interface "SmartKeyboard{ - 'Number of Keyboards':'4', - 'Rounding Mode':'2', - 'Inter-Keyboard Slide':'0', - 'Keyboard 0 - Number of Keys':'13', - 'Keyboard 1 - Number of Keys':'13', - 'Keyboard 2 - Number of Keys':'13', - 'Keyboard 3 - Number of Keys':'13', - 'Keyboard 0 - Lowest Key':'60', - 'Keyboard 1 - Lowest Key':'60', - 'Keyboard 2 - Lowest Key':'60', - 'Keyboard 3 - Lowest Key':'60', - 'Keyboard 0 - Send Y':'1', - 'Keyboard 1 - Send Y':'1', - 'Keyboard 2 - Send Y':'1', - 'Keyboard 3 - Send Y':'1' -}"; - -import("stdfaust.lib"); - -// standard parameters -f = hslider("freq",300,50,2000,0.01); -bend = ba.semi2ratio(hslider("bend[midi:pitchwheel]",0,-2,2,0.001)) : si.polySmooth(gate,0.999,1); -gain = hslider("gain",1,0,1,0.01); -s = hslider("sustain[midi:ctrl 64]",0,0,1,1); // for sustain pedal -t = button("gate"); -y = hslider("y[midi:ctrl 1]",1,0,1,0.001) : si.smoo; -keyboard = hslider("keyboard",0,0,3,1) : int; - -// fomating parameters -gate = t+s : min(1); -freq = f*bend; -cutoff = y*4000+50; - -// oscillators -oscilators(0) = os.sawtooth(freq); -oscilators(1) = os.triangle(freq); -oscilators(2) = os.square(freq); -oscilators(3) = os.osc(freq); - -// oscs are selected in function of the current keyboard -synths = par(i,4,select2(keyboard == i,0,oscilators(i))) :> fi.lowpass(3,cutoff) : *(envelope) -with{ - envelope = gate*gain : si.smoo; -}; - -process = synths <: _,_; diff --git a/dist/examples/smartKeyboard/toy.dsp b/dist/examples/smartKeyboard/toy.dsp deleted file mode 100644 index 16838ba3..00000000 --- a/dist/examples/smartKeyboard/toy.dsp +++ /dev/null @@ -1,71 +0,0 @@ -//##################################### toy.dsp ####################################### -// Faust sound toy specifically designed for `faust2smartkeyb` where a funny -// synth can be controlled using several fingers on the screen and the built-in -// accelerometer. -// -// ## `SmartKeyboard` Use Strategy -// -// We just want a blank screen where the position of the different fingers on -// the screen can be tracked and retrieved in the Faust object. For that, we -// create one keyboard with one key, that should fill the screen. We ask the -// interface to not compute the `freq` and `bend` parameters to save -// computation by setting `'Keyboard 0 - Send Freq':'0'`. We don't want the -// color of the key to change when it is touched so we deactivate the -// `Piano Keyboard` mode. Fingers should be numbered to be able to use the -// numbered `x` and `y` parameters (`x0`, `y0`, `x1`, etc.), so `Count Fingers` -// is enabled. Finally, by setting `Max Keyboard Polyphony` to 0, we deactivate -// the voice allocation system and we automatically start a voice when the app -// is launched. This means that fingers are no longer associated to specific voices. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] toy.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017: -// https://ccrma.stanford.edu/~rmichon -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -// X/Y interface: one keyboard with one key -// freq and bend are not computed -// fingers are counted -// voice is launched on startup -declare interface "SmartKeyboard{ - 'Number of Keyboards':'1', - 'Max Keyboard Polyphony':'0', - 'Keyboard 0 - Number of Keys':'1', - 'Keyboard 0 - Send Freq':'0', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 0 - Send Numbered X':'1', - 'Keyboard 0 - Send Numbered Y':'1' -}"; - -import("stdfaust.lib"); - -// parameters -x0 = hslider("x0",0.5,0,1,0.01) : si.smoo; -y0 = hslider("y0",0.5,0,1,0.01) : si.smoo; -y1 = hslider("y1",0,0,1,0.01) : si.smoo; -q = hslider("q[acc: 0 0 -10 0 10]",30,10,50,0.01) : si.smoo; -del = hslider("del[acc: 0 0 -10 0 10]",0.5,0.01,1,0.01) : si.smoo; -fb = hslider("fb[acc: 1 0 -10 0 10]",0.5,0,1,0.01) : si.smoo; - -// mapping -impFreq = 2 + x0*20; -resFreq = y0*3000+300; - -// simple echo effect -echo = +~(de.delay(65536,del*ma.SR)*fb); - -// putting it together -process = os.lf_imptrain(impFreq) : fi.resonlp(resFreq,q,1) : echo : ef.cubicnl(y1,0)*0.95 <: _,_; diff --git a/dist/examples/smartKeyboard/trumpet.dsp b/dist/examples/smartKeyboard/trumpet.dsp deleted file mode 100644 index 2662d0ad..00000000 --- a/dist/examples/smartKeyboard/trumpet.dsp +++ /dev/null @@ -1,59 +0,0 @@ -//################################### trumpet.dsp ##################################### -// A simple trumpet app... (for large screens). -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp trumpet.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -import("stdfaust.lib"); - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'5', - 'Max Keyboard Polyphony':'1', - 'Mono Mode':'1', - 'Keyboard 0 - Number of Keys':'13', - 'Keyboard 1 - Number of Keys':'13', - 'Keyboard 2 - Number of Keys':'13', - 'Keyboard 3 - Number of Keys':'13', - 'Keyboard 4 - Number of Keys':'13', - 'Keyboard 0 - Lowest Key':'77', - 'Keyboard 1 - Lowest Key':'72', - 'Keyboard 2 - Lowest Key':'67', - 'Keyboard 3 - Lowest Key':'62', - 'Keyboard 4 - Lowest Key':'57', - 'Rounding Mode':'2', - 'Keyboard 0 - Send Y':'1', - 'Keyboard 1 - Send Y':'1', - 'Keyboard 2 - Send Y':'1', - 'Keyboard 3 - Send Y':'1', - 'Keyboard 4 - Send Y':'1', -}"; - -// standard parameters -f = hslider("freq",300,50,2000,0.01); -bend = ba.semi2ratio(hslider("bend[midi:pitchwheel]",0,-2,2,0.001)) : si.polySmooth(gate,0.999,1); -gain = hslider("gain",1,0,1,0.01); -s = hslider("sustain[midi:ctrl 64]",0,0,1,1); // for sustain pedal -t = button("gate"); -y = hslider("y[midi:ctrl 1]",1,0,1,0.001) : si.smoo; - -// fomating parameters -gate = t+s : min(1); -freq = f*bend; -cutoff = y*4000+50; -envelope = gate*gain : si.smoo; - -process = os.sawtooth(freq)*envelope : fi.lowpass(3,cutoff) <: _,_; diff --git a/dist/examples/smartKeyboard/turenas.dsp b/dist/examples/smartKeyboard/turenas.dsp deleted file mode 100644 index 864795ee..00000000 --- a/dist/examples/smartKeyboard/turenas.dsp +++ /dev/null @@ -1,114 +0,0 @@ -//################################### turenas.dsp ######################################## -// A simple smart phone percussion based on an additive synthesizer. -// -// ## `SmartKeyboard` Use Strategy -// -// Since the sounds generated by this synth are very short, the strategy here is to take -// advantage of the polyphony capabilities of the iOSKeyboard architecture by creating -// a new voice every time a new key is pressed. Since the `SmartKeyboard` interface has a -// large number of keys here (180), lots of sounds are generated when sliding a -// finger across the keyboard. -// -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] turenas.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -declare name "turenas"; - -import("stdfaust.lib"); - -//========================= Smart Keyboard Configuration ================================= -// (10 keyboards with 18 keys each configured as a pitch matrix. -//======================================================================================== - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'10', - 'Keyboard 0 - Number of Keys':'18', - 'Keyboard 1 - Number of Keys':'18', - 'Keyboard 2 - Number of Keys':'18', - 'Keyboard 3 - Number of Keys':'18', - 'Keyboard 4 - Number of Keys':'18', - 'Keyboard 5 - Number of Keys':'18', - 'Keyboard 6 - Number of Keys':'18', - 'Keyboard 7 - Number of Keys':'18', - 'Keyboard 8 - Number of Keys':'18', - 'Keyboard 9 - Number of Keys':'18', - 'Keyboard 0 - Lowest Key':'50', - 'Keyboard 1 - Lowest Key':'55', - 'Keyboard 2 - Lowest Key':'60', - 'Keyboard 3 - Lowest Key':'65', - 'Keyboard 4 - Lowest Key':'70', - 'Keyboard 5 - Lowest Key':'75', - 'Keyboard 6 - Lowest Key':'80', - 'Keyboard 7 - Lowest Key':'85', - 'Keyboard 8 - Lowest Key':'90', - 'Keyboard 9 - Lowest Key':'95', - 'Keyboard 0 - Piano Keyboard':'0', - 'Keyboard 1 - Piano Keyboard':'0', - 'Keyboard 2 - Piano Keyboard':'0', - 'Keyboard 3 - Piano Keyboard':'0', - 'Keyboard 4 - Piano Keyboard':'0', - 'Keyboard 5 - Piano Keyboard':'0', - 'Keyboard 6 - Piano Keyboard':'0', - 'Keyboard 7 - Piano Keyboard':'0', - 'Keyboard 8 - Piano Keyboard':'0', - 'Keyboard 9 - Piano Keyboard':'0', - 'Keyboard 0 - Send X':'0', - 'Keyboard 1 - Send X':'0', - 'Keyboard 2 - Send X':'0', - 'Keyboard 3 - Send X':'0', - 'Keyboard 4 - Send X':'0', - 'Keyboard 5 - Send X':'0', - 'Keyboard 6 - Send X':'0', - 'Keyboard 7 - Send X':'0', - 'Keyboard 8 - Send X':'0', - 'Keyboard 9 - Send X':'0' -}"; - -//================================ Instrument Parameters ================================= -// Creates the connection between the synth and the mobile device -//======================================================================================== - -// SmartKeyboard Y parameter -y = hslider("y",0,0,1,0.01); -// Smart Keyboard frequency parameter -freq = hslider("freq",400,50,2000,0.01); -// SmartKeyboard gate parameter -gate = button("gate"); -// mode resonance duration is controlled with the x axis of the accelerometer -res = hslider("res[acc: 0 0 -10 0 10]",2.5,0.01,5,0.01); - -//=================================== Parameters Mapping ================================= -//======================================================================================== - -// number of modes -nModes = 6; -// distance between each mode -maxModeSpread = 5; -modeSpread = y*maxModeSpread; -// computing modes frequency ratio -modeFreqRatios = par(i,nModes,1+(i+1)/nModes*modeSpread); -// computing modes gain -minModeGain = 0.3; -modeGains = par(i,nModes,1-(i+1)/(nModes*minModeGain)); -// smoothed mode resonance -modeRes = res : si.smoo; - -//============================================ DSP ======================================= -//======================================================================================== - -process = sy.additiveDrum(freq,modeFreqRatios,modeGains,0.8,0.001,modeRes,gate)*0.05; diff --git a/dist/examples/smartKeyboard/violin.dsp b/dist/examples/smartKeyboard/violin.dsp deleted file mode 100644 index 16ba739e..00000000 --- a/dist/examples/smartKeyboard/violin.dsp +++ /dev/null @@ -1,91 +0,0 @@ -//############################### violin.dsp ################################### -// Faust instrument specifically designed for `faust2smartkeyb` where a -// complete violin physical model can be played using the touch sceen -// interface. While the 4 virtual strings can be bowed using a control -// surface on the screen, it could be easily substituted with an external -// interface. -// -// ## `SmartKeyboard` Use Strategy -// -// 4 keyboards are used to control the pitch of the 4 bowed strings. Strings -// are connected to the virtual bow when they are touched. A pad created from -// a keybaord with a single key can be used to control the bow velocity and -// pressure on the selected strings. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. -// However it was specifically designed to be used with `faust2smartkeyb`. For -// best results, we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp violin.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Aug. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//############################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'5', - 'Max Keyboard Polyphony':'0', - 'Rounding Mode':'2', - 'Send Fingers Count':'1', - 'Keyboard 0 - Number of Keys':'19', - 'Keyboard 1 - Number of Keys':'19', - 'Keyboard 2 - Number of Keys':'19', - 'Keyboard 3 - Number of Keys':'19', - 'Keyboard 4 - Number of Keys':'1', - 'Keyboard 0 - Lowest Key':'55', - 'Keyboard 1 - Lowest Key':'62', - 'Keyboard 2 - Lowest Key':'69', - 'Keyboard 3 - Lowest Key':'76', - 'Keyboard 0 - Send Keyboard Freq':'1', - 'Keyboard 1 - Send Keyboard Freq':'1', - 'Keyboard 2 - Send Keyboard Freq':'1', - 'Keyboard 3 - Send Keyboard Freq':'1', - 'Keyboard 4 - Send Freq':'0', - 'Keyboard 4 - Send Key X':'1', - 'Keyboard 4 - Send Key Y':'1', - 'Keyboard 4 - Key 0 - Label':'Bow', - 'Keyboard 4 - Static Mode':'1' -}"; - -import("stdfaust.lib"); - -// SMARTKEYBOARD PARAMS -kbfreq(0) = hslider("kb0freq",220,20,10000,0.01); -kbbend(0) = hslider("kb0bend",1,0,10,0.01); -kbfreq(1) = hslider("kb1freq",330,20,10000,0.01); -kbbend(1) = hslider("kb1bend",1,0,10,0.01); -kbfreq(2) = hslider("kb2freq",440,20,10000,0.01); -kbbend(2) = hslider("kb2bend",1,0,10,0.01); -kbfreq(3) = hslider("kb3freq",550,20,10000,0.01); -kbbend(3) = hslider("kb3bend",1,0,10,0.01); -kb4k0x = hslider("kb4k0x",0,0,1,1) : si.smoo; -kb4k0y = hslider("kb4k0y",0,0,1,1) : si.smoo; -kbfingers(0) = hslider("kb0fingers",0,0,10,1) : int; -kbfingers(1) = hslider("kb1fingers",0,0,10,1) : int; -kbfingers(2) = hslider("kb2fingers",0,0,10,1) : int; -kbfingers(3) = hslider("kb3fingers",0,0,10,1) : int; - -// MODEL PARAMETERS -// strings lengths -sl(i) = kbfreq(i)*kbbend(i) : pm.f2l : si.smoo; -// string active only if fingers are touching the keyboard -as(i) = kbfingers(i)>0; -// bow pressure could also be controlled by an external parameter -bowPress = kb4k0y; -// retrieving finger displacement on screen (dirt simple) -bowVel = kb4k0x-kb4k0x' : abs : *(8000) : min(1) : si.smoo; -// bow position is constant but could be ontrolled by an external interface -bowPos = 0.7; - -// ASSEMBLING MODELS -// essentially 4 parallel violin strings -model = par(i,4,pm.violinModel(sl(i),bowPress,bowVel*as(i),bowPos)) :> _; - -process = model <: _,_; diff --git a/dist/examples/smartKeyboard/violin2.dsp b/dist/examples/smartKeyboard/violin2.dsp deleted file mode 100644 index e8f80c1a..00000000 --- a/dist/examples/smartKeyboard/violin2.dsp +++ /dev/null @@ -1,84 +0,0 @@ -//############################### violin2.dsp ################################## -// Faust instrument specifically designed for `faust2smartkeyb` where a -// complete violin physical model can be played using the touch sceen -// interface. Bowing is carried out by constantly moving a finger on the -// y axis of a key. -// -// ## `SmartKeyboard` Use Strategy -// -// 4 keyboards are used to control the pitch of the 4 bowed strings. Strings -// are connected to the virtual bow when they are touched. -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. -// However it was specifically designed to be used with `faust2smartkeyb`. For -// best results, we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] -effect reverb.dsp violin.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Aug. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//############################################################################## - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'4', - 'Max Keyboard Polyphony':'0', - 'Rounding Mode':'2', - 'Send Fingers Count':'1', - 'Keyboard 0 - Number of Keys':'12', - 'Keyboard 1 - Number of Keys':'12', - 'Keyboard 2 - Number of Keys':'12', - 'Keyboard 3 - Number of Keys':'12', - 'Keyboard 0 - Lowest Key':'55', - 'Keyboard 1 - Lowest Key':'62', - 'Keyboard 2 - Lowest Key':'69', - 'Keyboard 3 - Lowest Key':'76', - 'Keyboard 0 - Send Keyboard Freq':'1', - 'Keyboard 1 - Send Keyboard Freq':'1', - 'Keyboard 2 - Send Keyboard Freq':'1', - 'Keyboard 3 - Send Keyboard Freq':'1', - 'Keyboard 0 - Send Y':'1', - 'Keyboard 1 - Send Y':'1', - 'Keyboard 2 - Send Y':'1', - 'Keyboard 3 - Send Y':'1' -}"; - -import("stdfaust.lib"); - -// SMARTKEYBOARD PARAMS -kbfreq(0) = hslider("kb0freq",220,20,10000,0.01); -kbbend(0) = hslider("kb0bend",1,0,10,0.01); -kbfreq(1) = hslider("kb1freq",330,20,10000,0.01); -kbbend(1) = hslider("kb1bend",1,0,10,0.01); -kbfreq(2) = hslider("kb2freq",440,20,10000,0.01); -kbbend(2) = hslider("kb2bend",1,0,10,0.01); -kbfreq(3) = hslider("kb3freq",550,20,10000,0.01); -kbbend(3) = hslider("kb3bend",1,0,10,0.01); -kbfingers(0) = hslider("kb0fingers",0,0,10,1) : int; -kbfingers(1) = hslider("kb1fingers",0,0,10,1) : int; -kbfingers(2) = hslider("kb2fingers",0,0,10,1) : int; -kbfingers(3) = hslider("kb3fingers",0,0,10,1) : int; -y = hslider("y",0,0,1,1) : si.smoo; - -// MODEL PARAMETERS -// strings lengths -sl(i) = kbfreq(i)*kbbend(i) : pm.f2l : si.smoo; -// string active only if fingers are touching the keyboard -as(i) = kbfingers(i)>0; -// retrieving finger displacement on screen (dirt simple) -bowVel = y-y' : abs : *(3000) : min(1) : si.smoo; -// bow position is constant but could be ontrolled by an external interface -bowPos = 0.7; -bowPress = 0.5; - -// ASSEMBLING MODELS -// essentially 4 parallel violin strings -model = par(i,4,pm.violinModel(sl(i),bowPress,bowVel*as(i),bowPos)) :> _; - -process = model <: _,_; diff --git a/dist/examples/smartKeyboard/vocal.dsp b/dist/examples/smartKeyboard/vocal.dsp deleted file mode 100644 index fc350164..00000000 --- a/dist/examples/smartKeyboard/vocal.dsp +++ /dev/null @@ -1,43 +0,0 @@ -//######################################## vocal.dsp ##################################### -// A funny vocal synth app... -// -// ## Compilation Instructions -// -// This Faust code will compile fine with any of the standard Faust targets. However -// it was specifically designed to be used with `faust2smartkeyb`. For best results, -// we recommend to use the following parameters to compile it: -// -// ``` -// faust2smartkeyb [-ios/-android] vocal.dsp -// ``` -// -// ## Version/Licence -// -// Version 0.0, Feb. 2017 -// Copyright Romain Michon CCRMA (Stanford University)/GRAME 2017 -// MIT Licence: https://opensource.org/licenses/MIT -//######################################################################################## - -import("stdfaust.lib"); - -declare interface "SmartKeyboard{ - 'Number of Keyboards':'1', - 'Max Keyboard Polyphony':'0', - 'Keyboard 0 - Number of Keys':'1', - 'Keyboard 0 - Send Freq':'0', - 'Keyboard 0 - Static Mode':'1', - 'Keyboard 0 - Send X':'1', - 'Keyboard 0 - Piano Keyboard':'0' -}"; - -// standard parameters -vowel = hslider("vowel[acc: 0 0 -10 0 10]",2,0,4,0.01) : si.smoo; -x = hslider("x",0.5,0,1,0.01) : si.smoo; -vibrato = hslider("vibrato[acc: 1 0 -10 0 10]",0.05,0,0.1,0.01); -gain = hslider("gain",0.25,0,1,0.01); - -// fomating parameters -freq = x*200 + 50; -voiceFreq = freq*(os.osc(6)*vibrato+1); - -process = pm.SFFormantModelBP(1,vowel,0,voiceFreq,gain) <: _,_; diff --git a/dist/examples/spat/panpot.dsp b/dist/examples/spat/panpot.dsp deleted file mode 100644 index 56fcce6c..00000000 --- a/dist/examples/spat/panpot.dsp +++ /dev/null @@ -1,17 +0,0 @@ -declare name "panpot"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//------------------------------------------------- -// Stereo panpot -//------------------------------------------------- - -panpot(x) = sqrt(c)*x, sqrt(1-c)*x - with { - c=(nentry("[1]pan[style:knob]",0,-90,90,1)-90.0)/-180.0; - }; - -process = panpot; - diff --git a/dist/examples/spat/spat.dsp b/dist/examples/spat/spat.dsp deleted file mode 100644 index 012085ec..00000000 --- a/dist/examples/spat/spat.dsp +++ /dev/null @@ -1,25 +0,0 @@ -declare name "spat"; -declare version "1.0"; -declare author "Grame"; -declare license "BSD"; -declare copyright "(c)GRAME 2006"; - -//========================================================== -// -// GMEM SPAT -// implementation of L. Pottier Spatializer -// -//========================================================== - -import("stdfaust.lib"); - -//------------------------------------------------------ -// EXEMPLE : une entree mono spatialisee sur 8 sorties -//------------------------------------------------------ - -angle = hslider("angle", 0.0, 0, 1, 0.01); -distance = hslider("distance", 0.5, 0, 1, 0.01); - -process = vgroup("Spatializer 1x8", sp.spat(8, angle, distance)); - - diff --git a/dist/faust-ui/index.d.ts b/dist/faust-ui/index.d.ts deleted file mode 100644 index bfaf81ae..00000000 --- a/dist/faust-ui/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "../src/index"; -export * from "../src/types"; diff --git a/dist/faust-ui/index.html b/dist/faust-ui/index.html deleted file mode 100644 index fc56dbf8..00000000 --- a/dist/faust-ui/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - FaustUI - - - -
- - - - - \ No newline at end of file diff --git a/dist/faust-ui/index.js b/dist/faust-ui/index.js deleted file mode 100644 index 4adc4cd8..00000000 --- a/dist/faust-ui/index.js +++ /dev/null @@ -1,4973 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["FaustUI"] = factory(); - else - root["FaustUI"] = factory(); -})(self, () => { -return /******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@shren/typed-event-emitter/dist/index.js": -/*!***************************************************************!*\ - !*** ./node_modules/@shren/typed-event-emitter/dist/index.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TypedEventEmitter = exports.$AnyEventType = void 0; -exports.$AnyEventType = Symbol("__TypedEventListener_AnyEventType"); -class TypedEventEmitter { - constructor() { - this._listeners = { [exports.$AnyEventType]: [] }; - } - get listeners() { - return this._listeners; - } - getListeners(eventName) { - if (!(eventName in this._listeners)) - this._listeners[eventName] = []; - return this._listeners[eventName]; - } - on(eventName, listener) { - if (this.getListeners(eventName).indexOf(listener) === -1) - this.getListeners(eventName).push(listener); - } - once(eventName, listener) { - const listenerWithOff = (arg, emitter) => { - const returnValue = listener(arg, emitter); - this.off(eventName, listenerWithOff); - return returnValue; - }; - this.on(eventName, listenerWithOff); - } - onAny(listener) { - this._listeners[exports.$AnyEventType].push(listener); - } - off(eventName, listener) { - const i = this.getListeners(eventName).indexOf(listener); - if (i !== -1) - this.getListeners(eventName).splice(i, 1); - } - offAny(listener) { - const i = this._listeners[exports.$AnyEventType].indexOf(listener); - if (i !== -1) - this._listeners[exports.$AnyEventType].splice(i, 1); - } - async emit(eventName, eventData, options) { - var _a; - let listeners = this.getListeners(eventName); - let anyListeners = (options === null || options === void 0 ? void 0 : options.excludeAny) ? [] : this._listeners[exports.$AnyEventType]; - if (!listeners.length && !anyListeners.length) - return []; - if ((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.length) { - const { exclude } = options; - listeners = listeners.filter(l => exclude.indexOf(l) === -1); - anyListeners = anyListeners.filter(l => exclude.indexOf(l) === -1); - } - return Promise.all([...listeners.map(f => f(eventData, this)), ...anyListeners.map(f => f(eventName, eventData, this))]); - } - async emitSerial(eventName, eventData, options) { - var _a; - let listeners = this.getListeners(eventName); - let anyListeners = (options === null || options === void 0 ? void 0 : options.excludeAny) ? [] : this._listeners[exports.$AnyEventType]; - if (!listeners.length && !anyListeners.length) - return []; - if ((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.length) { - const { exclude } = options; - listeners = listeners.filter(l => exclude.indexOf(l) === -1); - anyListeners = anyListeners.filter(l => exclude.indexOf(l) === -1); - } - const returnValues = []; - for (let i = 0; i < listeners.length; i++) { - const listener = listeners[i]; - returnValues[i] = await listener(eventData, this); - } - for (let i = 0; i < anyListeners.length; i++) { - const listener = anyListeners[i]; - returnValues[listeners.length + i] = await listener(eventName, eventData, this); - } - return returnValues; - } - emitSync(eventName, eventData, options) { - var _a; - let listeners = this.getListeners(eventName); - let anyListeners = (options === null || options === void 0 ? void 0 : options.excludeAny) ? [] : this._listeners[exports.$AnyEventType]; - if (!listeners.length && !anyListeners.length) - return []; - if ((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.length) { - const { exclude } = options; - listeners = listeners.filter(l => exclude.indexOf(l) === -1); - anyListeners = anyListeners.filter(l => exclude.indexOf(l) === -1); - } - return [...listeners.map(f => f(eventData, this)), ...anyListeners.map(f => f(eventName, eventData, this))]; - } - offAll(eventName) { - if (eventName) { - this._listeners[eventName] = []; - } - else { - this._listeners = { [exports.$AnyEventType]: [] }; - } - } - listenerCount(eventName) { - const anyListenerCount = this._listeners[exports.$AnyEventType].length; - if (!(eventName in this._listeners)) - return anyListenerCount; - return this._listeners[eventName].length + anyListenerCount; - } -} -exports.TypedEventEmitter = TypedEventEmitter; -exports["default"] = TypedEventEmitter; -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Base.scss": -/*!***************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Base.scss ***! - \***************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component {\n display: flex;\n position: absolute;\n flex-direction: column;\n overflow: hidden;\n}\n.faust-ui-component:focus {\n outline: none;\n}\n.faust-ui-component > .faust-ui-component-label {\n position: relative;\n margin-top: 4px;\n width: 100%;\n user-select: none;\n}\n.faust-ui-component > .faust-ui-component-label > canvas {\n position: relative;\n display: block;\n max-width: 100%;\n max-height: 100%;\n}\n.faust-ui-component input {\n box-shadow: none;\n}", "",{"version":3,"sources":["webpack://./src/components/Base.scss"],"names":[],"mappings":"AAAA;EACI,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,gBAAA;AACJ;AAAI;EACI,aAAA;AAER;AAAI;EACI,kBAAA;EACA,eAAA;EACA,WAAA;EACA,iBAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;AAGZ;AAAI;EACI,gBAAA;AAER","sourcesContent":[".faust-ui-component {\n display: flex;\n position: absolute;\n flex-direction: column;\n overflow: hidden;\n &:focus {\n outline: none;\n }\n & > .faust-ui-component-label {\n position: relative;\n margin-top: 4px;\n width: 100%;\n user-select: none;\n & > canvas {\n position: relative;\n display: block;\n max-width: 100%;\n max-height: 100%;\n }\n }\n & input {\n box-shadow: none;\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Button.scss": -/*!*****************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Button.scss ***! - \*****************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-button > div {\n display: flex;\n position: relative;\n cursor: pointer;\n border-width: 1px;\n text-align: center;\n border-radius: 4px;\n flex: 1 0 auto;\n border-style: solid;\n}\n.faust-ui-component.faust-ui-component-button > div > span {\n user-select: none;\n margin: auto;\n}", "",{"version":3,"sources":["webpack://./src/components/Button.scss"],"names":[],"mappings":"AACI;EACI,aAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;EACA,cAAA;EACA,mBAAA;AAAR;AACQ;EACI,iBAAA;EACA,YAAA;AACZ","sourcesContent":[".faust-ui-component.faust-ui-component-button {\n & > div {\n display: flex;\n position: relative;\n cursor: pointer;\n border-width: 1px;\n text-align: center;\n border-radius: 4px;\n flex: 1 0 auto;\n border-style: solid;\n & > span {\n user-select: none;\n margin: auto;\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Checkbox.scss": -/*!*******************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Checkbox.scss ***! - \*******************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-checkbox > div {\n display: flex;\n position: relative;\n cursor: pointer;\n border-width: 1px;\n text-align: center;\n border-radius: 1px;\n flex: 1 0 auto;\n border-style: solid;\n}\n.faust-ui-component.faust-ui-component-checkbox > div > span {\n margin: auto;\n user-select: none;\n}", "",{"version":3,"sources":["webpack://./src/components/Checkbox.scss"],"names":[],"mappings":"AACI;EACI,aAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;EACA,cAAA;EACA,mBAAA;AAAR;AACQ;EACI,YAAA;EACA,iBAAA;AACZ","sourcesContent":[".faust-ui-component.faust-ui-component-checkbox {\n & > div {\n display: flex;\n position: relative;\n cursor: pointer;\n border-width: 1px;\n text-align: center;\n border-radius: 1px;\n flex: 1 0 auto;\n border-style: solid;\n & > span {\n margin: auto;\n user-select: none;\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Group.scss": -/*!****************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Group.scss ***! - \****************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-group {\n position: absolute;\n display: block;\n background-color: rgba(80, 80, 80, 0.75);\n border-radius: 4px;\n border: 1px rgba(255, 255, 255, 0.25) solid;\n}\n.faust-ui-group > .faust-ui-group-label {\n position: relative;\n margin: 4px;\n width: calc(100% - 8px);\n user-select: none;\n}\n.faust-ui-group > .faust-ui-group-label > canvas {\n position: relative;\n display: block;\n max-width: 100%;\n max-height: 100%;\n}\n.faust-ui-group .faust-ui-tgroup-tabs {\n position: absolute;\n display: inline-block;\n white-space: nowrap;\n left: 0px;\n}\n.faust-ui-group .faust-ui-tgroup-tabs .faust-ui-tgroup-tab {\n position: relative;\n display: inline-block;\n border-radius: 5px;\n cursor: pointer;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n margin: 10px;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.5);\n}\n.faust-ui-group .faust-ui-tgroup-tabs .faust-ui-tgroup-tab:hover {\n background-color: rgb(255, 255, 255);\n}\n.faust-ui-group .faust-ui-tgroup-tabs .faust-ui-tgroup-tab.active {\n background-color: rgb(40, 40, 40);\n color: white;\n}", "",{"version":3,"sources":["webpack://./src/components/Group.scss"],"names":[],"mappings":"AACA;EACI,kBAAA;EACA,cAAA;EACA,wCAAA;EACA,kBAAA;EACA,2CAAA;AAAJ;AACI;EACI,kBAAA;EACA,WAAA;EACA,uBAAA;EACA,iBAAA;AACR;AAAQ;EACI,kBAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;AAEZ;AACI;EACI,kBAAA;EACA,qBAAA;EACA,mBAAA;EACA,SAAA;AACR;AAAQ;EACI,kBAAA;EACA,qBAAA;EACA,kBAAA;EACA,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,iBAAA;EACA,YAAA;EACA,kBAAA;EACA,0CAAA;AAEZ;AADY;EACI,oCAAA;AAGhB;AADY;EACI,iCAAA;EACA,YAAA;AAGhB","sourcesContent":["\n.faust-ui-group {\n position: absolute;\n display: block;\n background-color: rgba(80, 80, 80, 0.75);\n border-radius: 4px;\n border: 1px rgba(255, 255, 255, 0.25) solid;\n & > .faust-ui-group-label {\n position: relative;\n margin: 4px;\n width: calc(100% - 8px);\n user-select: none;\n & > canvas {\n position: relative;\n display: block;\n max-width: 100%;\n max-height: 100%;\n }\n }\n & .faust-ui-tgroup-tabs {\n position: absolute;\n display: inline-block;\n white-space: nowrap;\n left: 0px;\n & .faust-ui-tgroup-tab {\n position: relative;\n display: inline-block;\n border-radius: 5px;\n cursor: pointer;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n margin: 10px;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.5);\n &:hover {\n background-color: rgba(255, 255, 255, 1);\n }\n &.active {\n background-color: rgba(40, 40, 40, 1);\n color: white;\n }\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/HBargraph.scss": -/*!********************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/HBargraph.scss ***! - \********************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-label {\n flex: 0 0 auto;\n}\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv {\n position: relative;\n display: flex;\n flex-direction: row-reverse;\n flex: 1 1 auto;\n width: 100%;\n height: auto;\n}\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv > .faust-ui-component-hbargraph-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n height: 100%;\n margin: auto;\n}\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv > .faust-ui-component-hbargraph-canvasdiv > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: auto 5px auto auto;\n border-width: 0px;\n border-radius: 4px;\n width: calc(20% - 13px);\n padding: 2px 4px;\n}", "",{"version":3,"sources":["webpack://./src/components/HBargraph.scss"],"names":[],"mappings":"AACI;EACI,cAAA;AAAR;AAEI;EACI,kBAAA;EACA,aAAA;EACA,2BAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;AAAR;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,YAAA;AACZ;AAAY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAEhB;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,uBAAA;EACA,gBAAA;AACZ","sourcesContent":[".faust-ui-component.faust-ui-component-hbargraph {\n & > .faust-ui-component-label {\n flex: 0 0 auto;\n }\n & > .faust-ui-component-hbargraph-flexdiv {\n position: relative;\n display: flex;\n flex-direction: row-reverse;\n flex: 1 1 auto;\n width: 100%;\n height: auto;\n & > .faust-ui-component-hbargraph-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n height: 100%;\n margin: auto;\n & > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n }\n }\n & > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: auto 5px auto auto;\n border-width: 0px;\n border-radius: 4px;\n width: calc(20% - 13px);\n padding: 2px 4px;\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/HSlider.scss": -/*!******************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/HSlider.scss ***! - \******************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-hslider > .faust-ui-component-label {\n flex: 0 0 auto;\n}\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv {\n position: relative;\n display: flex;\n flex-direction: row-reverse;\n flex: 1 1 auto;\n width: 100%;\n height: auto;\n}\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > .faust-ui-component-hslider-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n height: 100%;\n margin: auto;\n}\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > .faust-ui-component-hslider-canvasdiv > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: auto 5px auto auto;\n border-width: 0px;\n border-radius: 4px;\n width: calc(20% - 13px);\n padding: 2px 4px;\n -moz-appearance: textfield;\n}\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}", "",{"version":3,"sources":["webpack://./src/components/HSlider.scss"],"names":[],"mappings":"AACI;EACI,cAAA;AAAR;AAEI;EACI,kBAAA;EACA,aAAA;EACA,2BAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;AAAR;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,YAAA;AACZ;AAAY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAEhB;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,uBAAA;EACA,gBAAA;EACA,0BAAA;AACZ;AAAY;EAEI,wBAAA;EACA,SAAA;AAChB","sourcesContent":[".faust-ui-component.faust-ui-component-hslider {\n & > .faust-ui-component-label {\n flex: 0 0 auto;\n }\n & > .faust-ui-component-hslider-flexdiv {\n position: relative;\n display: flex;\n flex-direction: row-reverse;\n flex: 1 1 auto;\n width: 100%;\n height: auto;\n & > .faust-ui-component-hslider-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n height: 100%;\n margin: auto;\n & > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n }\n }\n & > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: auto 5px auto auto;\n border-width: 0px;\n border-radius: 4px;\n width: calc(20% - 13px);\n padding: 2px 4px;\n -moz-appearance:textfield;\n &::-webkit-inner-spin-button, \n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n}\n"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Knob.scss": -/*!***************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Knob.scss ***! - \***************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-knob {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-knob > canvas {\n position: relative;\n display: block;\n flex: 1 1 auto;\n min-height: 50%;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-knob > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: 0px;\n border-width: 0px;\n border-radius: 4px;\n max-width: calc(100% - 8px);\n padding: 2px 4px;\n -moz-appearance: textfield;\n}\n.faust-ui-component.faust-ui-component-knob > input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-knob > input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}", "",{"version":3,"sources":["webpack://./src/components/Knob.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,eAAA;EACA,WAAA;AAER;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,WAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,gBAAA;EACA,0BAAA;AAER;AADQ;EAEI,wBAAA;EACA,SAAA;AAEZ","sourcesContent":[".faust-ui-component.faust-ui-component-knob {\n align-items: center;\n & > canvas {\n position: relative;\n display: block;\n flex: 1 1 auto;\n min-height: 50%;\n width: 100%;\n }\n & > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: 0px;\n border-width: 0px;\n border-radius: 4px;\n max-width: calc(100% - 8px);\n padding: 2px 4px;\n -moz-appearance:textfield;\n &::-webkit-inner-spin-button, \n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Led.scss": -/*!**************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Led.scss ***! - \**************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-led {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-led > .faust-ui-component-label {\n flex: 0 0 auto;\n}\n.faust-ui-component.faust-ui-component-led > .faust-ui-component-led-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-led > .faust-ui-component-led-canvasdiv > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n}", "",{"version":3,"sources":["webpack://./src/components/Led.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;AAER;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,WAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAGZ","sourcesContent":[".faust-ui-component.faust-ui-component-led {\n align-items: center;\n & > .faust-ui-component-label {\n flex: 0 0 auto;\n }\n & > .faust-ui-component-led-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n width: 100%;\n & > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n }\n }\n}\n"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Menu.scss": -/*!***************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Menu.scss ***! - \***************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-menu {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-menu > select {\n margin: 0px;\n text-align: center;\n border-width: 1px;\n border-radius: 4px;\n padding: 2px 4px;\n width: calc(100% - 8px);\n}", "",{"version":3,"sources":["webpack://./src/components/Menu.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,uBAAA;AAER","sourcesContent":[".faust-ui-component.faust-ui-component-menu {\n align-items: center;\n & > select {\n margin: 0px;\n text-align: center;\n border-width: 1px;\n border-radius: 4px;\n padding: 2px 4px;\n width: calc(100% - 8px);\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Nentry.scss": -/*!*****************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Nentry.scss ***! - \*****************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-nentry {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-nentry input {\n margin: 0px;\n text-align: center;\n border-width: 1px;\n border-radius: 4px;\n padding: 2px 4px;\n width: calc(100% - 8px);\n}\n.faust-ui-component.faust-ui-component-nentry input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-nentry input::-webkit-outer-spin-button {\n opacity: 1;\n}", "",{"version":3,"sources":["webpack://./src/components/Nentry.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,uBAAA;AAER;AADQ;EAEI,UAAA;AAEZ","sourcesContent":[".faust-ui-component.faust-ui-component-nentry {\n align-items: center;\n & input {\n margin: 0px;\n text-align: center;\n border-width: 1px;\n border-radius: 4px;\n padding: 2px 4px;\n width: calc(100% - 8px);\n &::-webkit-inner-spin-button, \n &::-webkit-outer-spin-button {\n opacity: 1;\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Numerical.scss": -/*!********************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Numerical.scss ***! - \********************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-numerical {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-numerical > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: auto;\n border-width: 0px;\n border-radius: 4px;\n width: calc(100% - 8px);\n padding: 2px 4px;\n}", "",{"version":3,"sources":["webpack://./src/components/Numerical.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA,uBAAA;EACA,gBAAA;AAER","sourcesContent":[".faust-ui-component.faust-ui-component-numerical {\n align-items: center;\n & > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: auto;\n border-width: 0px;\n border-radius: 4px;\n width: calc(100% - 8px);\n padding: 2px 4px;\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Radio.scss": -/*!****************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Radio.scss ***! - \****************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-radio {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-radio > .faust-ui-component-label {\n flex: 0 0 auto;\n margin-top: auto;\n}\n.faust-ui-component.faust-ui-component-radio > .faust-ui-component-radio-group {\n flex: 0 0 auto;\n margin-bottom: auto;\n border-width: 1px;\n border-radius: 4px;\n padding: 2px 4px;\n width: calc(100% - 8px);\n}\n.faust-ui-component.faust-ui-component-radio > .faust-ui-component-radio-group > div {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}", "",{"version":3,"sources":["webpack://./src/components/Radio.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;EACA,gBAAA;AAER;AAAI;EACI,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,uBAAA;AAER;AADQ;EACI,uBAAA;EACA,mBAAA;EACA,gBAAA;AAGZ","sourcesContent":[".faust-ui-component.faust-ui-component-radio {\n align-items: center;\n & > .faust-ui-component-label {\n flex: 0 0 auto;\n margin-top: auto;\n }\n & > .faust-ui-component-radio-group {\n flex: 0 0 auto;\n margin-bottom: auto;\n border-width: 1px;\n border-radius: 4px;\n padding: 2px 4px;\n width: calc(100% - 8px);\n & > div {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/VBargraph.scss": -/*!********************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/VBargraph.scss ***! - \********************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-vbargraph {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-label {\n flex: 0 0 auto;\n}\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n height: inherit;\n}\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv > .faust-ui-component-vbargraph-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv > .faust-ui-component-vbargraph-canvasdiv > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: 5px auto auto auto;\n border-width: 0px;\n border-radius: 4px;\n height: 5%;\n width: calc(100% - 8px);\n padding: 2px 4px;\n}", "",{"version":3,"sources":["webpack://./src/components/VBargraph.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;AAER;AAAI;EACI,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,WAAA;AAGZ;AAFY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAIhB;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,uBAAA;EACA,gBAAA;AAGZ","sourcesContent":[".faust-ui-component.faust-ui-component-vbargraph {\n align-items: center;\n & > .faust-ui-component-label {\n flex: 0 0 auto;\n }\n & > .faust-ui-component-vbargraph-flexdiv {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n height: inherit;\n & > .faust-ui-component-vbargraph-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n width: 100%;\n & > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n }\n }\n & > input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: 5px auto auto auto;\n border-width: 0px;\n border-radius: 4px;\n height: 5%;\n width: calc(100% - 8px);\n padding: 2px 4px;\n }\n }\n}\n"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/VSlider.scss": -/*!******************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/VSlider.scss ***! - \******************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-component.faust-ui-component-vslider {\n align-items: center;\n}\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-label {\n flex: 0 0 auto;\n}\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n height: auto;\n}\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv > .faust-ui-component-vslider-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv > .faust-ui-component-vslider-canvasdiv > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n}\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: 5px auto auto auto;\n border-width: 0px;\n border-radius: 4px;\n height: 5%;\n max-width: calc(100% - 8px);\n padding: 2px 4px;\n -moz-appearance: textfield;\n}\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}", "",{"version":3,"sources":["webpack://./src/components/VSlider.scss"],"names":[],"mappings":"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;AAER;AAAI;EACI,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,WAAA;AAGZ;AAFY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAIhB;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,2BAAA;EACA,gBAAA;EACA,0BAAA;AAGZ;AAFY;EAEI,wBAAA;EACA,SAAA;AAGhB","sourcesContent":[".faust-ui-component.faust-ui-component-vslider {\n align-items: center;\n & > .faust-ui-component-label {\n flex: 0 0 auto;\n }\n & > .faust-ui-component-vslider-flexdiv {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n height: auto;\n & > .faust-ui-component-vslider-canvasdiv {\n position: relative;\n display: block;\n flex: 1 1 auto;\n width: 100%;\n & > canvas {\n position: absolute;\n display: block;\n height: 100%;\n width: 100%;\n }\n }\n & input {\n position: relative;\n display: block;\n flex: 0 1 auto;\n text-align: center;\n background-color: rgba(255, 255, 255, 0.25);\n margin: 5px auto auto auto;\n border-width: 0px;\n border-radius: 4px;\n height: 5%;\n max-width: calc(100% - 8px);\n padding: 2px 4px;\n -moz-appearance:textfield;\n &::-webkit-inner-spin-button, \n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/index.scss": -/*!*****************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/index.scss ***! - \*****************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - - -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ".faust-ui-root {\n margin: 0px auto;\n flex: 1 0 auto;\n position: relative !important;\n background-color: transparent !important;\n border: none !important;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n}", "",{"version":3,"sources":["webpack://./src/index.scss"],"names":[],"mappings":"AAAA;EACI,gBAAA;EACA,cAAA;EACA,6BAAA;EACA,wCAAA;EACA,uBAAA;EACA,kMAAA;AACJ","sourcesContent":[".faust-ui-root {\n margin: 0px auto;\n flex: 1 0 auto;\n position: relative !important;\n background-color: transparent !important;\n border: none !important;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n}"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/api.js": -/*!*****************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/api.js ***! - \*****************************************************/ -/***/ ((module) => { - - - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -module.exports = function (cssWithMappingToString) { - var list = []; // return the list of modules as css string - - list.toString = function toString() { - return this.map(function (item) { - var content = ""; - var needLayer = typeof item[5] !== "undefined"; - - if (item[4]) { - content += "@supports (".concat(item[4], ") {"); - } - - if (item[2]) { - content += "@media ".concat(item[2], " {"); - } - - if (needLayer) { - content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); - } - - content += cssWithMappingToString(item); - - if (needLayer) { - content += "}"; - } - - if (item[2]) { - content += "}"; - } - - if (item[4]) { - content += "}"; - } - - return content; - }).join(""); - }; // import a list of modules into the list - - - list.i = function i(modules, media, dedupe, supports, layer) { - if (typeof modules === "string") { - modules = [[null, modules, undefined]]; - } - - var alreadyImportedModules = {}; - - if (dedupe) { - for (var k = 0; k < this.length; k++) { - var id = this[k][0]; - - if (id != null) { - alreadyImportedModules[id] = true; - } - } - } - - for (var _k = 0; _k < modules.length; _k++) { - var item = [].concat(modules[_k]); - - if (dedupe && alreadyImportedModules[item[0]]) { - continue; - } - - if (typeof layer !== "undefined") { - if (typeof item[5] === "undefined") { - item[5] = layer; - } else { - item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); - item[5] = layer; - } - } - - if (media) { - if (!item[2]) { - item[2] = media; - } else { - item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); - item[2] = media; - } - } - - if (supports) { - if (!item[4]) { - item[4] = "".concat(supports); - } else { - item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); - item[4] = supports; - } - } - - list.push(item); - } - }; - - return list; -}; - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": -/*!************************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! - \************************************************************/ -/***/ ((module) => { - - - -module.exports = function (item) { - var content = item[1]; - var cssMapping = item[3]; - - if (!cssMapping) { - return content; - } - - if (typeof btoa === "function") { - var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); - var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); - var sourceMapping = "/*# ".concat(data, " */"); - var sourceURLs = cssMapping.sources.map(function (source) { - return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */"); - }); - return [content].concat(sourceURLs).concat([sourceMapping]).join("\n"); - } - - return [content].join("\n"); -}; - -/***/ }), - -/***/ "./src/FaustUI.ts": -/*!************************!*\ - !*** ./src/FaustUI.ts ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FaustUI) -/* harmony export */ }); -/* harmony import */ var _layout_Layout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./layout/Layout */ "./src/layout/Layout.ts"); -/* harmony import */ var _components_Group__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/Group */ "./src/components/Group.ts"); -/* harmony import */ var _index_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.scss */ "./src/index.scss"); - - - -class FaustUI { - constructor(options) { - this.componentMap = {}; - this.paramChangeByUI = (path, value) => { - if (!this.hostWindow) - return; - this.hostWindow.postMessage({ path, value, type: "param" }, "*"); - }; - const { root, ui: uiIn, listenWindowResize, listenWindowMessage } = options; - this.DOMroot = root; - this.ui = uiIn || []; - if (typeof listenWindowResize === "undefined" || listenWindowResize === true) { - window.addEventListener("resize", () => { - this.resize(); - }); - } - if (typeof listenWindowMessage === "undefined" || listenWindowMessage === true) { - window.addEventListener("message", (e) => { - const { data, source } = e; - this.hostWindow = source; - const { type } = data; - if (!type) - return; - if (type === "ui") { - this.ui = data.ui; - } else if (type === "param") { - const { path, value } = data; - this.paramChangeByDSP(path, value); - } - }); - } - } - mount() { - this.componentMap = {}; - this.DOMroot.innerHTML = ""; - const props = { - label: "", - type: "vgroup", - items: this.ui, - style: { - grid: this.grid, - width: this.layout.width, - height: this.layout.height, - left: this.layout.offsetLeft, - top: this.layout.offsetTop - }, - isRoot: true, - emitter: this - }; - this.faustUIRoot = new _components_Group__WEBPACK_IMPORTED_MODULE_1__["default"](props); - this.faustUIRoot.componentWillMount(); - this.faustUIRoot.mount(); - this.DOMroot.appendChild(this.faustUIRoot.container); - this.faustUIRoot.componentDidMount(); - } - register(path, item) { - if (this.componentMap[path]) - this.componentMap[path].push(item); - else - this.componentMap[path] = [item]; - } - paramChangeByDSP(path, value) { - if (this.componentMap[path]) - this.componentMap[path].forEach((item) => item.setState({ value })); - } - calc() { - const { items, layout } = _layout_Layout__WEBPACK_IMPORTED_MODULE_0__["default"].calc(this.ui); - this._ui = items; - this._layout = layout; - this.calcGrid(); - } - calcGrid() { - const { width, height } = this.DOMroot.getBoundingClientRect(); - const grid = Math.max(40, Math.min(width / this._layout.width, height / this._layout.height)); - this.grid = grid; - return grid; - } - resize() { - if (!this.faustUIRoot) - return; - this.calcGrid(); - this.faustUIRoot.setState({ style: { grid: this.grid } }); - } - get ui() { - return this._ui; - } - set ui(uiIn) { - this._ui = uiIn; - this.calc(); - this.mount(); - } - get layout() { - return this._layout; - } - get minWidth() { - return this._layout.width * 40 + 1; - } - get minHeight() { - return this._layout.height * 40 + 1; - } -} - - -/***/ }), - -/***/ "./src/components/AbstractComponent.ts": -/*!*********************************************!*\ - !*** ./src/components/AbstractComponent.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AbstractComponent) -/* harmony export */ }); -/* harmony import */ var _shren_typed_event_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @shren/typed-event-emitter */ "./node_modules/@shren/typed-event-emitter/dist/index.js"); -var __defProp = Object.defineProperty; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; - -class AbstractComponent extends _shren_typed_event_emitter__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor(props) { - super(); - this.$frame = 0; - this.frameReduce = 1; - this.raf = () => { - this.$frame++; - if (this.$frame % this.frameReduce !== 0) { - this.$raf = window.requestAnimationFrame(this.raf); - return; - } - this.$raf = void 0; - this.tasks.forEach((f) => f()); - this.tasks = []; - }; - this.tasks = []; - this.state = __spreadValues(__spreadValues({}, this.defaultProps), props); - } - get defaultProps() { - return this.constructor.defaultProps; - } - setState(newState) { - let shouldUpdate = false; - for (const stateKey in newState) { - const stateValue = newState[stateKey]; - if (stateKey in this.state && this.state[stateKey] !== stateValue) { - this.state[stateKey] = stateValue; - shouldUpdate = true; - } else - return; - if (shouldUpdate) - this.emit(stateKey, this.state[stateKey]); - } - } - schedule(func) { - if (this.tasks.indexOf(func) === -1) - this.tasks.push(func); - if (this.$raf) - return; - this.$raf = window.requestAnimationFrame(this.raf); - } -} -AbstractComponent.defaultProps = {}; - - -/***/ }), - -/***/ "./src/components/AbstractItem.ts": -/*!****************************************!*\ - !*** ./src/components/AbstractItem.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AbstractItem) -/* harmony export */ }); -/* harmony import */ var _AbstractComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractComponent */ "./src/components/AbstractComponent.ts"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/components/utils.ts"); -/* harmony import */ var _Base_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Base.scss */ "./src/components/Base.scss"); -var __defProp = Object.defineProperty; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; - - - -const _AbstractItem = class extends _AbstractComponent__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor(props) { - super(props); - this.frameReduce = 3; - this.handleKeyDown = (e) => { - }; - this.handleKeyUp = (e) => { - }; - this.handleTouchStart = (e) => { - e.preventDefault(); - const rect = e.currentTarget.getBoundingClientRect(); - let prevX = e.touches[0].clientX; - let prevY = e.touches[0].clientY; - const fromX = prevX - rect.left; - const fromY = prevY - rect.top; - const prevValue = this.state.value; - this.handlePointerDown({ x: fromX, y: fromY, originalEvent: e }); - const handleTouchMove = (e2) => { - e2.preventDefault(); - const clientX = e2.changedTouches[0].clientX; - const clientY = e2.changedTouches[0].clientY; - const movementX = clientX - prevX; - const movementY = clientY - prevY; - prevX = clientX; - prevY = clientY; - const x = clientX - rect.left; - const y = clientY - rect.top; - this.handlePointerDrag({ prevValue, x, y, fromX, fromY, movementX, movementY, originalEvent: e2 }); - }; - const handleTouchEnd = (e2) => { - e2.preventDefault(); - const x = e2.changedTouches[0].clientX - rect.left; - const y = e2.changedTouches[0].clientY - rect.top; - this.handlePointerUp({ x, y, originalEvent: e2 }); - document.removeEventListener("touchmove", handleTouchMove); - document.removeEventListener("touchend", handleTouchEnd); - }; - document.addEventListener("touchmove", handleTouchMove, { passive: false }); - document.addEventListener("touchend", handleTouchEnd, { passive: false }); - }; - this.handleWheel = (e) => { - }; - this.handleClick = (e) => { - }; - this.handleMouseDown = (e) => { - e.preventDefault(); - e.currentTarget.focus(); - const rect = e.currentTarget.getBoundingClientRect(); - const fromX = e.clientX - rect.left; - const fromY = e.clientY - rect.top; - const prevValue = this.state.value; - this.handlePointerDown({ x: fromX, y: fromY, originalEvent: e }); - const handleMouseMove = (e2) => { - e2.preventDefault(); - const x = e2.clientX - rect.left; - const y = e2.clientY - rect.top; - this.handlePointerDrag({ prevValue, x, y, fromX, fromY, movementX: e2.movementX, movementY: e2.movementY, originalEvent: e2 }); - }; - const handleMouseUp = (e2) => { - e2.preventDefault(); - const x = e2.clientX - rect.left; - const y = e2.clientY - rect.top; - this.handlePointerUp({ x, y, originalEvent: e2 }); - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - }; - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); - }; - this.handleMouseOver = (e) => { - }; - this.handleMouseOut = (e) => { - }; - this.handleContextMenu = (e) => { - }; - this.handlePointerDown = (e) => { - }; - this.handlePointerDrag = (e) => { - }; - this.handlePointerUp = (e) => { - }; - this.handleFocusIn = (e) => this.setState({ focus: true }); - this.handleFocusOut = (e) => this.setState({ focus: false }); - this.state.style = __spreadValues(__spreadValues({}, this.defaultProps.style), props.style); - if (this.state.emitter) - this.state.emitter.register(this.state.address, this); - } - toValidNumber(value) { - const { min, max, step } = this.state; - if (typeof min !== "number" || typeof max !== "number") - return value; - const v = Math.min(max, Math.max(min, value)); - if (!step) - return v; - return min + Math.floor((v - min) / step) * step; - } - setValue(valueIn) { - const value = this.toValidNumber(valueIn); - const changed = this.setState({ value }); - if (changed) - this.change(value); - return changed; - } - change(valueIn) { - if (this.state.emitter) - this.state.emitter.paramChangeByUI(this.state.address, typeof valueIn === "number" ? valueIn : this.state.value); - } - setState(newState) { - let shouldUpdate = false; - for (const key in newState) { - const stateKey = key; - const stateValue = newState[stateKey]; - if (stateKey === "style") { - for (const styleKey in newState.style) { - if (styleKey in this.state.style && this.state.style[styleKey] !== newState.style[styleKey]) { - this.state.style[styleKey] = newState.style[styleKey]; - shouldUpdate = true; - } - } - } else if (stateKey in this.state && this.state[stateKey] !== stateValue) { - this.state[stateKey] = stateValue; - shouldUpdate = true; - } else - return false; - if (shouldUpdate) - this.emit(stateKey, this.state[stateKey]); - } - return shouldUpdate; - } - componentWillMount() { - this.container = document.createElement("div"); - this.container.className = ["faust-ui-component", "faust-ui-component-" + this.className].join(" "); - this.container.tabIndex = 1; - this.container.id = this.state.address; - if (this.state.tooltip) - this.container.title = this.state.tooltip; - this.label = document.createElement("div"); - this.label.className = "faust-ui-component-label"; - this.labelCanvas = document.createElement("canvas"); - this.labelCtx = this.labelCanvas.getContext("2d"); - return this; - } - mount() { - this.label.appendChild(this.labelCanvas); - return this; - } - paintLabel(align) { - const label = this.state.label; - const color = this.state.style.labelcolor; - const ctx = this.labelCtx; - const canvas = this.labelCanvas; - let { width, height } = this.label.getBoundingClientRect(); - if (!width || !height) - return this; - width = Math.floor(width); - height = Math.floor(height); - canvas.height = height; - canvas.width = width; - ctx.clearRect(0, 0, width, height); - ctx.fillStyle = color; - ctx.textBaseline = "middle"; - ctx.textAlign = align || "center"; - ctx.font = `bold ${height * 0.9}px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`; - ctx.fillText(label, align === "left" ? 0 : align === "right" ? width : width / 2, height / 2, width); - return this; - } - componentDidMount() { - const handleResize = () => { - const { grid, left, top, width, height } = this.state.style; - this.container.style.width = `${width * grid}px`; - this.container.style.height = `${height * grid}px`; - this.container.style.left = `${left * grid}px`; - this.container.style.top = `${top * grid}px`; - this.label.style.height = `${grid * 0.25}px`; - this.paintLabel(); - }; - this.on("style", () => this.schedule(handleResize)); - handleResize(); - return this; - } - get stepsCount() { - const { type, max, min, step, enums } = this.state; - const maxSteps = type === "enum" ? enums.length : type === "int" ? max - min : (max - min) / step; - if (step) { - if (type === "enum") - return enums.length; - if (type === "int") - return Math.min(Math.floor((max - min) / (Math.round(step) || 1)), maxSteps); - return Math.floor((max - min) / step); - } - return maxSteps; - } - get distance() { - const { type, max, min, value, enums, scale } = this.state; - return _AbstractItem.getDistance({ type, max, min, value, enums, scale }); - } - static getDistance(state) { - const { type, max, min, value, enums, scale } = state; - if (type === "enum") - return value / (enums.length - 1); - const v = scale === "exp" ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normLog)(value, min, max) : scale === "log" ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normExp)(value, min, max) : value; - return (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normalize)(v, min, max); - } - get stepRange() { - const full = 100; - const stepsCount = this.stepsCount; - return full / stepsCount; - } -}; -let AbstractItem = _AbstractItem; -AbstractItem.defaultProps = { - value: 0, - active: true, - focus: false, - label: "", - address: "", - min: 0, - max: 1, - enums: {}, - type: "float", - unit: "", - scale: "linear", - step: 0.01, - style: { width: 45, height: 15, left: 0, top: 0, labelcolor: "rgba(226, 222, 255, 0.5)" } -}; - - - -/***/ }), - -/***/ "./src/components/Button.ts": -/*!**********************************!*\ - !*** ./src/components/Button.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Button) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _Button_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Button.scss */ "./src/components/Button.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class Button extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "button"; - this.setStyle = () => { - const { value, style } = this.state; - const { height, grid, fontsize, fontname, fontface, textcolor, textoncolor, bgoncolor, bgcolor, bordercolor, borderoncolor } = style; - this.btn.style.backgroundColor = value ? bgoncolor : bgcolor; - this.btn.style.borderColor = value ? borderoncolor : bordercolor; - this.btn.style.color = value ? textoncolor : textcolor; - this.btn.style.fontSize = `${fontsize || height * grid / 4}px`; - this.btn.style.fontFamily = `${fontname}, sans-serif`; - this.btn.style.fontStyle = fontface; - }; - this.handlePointerDown = () => { - this.setValue(1); - }; - this.handlePointerUp = () => { - this.setValue(0); - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "normal", - bgcolor: "rgba(40, 40, 40, 1)", - bgoncolor: "rgba(18, 18, 18, 1)", - bordercolor: "rgba(80, 80, 80, 1)", - borderoncolor: "rgba(255, 165, 0, 1)", - textcolor: "rgba(226, 222, 255, 0.5)", - textoncolor: "rgba(255, 165, 0, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.btn = document.createElement("div"); - this.span = document.createElement("span"); - this.span.innerText = this.state.label; - this.setStyle(); - return this; - } - mount() { - this.btn.appendChild(this.span); - this.container.appendChild(this.btn); - return super.mount(); - } - componentDidMount() { - super.componentDidMount(); - this.btn.addEventListener("mousedown", this.handleMouseDown); - this.btn.addEventListener("touchstart", this.handleTouchStart); - this.on("style", () => this.schedule(this.setStyle)); - const labelChange = () => this.span.innerText = this.state.label; - this.on("label", () => this.schedule(labelChange)); - this.on("value", () => this.schedule(this.setStyle)); - return this; - } -} - - -/***/ }), - -/***/ "./src/components/Checkbox.ts": -/*!************************************!*\ - !*** ./src/components/Checkbox.ts ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Checkbox) -/* harmony export */ }); -/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Button */ "./src/components/Button.ts"); -/* harmony import */ var _Checkbox_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Checkbox.scss */ "./src/components/Checkbox.scss"); - - -class Checkbox extends _Button__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "checkbox"; - this.handlePointerDown = () => { - this.setValue(1 - this.state.value); - }; - this.handlePointerUp = () => { - }; - } -} - - -/***/ }), - -/***/ "./src/components/Group.ts": -/*!*********************************!*\ - !*** ./src/components/Group.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Group) -/* harmony export */ }); -/* harmony import */ var _AbstractComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractComponent */ "./src/components/AbstractComponent.ts"); -/* harmony import */ var _HSlider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HSlider */ "./src/components/HSlider.ts"); -/* harmony import */ var _VSlider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./VSlider */ "./src/components/VSlider.ts"); -/* harmony import */ var _Nentry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Nentry */ "./src/components/Nentry.ts"); -/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Button */ "./src/components/Button.ts"); -/* harmony import */ var _Checkbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Checkbox */ "./src/components/Checkbox.ts"); -/* harmony import */ var _Knob__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Knob */ "./src/components/Knob.ts"); -/* harmony import */ var _Menu__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Menu */ "./src/components/Menu.ts"); -/* harmony import */ var _Radio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Radio */ "./src/components/Radio.ts"); -/* harmony import */ var _Led__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Led */ "./src/components/Led.ts"); -/* harmony import */ var _Numerical__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Numerical */ "./src/components/Numerical.ts"); -/* harmony import */ var _HBargraph__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./HBargraph */ "./src/components/HBargraph.ts"); -/* harmony import */ var _VBargraph__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./VBargraph */ "./src/components/VBargraph.ts"); -/* harmony import */ var _layout_Layout__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../layout/Layout */ "./src/layout/Layout.ts"); -/* harmony import */ var _Group_scss__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group.scss */ "./src/components/Group.scss"); - - - - - - - - - - - - - - - -class Group extends _AbstractComponent__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.updateUI = () => { - this.children = []; - const { style, type, items, emitter, isRoot } = this.state; - const { grid, left, top, width, height } = style; - this.label.style.height = `${grid * 0.3}px`; - this.container.style.left = `${left * grid}px`; - this.container.style.top = `${top * grid}px`; - this.container.style.width = `${width * grid}px`; - this.container.style.height = `${height * grid}px`; - this.container.className = ["faust-ui-group", `faust-ui-${type}`, `${isRoot ? "faust-ui-root" : ""}`].join(" "); - items.forEach((item) => { - if (item.type.endsWith("group")) { - const component = Group.getComponent(item, emitter, grid); - if (component) - this.children.push(component); - } else { - const ioItem = item; - const itemComponent = Group.getComponent(ioItem, this.state.emitter, grid); - if (itemComponent) - this.children.push(itemComponent); - } - }); - if (type === "tgroup") { - this.tabs.innerHTML = ""; - this.tabs.style.height = `${grid}px`; - this.tabs.style.top = `${0.25 * grid}px`; - this.state.items.forEach((item, i) => { - const label = item.label; - const tab = document.createElement("span"); - tab.innerText = label; - tab.className = "faust-ui-tgroup-tab"; - tab.style.fontSize = `${0.25 * grid}px`; - tab.style.width = `${2 * grid - 20}px`; - tab.style.height = `${grid - 20}px`; - tab.style.lineHeight = `${grid - 20}px`; - tab.addEventListener("click", () => { - const groups = []; - for (let j = 0; j < this.container.children.length; j++) { - const element = this.container.children[j]; - if (j > 1) - groups.push(element); - } - for (let j = 0; j < groups.length; j++) { - const element = groups[j]; - element.style.visibility = i === j ? "visible" : "hidden"; - } - for (let j = 0; j < this.tabs.children.length; j++) { - const e = this.tabs.children[j]; - if (i !== j) { - if (e.classList.contains("active")) - e.classList.remove("active"); - } else - e.classList.add("active"); - } - }); - this.tabs.appendChild(tab); - }); - } - }; - } - static parseMeta(metaIn) { - const metaObject = {}; - if (!metaIn) - return { metaObject }; - metaIn.forEach((m) => Object.assign(metaObject, m)); - if (metaObject.style) { - const enumsRegex = /\{(?:(?:'|_|-)(.+?)(?:'|_|-):([-+]?[0-9]*\.?[0-9]+?);)+(?:(?:'|_|-)(.+?)(?:'|_|-):([-+]?[0-9]*\.?[0-9]+?))\}/; - const matched = metaObject.style.match(enumsRegex); - if (matched) { - const itemsRegex = /(?:(?:'|_|-)(.+?)(?:'|_|-):([-+]?[0-9]*\.?[0-9]+?))/g; - const enums = {}; - let item; - while (item = itemsRegex.exec(matched[0])) { - enums[item[1]] = +item[2]; - } - return { metaObject, enums }; - } - } - return { metaObject }; - } - static getComponent(item, emitter, grid) { - const type = _layout_Layout__WEBPACK_IMPORTED_MODULE_13__["default"].predictType(item); - if (type.endsWith("group")) { - const { label: label2, items, type: type2, layout: layout2 } = item; - const props2 = { - label: label2, - type: type2, - items, - style: { - grid, - width: layout2.width, - height: layout2.height, - left: layout2.offsetLeft, - top: layout2.offsetTop, - labelcolor: "rgba(255, 255, 255, 0.7)" - }, - emitter - }; - return new Group(props2); - } - const ioItem = item; - const { metaObject, enums } = this.parseMeta(ioItem.meta); - const { tooltip, unit, scale } = metaObject; - const { label, min, max, address, layout } = ioItem; - const props = { - label, - address, - tooltip, - unit, - scale: scale || "linear", - emitter, - enums, - style: { - grid, - width: layout.width, - height: layout.height, - left: layout.offsetLeft, - top: layout.offsetTop - }, - type: "float", - min: isFinite(min) ? min : 0, - max: isFinite(max) ? max : 1, - step: "step" in item ? +item.step : 1, - value: "init" in item ? +item.init || 0 : 0 - }; - if (type === "button") - return new _Button__WEBPACK_IMPORTED_MODULE_4__["default"](props); - if (type === "checkbox") - return new _Checkbox__WEBPACK_IMPORTED_MODULE_5__["default"](props); - if (type === "nentry") - return new _Nentry__WEBPACK_IMPORTED_MODULE_3__["default"](props); - if (type === "knob") - return new _Knob__WEBPACK_IMPORTED_MODULE_6__["default"](props); - if (type === "menu") - return new _Menu__WEBPACK_IMPORTED_MODULE_7__["default"](props); - if (type === "radio") - return new _Radio__WEBPACK_IMPORTED_MODULE_8__["default"](props); - if (type === "hslider") - return new _HSlider__WEBPACK_IMPORTED_MODULE_1__["default"](props); - if (type === "vslider") - return new _VSlider__WEBPACK_IMPORTED_MODULE_2__["default"](props); - if (type === "hbargraph") - return new _HBargraph__WEBPACK_IMPORTED_MODULE_11__["default"](props); - if (type === "vbargraph") - return new _VBargraph__WEBPACK_IMPORTED_MODULE_12__["default"](props); - if (type === "numerical") - return new _Numerical__WEBPACK_IMPORTED_MODULE_10__["default"](props); - if (type === "led") - return new _Led__WEBPACK_IMPORTED_MODULE_9__["default"](props); - return null; - } - setState(newState) { - let shouldUpdate = false; - for (const key in newState) { - const stateKey = key; - const stateValue = newState[stateKey]; - if (stateKey === "style") { - for (const key2 in newState.style) { - const styleKey = key2; - if (styleKey in this.state.style && this.state.style[styleKey] !== newState.style[styleKey]) { - this.state.style[styleKey] = newState.style[styleKey]; - shouldUpdate = true; - } - } - } else if (stateKey in this.state && this.state[stateKey] !== stateValue) { - this.state[stateKey] = stateValue; - shouldUpdate = true; - } else - return; - if (shouldUpdate) - this.emit(stateKey, this.state[stateKey]); - } - } - componentWillMount() { - this.container = document.createElement("div"); - this.tabs = document.createElement("div"); - this.tabs.className = "faust-ui-tgroup-tabs"; - this.label = document.createElement("div"); - this.label.className = "faust-ui-group-label"; - this.labelCanvas = document.createElement("canvas"); - this.labelCtx = this.labelCanvas.getContext("2d"); - this.updateUI(); - this.children.forEach((item) => item.componentWillMount()); - return this; - } - paintLabel() { - const label = this.state.label; - const color = this.state.style.labelcolor; - const ctx = this.labelCtx; - const canvas = this.labelCanvas; - let { width, height } = this.label.getBoundingClientRect(); - if (!width || !height) - return this; - width = Math.floor(width); - height = Math.floor(height); - canvas.height = height; - canvas.width = width; - ctx.clearRect(0, 0, width, height); - ctx.fillStyle = color; - ctx.textBaseline = "middle"; - ctx.textAlign = "left"; - ctx.font = `bold ${height * 0.9}px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`; - ctx.fillText(label, 0, height / 2, width); - return this; - } - mount() { - this.label.appendChild(this.labelCanvas); - this.container.appendChild(this.label); - if (this.tabs.children.length) - this.container.appendChild(this.tabs); - this.children.forEach((item) => { - item.mount(); - this.container.appendChild(item.container); - }); - return this; - } - componentDidMount() { - const handleResize = () => { - const { grid, left, top, width, height } = this.state.style; - this.label.style.height = `${grid * 0.3}px`; - this.container.style.width = `${width * grid}px`; - this.container.style.height = `${height * grid}px`; - this.container.style.left = `${left * grid}px`; - this.container.style.top = `${top * grid}px`; - if (this.state.type === "tgroup") { - this.tabs.style.height = `${grid}px`; - this.tabs.style.top = `${0.25 * grid}px`; - for (let i = 0; i < this.tabs.children.length; i++) { - const tab = this.tabs.children[i]; - tab.style.fontSize = `${0.25 * grid}px`; - tab.style.width = `${2 * grid - 20}px`; - tab.style.height = `${grid - 20}px`; - tab.style.lineHeight = `${grid - 20}px`; - } - } - this.paintLabel(); - this.children.forEach((item) => item.setState({ style: { grid } })); - }; - this.on("style", () => this.schedule(handleResize)); - const itemsChange = () => { - this.updateUI(); - this.children.forEach((item) => item.componentWillMount()); - }; - this.on("items", () => this.schedule(itemsChange)); - const labelChange = () => { - this.paintLabel(); - this.label.title = this.state.label; - }; - this.on("label", () => this.schedule(labelChange)); - this.paintLabel(); - if (this.tabs && this.tabs.children.length) - this.tabs.children[0].click(); - this.children.forEach((item) => item.componentDidMount()); - return this; - } -} - - -/***/ }), - -/***/ "./src/components/HBargraph.ts": -/*!*************************************!*\ - !*** ./src/components/HBargraph.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ HBargraph) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _VBargraph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VBargraph */ "./src/components/VBargraph.ts"); -/* harmony import */ var _HBargraph_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./HBargraph.scss */ "./src/components/HBargraph.scss"); - - - -class HBargraph extends _VBargraph__WEBPACK_IMPORTED_MODULE_1__["default"] { - constructor() { - super(...arguments); - this.className = "hbargraph"; - this.setStyle = () => { - const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - this.input.style.fontSize = `${fontsize || height * grid * 0.2}px`; - this.input.style.color = textcolor; - this.container.style.backgroundColor = bgcolor; - this.container.style.borderColor = bordercolor; - }; - this.paint = () => { - const { barwidth, barbgcolor, coldcolor, warmcolor, hotcolor, overloadcolor } = this.state.style; - const { type, max, min, enums, scale, value } = this.state; - const ctx = this.ctx; - const canvas = this.canvas; - let { width, height } = this.canvasDiv.getBoundingClientRect(); - width = Math.floor(width); - height = Math.floor(height); - canvas.width = width; - canvas.height = height; - const drawWidth = width * 0.9; - const drawHeight = barwidth || Math.min(height / 3, drawWidth * 0.05); - const left = width * 0.05; - const top = (height - drawHeight) * 0.5; - this.paintValue = value; - const paintValue = this.paintValue; - if (paintValue > this.maxValue) { - this.maxValue = paintValue; - if (this.maxTimer) - window.clearTimeout(this.maxTimer); - this.maxTimer = window.setTimeout(() => { - this.maxValue = this.paintValue; - this.maxTimer = void 0; - this.schedule(this.paint); - }, 1e3); - } - if (paintValue < this.maxValue && typeof this.maxTimer === "undefined") { - this.maxTimer = window.setTimeout(() => { - this.maxValue = this.paintValue; - this.maxTimer = void 0; - this.schedule(this.paint); - }, 1e3); - } - const maxValue = this.maxValue; - const coldStop = (-18 - min) / (max - min); - const warmStop = (-6 - min) / (max - min); - const hotStop = (-3 - min) / (max - min); - const overloadStop = Math.max(0, -min / (max - min)); - const gradient = ctx.createLinearGradient(left, 0, drawWidth, 0); - if (coldStop <= 1 && coldStop >= 0) - gradient.addColorStop(coldStop, coldcolor); - else if (coldStop > 1) - gradient.addColorStop(1, coldcolor); - if (warmStop <= 1 && warmStop >= 0) - gradient.addColorStop(warmStop, warmcolor); - if (hotStop <= 1 && hotStop >= 0) - gradient.addColorStop(hotStop, hotcolor); - if (overloadStop <= 1 && overloadStop >= 0) - gradient.addColorStop(overloadStop, overloadcolor); - else if (overloadStop < 0) - gradient.addColorStop(0, coldcolor); - ctx.fillStyle = barbgcolor; - if (paintValue < 0) - ctx.fillRect(left, top, drawWidth * overloadStop, drawHeight); - if (paintValue < max) - ctx.fillRect(left + drawWidth * overloadStop + 1, top, drawWidth * (1 - overloadStop) - 1, drawHeight); - ctx.fillStyle = gradient; - if (paintValue > min) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(0, paintValue) })); - ctx.fillRect(left, top, distance * drawWidth, drawHeight); - } - if (paintValue > 0) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(max, paintValue) }) - overloadStop); - ctx.fillRect(left + overloadStop * drawWidth + 1, top, distance * drawWidth - 1, drawHeight); - } - if (maxValue > paintValue) { - if (maxValue <= 0) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(0, maxValue) })); - ctx.fillRect(left + distance * drawWidth - 1, top, 1, drawHeight); - } - if (maxValue > 0) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(max, maxValue) }) - overloadStop); - ctx.fillRect(left + Math.min(drawWidth - 1, (overloadStop + distance) * drawWidth), top, 1, drawHeight); - } - } - }; - } - paintLabel() { - return super.paintLabel("left"); - } -} - - -/***/ }), - -/***/ "./src/components/HSlider.ts": -/*!***********************************!*\ - !*** ./src/components/HSlider.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ HSlider) -/* harmony export */ }); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/components/utils.ts"); -/* harmony import */ var _VSlider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VSlider */ "./src/components/VSlider.ts"); -/* harmony import */ var _HSlider_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./HSlider.scss */ "./src/components/HSlider.scss"); - - - -class HSlider extends _VSlider__WEBPACK_IMPORTED_MODULE_1__["default"] { - constructor() { - super(...arguments); - this.className = "hslider"; - this.setStyle = () => { - const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - this.input.style.fontSize = `${fontsize || height * grid * 0.2}px`; - this.input.style.color = textcolor; - this.container.style.backgroundColor = bgcolor; - this.container.style.borderColor = bordercolor; - }; - this.paint = () => { - const { sliderwidth, sliderbgcolor, sliderbgoncolor, slidercolor } = this.state.style; - const ctx = this.ctx; - const canvas = this.canvas; - const distance = this.distance; - let { width, height } = this.canvasDiv.getBoundingClientRect(); - width = Math.floor(width); - height = Math.floor(height); - canvas.width = width; - canvas.height = height; - const drawWidth = width * 0.9; - const drawHeight = sliderwidth || Math.min(height / 3, drawWidth * 0.05); - const left = width * 0.05; - const top = (height - drawHeight) * 0.5; - const borderRadius = drawHeight * 0.25; - this.interactionRect = [left, 0, drawWidth, height]; - const grd = ctx.createLinearGradient(left, 0, left + drawWidth, 0); - grd.addColorStop(Math.max(0, Math.min(1, distance)), sliderbgoncolor); - grd.addColorStop(Math.max(0, Math.min(1, distance)), sliderbgcolor); - ctx.fillStyle = grd; - (0,_utils__WEBPACK_IMPORTED_MODULE_0__.fillRoundedRect)(ctx, left, top, drawWidth, drawHeight, borderRadius); - ctx.fillStyle = slidercolor; - (0,_utils__WEBPACK_IMPORTED_MODULE_0__.fillRoundedRect)(ctx, left + drawWidth * distance - drawHeight, top - drawHeight, drawHeight * 2, drawHeight * 3, borderRadius); - }; - } - paintLabel() { - return super.paintLabel("left"); - } -} - - -/***/ }), - -/***/ "./src/components/Knob.ts": -/*!********************************!*\ - !*** ./src/components/Knob.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Knob) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/components/utils.ts"); -/* harmony import */ var _Knob_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Knob.scss */ "./src/components/Knob.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - - -class Knob extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "knob"; - this.handleChange = (e) => { - const value = parseFloat(e.currentTarget.value); - if (isFinite(value)) { - const changed = this.setValue(+this.inputNumber.value); - if (changed) - return; - } - this.input.value = this.inputNumber.value + (this.state.unit || ""); - }; - this.setStyle = () => { - const { fontsize, height, grid, textcolor, bgcolor, bordercolor } = this.state.style; - this.input.style.fontSize = `${fontsize || height * grid * 0.1}px`; - this.input.style.color = textcolor; - this.container.style.backgroundColor = bgcolor; - this.container.style.borderColor = bordercolor; - }; - this.paint = () => { - const { knobwidth, knobcolor, knoboncolor, needlecolor } = this.state.style; - const ctx = this.ctx; - const canvas = this.canvas; - const distance = this.distance; - let { width, height } = this.canvas.getBoundingClientRect(); - width = Math.floor(width); - height = Math.floor(height); - canvas.width = width; - canvas.height = height; - const start = 5 / 8 * Math.PI; - const end = 19 / 8 * Math.PI; - const valPos = start + (0,_utils__WEBPACK_IMPORTED_MODULE_1__.toRad)(distance * 315); - const dialHeight = Math.min(width, height) * 0.75; - const dialRadius = dialHeight * 0.5; - const dialCenterX = width * 0.5; - const dialCenterY = height * 0.5; - const valuePosX = dialCenterX + dialHeight * 0.5 * Math.cos(valPos); - const valuePosY = dialCenterY + dialHeight * 0.5 * Math.sin(valPos); - const lineWidth = knobwidth || dialRadius * 0.2; - ctx.strokeStyle = knobcolor; - ctx.lineWidth = lineWidth; - ctx.lineCap = "round"; - ctx.beginPath(); - ctx.arc(dialCenterX, dialCenterY, dialRadius, valPos, end); - ctx.stroke(); - if (distance) { - ctx.strokeStyle = knoboncolor; - ctx.beginPath(); - ctx.arc(dialCenterX, dialCenterY, dialRadius, start, valPos); - ctx.stroke(); - } - ctx.strokeStyle = needlecolor; - ctx.beginPath(); - ctx.moveTo(dialCenterX, dialCenterY); - ctx.lineTo(valuePosX, valuePosY); - ctx.stroke(); - }; - this.handlePointerDrag = (e) => { - const newValue = this.getValueFromDelta(e); - if (newValue !== this.state.value) - this.setValue(newValue); - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(18, 18, 18, 0)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)", - knobwidth: void 0, - knobcolor: "rgba(18, 18, 18, 1)", - knoboncolor: "rgba(255, 165, 0, 1)", - needlecolor: "rgba(200, 200, 200, 0.75)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.canvas = document.createElement("canvas"); - this.canvas.width = 10; - this.canvas.height = 10; - this.ctx = this.canvas.getContext("2d"); - this.inputNumber = document.createElement("input"); - this.inputNumber.type = "number"; - this.inputNumber.value = (+this.state.value.toFixed(3)).toString(); - this.inputNumber.max = this.state.max.toString(); - this.inputNumber.min = this.state.min.toString(); - this.inputNumber.step = this.state.step.toString(); - this.input = document.createElement("input"); - this.input.value = this.inputNumber.value + (this.state.unit || ""); - this.input.spellcheck = false; - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.input.addEventListener("change", this.handleChange); - this.canvas.addEventListener("mousedown", this.handleMouseDown); - this.canvas.addEventListener("touchstart", this.handleTouchStart, { passive: false }); - this.on("style", () => { - this.schedule(this.setStyle); - this.schedule(this.paint); - }); - this.on("label", () => this.schedule(this.paintLabel)); - const valueChange = () => { - this.inputNumber.value = (+this.state.value.toFixed(3)).toString(); - this.input.value = this.inputNumber.value + (this.state.unit || ""); - }; - this.on("value", () => { - this.schedule(valueChange); - this.schedule(this.paint); - }); - const maxChange = () => this.inputNumber.max = this.state.max.toString(); - this.on("max", () => { - this.schedule(maxChange); - this.schedule(this.paint); - }); - const minChange = () => this.inputNumber.min = this.state.min.toString(); - this.on("min", () => { - this.schedule(minChange); - this.schedule(this.paint); - }); - const stepChange = () => this.inputNumber.step = this.state.step.toString(); - this.on("step", () => { - this.schedule(stepChange); - this.schedule(this.paint); - }); - this.schedule(this.paint); - return this; - } - mount() { - this.container.appendChild(this.label); - this.container.appendChild(this.canvas); - this.container.appendChild(this.input); - return super.mount(); - } - getValueFromDelta(e) { - const { type, min, max, enums, scale } = this.state; - const step = type === "enum" ? 1 : this.state.step || 1; - const stepRange = this.stepRange; - const stepsCount = this.stepsCount; - const range = 100; - const prevDistance = _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ value: e.prevValue, type, min, max, enums, scale }) * range; - const distance = prevDistance + e.fromY - e.y; - const denormalized = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.denormalize)(distance / range, min, max); - const v = scale === "exp" ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normExp)(denormalized, min, max) : scale === "log" ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normLog)(denormalized, min, max) : denormalized; - let steps = Math.round((0,_utils__WEBPACK_IMPORTED_MODULE_1__.normalize)(v, min, max) * range / stepRange); - steps = Math.min(stepsCount, Math.max(0, steps)); - if (type === "enum") - return steps; - if (type === "int") - return Math.round(steps * step + min); - return steps * step + min; - } -} - - -/***/ }), - -/***/ "./src/components/Led.ts": -/*!*******************************!*\ - !*** ./src/components/Led.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Led) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _Led_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Led.scss */ "./src/components/Led.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class Led extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "led"; - this.setStyle = () => { - const { bgcolor, bordercolor } = this.state.style; - this.container.style.backgroundColor = bgcolor; - this.container.style.borderColor = bordercolor; - }; - this.paint = () => { - const { shape, ledbgcolor, coldcolor, warmcolor, hotcolor, overloadcolor } = this.state.style; - const { min, max } = this.state; - const { canvas, ctx, tempCanvas, tempCtx, distance } = this; - const { width, height } = canvas.getBoundingClientRect(); - canvas.width = width; - canvas.height = height; - const drawHeight = Math.min(height, width) * 0.75; - const drawWidth = drawHeight; - const left = (width - drawWidth) * 0.5; - const top = (height - drawHeight) * 0.5; - const coldStop = (-18 - min) / (max - min); - const warmStop = (-6 - min) / (max - min); - const hotStop = (-3 - min) / (max - min); - const overloadStop = -min / (max - min); - const gradient = tempCtx.createLinearGradient(0, 0, tempCanvas.width, 0); - if (coldStop <= 1 && coldStop >= 0) - gradient.addColorStop(coldStop, coldcolor); - else if (coldStop > 1) - gradient.addColorStop(1, coldcolor); - if (warmStop <= 1 && warmStop >= 0) - gradient.addColorStop(warmStop, warmcolor); - if (hotStop <= 1 && hotStop >= 0) - gradient.addColorStop(hotStop, hotcolor); - if (overloadStop <= 1 && overloadStop >= 0) - gradient.addColorStop(overloadStop, overloadcolor); - else if (overloadStop < 0) - gradient.addColorStop(0, coldcolor); - tempCtx.fillStyle = gradient; - tempCtx.fillRect(0, 0, tempCanvas.width, 10); - const d = tempCtx.getImageData(Math.min(tempCanvas.width - 1, distance * tempCanvas.width), 0, 1, 1).data; - if (distance) - ctx.fillStyle = `rgb(${d[0]}, ${d[1]}, ${d[2]})`; - else - ctx.fillStyle = ledbgcolor; - if (shape === "circle") - ctx.arc(width / 2, height / 2, width / 2 - left, 0, 2 * Math.PI); - else - ctx.rect(left, top, drawWidth, drawHeight); - ctx.fill(); - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(18, 18, 18, 0)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)", - shape: "circle", - ledbgcolor: "rgba(18, 18, 18, 1)", - coldcolor: "rgba(12, 248, 100, 1)", - warmcolor: "rgba(195, 248, 100, 1)", - hotcolor: "rgba(255, 193, 10, 1)", - overloadcolor: "rgba(255, 10, 10, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.canvasDiv = document.createElement("div"); - this.canvasDiv.className = `faust-ui-component-${this.className}-canvasdiv`; - this.canvas = document.createElement("canvas"); - this.canvas.width = 10; - this.canvas.height = 10; - this.ctx = this.canvas.getContext("2d"); - this.tempCanvas = document.createElement("canvas"); - this.tempCtx = this.tempCanvas.getContext("2d"); - this.tempCanvas.width = 128; - this.tempCanvas.height = 1; - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.canvas.addEventListener("mousedown", this.handleMouseDown); - this.canvas.addEventListener("touchstart", this.handleTouchStart, { passive: false }); - this.on("style", () => this.schedule(this.setStyle)); - this.on("label", () => this.schedule(this.paintLabel)); - this.on("value", () => this.schedule(this.paint)); - this.on("max", () => this.schedule(this.paint)); - this.on("min", () => this.schedule(this.paint)); - this.on("step", () => this.schedule(this.paint)); - this.schedule(this.paint); - return this; - } - mount() { - this.canvasDiv.appendChild(this.canvas); - this.container.appendChild(this.label); - this.container.appendChild(this.canvasDiv); - return super.mount(); - } -} - - -/***/ }), - -/***/ "./src/components/Menu.ts": -/*!********************************!*\ - !*** ./src/components/Menu.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Menu) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _Menu_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Menu.scss */ "./src/components/Menu.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class Menu extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "menu"; - this.handleChange = (e) => { - this.setValue(+e.currentTarget.value); - }; - this.setStyle = () => { - const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - this.select.style.backgroundColor = bgcolor; - this.select.style.borderColor = bordercolor; - this.select.style.color = textcolor; - this.select.style.fontSize = `${fontsize || height * grid / 4}px`; - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(255, 255, 255, 0.25)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.select = document.createElement("select"); - this.getOptions(); - this.setStyle(); - return this; - } - getOptions() { - const { enums } = this.state; - this.select.innerHTML = ""; - if (enums) { - let i = 0; - for (const key in enums) { - const option = document.createElement("option"); - option.value = enums[key].toString(); - option.text = key; - if (i === 0) - option.selected = true; - this.select.appendChild(option); - i++; - } - } - } - componentDidMount() { - super.componentDidMount(); - this.select.addEventListener("change", this.handleChange); - this.on("style", () => this.schedule(this.setStyle)); - this.on("label", () => this.schedule(this.paintLabel)); - this.on("enums", () => this.schedule(this.getOptions)); - const valueChange = () => { - for (let i = this.select.children.length - 1; i >= 0; i--) { - const option = this.select.children[i]; - if (+option.value === this.state.value) - this.select.selectedIndex = i; - } - }; - this.on("value", () => this.schedule(valueChange)); - valueChange(); - return this; - } - mount() { - this.container.appendChild(this.label); - this.container.appendChild(this.select); - return super.mount(); - } -} - - -/***/ }), - -/***/ "./src/components/Nentry.ts": -/*!**********************************!*\ - !*** ./src/components/Nentry.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Nentry) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _Nentry_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Nentry.scss */ "./src/components/Nentry.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class Nentry extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "nentry"; - this.handleChange = (e) => { - this.setValue(+e.currentTarget.value); - }; - this.setStyle = () => { - const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - this.input.style.backgroundColor = bgcolor; - this.input.style.borderColor = bordercolor; - this.input.style.color = textcolor; - this.input.style.fontSize = `${fontsize || height * grid / 4}px`; - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(255, 255, 255, 0.25)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.input = document.createElement("input"); - this.input.type = "number"; - this.input.value = (+this.state.value.toFixed(3)).toString(); - this.input.max = this.state.max.toString(); - this.input.min = this.state.min.toString(); - this.input.step = this.state.step.toString(); - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.input.addEventListener("change", this.handleChange); - this.on("style", () => this.schedule(this.setStyle)); - this.on("label", () => this.schedule(this.paintLabel)); - const valueChange = () => this.input.value = (+this.state.value.toFixed(3)).toString(); - this.on("value", () => this.schedule(valueChange)); - const maxChange = () => this.input.max = this.state.max.toString(); - this.on("max", () => this.schedule(maxChange)); - const minChange = () => this.input.min = this.state.min.toString(); - this.on("min", () => this.schedule(minChange)); - const stepChange = () => this.input.step = this.state.step.toString(); - this.on("step", () => this.schedule(stepChange)); - return this; - } - mount() { - this.container.appendChild(this.label); - this.container.appendChild(this.input); - return super.mount(); - } -} - - -/***/ }), - -/***/ "./src/components/Numerical.ts": -/*!*************************************!*\ - !*** ./src/components/Numerical.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Numerical) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _Numerical_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Numerical.scss */ "./src/components/Numerical.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class Numerical extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "numerical"; - this.setStyle = () => { - const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - this.input.style.backgroundColor = bgcolor; - this.input.style.borderColor = bordercolor; - this.input.style.color = textcolor; - this.input.style.fontSize = `${fontsize || height * grid / 4}px`; - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(255, 255, 255, 0.25)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.input = document.createElement("input"); - this.input.disabled = true; - this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || ""); - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.on("style", () => this.schedule(this.setStyle)); - this.on("label", () => this.schedule(this.paintLabel)); - const valueChange = () => this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || ""); - this.on("value", () => this.schedule(valueChange)); - return this; - } - mount() { - this.container.appendChild(this.label); - this.container.appendChild(this.input); - return super.mount(); - } -} - - -/***/ }), - -/***/ "./src/components/Radio.ts": -/*!*********************************!*\ - !*** ./src/components/Radio.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Radio) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _Radio_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Radio.scss */ "./src/components/Radio.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class Radio extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "radio"; - this.getOptions = () => { - const { enums, address } = this.state; - this.group.innerHTML = ""; - if (enums) { - let i = 0; - for (const key in enums) { - const input = document.createElement("input"); - const div = document.createElement("div"); - input.value = enums[key].toString(); - input.name = address; - input.type = "radio"; - if (i === 0) - input.checked = true; - input.addEventListener("change", () => { - if (input.checked) - this.setValue(enums[key]); - }); - div.appendChild(input); - div.append(key); - this.group.appendChild(div); - i++; - } - } - }; - this.setStyle = () => { - const { height, width, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - const fontSize = Math.min(height * grid * 0.1, width * grid * 0.1); - this.group.style.backgroundColor = bgcolor; - this.group.style.borderColor = bordercolor; - this.group.style.color = textcolor; - this.group.style.fontSize = `${fontsize || fontSize}px`; - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(255, 255, 255, 0.25)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.group = document.createElement("div"); - this.group.className = "faust-ui-component-radio-group"; - this.getOptions(); - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.on("style", () => this.schedule(this.setStyle)); - this.on("label", () => this.schedule(this.paintLabel)); - this.on("enums", () => this.schedule(this.getOptions)); - const valueChange = () => { - for (let i = this.group.children.length - 1; i >= 0; i--) { - const input = this.group.children[i].querySelector("input"); - if (+input.value === this.state.value) - input.checked = true; - } - }; - this.on("value", () => this.schedule(valueChange)); - valueChange(); - return this; - } - mount() { - this.container.appendChild(this.label); - this.container.appendChild(this.group); - return super.mount(); - } -} - - -/***/ }), - -/***/ "./src/components/VBargraph.ts": -/*!*************************************!*\ - !*** ./src/components/VBargraph.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ VBargraph) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _VBargraph_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VBargraph.scss */ "./src/components/VBargraph.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - -class VBargraph extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "vbargraph"; - this.setStyle = () => { - const { height, width, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - const fontSize = Math.min(height * grid * 0.05, width * grid * 0.2); - this.input.style.fontSize = `${fontsize || fontSize}px`; - this.input.style.color = textcolor; - this.container.style.backgroundColor = bgcolor; - this.container.style.borderColor = bordercolor; - }; - this.paintValue = 0; - this.maxValue = -Infinity; - this.paint = () => { - const { barwidth, barbgcolor, coldcolor, warmcolor, hotcolor, overloadcolor } = this.state.style; - const { type, max, min, enums, scale, value } = this.state; - const ctx = this.ctx; - const canvas = this.canvas; - let { width, height } = this.canvasDiv.getBoundingClientRect(); - width = Math.floor(width); - height = Math.floor(height); - canvas.width = width; - canvas.height = height; - const drawHeight = height * 0.9; - const drawWidth = barwidth || Math.min(width / 3, drawHeight * 0.05); - const left = (width - drawWidth) * 0.5; - const top = height * 0.05; - this.paintValue = value; - const paintValue = this.paintValue; - if (paintValue > this.maxValue) { - this.maxValue = paintValue; - if (this.maxTimer) - window.clearTimeout(this.maxTimer); - this.maxTimer = window.setTimeout(() => { - this.maxValue = this.paintValue; - this.maxTimer = void 0; - this.schedule(this.paint); - }, 1e3); - } - if (paintValue < this.maxValue && typeof this.maxTimer === "undefined") { - this.maxTimer = window.setTimeout(() => { - this.maxValue = this.paintValue; - this.maxTimer = void 0; - this.schedule(this.paint); - }, 1e3); - } - const maxValue = this.maxValue; - const coldStop = (-18 - min) / (max - min); - const warmStop = (-6 - min) / (max - min); - const hotStop = (-3 - min) / (max - min); - const overloadStop = Math.max(0, -min / (max - min)); - const gradient = ctx.createLinearGradient(0, drawHeight, 0, top); - if (coldStop <= 1 && coldStop >= 0) - gradient.addColorStop(coldStop, coldcolor); - else if (coldStop > 1) - gradient.addColorStop(1, coldcolor); - if (warmStop <= 1 && warmStop >= 0) - gradient.addColorStop(warmStop, warmcolor); - if (hotStop <= 1 && hotStop >= 0) - gradient.addColorStop(hotStop, hotcolor); - if (overloadStop <= 1 && overloadStop >= 0) - gradient.addColorStop(overloadStop, overloadcolor); - else if (overloadStop < 0) - gradient.addColorStop(0, coldcolor); - ctx.fillStyle = barbgcolor; - if (paintValue < 0) - ctx.fillRect(left, top + (1 - overloadStop) * drawHeight, drawWidth, drawHeight * overloadStop); - if (paintValue < max) - ctx.fillRect(left, top, drawWidth, (1 - overloadStop) * drawHeight - 1); - ctx.fillStyle = gradient; - if (paintValue > min) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(0, paintValue) })); - ctx.fillRect(left, top + (1 - distance) * drawHeight, drawWidth, drawHeight * distance); - } - if (paintValue > 0) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(max, paintValue) }) - overloadStop); - ctx.fillRect(left, top + (1 - overloadStop - distance) * drawHeight, drawWidth, drawHeight * distance - 1); - } - if (maxValue > paintValue) { - if (maxValue <= 0) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(0, maxValue) })); - ctx.fillRect(left, top + (1 - distance) * drawHeight, drawWidth, 1); - } - if (maxValue > 0) { - const distance = Math.max(0, _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"].getDistance({ type, max, min, enums, scale, value: Math.min(max, maxValue) }) - overloadStop); - ctx.fillRect(left, Math.max(top, top + (1 - overloadStop - distance) * drawHeight - 1), drawWidth, 1); - } - } - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(18, 18, 18, 0)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)", - barwidth: void 0, - barbgcolor: "rgba(18, 18, 18, 1)", - coldcolor: "rgba(12, 248, 100, 1)", - warmcolor: "rgba(195, 248, 100, 1)", - hotcolor: "rgba(255, 193, 10, 1)", - overloadcolor: "rgba(255, 10, 10, 1)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.flexDiv = document.createElement("div"); - this.flexDiv.className = `faust-ui-component-${this.className}-flexdiv`; - this.canvasDiv = document.createElement("div"); - this.canvasDiv.className = `faust-ui-component-${this.className}-canvasdiv`; - this.canvas = document.createElement("canvas"); - this.canvas.width = 10; - this.canvas.height = 10; - this.ctx = this.canvas.getContext("2d"); - this.input = document.createElement("input"); - this.input.disabled = true; - this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || ""); - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.canvas.addEventListener("mousedown", this.handleMouseDown); - this.canvas.addEventListener("touchstart", this.handleTouchStart, { passive: false }); - this.on("style", () => { - this.schedule(this.setStyle); - this.schedule(this.paint); - }); - this.on("label", () => this.schedule(this.paintLabel)); - const valueChange = () => this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || ""); - this.on("value", () => { - this.schedule(valueChange); - this.schedule(this.paint); - }); - this.on("max", () => this.schedule(this.paint)); - this.on("min", () => this.schedule(this.paint)); - this.on("step", () => this.schedule(this.paint)); - this.schedule(this.paint); - return this; - } - mount() { - this.canvasDiv.appendChild(this.canvas); - this.flexDiv.appendChild(this.canvasDiv); - this.flexDiv.appendChild(this.input); - this.container.appendChild(this.label); - this.container.appendChild(this.flexDiv); - return super.mount(); - } -} - - -/***/ }), - -/***/ "./src/components/VSlider.ts": -/*!***********************************!*\ - !*** ./src/components/VSlider.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ VSlider) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/components/AbstractItem.ts"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/components/utils.ts"); -/* harmony import */ var _VSlider_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./VSlider.scss */ "./src/components/VSlider.scss"); -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - - - -class VSlider extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.className = "vslider"; - this.interactionRect = [0, 0, 0, 0]; - this.handleChange = (e) => { - const value = parseFloat(e.currentTarget.value); - if (isFinite(value)) { - const changed = this.setValue(+value); - if (changed) - return; - } - this.input.value = this.inputNumber.value + (this.state.unit || ""); - }; - this.setStyle = () => { - const { height, width, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style; - const fontSize = Math.min(height * grid * 0.05, width * grid * 0.2); - this.input.style.fontSize = `${fontsize || fontSize}px`; - this.input.style.color = textcolor; - this.container.style.backgroundColor = bgcolor; - this.container.style.borderColor = bordercolor; - }; - this.paint = () => { - const { sliderwidth, sliderbgcolor, sliderbgoncolor, slidercolor } = this.state.style; - const ctx = this.ctx; - const canvas = this.canvas; - const distance = this.distance; - let { width, height } = this.canvasDiv.getBoundingClientRect(); - width = Math.floor(width); - height = Math.floor(height); - canvas.width = width; - canvas.height = height; - const drawHeight = height * 0.9; - const drawWidth = sliderwidth || Math.min(width / 3, drawHeight * 0.05); - const left = (width - drawWidth) * 0.5; - const top = height * 0.05; - const borderRadius = drawWidth * 0.25; - this.interactionRect = [0, top, width, drawHeight]; - const grd = ctx.createLinearGradient(0, top, 0, top + drawHeight); - grd.addColorStop(Math.max(0, Math.min(1, 1 - distance)), sliderbgcolor); - grd.addColorStop(Math.max(0, Math.min(1, 1 - distance)), sliderbgoncolor); - ctx.fillStyle = grd; - (0,_utils__WEBPACK_IMPORTED_MODULE_1__.fillRoundedRect)(ctx, left, top, drawWidth, drawHeight, borderRadius); - ctx.fillStyle = slidercolor; - (0,_utils__WEBPACK_IMPORTED_MODULE_1__.fillRoundedRect)(ctx, left - drawWidth, top + drawHeight * (1 - distance) - drawWidth, drawWidth * 3, drawWidth * 2, borderRadius); - }; - this.handlePointerDown = (e) => { - const { value } = this.state; - if (e.x < this.interactionRect[0] || e.x > this.interactionRect[0] + this.interactionRect[2] || e.y < this.interactionRect[1] || e.y > this.interactionRect[1] + this.interactionRect[3]) - return; - const newValue = this.getValueFromPos(e); - if (newValue !== value) - this.setValue(this.getValueFromPos(e)); - }; - this.handlePointerDrag = (e) => { - const newValue = this.getValueFromPos(e); - if (newValue !== this.state.value) - this.setValue(newValue); - }; - } - static get defaultProps() { - const inherited = super.defaultProps; - return __spreadProps(__spreadValues({}, inherited), { - style: __spreadProps(__spreadValues({}, inherited.style), { - fontname: "Arial", - fontsize: void 0, - fontface: "regular", - bgcolor: "rgba(18, 18, 18, 0)", - bordercolor: "rgba(80, 80, 80, 0)", - labelcolor: "rgba(226, 222, 255, 0.5)", - textcolor: "rgba(18, 18, 18, 1)", - sliderwidth: void 0, - sliderbgcolor: "rgba(18, 18, 18, 1)", - sliderbgoncolor: "rgba(255, 165, 0, 1)", - slidercolor: "rgba(200, 200, 200, 0.75)" - }) - }); - } - componentWillMount() { - super.componentWillMount(); - this.flexDiv = document.createElement("div"); - this.flexDiv.className = `faust-ui-component-${this.className}-flexdiv`; - this.canvasDiv = document.createElement("div"); - this.canvasDiv.className = `faust-ui-component-${this.className}-canvasdiv`; - this.canvas = document.createElement("canvas"); - this.canvas.width = 10; - this.canvas.height = 10; - this.ctx = this.canvas.getContext("2d"); - this.inputNumber = document.createElement("input"); - this.inputNumber.type = "number"; - this.inputNumber.value = (+this.state.value.toFixed(3)).toString(); - this.inputNumber.max = this.state.max.toString(); - this.inputNumber.min = this.state.min.toString(); - this.inputNumber.step = this.state.step.toString(); - this.input = document.createElement("input"); - this.input.value = this.inputNumber.value + (this.state.unit || ""); - this.input.spellcheck = false; - this.setStyle(); - return this; - } - componentDidMount() { - super.componentDidMount(); - this.input.addEventListener("change", this.handleChange); - this.canvas.addEventListener("mousedown", this.handleMouseDown); - this.canvas.addEventListener("touchstart", this.handleTouchStart, { passive: false }); - this.on("style", () => { - this.schedule(this.setStyle); - this.schedule(this.paint); - }); - this.on("label", () => this.schedule(this.paintLabel)); - const valueChange = () => { - this.inputNumber.value = (+this.state.value.toFixed(3)).toString(); - this.input.value = this.inputNumber.value + (this.state.unit || ""); - }; - this.on("value", () => { - this.schedule(valueChange); - this.schedule(this.paint); - }); - const maxChange = () => this.inputNumber.max = this.state.max.toString(); - this.on("max", () => { - this.schedule(maxChange); - this.schedule(this.paint); - }); - const minChange = () => this.inputNumber.min = this.state.min.toString(); - this.on("min", () => { - this.schedule(minChange); - this.schedule(this.paint); - }); - const stepChange = () => this.inputNumber.step = this.state.step.toString(); - this.on("step", () => { - this.schedule(stepChange); - this.schedule(this.paint); - }); - this.schedule(this.paint); - return this; - } - mount() { - this.canvasDiv.appendChild(this.canvas); - this.flexDiv.appendChild(this.canvasDiv); - this.flexDiv.appendChild(this.input); - this.container.appendChild(this.label); - this.container.appendChild(this.flexDiv); - return super.mount(); - } - get stepsCount() { - const { type, max, min, step, enums } = this.state; - const maxSteps = type === "enum" ? enums.length : type === "int" ? max - min : (max - min) / step; - if (step) { - if (type === "enum") - return enums.length; - if (type === "int") - return Math.min(Math.floor((max - min) / (Math.round(step) || 0)), maxSteps); - return Math.floor((max - min) / step); - } - return maxSteps; - } - get stepRange() { - const full = this.interactionRect[this.className === "vslider" ? 3 : 2]; - const stepsCount = this.stepsCount; - return full / stepsCount; - } - getValueFromPos(e) { - const { type, min, max, scale } = this.state; - const step = type === "enum" ? 1 : this.state.step || 1; - const stepRange = this.stepRange; - const stepsCount = this.stepsCount; - const distance = this.className === "vslider" ? this.interactionRect[3] - (e.y - this.interactionRect[1]) : e.x - this.interactionRect[0]; - const range = this.className === "vslider" ? this.interactionRect[3] : this.interactionRect[2]; - const denormalized = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.denormalize)(distance / range, min, max); - const v = scale === "exp" ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normExp)(denormalized, min, max) : scale === "log" ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normLog)(denormalized, min, max) : denormalized; - let steps = Math.round((0,_utils__WEBPACK_IMPORTED_MODULE_1__.normalize)(v, min, max) * range / stepRange); - steps = Math.min(stepsCount, Math.max(0, steps)); - if (type === "enum") - return steps; - if (type === "int") - return Math.round(steps * step + min); - return steps * step + min; - } -} - - -/***/ }), - -/***/ "./src/components/utils.ts": -/*!*********************************!*\ - !*** ./src/components/utils.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ atodb: () => (/* binding */ atodb), -/* harmony export */ dbtoa: () => (/* binding */ dbtoa), -/* harmony export */ denormalize: () => (/* binding */ denormalize), -/* harmony export */ fillRoundedRect: () => (/* binding */ fillRoundedRect), -/* harmony export */ iNormExp: () => (/* binding */ iNormExp), -/* harmony export */ iNormLog: () => (/* binding */ iNormLog), -/* harmony export */ normExp: () => (/* binding */ normExp), -/* harmony export */ normLog: () => (/* binding */ normLog), -/* harmony export */ normalize: () => (/* binding */ normalize), -/* harmony export */ roundedRect: () => (/* binding */ roundedRect), -/* harmony export */ toMIDI: () => (/* binding */ toMIDI), -/* harmony export */ toRad: () => (/* binding */ toRad) -/* harmony export */ }); -const toMIDI = (f) => ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"][(f % 12 + 12) % 12] + Math.round(f / 12 - 2); -const toRad = (degrees) => degrees * Math.PI / 180; -const atodb = (a) => 20 * Math.log10(a); -const dbtoa = (db) => 10 ** (db / 20); -const denormalize = (x, min, max) => min + (max - min) * x; -const normalize = (x, min, max) => (x - min) / (max - min) || 0; -const normLog = (x, min, max) => { - const normalized = normalize(x, min, max); - const logMin = Math.log(Math.max(Number.EPSILON, min)); - const logMax = Math.log(Math.max(Number.EPSILON, max)); - const vLog = denormalize(normalized, logMin, logMax); - const v = Math.exp(vLog); - return Math.max(min, Math.min(max, v)); -}; -const iNormLog = (vIn, min, max) => { - const v = Math.max(min, Math.min(max, vIn)); - const vLog = Math.log(Math.max(Number.EPSILON, v)); - const logMin = Math.log(Math.max(Number.EPSILON, min)); - const logMax = Math.log(Math.max(Number.EPSILON, max)); - const normalized = normalize(vLog, logMin, logMax); - return denormalize(normalized, min, max); -}; -const normExp = iNormLog; -const iNormExp = normLog; -const roundedRect = (ctx, x, y, width, height, radius) => { - const radii = [0, 0, 0, 0]; - if (typeof radius === "number") - radii.fill(radius); - else - radius.forEach((v, i) => radii[i] = v); - ctx.beginPath(); - ctx.moveTo(x + radii[0], y); - ctx.lineTo(x + width - radii[1], y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radii[1]); - ctx.lineTo(x + width, y + height - radii[2]); - ctx.quadraticCurveTo(x + width, y + height, x + width - radii[2], y + height); - ctx.lineTo(x + radii[3], y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radii[3]); - ctx.lineTo(x, y + radii[0]); - ctx.quadraticCurveTo(x, y, x + radii[0], y); - ctx.closePath(); - ctx.stroke(); -}; -const fillRoundedRect = (ctx, x, y, width, height, radius) => { - const radii = [0, 0, 0, 0]; - if (typeof radius === "number") - radii.fill(radius); - else - radius.forEach((v, i) => radii[i] = v); - ctx.beginPath(); - ctx.moveTo(x + radii[0], y); - ctx.lineTo(x + width - radii[1], y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radii[1]); - ctx.lineTo(x + width, y + height - radii[2]); - ctx.quadraticCurveTo(x + width, y + height, x + width - radii[2], y + height); - ctx.lineTo(x + radii[3], y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radii[3]); - ctx.lineTo(x, y + radii[0]); - ctx.quadraticCurveTo(x, y, x + radii[0], y); - ctx.closePath(); - ctx.fill(); -}; - - -/***/ }), - -/***/ "./src/instantiate.ts": -/*!****************************!*\ - !*** ./src/instantiate.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _FaustUI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FaustUI */ "./src/FaustUI.ts"); - -const instantiate = () => { - const faustUI = new _FaustUI__WEBPACK_IMPORTED_MODULE_0__["default"]({ - root: document.getElementById("root"), - listenWindowResize: true, - listenWindowMessage: true - }); - let host; - window.addEventListener("message", (e) => { - const { source } = e; - host = source; - }); - window.addEventListener("keydown", (e) => { - if (host) - host.postMessage({ type: "keydown", key: e.key }, "*"); - }); - window.addEventListener("keyup", (e) => { - if (host) - host.postMessage({ type: "keyup", key: e.key }, "*"); - }); - window.faustUI = faustUI; -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (instantiate); - - -/***/ }), - -/***/ "./src/layout/AbstractGroup.ts": -/*!*************************************!*\ - !*** ./src/layout/AbstractGroup.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AbstractGroup) -/* harmony export */ }); -const _AbstractGroup = class { - constructor(group, isRoot) { - this.isRoot = !!isRoot; - Object.assign(this, group); - const { hasHSizingDesc, hasVSizingDesc } = this; - const sizing = hasHSizingDesc && hasVSizingDesc ? "both" : hasHSizingDesc ? "horizontal" : hasVSizingDesc ? "vertical" : "none"; - this.layout = { - type: group.type, - width: _AbstractGroup.padding * 2, - height: _AbstractGroup.padding * 2 + _AbstractGroup.labelHeight, - sizing - }; - } - get hasHSizingDesc() { - return !!this.items.find((item) => { - if (item instanceof _AbstractGroup) - return item.hasHSizingDesc; - return item.layout.sizing === "horizontal" || item.layout.sizing === "both"; - }); - } - get hasVSizingDesc() { - return !!this.items.find((item) => { - if (item instanceof _AbstractGroup) - return item.hasVSizingDesc; - return item.layout.sizing === "vertical" || item.layout.sizing === "both"; - }); - } - adjust() { - return this; - } - expand(dX, dY) { - return this; - } - offset() { - return this; - } -}; -let AbstractGroup = _AbstractGroup; -AbstractGroup.padding = 0.2; -AbstractGroup.labelHeight = 0.25; -AbstractGroup.spaceBetween = 0.1; - - - -/***/ }), - -/***/ "./src/layout/AbstractInputItem.ts": -/*!*****************************************!*\ - !*** ./src/layout/AbstractInputItem.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AbstractInputItem) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/layout/AbstractItem.ts"); - -class AbstractInputItem extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor(item) { - super(item); - this.init = +item.init || 0; - this.step = +item.step || 1; - } -} - - -/***/ }), - -/***/ "./src/layout/AbstractItem.ts": -/*!************************************!*\ - !*** ./src/layout/AbstractItem.ts ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AbstractItem) -/* harmony export */ }); -class AbstractItem { - constructor(item) { - Object.assign(this, item); - this.min = isFinite(+this.min) ? +this.min : 0; - this.max = isFinite(+this.max) ? +this.max : 1; - } - adjust() { - return this; - } - expand(dX, dY) { - return this; - } - offset() { - return this; - } -} - - -/***/ }), - -/***/ "./src/layout/AbstractOutputItem.ts": -/*!******************************************!*\ - !*** ./src/layout/AbstractOutputItem.ts ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AbstractOutputItem) -/* harmony export */ }); -/* harmony import */ var _AbstractItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractItem */ "./src/layout/AbstractItem.ts"); - -class AbstractOutputItem extends _AbstractItem__WEBPACK_IMPORTED_MODULE_0__["default"] { -} - - -/***/ }), - -/***/ "./src/layout/Button.ts": -/*!******************************!*\ - !*** ./src/layout/Button.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Button) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class Button extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "button", - width: 2, - height: 1, - sizing: "horizontal" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Checkbox.ts": -/*!********************************!*\ - !*** ./src/layout/Checkbox.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Checkbox) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class Checkbox extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "checkbox", - width: 2, - height: 1, - sizing: "horizontal" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/HBargraph.ts": -/*!*********************************!*\ - !*** ./src/layout/HBargraph.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ HBargraph) -/* harmony export */ }); -/* harmony import */ var _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractOutputItem */ "./src/layout/AbstractOutputItem.ts"); - -class HBargraph extends _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "hbargraph", - width: 5, - height: 1, - sizing: "horizontal" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/HGroup.ts": -/*!******************************!*\ - !*** ./src/layout/HGroup.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ HGroup) -/* harmony export */ }); -/* harmony import */ var _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractGroup */ "./src/layout/AbstractGroup.ts"); - -class HGroup extends _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"] { - adjust() { - this.items.forEach((item) => { - item.adjust(); - this.layout.width += item.layout.width; - this.layout.height = Math.max(this.layout.height, item.layout.height + 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding + _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].labelHeight); - }); - this.layout.width += _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].spaceBetween * (this.items.length - 1); - if (this.layout.width < 1) - this.layout.width += 1; - return this; - } - expand(dX) { - let hExpandItems = 0; - this.items.forEach((item) => { - if (item.layout.sizing === "both" || item.layout.sizing === "horizontal") - hExpandItems++; - }); - this.items.forEach((item) => { - let dX$ = 0; - let dY$ = 0; - if (item.layout.sizing === "both" || item.layout.sizing === "horizontal") { - dX$ = hExpandItems ? dX / hExpandItems : 0; - item.layout.width += dX$; - } - if (item.layout.sizing === "both" || item.layout.sizing === "vertical") { - dY$ = this.layout.height - 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding - _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].labelHeight - item.layout.height; - item.layout.height += dY$; - } - item.expand(dX$, dY$); - }); - return this; - } - offset() { - const { labelHeight, padding, spaceBetween } = _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"]; - let $left = padding; - const $top = padding + labelHeight; - const { height } = this.layout; - this.items.forEach((item) => { - item.layout.offsetLeft = $left; - item.layout.offsetTop = $top; - item.layout.offsetTop += (height - labelHeight - item.layout.height) / 2 - padding; - item.layout.left = (this.layout.left || 0) + item.layout.offsetLeft; - item.layout.top = (this.layout.top || 0) + item.layout.offsetTop; - item.offset(); - $left += item.layout.width + spaceBetween; - }); - return this; - } -} - - -/***/ }), - -/***/ "./src/layout/HSlider.ts": -/*!*******************************!*\ - !*** ./src/layout/HSlider.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ HSlider) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class HSlider extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "hslider", - width: 5, - height: 1, - sizing: "horizontal" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Knob.ts": -/*!****************************!*\ - !*** ./src/layout/Knob.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Knob) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class Knob extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "knob", - width: 1, - height: 1.75, - sizing: "none" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Layout.ts": -/*!******************************!*\ - !*** ./src/layout/Layout.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Layout) -/* harmony export */ }); -/* harmony import */ var _HSlider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./HSlider */ "./src/layout/HSlider.ts"); -/* harmony import */ var _VSlider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VSlider */ "./src/layout/VSlider.ts"); -/* harmony import */ var _Nentry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Nentry */ "./src/layout/Nentry.ts"); -/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Button */ "./src/layout/Button.ts"); -/* harmony import */ var _Checkbox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Checkbox */ "./src/layout/Checkbox.ts"); -/* harmony import */ var _Knob__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Knob */ "./src/layout/Knob.ts"); -/* harmony import */ var _Menu__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Menu */ "./src/layout/Menu.ts"); -/* harmony import */ var _Radio__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Radio */ "./src/layout/Radio.ts"); -/* harmony import */ var _Led__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Led */ "./src/layout/Led.ts"); -/* harmony import */ var _Numerical__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Numerical */ "./src/layout/Numerical.ts"); -/* harmony import */ var _HBargraph__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./HBargraph */ "./src/layout/HBargraph.ts"); -/* harmony import */ var _VBargraph__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./VBargraph */ "./src/layout/VBargraph.ts"); -/* harmony import */ var _HGroup__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./HGroup */ "./src/layout/HGroup.ts"); -/* harmony import */ var _VGroup__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./VGroup */ "./src/layout/VGroup.ts"); -/* harmony import */ var _TGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./TGroup */ "./src/layout/TGroup.ts"); - - - - - - - - - - - - - - - -class Layout { - static predictType(item) { - if (item.type === "vgroup" || item.type === "hgroup" || item.type === "tgroup" || item.type === "button" || item.type === "checkbox") - return item.type; - if (item.type === "hbargraph" || item.type === "vbargraph") { - if (item.meta && item.meta.find((meta) => meta.style && meta.style.startsWith("led"))) - return "led"; - if (item.meta && item.meta.find((meta) => meta.style && meta.style.startsWith("numerical"))) - return "numerical"; - return item.type; - } - if (item.type === "hslider" || item.type === "nentry" || item.type === "vslider") { - if (item.meta && item.meta.find((meta) => meta.style && meta.style.startsWith("knob"))) - return "knob"; - if (item.meta && item.meta.find((meta) => meta.style && meta.style.startsWith("menu"))) - return "menu"; - if (item.meta && item.meta.find((meta) => meta.style && meta.style.startsWith("radio"))) - return "radio"; - } - return item.type; - } - static getItem(item) { - const Ctor = { - hslider: _HSlider__WEBPACK_IMPORTED_MODULE_0__["default"], - vslider: _VSlider__WEBPACK_IMPORTED_MODULE_1__["default"], - nentry: _Nentry__WEBPACK_IMPORTED_MODULE_2__["default"], - button: _Button__WEBPACK_IMPORTED_MODULE_3__["default"], - checkbox: _Checkbox__WEBPACK_IMPORTED_MODULE_4__["default"], - knob: _Knob__WEBPACK_IMPORTED_MODULE_5__["default"], - menu: _Menu__WEBPACK_IMPORTED_MODULE_6__["default"], - radio: _Radio__WEBPACK_IMPORTED_MODULE_7__["default"], - led: _Led__WEBPACK_IMPORTED_MODULE_8__["default"], - numerical: _Numerical__WEBPACK_IMPORTED_MODULE_9__["default"], - hbargraph: _HBargraph__WEBPACK_IMPORTED_MODULE_10__["default"], - vbargraph: _VBargraph__WEBPACK_IMPORTED_MODULE_11__["default"], - hgroup: _HGroup__WEBPACK_IMPORTED_MODULE_12__["default"], - vgroup: _VGroup__WEBPACK_IMPORTED_MODULE_13__["default"], - tgroup: _TGroup__WEBPACK_IMPORTED_MODULE_14__["default"] - }; - const layoutType = this.predictType(item); - return new Ctor[layoutType](item); - } - static getItems(items) { - return items.map((item) => { - if ("items" in item) - item.items = this.getItems(item.items); - return this.getItem(item); - }); - } - static calc(ui) { - const rootGroup = new _VGroup__WEBPACK_IMPORTED_MODULE_13__["default"]({ items: this.getItems(ui), type: "vgroup", label: "" }, true); - rootGroup.adjust(); - rootGroup.expand(0, 0); - rootGroup.offset(); - return rootGroup; - } -} - - -/***/ }), - -/***/ "./src/layout/Led.ts": -/*!***************************!*\ - !*** ./src/layout/Led.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Led) -/* harmony export */ }); -/* harmony import */ var _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractOutputItem */ "./src/layout/AbstractOutputItem.ts"); - -class Led extends _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "led", - width: 1, - height: 1, - sizing: "none" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Menu.ts": -/*!****************************!*\ - !*** ./src/layout/Menu.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Menu) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class Menu extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "menu", - width: 2, - height: 1, - sizing: "horizontal" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Nentry.ts": -/*!******************************!*\ - !*** ./src/layout/Nentry.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Nentry) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class Nentry extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "nentry", - width: 1, - height: 1, - sizing: "none" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Numerical.ts": -/*!*********************************!*\ - !*** ./src/layout/Numerical.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Numerical) -/* harmony export */ }); -/* harmony import */ var _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractOutputItem */ "./src/layout/AbstractOutputItem.ts"); - -class Numerical extends _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "numerical", - width: 1, - height: 1, - sizing: "none" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/Radio.ts": -/*!*****************************!*\ - !*** ./src/layout/Radio.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Radio) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class Radio extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "radio", - width: 2, - height: 2, - sizing: "both" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/TGroup.ts": -/*!******************************!*\ - !*** ./src/layout/TGroup.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ TGroup) -/* harmony export */ }); -/* harmony import */ var _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractGroup */ "./src/layout/AbstractGroup.ts"); - -const _TGroup = class extends _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"] { - adjust() { - this.items.forEach((item) => { - item.adjust(); - this.layout.width = Math.max(this.layout.width, item.layout.width + 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding); - this.layout.height = Math.max(this.layout.height, item.layout.height + 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding + _TGroup.labelHeight); - }); - const tabsCount = this.items.length; - this.layout.width = Math.max(this.layout.width, tabsCount * _TGroup.tabLayout.width); - this.layout.height += _TGroup.tabLayout.height; - if (this.layout.width < 1) - this.layout.width += 1; - return this; - } - expand() { - const tabsCount = this.items.length; - this.items.forEach((item) => { - let dY$ = 0; - let dX$ = 0; - if (item.layout.sizing === "both" || item.layout.sizing === "horizontal") - dX$ = this.layout.width - 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding - item.layout.width; - if (item.layout.sizing === "both" || item.layout.sizing === "vertical") - dY$ = this.layout.height - 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding - _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].labelHeight - (tabsCount ? _TGroup.tabLayout.height : 0) - item.layout.height; - item.expand(dX$, dY$); - }); - return this; - } - offset() { - const { labelHeight, padding } = _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"]; - const $left = padding; - const $top = padding + labelHeight + _TGroup.tabLayout.height; - this.items.forEach((item) => { - item.layout.offsetLeft = $left; - item.layout.offsetTop = $top; - item.layout.left = (this.layout.left || 0) + item.layout.offsetLeft; - item.layout.top = (this.layout.top || 0) + item.layout.offsetTop; - item.offset(); - }); - return this; - } -}; -let TGroup = _TGroup; -TGroup.tabLayout = { - width: 2, - height: 1 -}; - - - -/***/ }), - -/***/ "./src/layout/VBargraph.ts": -/*!*********************************!*\ - !*** ./src/layout/VBargraph.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ VBargraph) -/* harmony export */ }); -/* harmony import */ var _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractOutputItem */ "./src/layout/AbstractOutputItem.ts"); - -class VBargraph extends _AbstractOutputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "vbargraph", - width: 1, - height: 5, - sizing: "vertical" - }; - } -} - - -/***/ }), - -/***/ "./src/layout/VGroup.ts": -/*!******************************!*\ - !*** ./src/layout/VGroup.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ VGroup) -/* harmony export */ }); -/* harmony import */ var _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractGroup */ "./src/layout/AbstractGroup.ts"); - -class VGroup extends _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"] { - adjust() { - this.items.forEach((item) => { - item.adjust(); - this.layout.width = Math.max(this.layout.width, item.layout.width + 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding); - this.layout.height += item.layout.height; - }); - this.layout.height += _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].spaceBetween * (this.items.length - 1); - if (this.layout.width < 1) - this.layout.width += 1; - return this; - } - expand(dX, dY) { - let vExpandItems = 0; - this.items.forEach((item) => { - if (item.layout.sizing === "both" || item.layout.sizing === "vertical") - vExpandItems++; - }); - this.items.forEach((item) => { - let dX$ = 0; - let dY$ = 0; - if (item.layout.sizing === "both" || item.layout.sizing === "horizontal") { - dX$ = this.layout.width - 2 * _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"].padding - item.layout.width; - item.layout.width += dX$; - } - if (item.layout.sizing === "both" || item.layout.sizing === "vertical") { - dY$ = vExpandItems ? dY / vExpandItems : 0; - item.layout.height += dY$; - } - item.expand(dX$, dY$); - }); - return this; - } - offset() { - const { labelHeight, padding, spaceBetween } = _AbstractGroup__WEBPACK_IMPORTED_MODULE_0__["default"]; - const $left = padding; - let $top = padding + labelHeight; - const { width } = this.layout; - this.items.forEach((item) => { - item.layout.offsetLeft = $left; - item.layout.offsetTop = $top; - item.layout.offsetLeft += (width - item.layout.width) / 2 - padding; - item.layout.left = (this.layout.left || 0) + item.layout.offsetLeft; - item.layout.top = (this.layout.top || 0) + item.layout.offsetTop; - item.offset(); - $top += item.layout.height + spaceBetween; - }); - return this; - } -} - - -/***/ }), - -/***/ "./src/layout/VSlider.ts": -/*!*******************************!*\ - !*** ./src/layout/VSlider.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ VSlider) -/* harmony export */ }); -/* harmony import */ var _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractInputItem */ "./src/layout/AbstractInputItem.ts"); - -class VSlider extends _AbstractInputItem__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor() { - super(...arguments); - this.layout = { - type: "vslider", - width: 1, - height: 5, - sizing: "vertical" - }; - } -} - - -/***/ }), - -/***/ "./src/components/Base.scss": -/*!**********************************!*\ - !*** ./src/components/Base.scss ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Base_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Base.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Base.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Base_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Base_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Base_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Base_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Button.scss": -/*!************************************!*\ - !*** ./src/components/Button.scss ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Button_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Button.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Button.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Button_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Button_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Button_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Button_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Checkbox.scss": -/*!**************************************!*\ - !*** ./src/components/Checkbox.scss ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Checkbox_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Checkbox.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Checkbox.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Checkbox_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Checkbox_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Checkbox_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Checkbox_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Group.scss": -/*!***********************************!*\ - !*** ./src/components/Group.scss ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Group_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Group.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Group.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Group_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Group_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Group_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Group_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/HBargraph.scss": -/*!***************************************!*\ - !*** ./src/components/HBargraph.scss ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HBargraph_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./HBargraph.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/HBargraph.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/HSlider.scss": -/*!*************************************!*\ - !*** ./src/components/HSlider.scss ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HSlider_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./HSlider.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/HSlider.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_HSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Knob.scss": -/*!**********************************!*\ - !*** ./src/components/Knob.scss ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Knob_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Knob.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Knob.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Knob_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Knob_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Knob_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Knob_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Led.scss": -/*!*********************************!*\ - !*** ./src/components/Led.scss ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Led_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Led.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Led.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Led_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Led_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Led_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Led_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Menu.scss": -/*!**********************************!*\ - !*** ./src/components/Menu.scss ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Menu_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Menu.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Menu.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Menu_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Menu_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Menu_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Menu_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Nentry.scss": -/*!************************************!*\ - !*** ./src/components/Nentry.scss ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Nentry_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Nentry.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Nentry.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Nentry_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Nentry_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Nentry_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Nentry_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Numerical.scss": -/*!***************************************!*\ - !*** ./src/components/Numerical.scss ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Numerical_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Numerical.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Numerical.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Numerical_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Numerical_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Numerical_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Numerical_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/Radio.scss": -/*!***********************************!*\ - !*** ./src/components/Radio.scss ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Radio_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Radio.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/Radio.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Radio_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Radio_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Radio_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_Radio_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/VBargraph.scss": -/*!***************************************!*\ - !*** ./src/components/VBargraph.scss ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VBargraph_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./VBargraph.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/VBargraph.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VBargraph_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/components/VSlider.scss": -/*!*************************************!*\ - !*** ./src/components/VSlider.scss ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VSlider_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./VSlider.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/components/VSlider.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_VSlider_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./src/index.scss": -/*!************************!*\ - !*** ./src/index.scss ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./index.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/index.scss"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": -/*!****************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! - \****************************************************************************/ -/***/ ((module) => { - - - -var stylesInDOM = []; - -function getIndexByIdentifier(identifier) { - var result = -1; - - for (var i = 0; i < stylesInDOM.length; i++) { - if (stylesInDOM[i].identifier === identifier) { - result = i; - break; - } - } - - return result; -} - -function modulesToDom(list, options) { - var idCountMap = {}; - var identifiers = []; - - for (var i = 0; i < list.length; i++) { - var item = list[i]; - var id = options.base ? item[0] + options.base : item[0]; - var count = idCountMap[id] || 0; - var identifier = "".concat(id, " ").concat(count); - idCountMap[id] = count + 1; - var indexByIdentifier = getIndexByIdentifier(identifier); - var obj = { - css: item[1], - media: item[2], - sourceMap: item[3], - supports: item[4], - layer: item[5] - }; - - if (indexByIdentifier !== -1) { - stylesInDOM[indexByIdentifier].references++; - stylesInDOM[indexByIdentifier].updater(obj); - } else { - var updater = addElementStyle(obj, options); - options.byIndex = i; - stylesInDOM.splice(i, 0, { - identifier: identifier, - updater: updater, - references: 1 - }); - } - - identifiers.push(identifier); - } - - return identifiers; -} - -function addElementStyle(obj, options) { - var api = options.domAPI(options); - api.update(obj); - - var updater = function updater(newObj) { - if (newObj) { - if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { - return; - } - - api.update(obj = newObj); - } else { - api.remove(); - } - }; - - return updater; -} - -module.exports = function (list, options) { - options = options || {}; - list = list || []; - var lastIdentifiers = modulesToDom(list, options); - return function update(newList) { - newList = newList || []; - - for (var i = 0; i < lastIdentifiers.length; i++) { - var identifier = lastIdentifiers[i]; - var index = getIndexByIdentifier(identifier); - stylesInDOM[index].references--; - } - - var newLastIdentifiers = modulesToDom(newList, options); - - for (var _i = 0; _i < lastIdentifiers.length; _i++) { - var _identifier = lastIdentifiers[_i]; - - var _index = getIndexByIdentifier(_identifier); - - if (stylesInDOM[_index].references === 0) { - stylesInDOM[_index].updater(); - - stylesInDOM.splice(_index, 1); - } - } - - lastIdentifiers = newLastIdentifiers; - }; -}; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": -/*!********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! - \********************************************************************/ -/***/ ((module) => { - - - -var memo = {}; -/* istanbul ignore next */ - -function getTarget(target) { - if (typeof memo[target] === "undefined") { - var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself - - if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { - try { - // This will throw an exception if access to iframe is blocked - // due to cross-origin restrictions - styleTarget = styleTarget.contentDocument.head; - } catch (e) { - // istanbul ignore next - styleTarget = null; - } - } - - memo[target] = styleTarget; - } - - return memo[target]; -} -/* istanbul ignore next */ - - -function insertBySelector(insert, style) { - var target = getTarget(insert); - - if (!target) { - throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); - } - - target.appendChild(style); -} - -module.exports = insertBySelector; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": -/*!**********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! - \**********************************************************************/ -/***/ ((module) => { - - - -/* istanbul ignore next */ -function insertStyleElement(options) { - var element = document.createElement("style"); - options.setAttributes(element, options.attributes); - options.insert(element, options.options); - return element; -} - -module.exports = insertStyleElement; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! - \**********************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - - - -/* istanbul ignore next */ -function setAttributesWithoutAttributes(styleElement) { - var nonce = true ? __webpack_require__.nc : 0; - - if (nonce) { - styleElement.setAttribute("nonce", nonce); - } -} - -module.exports = setAttributesWithoutAttributes; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": -/*!***************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! - \***************************************************************/ -/***/ ((module) => { - - - -/* istanbul ignore next */ -function apply(styleElement, options, obj) { - var css = ""; - - if (obj.supports) { - css += "@supports (".concat(obj.supports, ") {"); - } - - if (obj.media) { - css += "@media ".concat(obj.media, " {"); - } - - var needLayer = typeof obj.layer !== "undefined"; - - if (needLayer) { - css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); - } - - css += obj.css; - - if (needLayer) { - css += "}"; - } - - if (obj.media) { - css += "}"; - } - - if (obj.supports) { - css += "}"; - } - - var sourceMap = obj.sourceMap; - - if (sourceMap && typeof btoa !== "undefined") { - css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); - } // For old IE - - /* istanbul ignore if */ - - - options.styleTagTransform(css, styleElement, options.options); -} - -function removeStyleElement(styleElement) { - // istanbul ignore if - if (styleElement.parentNode === null) { - return false; - } - - styleElement.parentNode.removeChild(styleElement); -} -/* istanbul ignore next */ - - -function domAPI(options) { - var styleElement = options.insertStyleElement(options); - return { - update: function update(obj) { - apply(styleElement, options, obj); - }, - remove: function remove() { - removeStyleElement(styleElement); - } - }; -} - -module.exports = domAPI; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": -/*!*********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! - \*********************************************************************/ -/***/ ((module) => { - - - -/* istanbul ignore next */ -function styleTagTransform(css, styleElement) { - if (styleElement.styleSheet) { - styleElement.styleSheet.cssText = css; - } else { - while (styleElement.firstChild) { - styleElement.removeChild(styleElement.firstChild); - } - - styleElement.appendChild(document.createTextNode(css)); - } -} - -module.exports = styleTagTransform; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/nonce */ -/******/ (() => { -/******/ __webpack_require__.nc = undefined; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FaustUI: () => (/* reexport safe */ _FaustUI__WEBPACK_IMPORTED_MODULE_0__["default"]), -/* harmony export */ instantiate: () => (/* reexport safe */ _instantiate__WEBPACK_IMPORTED_MODULE_1__["default"]) -/* harmony export */ }); -/* harmony import */ var _FaustUI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FaustUI */ "./src/FaustUI.ts"); -/* harmony import */ var _instantiate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instantiate */ "./src/instantiate.ts"); - - - -})(); - -/******/ return __webpack_exports__; -/******/ })() -; -}); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/faust-ui/index.js.map b/dist/faust-ui/index.js.map deleted file mode 100644 index 767f7df9..00000000 --- a/dist/faust-ui/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;ACVa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,yBAAyB,GAAG,qBAAqB;AACjD,qBAAqB;AACrB;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,kBAAe;AACf;;;;;;;;;;;;;;;;;;AC1GA;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,+DAA+D,kBAAkB,uBAAuB,2BAA2B,qBAAqB,GAAG,6BAA6B,kBAAkB,GAAG,mDAAmD,uBAAuB,oBAAoB,gBAAgB,sBAAsB,GAAG,4DAA4D,uBAAuB,mBAAmB,oBAAoB,qBAAqB,GAAG,6BAA6B,qBAAqB,GAAG,OAAO,2FAA2F,UAAU,WAAW,WAAW,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,WAAW,KAAK,KAAK,WAAW,UAAU,UAAU,WAAW,KAAK,KAAK,WAAW,8CAA8C,oBAAoB,yBAAyB,6BAA6B,uBAAuB,eAAe,wBAAwB,OAAO,qCAAqC,6BAA6B,0BAA0B,sBAAsB,4BAA4B,sBAAsB,iCAAiC,6BAA6B,8BAA8B,+BAA+B,WAAW,OAAO,eAAe,2BAA2B,OAAO,GAAG,mBAAmB;AAC92C;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,+FAA+F,kBAAkB,uBAAuB,oBAAoB,sBAAsB,uBAAuB,uBAAuB,mBAAmB,wBAAwB,GAAG,8DAA8D,sBAAsB,iBAAiB,GAAG,OAAO,6FAA6F,UAAU,WAAW,UAAU,WAAW,WAAW,WAAW,UAAU,WAAW,KAAK,KAAK,WAAW,UAAU,wEAAwE,eAAe,wBAAwB,6BAA6B,0BAA0B,4BAA4B,6BAA6B,6BAA6B,yBAAyB,8BAA8B,oBAAoB,gCAAgC,2BAA2B,WAAW,OAAO,GAAG,mBAAmB;AACx/B;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,iGAAiG,kBAAkB,uBAAuB,oBAAoB,sBAAsB,uBAAuB,uBAAuB,mBAAmB,wBAAwB,GAAG,gEAAgE,iBAAiB,sBAAsB,GAAG,OAAO,+FAA+F,UAAU,WAAW,UAAU,WAAW,WAAW,WAAW,UAAU,WAAW,KAAK,KAAK,UAAU,WAAW,0EAA0E,eAAe,wBAAwB,6BAA6B,0BAA0B,4BAA4B,6BAA6B,6BAA6B,yBAAyB,8BAA8B,oBAAoB,2BAA2B,gCAAgC,WAAW,OAAO,GAAG,mBAAmB;AAChgC;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,2DAA2D,uBAAuB,mBAAmB,6CAA6C,uBAAuB,gDAAgD,GAAG,2CAA2C,uBAAuB,gBAAgB,4BAA4B,sBAAsB,GAAG,oDAAoD,uBAAuB,mBAAmB,oBAAoB,qBAAqB,GAAG,yCAAyC,uBAAuB,0BAA0B,wBAAwB,cAAc,GAAG,8DAA8D,uBAAuB,0BAA0B,uBAAuB,oBAAoB,4BAA4B,wBAAwB,sBAAsB,iBAAiB,uBAAuB,+CAA+C,GAAG,oEAAoE,yCAAyC,GAAG,qEAAqE,sCAAsC,iBAAiB,GAAG,OAAO,4FAA4F,WAAW,UAAU,WAAW,WAAW,WAAW,KAAK,KAAK,WAAW,UAAU,WAAW,WAAW,KAAK,KAAK,WAAW,UAAU,UAAU,WAAW,KAAK,KAAK,WAAW,WAAW,WAAW,UAAU,KAAK,KAAK,WAAW,WAAW,WAAW,UAAU,WAAW,WAAW,WAAW,UAAU,WAAW,WAAW,KAAK,KAAK,WAAW,MAAM,KAAK,WAAW,UAAU,6CAA6C,yBAAyB,qBAAqB,+CAA+C,yBAAyB,kDAAkD,iCAAiC,6BAA6B,sBAAsB,kCAAkC,4BAA4B,sBAAsB,iCAAiC,6BAA6B,8BAA8B,+BAA+B,WAAW,OAAO,+BAA+B,6BAA6B,gCAAgC,8BAA8B,oBAAoB,kCAAkC,iCAAiC,oCAAoC,iCAAiC,8BAA8B,sCAAsC,kCAAkC,gCAAgC,2BAA2B,iCAAiC,yDAAyD,uBAAuB,2DAA2D,eAAe,wBAAwB,wDAAwD,+BAA+B,eAAe,WAAW,OAAO,GAAG,mBAAmB;AACj6F;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,wHAAwH,mBAAmB,GAAG,4FAA4F,uBAAuB,kBAAkB,gCAAgC,mBAAmB,gBAAgB,iBAAiB,GAAG,sIAAsI,uBAAuB,mBAAmB,mBAAmB,iBAAiB,iBAAiB,GAAG,+IAA+I,uBAAuB,mBAAmB,iBAAiB,gBAAgB,GAAG,oGAAoG,uBAAuB,mBAAmB,mBAAmB,uBAAuB,gDAAgD,+BAA+B,sBAAsB,uBAAuB,4BAA4B,qBAAqB,GAAG,OAAO,gGAAgG,UAAU,KAAK,KAAK,WAAW,UAAU,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,WAAW,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,2EAA2E,qCAAqC,yBAAyB,OAAO,iDAAiD,6BAA6B,wBAAwB,sCAAsC,yBAAyB,sBAAsB,uBAAuB,uDAAuD,iCAAiC,6BAA6B,6BAA6B,2BAA2B,2BAA2B,0BAA0B,qCAAqC,iCAAiC,+BAA+B,8BAA8B,eAAe,WAAW,qBAAqB,iCAAiC,6BAA6B,6BAA6B,iCAAiC,0DAA0D,yCAAyC,gCAAgC,iCAAiC,sCAAsC,+BAA+B,WAAW,OAAO,GAAG,mBAAmB;AAC1rF;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,sHAAsH,mBAAmB,GAAG,wFAAwF,uBAAuB,kBAAkB,gCAAgC,mBAAmB,gBAAgB,iBAAiB,GAAG,gIAAgI,uBAAuB,mBAAmB,mBAAmB,iBAAiB,iBAAiB,GAAG,yIAAyI,uBAAuB,mBAAmB,iBAAiB,gBAAgB,GAAG,gGAAgG,uBAAuB,mBAAmB,mBAAmB,uBAAuB,gDAAgD,+BAA+B,sBAAsB,uBAAuB,4BAA4B,qBAAqB,+BAA+B,GAAG,oPAAoP,6BAA6B,cAAc,GAAG,OAAO,8FAA8F,UAAU,KAAK,KAAK,WAAW,UAAU,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,WAAW,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,KAAK,KAAK,WAAW,UAAU,0EAA0E,qCAAqC,yBAAyB,OAAO,+CAA+C,6BAA6B,wBAAwB,sCAAsC,yBAAyB,sBAAsB,uBAAuB,qDAAqD,iCAAiC,6BAA6B,6BAA6B,2BAA2B,2BAA2B,0BAA0B,qCAAqC,iCAAiC,+BAA+B,8BAA8B,eAAe,WAAW,qBAAqB,iCAAiC,6BAA6B,6BAA6B,iCAAiC,0DAA0D,yCAAyC,gCAAgC,iCAAiC,sCAAsC,+BAA+B,wCAAwC,wFAAwF,2CAA2C,4BAA4B,eAAe,WAAW,OAAO,GAAG,qBAAqB;AAChuG;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,uFAAuF,wBAAwB,GAAG,wDAAwD,uBAAuB,mBAAmB,mBAAmB,oBAAoB,gBAAgB,GAAG,uDAAuD,uBAAuB,mBAAmB,mBAAmB,uBAAuB,gDAAgD,gBAAgB,sBAAsB,uBAAuB,gCAAgC,qBAAqB,+BAA+B,GAAG,kKAAkK,6BAA6B,cAAc,GAAG,OAAO,2FAA2F,WAAW,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,WAAW,WAAW,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,KAAK,KAAK,WAAW,UAAU,sEAAsE,0BAA0B,kBAAkB,6BAA6B,yBAAyB,yBAAyB,0BAA0B,sBAAsB,OAAO,iBAAiB,6BAA6B,yBAAyB,yBAAyB,6BAA6B,sDAAsD,sBAAsB,4BAA4B,6BAA6B,sCAAsC,2BAA2B,oCAAoC,gFAAgF,uCAAuC,wBAAwB,WAAW,OAAO,GAAG,mBAAmB;AAC54D;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,sFAAsF,wBAAwB,GAAG,0EAA0E,mBAAmB,GAAG,kFAAkF,uBAAuB,mBAAmB,mBAAmB,gBAAgB,GAAG,2FAA2F,uBAAuB,mBAAmB,iBAAiB,gBAAgB,GAAG,OAAO,0FAA0F,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,qEAAqE,0BAA0B,qCAAqC,yBAAyB,OAAO,6CAA6C,6BAA6B,yBAAyB,yBAAyB,sBAAsB,sBAAsB,iCAAiC,6BAA6B,2BAA2B,0BAA0B,WAAW,OAAO,GAAG,qBAAqB;AAC3uC;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,uFAAuF,wBAAwB,GAAG,wDAAwD,gBAAgB,uBAAuB,sBAAsB,uBAAuB,qBAAqB,4BAA4B,GAAG,OAAO,2FAA2F,WAAW,KAAK,KAAK,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,sEAAsE,0BAA0B,kBAAkB,sBAAsB,6BAA6B,4BAA4B,6BAA6B,2BAA2B,kCAAkC,OAAO,GAAG,mBAAmB;AAClyB;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,yFAAyF,wBAAwB,GAAG,uDAAuD,gBAAgB,uBAAuB,sBAAsB,uBAAuB,qBAAqB,4BAA4B,GAAG,kKAAkK,eAAe,GAAG,OAAO,6FAA6F,WAAW,KAAK,KAAK,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,KAAK,KAAK,UAAU,wEAAwE,0BAA0B,eAAe,sBAAsB,6BAA6B,4BAA4B,6BAA6B,2BAA2B,kCAAkC,gFAAgF,yBAAyB,WAAW,OAAO,GAAG,mBAAmB;AAChmC;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,4FAA4F,wBAAwB,GAAG,4DAA4D,uBAAuB,mBAAmB,mBAAmB,uBAAuB,gDAAgD,iBAAiB,sBAAsB,uBAAuB,4BAA4B,qBAAqB,GAAG,OAAO,gGAAgG,WAAW,KAAK,KAAK,WAAW,UAAU,UAAU,WAAW,WAAW,UAAU,WAAW,WAAW,WAAW,WAAW,2EAA2E,0BAA0B,iBAAiB,6BAA6B,yBAAyB,yBAAyB,6BAA6B,sDAAsD,uBAAuB,4BAA4B,6BAA6B,kCAAkC,2BAA2B,OAAO,GAAG,mBAAmB;AACllC;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,wFAAwF,wBAAwB,GAAG,4EAA4E,mBAAmB,qBAAqB,GAAG,kFAAkF,mBAAmB,wBAAwB,sBAAsB,uBAAuB,qBAAqB,4BAA4B,GAAG,wFAAwF,4BAA4B,wBAAwB,qBAAqB,GAAG,OAAO,4FAA4F,WAAW,KAAK,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,KAAK,KAAK,WAAW,WAAW,WAAW,uEAAuE,0BAA0B,qCAAqC,yBAAyB,2BAA2B,OAAO,2CAA2C,yBAAyB,8BAA8B,4BAA4B,6BAA6B,2BAA2B,kCAAkC,mBAAmB,sCAAsC,kCAAkC,+BAA+B,WAAW,OAAO,GAAG,mBAAmB;AAC16C;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,4FAA4F,wBAAwB,GAAG,gFAAgF,mBAAmB,GAAG,4FAA4F,uBAAuB,kBAAkB,2BAA2B,mBAAmB,gBAAgB,oBAAoB,GAAG,sIAAsI,uBAAuB,mBAAmB,mBAAmB,gBAAgB,GAAG,+IAA+I,uBAAuB,mBAAmB,iBAAiB,gBAAgB,GAAG,oGAAoG,uBAAuB,mBAAmB,mBAAmB,uBAAuB,gDAAgD,+BAA+B,sBAAsB,uBAAuB,eAAe,4BAA4B,qBAAqB,GAAG,OAAO,gGAAgG,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,WAAW,UAAU,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,WAAW,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,WAAW,WAAW,2EAA2E,0BAA0B,qCAAqC,yBAAyB,OAAO,iDAAiD,6BAA6B,wBAAwB,iCAAiC,yBAAyB,sBAAsB,0BAA0B,uDAAuD,iCAAiC,6BAA6B,6BAA6B,0BAA0B,0BAA0B,qCAAqC,iCAAiC,+BAA+B,8BAA8B,eAAe,WAAW,qBAAqB,iCAAiC,6BAA6B,6BAA6B,iCAAiC,0DAA0D,yCAAyC,gCAAgC,iCAAiC,yBAAyB,sCAAsC,+BAA+B,WAAW,OAAO,GAAG,qBAAqB;AAChzF;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC6G;AACjB;AAC5F,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,0FAA0F,wBAAwB,GAAG,8EAA8E,mBAAmB,GAAG,wFAAwF,uBAAuB,kBAAkB,2BAA2B,mBAAmB,gBAAgB,iBAAiB,GAAG,gIAAgI,uBAAuB,mBAAmB,mBAAmB,gBAAgB,GAAG,yIAAyI,uBAAuB,mBAAmB,iBAAiB,gBAAgB,GAAG,8FAA8F,uBAAuB,mBAAmB,mBAAmB,uBAAuB,gDAAgD,+BAA+B,sBAAsB,uBAAuB,eAAe,gCAAgC,qBAAqB,+BAA+B,GAAG,gPAAgP,6BAA6B,cAAc,GAAG,OAAO,8FAA8F,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,WAAW,UAAU,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,WAAW,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,WAAW,WAAW,WAAW,KAAK,KAAK,WAAW,UAAU,0EAA0E,0BAA0B,qCAAqC,yBAAyB,OAAO,+CAA+C,6BAA6B,wBAAwB,iCAAiC,yBAAyB,sBAAsB,uBAAuB,qDAAqD,iCAAiC,6BAA6B,6BAA6B,0BAA0B,0BAA0B,qCAAqC,iCAAiC,+BAA+B,8BAA8B,eAAe,WAAW,mBAAmB,iCAAiC,6BAA6B,6BAA6B,iCAAiC,0DAA0D,yCAAyC,gCAAgC,iCAAiC,yBAAyB,0CAA0C,+BAA+B,wCAAwC,wFAAwF,2CAA2C,4BAA4B,eAAe,WAAW,OAAO,GAAG,mBAAmB;AAC10G;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPvC;AAC0G;AACjB;AACzF,8BAA8B,mFAA2B,CAAC,4FAAqC;AAC/F;AACA,0DAA0D,qBAAqB,mBAAmB,kCAAkC,6CAA6C,4BAA4B,qNAAqN,GAAG,OAAO,iFAAiF,WAAW,UAAU,WAAW,WAAW,WAAW,WAAW,yCAAyC,uBAAuB,qBAAqB,oCAAoC,+CAA+C,8BAA8B,uNAAuN,GAAG,mBAAmB;AACj/B;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;ACP1B;;AAEb;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;;AAEA;AACA,qDAAqD;AACrD;;AAEA;AACA,gDAAgD;AAChD;;AAEA;AACA,qFAAqF;AACrF;;AAEA;;AAEA;AACA,qBAAqB;AACrB;;AAEA;AACA,qBAAqB;AACrB;;AAEA;AACA,qBAAqB;AACrB;;AAEA;AACA,KAAK;AACL,KAAK;;;AAGL;AACA;AACA;AACA;;AAEA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,qBAAqB;AAC1C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACrGa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;ACpBqC;AAEE;AAGjB;AAeP,MAAM,QAAQ;AAAA,EAWzB,YAAY,SAAmB;AAV/B,wBAAwD,CAAC;AA4EzD,2BAAkB,CAAC,MAAc,UAAkB;AAC/C,UAAI,CAAC,KAAK;AAAY;AACtB,WAAK,WAAW,YAAY,EAAE,MAAM,OAAO,MAAM,QAAQ,GAAG,GAAG;AAAA,IACnE;AApEI,UAAM,EAAE,MAAM,IAAI,MAAM,oBAAoB,wBAAwB;AACpE,SAAK,UAAU;AACf,SAAK,KAAK,QAAQ,CAAC;AACnB,QAAI,OAAO,uBAAuB,eAAe,uBAAuB,MAAM;AAC1E,aAAO,iBAAiB,UAAU,MAAM;AACpC,aAAK,OAAO;AAAA,MAChB,CAAC;AAAA,IACL;AACA,QAAI,OAAO,wBAAwB,eAAe,wBAAwB,MAAM;AAC5E,aAAO,iBAAiB,WAAW,CAAC,MAAM;AACtC,cAAM,EAAE,MAAM,WAAW;AACzB,aAAK,aAAa;AAClB,cAAM,EAAE,SAAS;AACjB,YAAI,CAAC;AAAM;AACX,YAAI,SAAS,MAAM;AACf,eAAK,KAAK,KAAK;AAAA,QACnB,WAAW,SAAS,SAAS;AACzB,gBAAM,EAAE,MAAM,UAAU;AACxB,eAAK,iBAAiB,MAAM,KAAK;AAAA,QACrC;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAIA,QAAQ;AACJ,SAAK,eAAe,CAAC;AACrB,SAAK,QAAQ,YAAY;AACzB,UAAM,QAA2B;AAAA,MAC7B,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA,QACH,MAAM,KAAK;AAAA,QACX,OAAO,KAAK,OAAO;AAAA,QACnB,QAAQ,KAAK,OAAO;AAAA,QACpB,MAAM,KAAK,OAAO;AAAA,QAClB,KAAK,KAAK,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACb;AACA,SAAK,cAAc,IAAI,yDAAK,CAAC,KAAK;AAClC,SAAK,YAAY,mBAAmB;AACpC,SAAK,YAAY,MAAM;AACvB,SAAK,QAAQ,YAAY,KAAK,YAAY,SAAS;AACnD,SAAK,YAAY,kBAAkB;AAAA,EACvC;AAAA,EAIA,SAAS,MAAc,MAAyB;AAC5C,QAAI,KAAK,aAAa;AAAO,WAAK,aAAa,MAAM,KAAK,IAAI;AAAA;AACzD,WAAK,aAAa,QAAQ,CAAC,IAAI;AAAA,EACxC;AAAA,EAIA,iBAAiB,MAAc,OAAe;AAC1C,QAAI,KAAK,aAAa;AAAO,WAAK,aAAa,MAAM,QAAQ,UAAQ,KAAK,SAAS,EAAE,MAAM,CAAC,CAAC;AAAA,EACjG;AAAA,EAWA,OAAO;AACH,UAAM,EAAE,OAAO,WAAW,sDAAM,CAAC,KAAK,KAAK,EAAE;AAC7C,SAAK,MAAM;AACX,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAClB;AAAA,EAIA,WAAW;AACP,UAAM,EAAE,OAAO,WAAW,KAAK,QAAQ,sBAAsB;AAC7D,UAAM,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,QAAQ,OAAO,SAAS,KAAK,QAAQ,MAAM,CAAC;AAC5F,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAIA,SAAS;AACL,QAAI,CAAC,KAAK;AAAa;AACvB,SAAK,SAAS;AACd,SAAK,YAAY,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5D;AAAA,MACI,KAAK;AACL,WAAO,KAAK;AAAA,EAChB;AAAA,MACI,GAAG,MAAM;AACT,SAAK,MAAM;AACX,SAAK,KAAK;AACV,SAAK,MAAM;AAAA,EACf;AAAA,MACI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,MACI,WAAW;AACX,WAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACrC;AAAA,MACI,YAAY;AACZ,WAAO,KAAK,QAAQ,SAAS,KAAK;AAAA,EACtC;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjJ2D;AAE5C,MAAe,0BAAsD,kEAAiB,CAAI;AAAA,EA+CrG,YAAY,OAAW;AACnB,UAAM;AA/BF,kBAAS;AAIjB,uBAAc;AASN,eAAM,MAAM;AAChB,WAAK;AACL,UAAI,KAAK,SAAS,KAAK,gBAAgB,GAAG;AACtC,aAAK,OAAO,OAAO,sBAAsB,KAAK,GAAG;AACjD;AAAA,MACJ;AACA,WAAK,OAAO;AACZ,WAAK,MAAM,QAAQ,OAAK,EAAE,CAAC;AAC3B,WAAK,QAAQ,CAAC;AAAA,IAClB;AAIQ,iBAAuB,CAAC;AAM5B,SAAK,QAAQ,kCAAK,KAAK,eAAiB;AAAA,EAC5C;AAAA,MA7CI,eAAe;AACf,WAAQ,KAAK,YAAyC;AAAA,EAC1D;AAAA,EA+CA,SAAS,UAAsB;AAC3B,QAAI,eAAe;AACnB,eAAW,YAAY,UAAU;AAC7B,YAAM,aAAa,SAAS;AAC5B,UAAI,YAAY,KAAK,SAAS,KAAK,MAAM,cAAc,YAAY;AAC/D,aAAK,MAAM,YAAY;AACvB,uBAAe;AAAA,MACnB;AAAO;AACP,UAAI;AAAc,aAAK,KAAK,UAAU,KAAK,MAAM,SAAS;AAAA,IAC9D;AAAA,EACJ;AAAA,EAKA,SAAS,MAAiB;AACtB,QAAI,KAAK,MAAM,QAAQ,IAAI,MAAM;AAAI,WAAK,MAAM,KAAK,IAAI;AACzD,QAAI,KAAK;AAAM;AACf,SAAK,OAAO,OAAO,sBAAsB,KAAK,GAAG;AAAA,EACrD;AACJ;AAtEW,iCAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNI;AACE;AAEjC;AAcrB,oCAA+E,0DAAiB,CAAsB;AAAA,EAkHlH,YAAY,OAA6B;AACrC,UAAM,KAAK;AA/Ef,uBAAc;AAKd,yBAAgB,CAAC,MAAqB;AAAA,IAAC;AACvC,uBAAc,CAAC,MAAqB;AAAA,IAAC;AACrC,4BAAmB,CAAC,MAAkB;AAClC,QAAE,eAAe;AACjB,YAAM,OAAQ,EAAE,cAA8B,sBAAsB;AACpE,UAAI,QAAQ,EAAE,QAAQ,GAAG;AACzB,UAAI,QAAQ,EAAE,QAAQ,GAAG;AACzB,YAAM,QAAQ,QAAQ,KAAK;AAC3B,YAAM,QAAQ,QAAQ,KAAK;AAC3B,YAAM,YAAY,KAAK,MAAM;AAC7B,WAAK,kBAAkB,EAAE,GAAG,OAAO,GAAG,OAAO,eAAe,EAAE,CAAC;AAC/D,YAAM,kBAAkB,CAAC,OAAkB;AACvC,WAAE,eAAe;AACjB,cAAM,UAAU,GAAE,eAAe,GAAG;AACpC,cAAM,UAAU,GAAE,eAAe,GAAG;AACpC,cAAM,YAAY,UAAU;AAC5B,cAAM,YAAY,UAAU;AAC5B,gBAAQ;AACR,gBAAQ;AACR,cAAM,IAAI,UAAU,KAAK;AACzB,cAAM,IAAI,UAAU,KAAK;AACzB,aAAK,kBAAkB,EAAE,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,WAAW,eAAe,GAAE,CAAC;AAAA,MACpG;AACA,YAAM,iBAAiB,CAAC,OAAkB;AACtC,WAAE,eAAe;AACjB,cAAM,IAAI,GAAE,eAAe,GAAG,UAAU,KAAK;AAC7C,cAAM,IAAI,GAAE,eAAe,GAAG,UAAU,KAAK;AAC7C,aAAK,gBAAgB,EAAE,GAAG,GAAG,eAAe,GAAE,CAAC;AAC/C,iBAAS,oBAAoB,aAAa,eAAe;AACzD,iBAAS,oBAAoB,YAAY,cAAc;AAAA,MAC3D;AACA,eAAS,iBAAiB,aAAa,iBAAiB,EAAE,SAAS,MAAM,CAAC;AAC1E,eAAS,iBAAiB,YAAY,gBAAgB,EAAE,SAAS,MAAM,CAAC;AAAA,IAC5E;AACA,uBAAc,CAAC,MAAkB;AAAA,IAAC;AAClC,uBAAc,CAAC,MAAkB;AAAA,IAAC;AAClC,2BAAkB,CAAC,MAAkB;AACjC,QAAE,eAAe;AACjB,MAAC,EAAE,cAA8B,MAAM;AACvC,YAAM,OAAQ,EAAE,cAA8B,sBAAsB;AACpE,YAAM,QAAQ,EAAE,UAAU,KAAK;AAC/B,YAAM,QAAQ,EAAE,UAAU,KAAK;AAC/B,YAAM,YAAY,KAAK,MAAM;AAC7B,WAAK,kBAAkB,EAAE,GAAG,OAAO,GAAG,OAAO,eAAe,EAAE,CAAC;AAC/D,YAAM,kBAAkB,CAAC,OAAkB;AACvC,WAAE,eAAe;AACjB,cAAM,IAAI,GAAE,UAAU,KAAK;AAC3B,cAAM,IAAI,GAAE,UAAU,KAAK;AAC3B,aAAK,kBAAkB,EAAE,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,GAAE,WAAW,WAAW,GAAE,WAAW,eAAe,GAAE,CAAC;AAAA,MAC9H;AACA,YAAM,gBAAgB,CAAC,OAAkB;AACrC,WAAE,eAAe;AACjB,cAAM,IAAI,GAAE,UAAU,KAAK;AAC3B,cAAM,IAAI,GAAE,UAAU,KAAK;AAC3B,aAAK,gBAAgB,EAAE,GAAG,GAAG,eAAe,GAAE,CAAC;AAC/C,iBAAS,oBAAoB,aAAa,eAAe;AACzD,iBAAS,oBAAoB,WAAW,aAAa;AAAA,MACzD;AACA,eAAS,iBAAiB,aAAa,eAAe;AACtD,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACtD;AACA,2BAAkB,CAAC,MAAkB;AAAA,IAAC;AACtC,0BAAiB,CAAC,MAAkB;AAAA,IAAC;AACrC,6BAAoB,CAAC,MAAkB;AAAA,IAAC;AACxC,6BAAoB,CAAC,MAAwB;AAAA,IAAC;AAC9C,6BAAoB,CAAC,MAAwB;AAAA,IAAC;AAC9C,2BAAkB,CAAC,MAAsB;AAAA,IAAC;AAC1C,yBAAgB,CAAC,MAAkB,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC;AAChE,0BAAiB,CAAC,MAAkB,KAAK,SAAS,EAAE,OAAO,MAAM,CAAC;AAO9D,SAAK,MAAM,QAAQ,kCAAK,KAAK,aAAa,QAAU,MAAM;AAC1D,QAAI,KAAK,MAAM;AAAS,WAAK,MAAM,QAAQ,SAAS,KAAK,MAAM,SAAS,IAAI;AAAA,EAChF;AAAA,EAIA,cAAc,OAAe;AACzB,UAAM,EAAE,KAAK,KAAK,SAAS,KAAK;AAChC,QAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ;AAAU,aAAO;AAC/D,UAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC5C,QAAI,CAAC;AAAM,aAAO;AAClB,WAAO,MAAM,KAAK,MAAO,KAAI,OAAO,IAAI,IAAI;AAAA,EAChD;AAAA,EAIA,SAAS,SAAiB;AACtB,UAAM,QAAQ,KAAK,cAAc,OAAO;AACxC,UAAM,UAAU,KAAK,SAAS,EAAE,MAAM,CAAC;AACvC,QAAI;AAAS,WAAK,OAAO,KAAK;AAC9B,WAAO;AAAA,EACX;AAAA,EAIA,OAAO,SAAkB;AACrB,QAAI,KAAK,MAAM;AAAS,WAAK,MAAM,QAAQ,gBAAgB,KAAK,MAAM,SAAS,OAAO,YAAY,WAAW,UAAU,KAAK,MAAM,KAAK;AAAA,EAC3I;AAAA,EAMA,SAAS,UAA6E;AAClF,QAAI,eAAe;AACnB,eAAW,OAAO,UAAU;AACxB,YAAM,WAAW;AACjB,YAAM,aAAa,SAAS;AAC5B,UAAI,aAAa,SAAS;AACtB,mBAAW,YAAY,SAAS,OAAO;AACnC,cAAI,YAAY,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,cAAc,SAAS,MAAM,WAAW;AACzF,iBAAK,MAAM,MAAM,YAAY,SAAS,MAAM;AAC5C,2BAAe;AAAA,UACnB;AAAA,QACJ;AAAA,MACJ,WAAW,YAAY,KAAK,SAAS,KAAK,MAAM,cAAc,YAAY;AACtE,QAAC,KAAK,MAAc,YAAY;AAChC,uBAAe;AAAA,MACnB;AAAO,eAAO;AACd,UAAI;AAAc,aAAK,KAAK,UAAU,KAAK,MAAM,SAAS;AAAA,IAC9D;AACA,WAAO;AAAA,EACX;AAAA,EAKA,qBAAqB;AACjB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,YAAY,CAAC,sBAAsB,wBAAwB,KAAK,SAAS,EAAE,KAAK,GAAG;AAClG,SAAK,UAAU,WAAW;AAC1B,SAAK,UAAU,KAAK,KAAK,MAAM;AAC/B,QAAI,KAAK,MAAM;AAAS,WAAK,UAAU,QAAQ,KAAK,MAAM;AAC1D,SAAK,QAAQ,SAAS,cAAc,KAAK;AACzC,SAAK,MAAM,YAAY;AACvB,SAAK,cAAc,SAAS,cAAc,QAAQ;AAClD,SAAK,WAAW,KAAK,YAAY,WAAW,IAAI;AAChD,WAAO;AAAA,EACX;AAAA,EAIA,QAAQ;AACJ,SAAK,MAAM,YAAY,KAAK,WAAW;AACvC,WAAO;AAAA,EACX;AAAA,EACA,WAAW,OAAyB;AAChC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,KAAK;AACpB,QAAI,EAAE,OAAO,WAAW,KAAK,MAAM,sBAAsB;AACzD,QAAI,CAAC,SAAS,CAAC;AAAQ,aAAO;AAC9B,YAAQ,KAAK,MAAM,KAAK;AACxB,aAAS,KAAK,MAAM,MAAM;AAC1B,WAAO,SAAS;AAChB,WAAO,QAAQ;AACf,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,QAAI,YAAY;AAChB,QAAI,eAAe;AACnB,QAAI,YAAY,SAAS;AACzB,QAAI,OAAO,QAAQ,SAAS;AAC5B,QAAI,SAAS,OAAO,UAAU,SAAS,IAAI,UAAU,UAAU,QAAQ,QAAQ,GAAG,SAAS,GAAG,KAAK;AACnG,WAAO;AAAA,EACX;AAAA,EAIA,oBAAoB;AAChB,UAAM,eAAe,MAAM;AACvB,YAAM,EAAE,MAAM,MAAM,KAAK,OAAO,WAAW,KAAK,MAAM;AACtD,WAAK,UAAU,MAAM,QAAQ,GAAG,QAAQ;AACxC,WAAK,UAAU,MAAM,SAAS,GAAG,SAAS;AAC1C,WAAK,UAAU,MAAM,OAAO,GAAG,OAAO;AACtC,WAAK,UAAU,MAAM,MAAM,GAAG,MAAM;AACpC,WAAK,MAAM,MAAM,SAAS,GAAG,OAAO;AACpC,WAAK,WAAW;AAAA,IACpB;AACA,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,YAAY,CAAC;AAClD,iBAAa;AACb,WAAO;AAAA,EACX;AAAA,MAII,aAAa;AACb,UAAM,EAAE,MAAM,KAAK,KAAK,MAAM,UAAU,KAAK;AAC7C,UAAM,WAAW,SAAS,SAAS,MAAM,SAAS,SAAS,QAAQ,MAAM,MAAO,OAAM,OAAO;AAC7F,QAAI,MAAM;AACN,UAAI,SAAS;AAAQ,eAAO,MAAM;AAClC,UAAI,SAAS;AAAO,eAAO,KAAK,IAAI,KAAK,MAAO,OAAM,OAAQ,MAAK,MAAM,IAAI,KAAK,EAAE,GAAG,QAAQ;AAC/F,aAAO,KAAK,MAAO,OAAM,OAAO,IAAI;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,MAII,WAAW;AACX,UAAM,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,UAAU,KAAK;AACrD,WAAO,cAAa,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,MAAM,CAAC;AAAA,EAC3E;AAAA,SACO,YAAY,OAAwJ;AACvK,UAAM,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,UAAU;AAChD,QAAI,SAAS;AAAQ,aAAO,QAAS,OAAM,SAAS;AACpD,UAAM,IAAI,UAAU,QAAQ,+CAAO,CAAC,OAAO,KAAK,GAAG,IAAI,UAAU,QAAQ,+CAAO,CAAC,OAAO,KAAK,GAAG,IAAI;AACpG,WAAO,iDAAS,CAAC,GAAG,KAAK,GAAG;AAAA,EAChC;AAAA,MAII,YAAY;AACZ,UAAM,OAAO;AACb,UAAM,aAAa,KAAK;AACxB,WAAO,OAAO;AAAA,EAClB;AACJ;AAtQA;AAIW,4BAAmD;AAAA,EACtD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO,CAAC;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG,KAAK,GAAG,YAAY,2BAA2B;AAC5F;AAlBJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjB0C;AAEnB;AAaR,MAAM,eAAe,qDAAY,CAAqB;AAAA,EAArE;AAAA;AAmBI,qBAAY;AAYZ,oBAAW,MAAM;AACb,YAAM,EAAE,OAAO,UAAU,KAAK;AAC9B,YAAM,EAAE,QAAQ,MAAM,UAAU,UAAU,UAAU,WAAW,aAAa,WAAW,SAAS,aAAa,kBAAkB;AAC/H,WAAK,IAAI,MAAM,kBAAkB,QAAQ,YAAY;AACrD,WAAK,IAAI,MAAM,cAAc,QAAQ,gBAAgB;AACrD,WAAK,IAAI,MAAM,QAAQ,QAAQ,cAAc;AAC7C,WAAK,IAAI,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AACzD,WAAK,IAAI,MAAM,aAAa,GAAG;AAC/B,WAAK,IAAI,MAAM,YAAY;AAAA,IAC/B;AAgBA,6BAAoB,MAAM;AACtB,WAAK,SAAS,CAAC;AAAA,IACnB;AACA,2BAAkB,MAAM;AACpB,WAAK,SAAS,CAAC;AAAA,IACnB;AAAA;AAAA,aA5DW,eAAqD;AAC5D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,QACX,aAAa;AAAA,QACb,eAAe;AAAA,QACf,WAAW;AAAA,QACX,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAKA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,MAAM,SAAS,cAAc,KAAK;AACvC,SAAK,OAAO,SAAS,cAAc,MAAM;AACzC,SAAK,KAAK,YAAY,KAAK,MAAM;AACjC,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAWA,QAAQ;AACJ,SAAK,IAAI,YAAY,KAAK,IAAI;AAC9B,SAAK,UAAU,YAAY,KAAK,GAAG;AACnC,WAAO,MAAM,MAAM;AAAA,EACvB;AAAA,EACA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,IAAI,iBAAiB,aAAa,KAAK,eAAe;AAC3D,SAAK,IAAI,iBAAiB,cAAc,KAAK,gBAAgB;AAC7D,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,UAAM,cAAc,MAAM,KAAK,KAAK,YAAY,KAAK,MAAM;AAC3D,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,WAAO;AAAA,EACX;AAOJ;;;;;;;;;;;;;;;;;AC7E8B;AACL;AAEV,MAAM,iBAAiB,+CAAM,CAAC;AAAA,EAA7C;AAAA;AACI,qBAAY;AAEZ,6BAAoB,MAAM;AACtB,WAAK,SAAS,IAAI,KAAK,MAAM,KAAK;AAAA,IACtC;AACA,2BAAkB,MAAM;AAAA,IACxB;AAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACVoD;AAEpB;AACA;AACF;AACA;AACI;AACR;AACA;AACE;AACJ;AACY;AACA;AACA;AACE;AAOhB;AAKP,MAAM,cAAc,0DAAiB,CAAoB;AAAA,EAAxE;AAAA;AAmJI,oBAAW,MAAM;AACb,WAAK,WAAW,CAAC;AACjB,YAAM,EAAE,OAAO,MAAM,OAAO,SAAS,WAAW,KAAK;AACrD,YAAM,EAAE,MAAM,MAAM,KAAK,OAAO,WAAW;AAC3C,WAAK,MAAM,MAAM,SAAS,GAAG,OAAO;AACpC,WAAK,UAAU,MAAM,OAAO,GAAG,OAAO;AACtC,WAAK,UAAU,MAAM,MAAM,GAAG,MAAM;AACpC,WAAK,UAAU,MAAM,QAAQ,GAAG,QAAQ;AACxC,WAAK,UAAU,MAAM,SAAS,GAAG,SAAS;AAC1C,WAAK,UAAU,YAAY,CAAC,kBAAkB,YAAY,QAAQ,GAAG,SAAS,kBAAkB,IAAI,EAAE,KAAK,GAAG;AAC9G,YAAM,QAAQ,CAAC,SAAS;AACpB,YAAI,KAAK,KAAK,SAAS,OAAO,GAAG;AAC7B,gBAAM,YAAY,MAAM,aAAa,MAAM,SAAS,IAAI;AACxD,cAAI;AAAW,iBAAK,SAAS,KAAK,SAAS;AAAA,QAC/C,OAAO;AACH,gBAAM,SAAS;AACf,gBAAM,gBAAgB,MAAM,aAAa,QAAQ,KAAK,MAAM,SAAS,IAAI;AACzE,cAAI;AAAe,iBAAK,SAAS,KAAK,aAAa;AAAA,QACvD;AAAA,MACJ,CAAC;AACD,UAAI,SAAS,UAAU;AACnB,aAAK,KAAK,YAAY;AACtB,aAAK,KAAK,MAAM,SAAS,GAAG;AAC5B,aAAK,KAAK,MAAM,MAAM,GAAG,OAAO;AAChC,aAAK,MAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAClC,gBAAM,QAAQ,KAAK;AACnB,gBAAM,MAAM,SAAS,cAAc,MAAM;AACzC,cAAI,YAAY;AAChB,cAAI,YAAY;AAChB,cAAI,MAAM,WAAW,GAAG,OAAO;AAC/B,cAAI,MAAM,QAAQ,GAAG,IAAI,OAAO;AAChC,cAAI,MAAM,SAAS,GAAG,OAAO;AAC7B,cAAI,MAAM,aAAa,GAAG,OAAO;AACjC,cAAI,iBAAiB,SAAS,MAAM;AAChC,kBAAM,SAA2B,CAAC;AAClC,qBAAS,IAAI,GAAG,IAAI,KAAK,UAAU,SAAS,QAAQ,KAAK;AACrD,oBAAM,UAAU,KAAK,UAAU,SAAS;AACxC,kBAAI,IAAI;AAAG,uBAAO,KAAK,OAAO;AAAA,YAClC;AACA,qBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,oBAAM,UAAU,OAAO;AACvB,sBAAQ,MAAM,aAAa,MAAM,IAAI,YAAY;AAAA,YACrD;AACA,qBAAS,IAAI,GAAG,IAAI,KAAK,KAAK,SAAS,QAAQ,KAAK;AAChD,oBAAM,IAAI,KAAK,KAAK,SAAS;AAC7B,kBAAI,MAAM,GAAG;AACT,oBAAI,EAAE,UAAU,SAAS,QAAQ;AAAG,oBAAE,UAAU,OAAO,QAAQ;AAAA,cACnE;AAAO,kBAAE,UAAU,IAAI,QAAQ;AAAA,YACnC;AAAA,UACJ,CAAC;AACD,eAAK,KAAK,YAAY,GAAG;AAAA,QAC7B,CAAC;AAAA,MACL;AAAA,IACJ;AAAA;AAAA,SAvMO,UAAU,QAAuF;AACpG,UAAM,aAA0B,CAAC;AACjC,QAAI,CAAC;AAAQ,aAAO,EAAE,WAAW;AACjC,WAAO,QAAQ,OAAK,OAAO,OAAO,YAAY,CAAC,CAAC;AAChD,QAAI,WAAW,OAAO;AAClB,YAAM,aAAa;AACnB,YAAM,UAAU,WAAW,MAAM,MAAM,UAAU;AACjD,UAAI,SAAS;AACT,cAAM,aAAa;AACnB,cAAM,QAAmC,CAAC;AAC1C,YAAI;AAEJ,eAAO,OAAO,WAAW,KAAK,QAAQ,EAAE,GAAG;AACvC,gBAAM,KAAK,MAAM,CAAC,KAAK;AAAA,QAC3B;AACA,eAAO,EAAE,YAAY,MAAM;AAAA,MAC/B;AAAA,IACJ;AACA,WAAO,EAAE,WAAW;AAAA,EACxB;AAAA,SACO,aAAa,MAAgF,SAAkB,MAAc;AAChI,UAAM,OAAO,uDAAM,CAAC,YAAY,IAAI;AACpC,QAAI,KAAK,SAAS,OAAO,GAAG;AACxB,YAAM,EAAE,eAAO,OAAO,aAAM,oBAAW;AACvC,YAAM,SAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,UACH;AAAA,UACA,OAAO,QAAO;AAAA,UACd,QAAQ,QAAO;AAAA,UACf,MAAM,QAAO;AAAA,UACb,KAAK,QAAO;AAAA,UACZ,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,MACJ;AACA,aAAO,IAAI,MAAM,MAAK;AAAA,IAC1B;AACA,UAAM,SAAS;AACf,UAAM,EAAE,YAAY,UAAU,KAAK,UAAU,OAAO,IAAI;AACxD,UAAM,EAAE,SAAS,MAAM,UAAU;AACjC,UAAM,EAAE,OAAO,KAAK,KAAK,SAAS,WAAW;AAC7C,UAAM,QAA4C;AAAA,MAC9C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACH;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,MAAM,OAAO;AAAA,QACb,KAAK,OAAO;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,MACN,KAAK,SAAS,GAAG,IAAI,MAAM;AAAA,MAC3B,KAAK,SAAS,GAAG,IAAI,MAAM;AAAA,MAC3B,MAAM,UAAU,OAAO,CAAC,KAAK,OAAO;AAAA,MACpC,OAAO,UAAU,OAAO,CAAC,KAAK,QAAQ,IAAI;AAAA,IAC9C;AACA,QAAI,SAAS;AAAU,aAAO,IAAI,+CAAM,CAAC,KAAK;AAC9C,QAAI,SAAS;AAAY,aAAO,IAAI,iDAAQ,CAAC,KAAK;AAClD,QAAI,SAAS;AAAU,aAAO,IAAI,+CAAM,CAAC,KAAK;AAC9C,QAAI,SAAS;AAAQ,aAAO,IAAI,6CAAI,CAAC,KAAK;AAC1C,QAAI,SAAS;AAAQ,aAAO,IAAI,6CAAI,CAAC,KAAK;AAC1C,QAAI,SAAS;AAAS,aAAO,IAAI,8CAAK,CAAC,KAAK;AAC5C,QAAI,SAAS;AAAW,aAAO,IAAI,gDAAO,CAAC,KAAK;AAChD,QAAI,SAAS;AAAW,aAAO,IAAI,gDAAO,CAAC,KAAK;AAChD,QAAI,SAAS;AAAa,aAAO,IAAI,mDAAS,CAAC,KAAK;AACpD,QAAI,SAAS;AAAa,aAAO,IAAI,mDAAS,CAAC,KAAK;AACpD,QAAI,SAAS;AAAa,aAAO,IAAI,mDAAS,CAAC,KAAK;AACpD,QAAI,SAAS;AAAO,aAAO,IAAI,4CAAG,CAAC,KAAK;AACxC,WAAO;AAAA,EACX;AAAA,EAiBA,SAAS,UAAyE;AAC9E,QAAI,eAAe;AACnB,eAAW,OAAO,UAAU;AACxB,YAAM,WAAW;AACjB,YAAM,aAAa,SAAS;AAC5B,UAAI,aAAa,SAAS;AACtB,mBAAW,QAAO,SAAS,OAAO;AAC9B,gBAAM,WAAW;AACjB,cAAI,YAAY,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,cAAc,SAAS,MAAM,WAAW;AACzF,YAAC,KAAK,MAAM,MAAc,YAAY,SAAS,MAAM;AACrD,2BAAe;AAAA,UACnB;AAAA,QACJ;AAAA,MACJ,WAAW,YAAY,KAAK,SAAS,KAAK,MAAM,cAAc,YAAY;AACtE,QAAC,KAAK,MAAc,YAAY;AAChC,uBAAe;AAAA,MACnB;AAAO;AACP,UAAI;AAAc,aAAK,KAAK,UAAU,KAAK,MAAM,SAAS;AAAA,IAC9D;AAAA,EACJ;AAAA,EACA,qBAAqB;AACjB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,OAAO,SAAS,cAAc,KAAK;AACxC,SAAK,KAAK,YAAY;AACtB,SAAK,QAAQ,SAAS,cAAc,KAAK;AACzC,SAAK,MAAM,YAAY;AACvB,SAAK,cAAc,SAAS,cAAc,QAAQ;AAClD,SAAK,WAAW,KAAK,YAAY,WAAW,IAAI;AAChD,SAAK,SAAS;AACd,SAAK,SAAS,QAAQ,UAAQ,KAAK,mBAAmB,CAAC;AACvD,WAAO;AAAA,EACX;AAAA,EACA,aAAa;AACT,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,KAAK;AACpB,QAAI,EAAE,OAAO,WAAW,KAAK,MAAM,sBAAsB;AACzD,QAAI,CAAC,SAAS,CAAC;AAAQ,aAAO;AAC9B,YAAQ,KAAK,MAAM,KAAK;AACxB,aAAS,KAAK,MAAM,MAAM;AAC1B,WAAO,SAAS;AAChB,WAAO,QAAQ;AACf,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,QAAI,YAAY;AAChB,QAAI,eAAe;AACnB,QAAI,YAAY;AAChB,QAAI,OAAO,QAAQ,SAAS;AAC5B,QAAI,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK;AACxC,WAAO;AAAA,EACX;AAAA,EAuDA,QAAQ;AACJ,SAAK,MAAM,YAAY,KAAK,WAAW;AACvC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,QAAI,KAAK,KAAK,SAAS;AAAQ,WAAK,UAAU,YAAY,KAAK,IAAI;AACnE,SAAK,SAAS,QAAQ,CAAC,SAAS;AAC5B,WAAK,MAAM;AACX,WAAK,UAAU,YAAY,KAAK,SAAS;AAAA,IAC7C,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EACA,oBAAoB;AAChB,UAAM,eAAe,MAAM;AACvB,YAAM,EAAE,MAAM,MAAM,KAAK,OAAO,WAAW,KAAK,MAAM;AACtD,WAAK,MAAM,MAAM,SAAS,GAAG,OAAO;AACpC,WAAK,UAAU,MAAM,QAAQ,GAAG,QAAQ;AACxC,WAAK,UAAU,MAAM,SAAS,GAAG,SAAS;AAC1C,WAAK,UAAU,MAAM,OAAO,GAAG,OAAO;AACtC,WAAK,UAAU,MAAM,MAAM,GAAG,MAAM;AACpC,UAAI,KAAK,MAAM,SAAS,UAAU;AAC9B,aAAK,KAAK,MAAM,SAAS,GAAG;AAC5B,aAAK,KAAK,MAAM,MAAM,GAAG,OAAO;AAChC,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK,SAAS,QAAQ,KAAK;AAChD,gBAAM,MAAM,KAAK,KAAK,SAAS;AAC/B,cAAI,MAAM,WAAW,GAAG,OAAO;AAC/B,cAAI,MAAM,QAAQ,GAAG,IAAI,OAAO;AAChC,cAAI,MAAM,SAAS,GAAG,OAAO;AAC7B,cAAI,MAAM,aAAa,GAAG,OAAO;AAAA,QACrC;AAAA,MACJ;AACA,WAAK,WAAW;AAChB,WAAK,SAAS,QAAQ,UAAQ,KAAK,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IACpE;AACA,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,YAAY,CAAC;AAClD,UAAM,cAAc,MAAM;AACtB,WAAK,SAAS;AACd,WAAK,SAAS,QAAQ,UAAQ,KAAK,mBAAmB,CAAC;AAAA,IAC3D;AACA,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,UAAM,cAAc,MAAM;AACtB,WAAK,WAAW;AAChB,WAAK,MAAM,QAAQ,KAAK,MAAM;AAAA,IAClC;AACA,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,SAAK,WAAW;AAChB,QAAI,KAAK,QAAQ,KAAK,KAAK,SAAS;AAAQ,MAAC,KAAK,KAAK,SAAS,GAAuB,MAAM;AAC7F,SAAK,SAAS,QAAQ,UAAQ,KAAK,kBAAkB,CAAC;AACtD,WAAO;AAAA,EACX;AACJ;;;;;;;;;;;;;;;;;;ACpR0C;AACN;AACV;AAEX,MAAM,kBAAkB,kDAAS,CAAC;AAAA,EAAjD;AAAA;AACI,qBAAY;AAKZ,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AAC/E,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AAC3D,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,UAAU,MAAM,kBAAkB;AACvC,WAAK,UAAU,MAAM,cAAc;AAAA,IACvC;AACA,iBAAQ,MAAM;AACV,YAAM,EAAE,UAAU,YAAY,WAAW,WAAW,UAAU,kBAAkB,KAAK,MAAM;AAC3F,YAAM,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,UAAU,KAAK;AACrD,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,UAAI,EAAE,OAAO,WAAW,KAAK,UAAU,sBAAsB;AAC7D,cAAQ,KAAK,MAAM,KAAK;AACxB,eAAS,KAAK,MAAM,MAAM;AAC1B,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,YAAY,QAAQ;AAC1B,YAAM,aAAa,YAAY,KAAK,IAAI,SAAS,GAAG,YAAY,IAAI;AACpE,YAAM,OAAO,QAAQ;AACrB,YAAM,MAAO,UAAS,cAAc;AACpC,WAAK,aAAa;AAClB,YAAM,aAAa,KAAK;AACxB,UAAI,aAAa,KAAK,UAAU;AAC5B,aAAK,WAAW;AAChB,YAAI,KAAK;AAAU,iBAAO,aAAa,KAAK,QAAQ;AACpD,aAAK,WAAW,OAAO,WAAW,MAAM;AACpC,eAAK,WAAW,KAAK;AACrB,eAAK,WAAW;AAChB,eAAK,SAAS,KAAK,KAAK;AAAA,QAC5B,GAAG,GAAI;AAAA,MACX;AACA,UAAI,aAAa,KAAK,YAAY,OAAO,KAAK,aAAa,aAAa;AACpE,aAAK,WAAW,OAAO,WAAW,MAAM;AACpC,eAAK,WAAW,KAAK;AACrB,eAAK,WAAW;AAChB,eAAK,SAAS,KAAK,KAAK;AAAA,QAC5B,GAAG,GAAI;AAAA,MACX;AACA,YAAM,WAAW,KAAK;AACtB,YAAM,WAAY,OAAM,OAAQ,OAAM;AACtC,YAAM,WAAY,MAAK,OAAQ,OAAM;AACrC,YAAM,UAAW,MAAK,OAAQ,OAAM;AACpC,YAAM,eAAe,KAAK,IAAI,GAAG,CAAC,MAAO,OAAM,IAAI;AACnD,YAAM,WAAW,IAAI,qBAAqB,MAAM,GAAG,WAAW,CAAC;AAC/D,UAAI,YAAY,KAAK,YAAY;AAAG,iBAAS,aAAa,UAAU,SAAS;AAAA,eACpE,WAAW;AAAG,iBAAS,aAAa,GAAG,SAAS;AACzD,UAAI,YAAY,KAAK,YAAY;AAAG,iBAAS,aAAa,UAAU,SAAS;AAC7E,UAAI,WAAW,KAAK,WAAW;AAAG,iBAAS,aAAa,SAAS,QAAQ;AACzE,UAAI,gBAAgB,KAAK,gBAAgB;AAAG,iBAAS,aAAa,cAAc,aAAa;AAAA,eACpF,eAAe;AAAG,iBAAS,aAAa,GAAG,SAAS;AAE7D,UAAI,YAAY;AAChB,UAAI,aAAa;AAAG,YAAI,SAAS,MAAM,KAAK,YAAY,cAAc,UAAU;AAChF,UAAI,aAAa;AAAK,YAAI,SAAS,OAAO,YAAY,eAAe,GAAG,KAAK,YAAa,KAAI,gBAAgB,GAAG,UAAU;AAC3H,UAAI,YAAY;AAChB,UAAI,aAAa,KAAK;AAClB,cAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC;AACvH,YAAI,SAAS,MAAM,KAAK,WAAW,WAAW,UAAU;AAAA,MAC5D;AACA,UAAI,aAAa,GAAG;AAChB,cAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,KAAK,UAAU,EAAE,CAAC,IAAI,YAAY;AACxI,YAAI,SAAS,OAAO,eAAe,YAAY,GAAG,KAAK,WAAW,YAAY,GAAG,UAAU;AAAA,MAC/F;AACA,UAAI,WAAW,YAAY;AACvB,YAAI,YAAY,GAAG;AACf,gBAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC;AACrH,cAAI,SAAS,OAAO,WAAW,YAAY,GAAG,KAAK,GAAG,UAAU;AAAA,QACpE;AACA,YAAI,WAAW,GAAG;AACd,gBAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC,IAAI,YAAY;AACtI,cAAI,SAAS,OAAO,KAAK,IAAI,YAAY,GAAI,gBAAe,YAAY,SAAS,GAAG,KAAK,GAAG,UAAU;AAAA,QAC1G;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EA9EA,aAAa;AACT,WAAO,MAAM,WAAW,MAAM;AAAA,EAClC;AA6EJ;;;;;;;;;;;;;;;;;;ACtF0C;AACV;AACR;AAET,MAAM,gBAAgB,gDAAO,CAAC;AAAA,EAA7C;AAAA;AACI,qBAAY;AAKZ,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AAC/E,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AAC3D,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,UAAU,MAAM,kBAAkB;AACvC,WAAK,UAAU,MAAM,cAAc;AAAA,IACvC;AACA,iBAAQ,MAAM;AACV,YAAM,EAAE,aAAa,eAAe,iBAAiB,gBAAgB,KAAK,MAAM;AAChF,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,YAAM,WAAW,KAAK;AACtB,UAAI,EAAE,OAAO,WAAW,KAAK,UAAU,sBAAsB;AAC7D,cAAQ,KAAK,MAAM,KAAK;AACxB,eAAS,KAAK,MAAM,MAAM;AAC1B,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,YAAY,QAAQ;AAC1B,YAAM,aAAa,eAAe,KAAK,IAAI,SAAS,GAAG,YAAY,IAAI;AACvE,YAAM,OAAO,QAAQ;AACrB,YAAM,MAAO,UAAS,cAAc;AACpC,YAAM,eAAe,aAAa;AAClC,WAAK,kBAAkB,CAAC,MAAM,GAAG,WAAW,MAAM;AAClD,YAAM,MAAM,IAAI,qBAAqB,MAAM,GAAG,OAAO,WAAW,CAAC;AACjE,UAAI,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,eAAe;AACpE,UAAI,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,aAAa;AAClE,UAAI,YAAY;AAChB,6DAAe,CAAC,KAAK,MAAM,KAAK,WAAW,YAAY,YAAY;AAEnE,UAAI,YAAY;AAChB,6DAAe,CAAC,KAAK,OAAO,YAAY,WAAW,YAAY,MAAM,YAAY,aAAa,GAAG,aAAa,GAAG,YAAY;AAAA,IACjI;AAAA;AAAA,EAnCA,aAAa;AACT,WAAO,MAAM,WAAW,MAAM;AAAA,EAClC;AAkCJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3C0C;AACgC;AAGrD;AAQN,MAAM,aAAa,qDAAY,CAAmB;AAAA,EAAjE;AAAA;AAqBI,qBAAY;AAwBZ,wBAAe,CAAC,MAAa;AACzB,YAAM,QAAQ,WAAY,EAAE,cAAmC,KAAK;AACpE,UAAI,SAAS,KAAK,GAAG;AACjB,cAAM,UAAU,KAAK,SAAS,CAAC,KAAK,YAAY,KAAK;AACrD,YAAI;AAAS;AAAA,MACjB;AACA,WAAK,MAAM,QAAQ,KAAK,YAAY,QAAS,MAAK,MAAM,QAAQ;AAAA,IACpE;AACA,oBAAW,MAAM;AACb,YAAM,EAAE,UAAU,QAAQ,MAAM,WAAW,SAAS,gBAAgB,KAAK,MAAM;AAC/E,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AAC3D,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,UAAU,MAAM,kBAAkB;AACvC,WAAK,UAAU,MAAM,cAAc;AAAA,IACvC;AA2CA,iBAAQ,MAAM;AACV,YAAM,EAAE,WAAW,WAAW,aAAa,gBAAgB,KAAK,MAAM;AACtE,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,YAAM,WAAW,KAAK;AACtB,UAAI,EAAE,OAAO,WAAW,KAAK,OAAO,sBAAsB;AAC1D,cAAQ,KAAK,MAAM,KAAK;AACxB,eAAS,KAAK,MAAM,MAAM;AAC1B,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,YAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,YAAM,SAAS,QAAQ,6CAAK,CAAC,WAAW,GAAG;AAC3C,YAAM,aAAa,KAAK,IAAI,OAAO,MAAM,IAAI;AAC7C,YAAM,aAAa,aAAa;AAChC,YAAM,cAAc,QAAQ;AAC5B,YAAM,cAAc,SAAS;AAK7B,YAAM,YAAY,cAAe,aAAa,MAAM,KAAK,IAAI,MAAM;AACnE,YAAM,YAAY,cAAe,aAAa,MAAM,KAAK,IAAI,MAAM;AACnE,YAAM,YAAY,aAAa,aAAa;AAE5C,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI,UAAU;AAEd,UAAI,UAAU;AACd,UAAI,IAAI,aAAa,aAAa,YAAY,QAAQ,GAAG;AACzD,UAAI,OAAO;AAEX,UAAI,UAAU;AACV,YAAI,cAAc;AAClB,YAAI,UAAU;AACd,YAAI,IAAI,aAAa,aAAa,YAAY,OAAO,MAAM;AAC3D,YAAI,OAAO;AAAA,MACf;AAEA,UAAI,cAAc;AAClB,UAAI,UAAU;AACd,UAAI,OAAO,aAAa,WAAW;AACnC,UAAI,OAAO,WAAW,SAAS;AAC/B,UAAI,OAAO;AAAA,IACf;AAiBA,6BAAoB,CAAC,MAAwB;AACzC,YAAM,WAAW,KAAK,kBAAkB,CAAC;AACzC,UAAI,aAAa,KAAK,MAAM;AAAO,aAAK,SAAS,QAAQ;AAAA,IAC7D;AAAA;AAAA,aAvKW,eAAmD;AAC1D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAOA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,SAAS;AACrB,SAAK,MAAM,KAAK,OAAO,WAAW,IAAI;AACtC,SAAK,cAAc,SAAS,cAAc,OAAO;AACjD,SAAK,YAAY,OAAO;AACxB,SAAK,YAAY,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS;AACjE,SAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AAC/C,SAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AAC/C,SAAK,YAAY,OAAO,KAAK,MAAM,KAAK,SAAS;AACjD,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,QAAQ,KAAK,YAAY,QAAS,MAAK,MAAM,QAAQ;AAChE,SAAK,MAAM,aAAa;AACxB,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAgBA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,MAAM,iBAAiB,UAAU,KAAK,YAAY;AACvD,SAAK,OAAO,iBAAiB,aAAa,KAAK,eAAe;AAC9D,SAAK,OAAO,iBAAiB,cAAc,KAAK,kBAAkB,EAAE,SAAS,MAAM,CAAC;AACpF,SAAK,GAAG,SAAS,MAAM;AACnB,WAAK,SAAS,KAAK,QAAQ;AAC3B,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM;AACtB,WAAK,YAAY,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS;AACjE,WAAK,MAAM,QAAQ,KAAK,YAAY,QAAS,MAAK,MAAM,QAAQ;AAAA,IACpE;AACA,SAAK,GAAG,SAAS,MAAM;AACnB,WAAK,SAAS,WAAW;AACzB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AACvE,SAAK,GAAG,OAAO,MAAM;AACjB,WAAK,SAAS,SAAS;AACvB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AACvE,SAAK,GAAG,OAAO,MAAM;AACjB,WAAK,SAAS,SAAS;AACvB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,aAAa,MAAM,KAAK,YAAY,OAAO,KAAK,MAAM,KAAK,SAAS;AAC1E,SAAK,GAAG,QAAQ,MAAM;AAClB,WAAK,SAAS,UAAU;AACxB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,SAAK,SAAS,KAAK,KAAK;AACxB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,MAAM;AACtC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,WAAO,MAAM,MAAM;AAAA,EACvB;AAAA,EAgDA,kBAAkB,GAAqB;AACnC,UAAM,EAAE,MAAM,KAAK,KAAK,OAAO,UAAU,KAAK;AAC9C,UAAM,OAAO,SAAS,SAAS,IAAK,KAAK,MAAM,QAAQ;AACvD,UAAM,YAAY,KAAK;AACvB,UAAM,aAAa,KAAK;AACxB,UAAM,QAAQ;AACd,UAAM,eAAe,qDAAY,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,MAAM,KAAK,KAAK,OAAO,MAAM,CAAC,IAAI;AACtG,UAAM,WAAW,eAAe,EAAE,QAAQ,EAAE;AAC5C,UAAM,eAAe,mDAAW,CAAC,WAAW,OAAO,KAAK,GAAG;AAC3D,UAAM,IAAI,UAAU,QAAQ,+CAAO,CAAC,cAAc,KAAK,GAAG,IAAI,UAAU,QAAQ,+CAAO,CAAC,cAAc,KAAK,GAAG,IAAI;AAClH,QAAI,QAAQ,KAAK,MAAM,iDAAS,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,SAAS;AACjE,YAAQ,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,KAAK,CAAC;AAC/C,QAAI,SAAS;AAAQ,aAAO;AAC5B,QAAI,SAAS;AAAO,aAAO,KAAK,MAAM,QAAQ,OAAO,GAAG;AACxD,WAAO,QAAQ,OAAO;AAAA,EAC1B;AAKJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrL0C;AAGtB;AAUL,MAAM,YAAY,qDAAY,CAAkB;AAAA,EAA/D;AAAA;AAuBI,qBAAY;AAsBZ,oBAAW,MAAM;AACb,YAAM,EAAE,SAAS,gBAAgB,KAAK,MAAM;AAC5C,WAAK,UAAU,MAAM,kBAAkB;AACvC,WAAK,UAAU,MAAM,cAAc;AAAA,IACvC;AAoBA,iBAAQ,MAAM;AACV,YAAM,EAAE,OAAO,YAAY,WAAW,WAAW,UAAU,kBAAkB,KAAK,MAAM;AACxF,YAAM,EAAE,KAAK,QAAQ,KAAK;AAC1B,YAAM,EAAE,QAAQ,KAAK,YAAY,SAAS,aAAa;AACvD,YAAM,EAAE,OAAO,WAAW,OAAO,sBAAsB;AACvD,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,aAAa,KAAK,IAAI,QAAQ,KAAK,IAAI;AAC7C,YAAM,YAAY;AAClB,YAAM,OAAQ,SAAQ,aAAa;AACnC,YAAM,MAAO,UAAS,cAAc;AACpC,YAAM,WAAY,OAAM,OAAQ,OAAM;AACtC,YAAM,WAAY,MAAK,OAAQ,OAAM;AACrC,YAAM,UAAW,MAAK,OAAQ,OAAM;AACpC,YAAM,eAAe,CAAC,MAAO,OAAM;AACnC,YAAM,WAAW,QAAQ,qBAAqB,GAAG,GAAG,WAAW,OAAO,CAAC;AACvE,UAAI,YAAY,KAAK,YAAY;AAAG,iBAAS,aAAa,UAAU,SAAS;AAAA,eACpE,WAAW;AAAG,iBAAS,aAAa,GAAG,SAAS;AACzD,UAAI,YAAY,KAAK,YAAY;AAAG,iBAAS,aAAa,UAAU,SAAS;AAC7E,UAAI,WAAW,KAAK,WAAW;AAAG,iBAAS,aAAa,SAAS,QAAQ;AACzE,UAAI,gBAAgB,KAAK,gBAAgB;AAAG,iBAAS,aAAa,cAAc,aAAa;AAAA,eACpF,eAAe;AAAG,iBAAS,aAAa,GAAG,SAAS;AAC7D,cAAQ,YAAY;AACpB,cAAQ,SAAS,GAAG,GAAG,WAAW,OAAO,EAAE;AAC3C,YAAM,IAAI,QAAQ,aAAa,KAAK,IAAI,WAAW,QAAQ,GAAG,WAAW,WAAW,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE;AACrG,UAAI;AAAU,YAAI,YAAY,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;AAAA;AACpD,YAAI,YAAY;AACrB,UAAI,UAAU;AAAU,YAAI,IAAI,QAAQ,GAAG,SAAS,GAAG,QAAQ,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE;AAAA;AAClF,YAAI,KAAK,MAAM,KAAK,WAAW,UAAU;AAC9C,UAAI,KAAK;AAAA,IACb;AAAA;AAAA,aAnGW,eAAkD;AACzD,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,MACnB;AAAA,IACJ;AAAA,EACJ;AAAA,EAQA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,YAAY,sBAAsB,KAAK;AACtD,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,SAAS;AACrB,SAAK,MAAM,KAAK,OAAO,WAAW,IAAI;AACtC,SAAK,aAAa,SAAS,cAAc,QAAQ;AACjD,SAAK,UAAU,KAAK,WAAW,WAAW,IAAI;AAC9C,SAAK,WAAW,QAAQ;AACxB,SAAK,WAAW,SAAS;AACzB,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAMA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,OAAO,iBAAiB,aAAa,KAAK,eAAe;AAC9D,SAAK,OAAO,iBAAiB,cAAc,KAAK,kBAAkB,EAAE,SAAS,MAAM,CAAC;AACpF,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAChD,SAAK,GAAG,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAC9C,SAAK,GAAG,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAC9C,SAAK,GAAG,QAAQ,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAC/C,SAAK,SAAS,KAAK,KAAK;AACxB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,MAAM;AACtC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,SAAS;AACzC,WAAO,MAAM,MAAM;AAAA,EACvB;AAiCJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClH0C;AAErB;AAWN,MAAM,aAAa,qDAAY,CAAmB;AAAA,EAAjE;AAAA;AAiBI,qBAAY;AAyBZ,wBAAe,CAAC,MAAa;AACzB,WAAK,SAAS,CAAE,EAAE,cAAmC,KAAK;AAAA,IAC9D;AACA,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AAC/E,WAAK,OAAO,MAAM,kBAAkB;AACpC,WAAK,OAAO,MAAM,cAAc;AAChC,WAAK,OAAO,MAAM,QAAQ;AAC1B,WAAK,OAAO,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AAAA,IAChE;AAAA;AAAA,aAlDW,eAAmD;AAC1D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EACA,aAAa;AACT,UAAM,EAAE,UAAU,KAAK;AACvB,SAAK,OAAO,YAAY;AACxB,QAAI,OAAO;AACP,UAAI,IAAI;AACR,iBAAW,OAAO,OAAO;AACrB,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,QAAQ,MAAM,KAAK,SAAS;AACnC,eAAO,OAAO;AACd,YAAI,MAAM;AAAG,iBAAO,WAAW;AAC/B,aAAK,OAAO,YAAY,MAAM;AAC9B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAWA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,OAAO,iBAAiB,UAAU,KAAK,YAAY;AACxD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM;AACtB,eAAS,IAAI,KAAK,OAAO,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AACvD,cAAM,SAAS,KAAK,OAAO,SAAS;AACpC,YAAI,CAAC,OAAO,UAAU,KAAK,MAAM;AAAO,eAAK,OAAO,gBAAgB;AAAA,MACxE;AAAA,IACJ;AACA,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,gBAAY;AACZ,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,MAAM;AACtC,WAAO,MAAM,MAAM;AAAA,EACvB;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtF0C;AAEnB;AAWR,MAAM,eAAe,qDAAY,CAAqB;AAAA,EAArE;AAAA;AAiBI,qBAAY;AAcZ,wBAAe,CAAC,MAAa;AACzB,WAAK,SAAS,CAAE,EAAE,cAAmC,KAAK;AAAA,IAC9D;AACA,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AAC/E,WAAK,MAAM,MAAM,kBAAkB;AACnC,WAAK,MAAM,MAAM,cAAc;AAC/B,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AAAA,IAC/D;AAAA;AAAA,aAvCW,eAAqD;AAC5D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS;AAC3D,SAAK,MAAM,MAAM,KAAK,MAAM,IAAI,SAAS;AACzC,SAAK,MAAM,MAAM,KAAK,MAAM,IAAI,SAAS;AACzC,SAAK,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS;AAC3C,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAWA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,MAAM,iBAAiB,UAAU,KAAK,YAAY;AACvD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM,KAAK,MAAM,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS;AACrF,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,UAAM,YAAY,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,IAAI,SAAS;AACjE,SAAK,GAAG,OAAO,MAAM,KAAK,SAAS,SAAS,CAAC;AAC7C,UAAM,YAAY,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,IAAI,SAAS;AACjE,SAAK,GAAG,OAAO,MAAM,KAAK,SAAS,SAAS,CAAC;AAC7C,UAAM,aAAa,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS;AACpE,SAAK,GAAG,QAAQ,MAAM,KAAK,SAAS,UAAU,CAAC;AAC/C,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,WAAO,MAAM,MAAM;AAAA,EACvB;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1E0C;AAGhB;AAEX,MAAM,kBAAkB,qDAAY,CAAqB;AAAA,EAAxE;AAAA;AAiBI,qBAAY;AAWZ,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AAC/E,WAAK,MAAM,MAAM,kBAAkB;AACnC,WAAK,MAAM,MAAM,cAAc;AAC/B,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY,SAAS,OAAO;AAAA,IAC/D;AAAA;AAAA,aAjCW,eAAqD;AAC5D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS,IAAK,MAAK,MAAM,QAAQ;AACnF,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAQA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM,KAAK,MAAM,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS,IAAK,MAAK,MAAM,QAAQ;AAC7G,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,WAAO,MAAM,MAAM;AAAA,EACvB;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrD0C;AAEpB;AAWP,MAAM,cAAc,qDAAY,CAAoB;AAAA,EAAnE;AAAA;AAiBI,qBAAY;AAWZ,sBAAa,MAAM;AACf,YAAM,EAAE,OAAO,YAAY,KAAK;AAChC,WAAK,MAAM,YAAY;AACvB,UAAI,OAAO;AACP,YAAI,IAAI;AACR,mBAAW,OAAO,OAAO;AACrB,gBAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,gBAAM,MAAM,SAAS,cAAc,KAAK;AACxC,gBAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,gBAAM,OAAO;AACb,gBAAM,OAAO;AACb,cAAI,MAAM;AAAG,kBAAM,UAAU;AAC7B,gBAAM,iBAAiB,UAAU,MAAM;AACnC,gBAAI,MAAM;AAAS,mBAAK,SAAS,MAAM,IAAI;AAAA,UAC/C,CAAC;AACD,cAAI,YAAY,KAAK;AACrB,cAAI,OAAO,GAAG;AACd,eAAK,MAAM,YAAY,GAAG;AAC1B;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,OAAO,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AACtF,YAAM,WAAW,KAAK,IAAI,SAAS,OAAO,KAAK,QAAQ,OAAO,GAAG;AACjE,WAAK,MAAM,MAAM,kBAAkB;AACnC,WAAK,MAAM,MAAM,cAAc;AAC/B,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY;AAAA,IAC/C;AAAA;AAAA,aAxDW,eAAoD;AAC3D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,QAAQ,SAAS,cAAc,KAAK;AACzC,SAAK,MAAM,YAAY;AACvB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EA+BA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AACnD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM;AACtB,eAAS,IAAI,KAAK,MAAM,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AACtD,cAAM,QAAQ,KAAK,MAAM,SAAS,GAAG,cAAc,OAAO;AAC1D,YAAI,CAAC,MAAM,UAAU,KAAK,MAAM;AAAO,gBAAM,UAAU;AAAA,MAC3D;AAAA,IACJ;AACA,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,WAAW,CAAC;AACjD,gBAAY;AACZ,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,WAAO,MAAM,MAAM;AAAA,EACvB;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3F0C;AAGhB;AAUX,MAAM,kBAAkB,qDAAY,CAAuB;AAAA,EAA1E;AAAA;AAuBI,qBAAY;AAuBZ,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,OAAO,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AACtF,YAAM,WAAW,KAAK,IAAI,SAAS,OAAO,MAAM,QAAQ,OAAO,GAAG;AAClE,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY;AAC3C,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,UAAU,MAAM,kBAAkB;AACvC,WAAK,UAAU,MAAM,cAAc;AAAA,IACvC;AA6BA,sBAAa;AACb,oBAAW;AAEX,iBAAQ,MAAM;AACV,YAAM,EAAE,UAAU,YAAY,WAAW,WAAW,UAAU,kBAAkB,KAAK,MAAM;AAC3F,YAAM,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,UAAU,KAAK;AACrD,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,UAAI,EAAE,OAAO,WAAW,KAAK,UAAU,sBAAsB;AAC7D,cAAQ,KAAK,MAAM,KAAK;AACxB,eAAS,KAAK,MAAM,MAAM;AAC1B,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,aAAa,SAAS;AAC5B,YAAM,YAAY,YAAY,KAAK,IAAI,QAAQ,GAAG,aAAa,IAAI;AACnE,YAAM,OAAQ,SAAQ,aAAa;AACnC,YAAM,MAAM,SAAS;AACrB,WAAK,aAAa;AAClB,YAAM,aAAa,KAAK;AACxB,UAAI,aAAa,KAAK,UAAU;AAC5B,aAAK,WAAW;AAChB,YAAI,KAAK;AAAU,iBAAO,aAAa,KAAK,QAAQ;AACpD,aAAK,WAAW,OAAO,WAAW,MAAM;AACpC,eAAK,WAAW,KAAK;AACrB,eAAK,WAAW;AAChB,eAAK,SAAS,KAAK,KAAK;AAAA,QAC5B,GAAG,GAAI;AAAA,MACX;AACA,UAAI,aAAa,KAAK,YAAY,OAAO,KAAK,aAAa,aAAa;AACpE,aAAK,WAAW,OAAO,WAAW,MAAM;AACpC,eAAK,WAAW,KAAK;AACrB,eAAK,WAAW;AAChB,eAAK,SAAS,KAAK,KAAK;AAAA,QAC5B,GAAG,GAAI;AAAA,MACX;AACA,YAAM,WAAW,KAAK;AACtB,YAAM,WAAY,OAAM,OAAQ,OAAM;AACtC,YAAM,WAAY,MAAK,OAAQ,OAAM;AACrC,YAAM,UAAW,MAAK,OAAQ,OAAM;AACpC,YAAM,eAAe,KAAK,IAAI,GAAG,CAAC,MAAO,OAAM,IAAI;AACnD,YAAM,WAAW,IAAI,qBAAqB,GAAG,YAAY,GAAG,GAAG;AAC/D,UAAI,YAAY,KAAK,YAAY;AAAG,iBAAS,aAAa,UAAU,SAAS;AAAA,eACpE,WAAW;AAAG,iBAAS,aAAa,GAAG,SAAS;AACzD,UAAI,YAAY,KAAK,YAAY;AAAG,iBAAS,aAAa,UAAU,SAAS;AAC7E,UAAI,WAAW,KAAK,WAAW;AAAG,iBAAS,aAAa,SAAS,QAAQ;AACzE,UAAI,gBAAgB,KAAK,gBAAgB;AAAG,iBAAS,aAAa,cAAc,aAAa;AAAA,eACpF,eAAe;AAAG,iBAAS,aAAa,GAAG,SAAS;AAE7D,UAAI,YAAY;AAChB,UAAI,aAAa;AAAG,YAAI,SAAS,MAAM,MAAO,KAAI,gBAAgB,YAAY,WAAW,aAAa,YAAY;AAClH,UAAI,aAAa;AAAK,YAAI,SAAS,MAAM,KAAK,WAAY,KAAI,gBAAgB,aAAa,CAAC;AAC5F,UAAI,YAAY;AAChB,UAAI,aAAa,KAAK;AAClB,cAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC;AACvH,YAAI,SAAS,MAAM,MAAO,KAAI,YAAY,YAAY,WAAW,aAAa,QAAQ;AAAA,MAC1F;AACA,UAAI,aAAa,GAAG;AAChB,cAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,KAAK,UAAU,EAAE,CAAC,IAAI,YAAY;AACxI,YAAI,SAAS,MAAM,MAAO,KAAI,eAAe,YAAY,YAAY,WAAW,aAAa,WAAW,CAAC;AAAA,MAC7G;AACA,UAAI,WAAW,YAAY;AACvB,YAAI,YAAY,GAAG;AACf,gBAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC;AACrH,cAAI,SAAS,MAAM,MAAO,KAAI,YAAY,YAAY,WAAW,CAAC;AAAA,QACtE;AACA,YAAI,WAAW,GAAG;AACd,gBAAM,WAAW,KAAK,IAAI,GAAG,qDAAY,CAAC,YAAY,EAAE,MAAM,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC,IAAI,YAAY;AACtI,cAAI,SAAS,MAAM,KAAK,IAAI,KAAK,MAAO,KAAI,eAAe,YAAY,aAAa,CAAC,GAAG,WAAW,CAAC;AAAA,QACxG;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,aAxJW,eAAuD;AAC9D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,MACnB;AAAA,IACJ;AAAA,EACJ;AAAA,EAQA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY,sBAAsB,KAAK;AACpD,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,YAAY,sBAAsB,KAAK;AACtD,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,SAAS;AACrB,SAAK,MAAM,KAAK,OAAO,WAAW,IAAI;AACtC,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS,IAAK,MAAK,MAAM,QAAQ;AACnF,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EASA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,OAAO,iBAAiB,aAAa,KAAK,eAAe;AAC9D,SAAK,OAAO,iBAAiB,cAAc,KAAK,kBAAkB,EAAE,SAAS,MAAM,CAAC;AACpF,SAAK,GAAG,SAAS,MAAM;AACnB,WAAK,SAAS,KAAK,QAAQ;AAC3B,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM,KAAK,MAAM,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS,IAAK,MAAK,MAAM,QAAQ;AAC7G,SAAK,GAAG,SAAS,MAAM;AACnB,WAAK,SAAS,WAAW;AACzB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,SAAK,GAAG,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAC9C,SAAK,GAAG,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAC9C,SAAK,GAAG,QAAQ,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC;AAC/C,SAAK,SAAS,KAAK,KAAK;AACxB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,MAAM;AACtC,SAAK,QAAQ,YAAY,KAAK,SAAS;AACvC,SAAK,QAAQ,YAAY,KAAK,KAAK;AACnC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,OAAO;AACvC,WAAO,MAAM,MAAM;AAAA,EACvB;AAyEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvK0C;AAC0C;AAG5D;AAQT,MAAM,gBAAgB,qDAAY,CAAqB;AAAA,EAAtE;AAAA;AAqBI,qBAAY;AAQZ,2BAA4B,CAAC,GAAG,GAAG,GAAG,CAAC;AAuBvC,wBAAe,CAAC,MAAa;AACzB,YAAM,QAAQ,WAAY,EAAE,cAAmC,KAAK;AACpE,UAAI,SAAS,KAAK,GAAG;AACjB,cAAM,UAAU,KAAK,SAAS,CAAC,KAAK;AACpC,YAAI;AAAS;AAAA,MACjB;AACA,WAAK,MAAM,QAAQ,KAAK,YAAY,QAAS,MAAK,MAAM,QAAQ;AAAA,IACpE;AACA,oBAAW,MAAM;AACb,YAAM,EAAE,QAAQ,OAAO,MAAM,UAAU,WAAW,SAAS,gBAAgB,KAAK,MAAM;AACtF,YAAM,WAAW,KAAK,IAAI,SAAS,OAAO,MAAM,QAAQ,OAAO,GAAG;AAClE,WAAK,MAAM,MAAM,WAAW,GAAG,YAAY;AAC3C,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,UAAU,MAAM,kBAAkB;AACvC,WAAK,UAAU,MAAM,cAAc;AAAA,IACvC;AA6CA,iBAAQ,MAAM;AACV,YAAM,EAAE,aAAa,eAAe,iBAAiB,gBAAgB,KAAK,MAAM;AAChF,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,YAAM,WAAW,KAAK;AACtB,UAAI,EAAE,OAAO,WAAW,KAAK,UAAU,sBAAsB;AAC7D,cAAQ,KAAK,MAAM,KAAK;AACxB,eAAS,KAAK,MAAM,MAAM;AAC1B,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,aAAa,SAAS;AAC5B,YAAM,YAAY,eAAe,KAAK,IAAI,QAAQ,GAAG,aAAa,IAAI;AACtE,YAAM,OAAQ,SAAQ,aAAa;AACnC,YAAM,MAAM,SAAS;AACrB,YAAM,eAAe,YAAY;AACjC,WAAK,kBAAkB,CAAC,GAAG,KAAK,OAAO,UAAU;AACjD,YAAM,MAAM,IAAI,qBAAqB,GAAG,KAAK,GAAG,MAAM,UAAU;AAChE,UAAI,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,aAAa;AACtE,UAAI,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,eAAe;AACxE,UAAI,YAAY;AAChB,6DAAe,CAAC,KAAK,MAAM,KAAK,WAAW,YAAY,YAAY;AAEnE,UAAI,YAAY;AAChB,6DAAe,CAAC,KAAK,OAAO,WAAW,MAAM,aAAc,KAAI,YAAY,WAAW,YAAY,GAAG,YAAY,GAAG,YAAY;AAAA,IACpI;AA+BA,6BAAoB,CAAC,MAAwB;AACzC,YAAM,EAAE,UAAU,KAAK;AACvB,UACI,EAAE,IAAI,KAAK,gBAAgB,MACxB,EAAE,IAAI,KAAK,gBAAgB,KAAK,KAAK,gBAAgB,MACrD,EAAE,IAAI,KAAK,gBAAgB,MAC3B,EAAE,IAAI,KAAK,gBAAgB,KAAK,KAAK,gBAAgB;AAC1D;AACF,YAAM,WAAW,KAAK,gBAAgB,CAAC;AACvC,UAAI,aAAa;AAAO,aAAK,SAAS,KAAK,gBAAgB,CAAC,CAAC;AAAA,IACjE;AACA,6BAAoB,CAAC,MAAwB;AACzC,YAAM,WAAW,KAAK,gBAAgB,CAAC;AACvC,UAAI,aAAa,KAAK,MAAM;AAAO,aAAK,SAAS,QAAQ;AAAA,IAC7D;AAAA;AAAA,aArLW,eAAqD;AAC5D,UAAM,YAAY,MAAM;AACxB,WAAO,iCACA,YADA;AAAA,MAEH,OAAO,iCACA,UAAU,QADV;AAAA,QAEH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,aAAa;AAAA,QACb,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAUA,qBAAqB;AACjB,UAAM,mBAAmB;AACzB,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY,sBAAsB,KAAK;AACpD,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,YAAY,sBAAsB,KAAK;AACtD,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,SAAS;AACrB,SAAK,MAAM,KAAK,OAAO,WAAW,IAAI;AACtC,SAAK,cAAc,SAAS,cAAc,OAAO;AACjD,SAAK,YAAY,OAAO;AACxB,SAAK,YAAY,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS;AACjE,SAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AAC/C,SAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AAC/C,SAAK,YAAY,OAAO,KAAK,MAAM,KAAK,SAAS;AACjD,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,QAAQ,KAAK,YAAY,QAAS,MAAK,MAAM,QAAQ;AAChE,SAAK,MAAM,aAAa;AACxB,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAiBA,oBAAoB;AAChB,UAAM,kBAAkB;AACxB,SAAK,MAAM,iBAAiB,UAAU,KAAK,YAAY;AACvD,SAAK,OAAO,iBAAiB,aAAa,KAAK,eAAe;AAC9D,SAAK,OAAO,iBAAiB,cAAc,KAAK,kBAAkB,EAAE,SAAS,MAAM,CAAC;AACpF,SAAK,GAAG,SAAS,MAAM;AACnB,WAAK,SAAS,KAAK,QAAQ;AAC3B,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,SAAK,GAAG,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AACrD,UAAM,cAAc,MAAM;AACtB,WAAK,YAAY,QAAS,EAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,GAAG,SAAS;AACjE,WAAK,MAAM,QAAQ,KAAK,YAAY,QAAS,MAAK,MAAM,QAAQ;AAAA,IACpE;AACA,SAAK,GAAG,SAAS,MAAM;AACnB,WAAK,SAAS,WAAW;AACzB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AACvE,SAAK,GAAG,OAAO,MAAM;AACjB,WAAK,SAAS,SAAS;AACvB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM,IAAI,SAAS;AACvE,SAAK,GAAG,OAAO,MAAM;AACjB,WAAK,SAAS,SAAS;AACvB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,aAAa,MAAM,KAAK,YAAY,OAAO,KAAK,MAAM,KAAK,SAAS;AAC1E,SAAK,GAAG,QAAQ,MAAM;AAClB,WAAK,SAAS,UAAU;AACxB,WAAK,SAAS,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,SAAK,SAAS,KAAK,KAAK;AACxB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,SAAK,UAAU,YAAY,KAAK,MAAM;AACtC,SAAK,QAAQ,YAAY,KAAK,SAAS;AACvC,SAAK,QAAQ,YAAY,KAAK,KAAK;AACnC,SAAK,UAAU,YAAY,KAAK,KAAK;AACrC,SAAK,UAAU,YAAY,KAAK,OAAO;AACvC,WAAO,MAAM,MAAM;AAAA,EACvB;AAAA,MA2BI,aAAa;AACb,UAAM,EAAE,MAAM,KAAK,KAAK,MAAM,UAAU,KAAK;AAC7C,UAAM,WAAW,SAAS,SAAS,MAAM,SAAS,SAAS,QAAQ,MAAM,MAAO,OAAM,OAAO;AAC7F,QAAI,MAAM;AACN,UAAI,SAAS;AAAQ,eAAO,MAAM;AAClC,UAAI,SAAS;AAAO,eAAO,KAAK,IAAI,KAAK,MAAO,OAAM,OAAQ,MAAK,MAAM,IAAI,KAAK,EAAE,GAAG,QAAQ;AAC/F,aAAO,KAAK,MAAO,OAAM,OAAO,IAAI;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,MACI,YAAY;AACZ,UAAM,OAAO,KAAK,gBAAgB,KAAK,cAAc,YAAY,IAAI;AACrE,UAAM,aAAa,KAAK;AACxB,WAAO,OAAO;AAAA,EAClB;AAAA,EACA,gBAAgB,GAA6B;AACzC,UAAM,EAAE,MAAM,KAAK,KAAK,UAAU,KAAK;AACvC,UAAM,OAAO,SAAS,SAAS,IAAK,KAAK,MAAM,QAAQ;AACvD,UAAM,YAAY,KAAK;AACvB,UAAM,aAAa,KAAK;AACxB,UAAM,WAAY,KAAK,cAAc,YAAY,KAAK,gBAAgB,KAAM,GAAE,IAAI,KAAK,gBAAgB,MAAM,EAAE,IAAI,KAAK,gBAAgB;AACxI,UAAM,QAAQ,KAAK,cAAc,YAAY,KAAK,gBAAgB,KAAK,KAAK,gBAAgB;AAC5F,UAAM,eAAe,mDAAW,CAAC,WAAW,OAAO,KAAK,GAAG;AAC3D,UAAM,IAAI,UAAU,QAAQ,+CAAO,CAAC,cAAc,KAAK,GAAG,IAAI,UAAU,QAAQ,+CAAO,CAAC,cAAc,KAAK,GAAG,IAAI;AAClH,QAAI,QAAQ,KAAK,MAAM,iDAAS,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,SAAS;AACjE,YAAQ,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,KAAK,CAAC;AAC/C,QAAI,SAAS;AAAQ,aAAO;AAC5B,QAAI,SAAS;AAAO,aAAO,KAAK,MAAM,QAAQ,OAAO,GAAG;AACxD,WAAO,QAAQ,OAAO;AAAA,EAC1B;AAgBJ;;;;;;;;;;;;;;;;;;;;;;;;;;ACnMO,MAAM,SAAS,CAAC,MAAc,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,EAAG,KAAI,KAAK,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC;AAC3I,MAAM,QAAQ,CAAC,YAAoB,UAAU,KAAK,KAAK;AACvD,MAAM,QAAQ,CAAC,MAAc,KAAK,KAAK,MAAM,CAAC;AAC9C,MAAM,QAAQ,CAAC,OAAe,MAAO,MAAK;AAC1C,MAAM,cAAc,CAAC,GAAW,KAAa,QAAgB,MAAO,OAAM,OAAO;AACjF,MAAM,YAAY,CAAC,GAAW,KAAa,QAAiB,KAAI,OAAQ,OAAM,QAAQ;AACtF,MAAM,UAAU,CAAC,GAAW,KAAa,QAAgB;AAC5D,QAAM,aAAa,UAAU,GAAG,KAAK,GAAG;AACxC,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACrD,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACrD,QAAM,OAAO,YAAY,YAAY,QAAQ,MAAM;AACnD,QAAM,IAAI,KAAK,IAAI,IAAI;AACvB,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;AACzC;AACO,MAAM,WAAW,CAAC,KAAa,KAAa,QAAgB;AAC/D,QAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC;AAC1C,QAAM,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,CAAC,CAAC;AACjD,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACrD,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACrD,QAAM,aAAa,UAAU,MAAM,QAAQ,MAAM;AACjD,SAAO,YAAY,YAAY,KAAK,GAAG;AAC3C;AACO,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,cAAc,CAAC,KAA+B,GAAW,GAAW,OAAe,QAAgB,WAA8B;AAC1I,QAAM,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AACzB,MAAI,OAAO,WAAW;AAAU,UAAM,KAAK,MAAM;AAAA;AAC5C,WAAO,QAAQ,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAC1C,MAAI,UAAU;AACd,MAAI,OAAO,IAAI,MAAM,IAAI,CAAC;AAC1B,MAAI,OAAO,IAAI,QAAQ,MAAM,IAAI,CAAC;AAClC,MAAI,iBAAiB,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,MAAM,EAAE;AAC1D,MAAI,OAAO,IAAI,OAAO,IAAI,SAAS,MAAM,EAAE;AAC3C,MAAI,iBAAiB,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM;AAC5E,MAAI,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM;AACnC,MAAI,iBAAiB,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,MAAM,EAAE;AAC5D,MAAI,OAAO,GAAG,IAAI,MAAM,EAAE;AAC1B,MAAI,iBAAiB,GAAG,GAAG,IAAI,MAAM,IAAI,CAAC;AAC1C,MAAI,UAAU;AACd,MAAI,OAAO;AACf;AACO,MAAM,kBAAkB,CAAC,KAA+B,GAAW,GAAW,OAAe,QAAgB,WAA8B;AAC9I,QAAM,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AACzB,MAAI,OAAO,WAAW;AAAU,UAAM,KAAK,MAAM;AAAA;AAC5C,WAAO,QAAQ,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAC1C,MAAI,UAAU;AACd,MAAI,OAAO,IAAI,MAAM,IAAI,CAAC;AAC1B,MAAI,OAAO,IAAI,QAAQ,MAAM,IAAI,CAAC;AAClC,MAAI,iBAAiB,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,MAAM,EAAE;AAC1D,MAAI,OAAO,IAAI,OAAO,IAAI,SAAS,MAAM,EAAE;AAC3C,MAAI,iBAAiB,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM;AAC5E,MAAI,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM;AACnC,MAAI,iBAAiB,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,MAAM,EAAE;AAC5D,MAAI,OAAO,GAAG,IAAI,MAAM,EAAE;AAC1B,MAAI,iBAAiB,GAAG,GAAG,IAAI,MAAM,IAAI,CAAC;AAC1C,MAAI,UAAU;AACd,MAAI,KAAK;AACb;;;;;;;;;;;;;;;;ACzDgC;AAEhC,MAAM,cAAc,MAAM;AACtB,QAAM,UAAU,IAAI,gDAAO,CAAC;AAAA,IACxB,MAAM,SAAS,eAAe,MAAM;AAAA,IACpC,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,EACzB,CAAC;AACD,MAAI;AACJ,SAAO,iBAAiB,WAAW,CAAC,MAAM;AACtC,UAAM,EAAE,WAAW;AACnB,WAAO;AAAA,EACX,CAAC;AAED,SAAO,iBAAiB,WAAW,CAAC,MAAM;AACtC,QAAI;AAAM,WAAK,YAAY,EAAE,MAAM,WAAW,KAAK,EAAE,IAAI,GAAG,GAAG;AAAA,EACnE,CAAC;AACD,SAAO,iBAAiB,SAAS,CAAC,MAAM;AACpC,QAAI;AAAM,WAAK,YAAY,EAAE,MAAM,SAAS,KAAK,EAAE,IAAI,GAAG,GAAG;AAAA,EACjE,CAAC;AACD,EAAC,OAAe,UAAU;AAC9B;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;AClB3B,6BAA6D;AAAA,EAUzD,YAAY,OAA2F,QAAkB;AACrH,SAAK,SAAS,CAAC,CAAC;AAChB,WAAO,OAAO,MAAM,KAAK;AACzB,UAAM,EAAE,gBAAgB,mBAAmB;AAC3C,UAAM,SAAS,kBAAkB,iBAAiB,SAAS,iBAAiB,eAAe,iBAAiB,aAAa;AACzH,SAAK,SAAS;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,OAAO,eAAc,UAAU;AAAA,MAC/B,QAAQ,eAAc,UAAU,IAAI,eAAc;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AAAA,MAKI,iBAA0B;AAC1B,WAAO,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,SAAS;AAC/B,UAAI,gBAAgB;AAAe,eAAO,KAAK;AAC/C,aAAO,KAAK,OAAO,WAAW,gBAAgB,KAAK,OAAO,WAAW;AAAA,IACzE,CAAC;AAAA,EACL;AAAA,MAII,iBAA0B;AAC1B,WAAO,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,SAAS;AAC/B,UAAI,gBAAgB;AAAe,eAAO,KAAK;AAC/C,aAAO,KAAK,OAAO,WAAW,cAAc,KAAK,OAAO,WAAW;AAAA,IACvE,CAAC;AAAA,EACL;AAAA,EACA,SAAS;AACL,WAAO;AAAA,EACX;AAAA,EACA,OAAO,IAAY,IAAY;AAC3B,WAAO;AAAA,EACX;AAAA,EACA,SAAS;AACL,WAAO;AAAA,EACX;AACJ;AAlDA;AACW,wBAAU;AACV,4BAAc;AACd,6BAAe;AAH1B;;;;;;;;;;;;;;;;ACJ0C;AAE3B,MAAe,0BAA0B,qDAAY,CAAC;AAAA,EAGjE,YAAY,MAAwB;AAChC,UAAM,IAAI;AACV,SAAK,OAAO,CAAC,KAAK,QAAQ;AAC1B,SAAK,OAAO,CAAC,KAAK,QAAQ;AAAA,EAC9B;AACJ;;;;;;;;;;;;;;;ACPe,MAAe,aAA8B;AAAA,EAUxD,YAAY,MAAmB;AAC3B,WAAO,OAAO,MAAM,IAAI;AACxB,SAAK,MAAM,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM;AAC7C,SAAK,MAAM,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM;AAAA,EACjD;AAAA,EAEA,SAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,IAAY,IAAkB;AACjC,WAAO;AAAA,EACX;AAAA,EACA,SAAe;AACX,WAAO;AAAA,EACX;AACJ;;;;;;;;;;;;;;;;AC7B0C;AAE3B,MAAe,2BAA2B,qDAAY,CAAC;AACtE;;;;;;;;;;;;;;;;ACHoD;AAGrC,MAAM,eAAe,0DAAiB,CAAC;AAAA,EAAtD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVoD;AAGrC,MAAM,iBAAiB,0DAAiB,CAAC;AAAA,EAAxD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVsD;AAGvC,MAAM,kBAAkB,2DAAkB,CAAC;AAAA,EAA1D;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACV4C;AAE7B,MAAM,eAAe,sDAAa,CAAC;AAAA,EAC9C,SAAS;AACL,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,WAAK,OAAO;AACZ,WAAK,OAAO,SAAS,KAAK,OAAO;AACjC,WAAK,OAAO,SAAS,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,SAAS,IAAI,sDAAa,CAAC,UAAU,sDAAa,CAAC,WAAW;AAAA,IAChI,CAAC;AACD,SAAK,OAAO,SAAS,sDAAa,CAAC,eAAgB,MAAK,MAAM,SAAS;AACvE,QAAI,KAAK,OAAO,QAAQ;AAAG,WAAK,OAAO,SAAS;AAChD,WAAO;AAAA,EACX;AAAA,EACA,OAAO,IAAY;AACf,QAAI,eAAe;AACnB,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW;AAAc;AAAA,IAC9E,CAAC;AACD,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,UAAI,MAAM;AACV,UAAI,MAAM;AACV,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW,cAAc;AACtE,cAAM,eAAe,KAAK,eAAe;AACzC,aAAK,OAAO,SAAS;AAAA,MACzB;AACA,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW,YAAY;AACpE,cAAM,KAAK,OAAO,SAAS,IAAI,sDAAa,CAAC,UAAU,sDAAa,CAAC,cAAc,KAAK,OAAO;AAC/F,aAAK,OAAO,UAAU;AAAA,MAC1B;AACA,WAAK,OAAO,KAAK,GAAG;AAAA,IACxB,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EACA,SAAS;AACL,UAAM,EAAE,aAAa,SAAS,iBAAiB,sDAAa;AAC5D,QAAI,QAAQ;AACZ,UAAM,OAAO,UAAU;AACvB,UAAM,EAAE,WAAW,KAAK;AACxB,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,WAAK,OAAO,aAAa;AACzB,WAAK,OAAO,YAAY;AAExB,WAAK,OAAO,aAAc,UAAS,cAAc,KAAK,OAAO,UAAU,IAAI;AAC3E,WAAK,OAAO,OAAQ,MAAK,OAAO,QAAQ,KAAK,KAAK,OAAO;AACzD,WAAK,OAAO,MAAO,MAAK,OAAO,OAAO,KAAK,KAAK,OAAO;AACvD,WAAK,OAAO;AACZ,eAAS,KAAK,OAAO,QAAQ;AAAA,IACjC,CAAC;AACD,WAAO;AAAA,EACX;AACJ;;;;;;;;;;;;;;;;ACnDoD;AAGrC,MAAM,gBAAgB,0DAAiB,CAAC;AAAA,EAAvD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVoD;AAGrC,MAAM,aAAa,0DAAiB,CAAC;AAAA,EAApD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACTgC;AACA;AACF;AACA;AACI;AACR;AACA;AACE;AACJ;AACY;AACA;AACA;AACN;AACA;AACA;AAKf,MAAM,OAAO;AAAA,SAIjB,YAAY,MAAgC;AAC/C,QAAI,KAAK,SAAS,YACP,KAAK,SAAS,YACd,KAAK,SAAS,YACd,KAAK,SAAS,YACd,KAAK,SAAS;AACvB,aAAO,KAAK;AACd,QAAI,KAAK,SAAS,eAAe,KAAK,SAAS,aAAa;AACxD,UAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAQ,KAAK,SAAS,KAAK,MAAM,WAAW,KAAK,CAAC;AAAG,eAAO;AAC5F,UAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAQ,KAAK,SAAS,KAAK,MAAM,WAAW,WAAW,CAAC;AAAG,eAAO;AAClG,aAAO,KAAK;AAAA,IAChB;AACA,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS,YAAY,KAAK,SAAS,WAAW;AAC9E,UAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAQ,KAAK,SAAS,KAAK,MAAM,WAAW,MAAM,CAAC;AAAG,eAAO;AAC7F,UAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAQ,KAAK,SAAS,KAAK,MAAM,WAAW,MAAM,CAAC;AAAG,eAAO;AAC7F,UAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAQ,KAAK,SAAS,KAAK,MAAM,WAAW,OAAO,CAAC;AAAG,eAAO;AAAA,IAClG;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,SAIO,QAAQ,MAAiD;AAC5D,UAAM,OAAO;AAAA,MACT,SAAS,gDAAO;AAAP,MACT,SAAS,gDAAO;AAAP,MACT,QAAQ,+CAAM;AAAN,MACR,QAAQ,+CAAM;AAAN,MACR,UAAU,iDAAQ;AAAR,MACV,MAAM,6CAAI;AAAJ,MACN,MAAM,6CAAI;AAAJ,MACN,OAAO,8CAAK;AAAL,MACP,KAAK,4CAAG;AAAH,MACL,WAAW,kDAAS;AAAT,MACX,WAAW,mDAAS;AAAT,MACX,WAAW,mDAAS;AAAT,MACX,QAAQ,gDAAM;AAAN,MACR,QAAQ,gDAAM;AAAN,MACR,QAAQ,gDAAM;AAAN,IACZ;AACA,UAAM,aAAa,KAAK,YAAY,IAAI;AACxC,WAAO,IAAI,KAAK,YAAY,IAAW;AAAA,EAC3C;AAAA,SACO,SAAS,OAAsB;AAClC,WAAO,MAAM,IAAI,CAAC,SAAS;AACvB,UAAI,WAAW;AAAM,aAAK,QAAQ,KAAK,SAAS,KAAK,KAAK;AAC1D,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC5B,CAAC;AAAA,EACL;AAAA,SACO,KAAK,IAAmB;AAC3B,UAAM,YAAY,IAAI,gDAAM,CAAC,EAAE,OAAO,KAAK,SAAS,EAAE,GAAG,MAAM,UAAU,OAAO,GAAG,GAAG,IAAI;AAC1F,cAAU,OAAO;AACjB,cAAU,OAAO,GAAG,CAAC;AACrB,cAAU,OAAO;AACjB,WAAO;AAAA,EACX;AACJ;;;;;;;;;;;;;;;;AChFsD;AAGvC,MAAM,YAAY,2DAAkB,CAAC;AAAA,EAApD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVoD;AAGrC,MAAM,aAAa,0DAAiB,CAAC;AAAA,EAApD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVoD;AAGrC,MAAM,eAAe,0DAAiB,CAAC;AAAA,EAAtD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVsD;AAGvC,MAAM,kBAAkB,2DAAkB,CAAC;AAAA,EAA1D;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACVoD;AAGrC,MAAM,cAAc,0DAAiB,CAAC;AAAA,EAArD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACV4C;AAE5C,8BAAoC,sDAAa,CAAC;AAAA,EAK9C,SAAS;AACL,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,WAAK,OAAO;AACZ,WAAK,OAAO,QAAQ,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,IAAI,sDAAa,CAAC,OAAO;AAC7F,WAAK,OAAO,SAAS,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,SAAS,IAAI,sDAAa,CAAC,UAAU,QAAO,WAAW;AAAA,IACzH,CAAC;AACD,UAAM,YAAY,KAAK,MAAM;AAC7B,SAAK,OAAO,QAAQ,KAAK,IAAI,KAAK,OAAO,OAAO,YAAY,QAAO,UAAU,KAAK;AAClF,SAAK,OAAO,UAAU,QAAO,UAAU;AACvC,QAAI,KAAK,OAAO,QAAQ;AAAG,WAAK,OAAO,SAAS;AAChD,WAAO;AAAA,EACX;AAAA,EACA,SAAS;AACL,UAAM,YAAY,KAAK,MAAM;AAC7B,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,UAAI,MAAM;AACV,UAAI,MAAM;AACV,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW;AAAc,cAAM,KAAK,OAAO,QAAQ,IAAI,sDAAa,CAAC,UAAU,KAAK,OAAO;AAC5I,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW;AAAY,cAAM,KAAK,OAAO,SAAS,IAAI,sDAAa,CAAC,UAAU,sDAAa,CAAC,cAAe,aAAY,QAAO,UAAU,SAAS,KAAK,KAAK,OAAO;AACnN,WAAK,OAAO,KAAK,GAAG;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EACA,SAAS;AACL,UAAM,EAAE,aAAa,YAAY,sDAAa;AAC9C,UAAM,QAAQ;AACd,UAAM,OAAO,UAAU,cAAc,QAAO,UAAU;AACtD,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,WAAK,OAAO,aAAa;AACzB,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,OAAQ,MAAK,OAAO,QAAQ,KAAK,KAAK,OAAO;AACzD,WAAK,OAAO,MAAO,MAAK,OAAO,OAAO,KAAK,KAAK,OAAO;AACvD,WAAK,OAAO;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACX;AACJ;AAzCA;AACW,mBAAY;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AACZ;AAJJ;;;;;;;;;;;;;;;;ACFsD;AAGvC,MAAM,kBAAkB,2DAAkB,CAAC;AAAA,EAA1D;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;ACV4C;AAE7B,MAAM,eAAe,sDAAa,CAAC;AAAA,EAC9C,SAAS;AACL,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,WAAK,OAAO;AACZ,WAAK,OAAO,QAAQ,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,IAAI,sDAAa,CAAC,OAAO;AAC7F,WAAK,OAAO,UAAU,KAAK,OAAO;AAAA,IACtC,CAAC;AACD,SAAK,OAAO,UAAU,sDAAa,CAAC,eAAgB,MAAK,MAAM,SAAS;AACxE,QAAI,KAAK,OAAO,QAAQ;AAAG,WAAK,OAAO,SAAS;AAChD,WAAO;AAAA,EACX;AAAA,EACA,OAAO,IAAY,IAAY;AAC3B,QAAI,eAAe;AACnB,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW;AAAY;AAAA,IAC5E,CAAC;AACD,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,UAAI,MAAM;AACV,UAAI,MAAM;AACV,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW,cAAc;AACtE,cAAM,KAAK,OAAO,QAAQ,IAAI,sDAAa,CAAC,UAAU,KAAK,OAAO;AAClE,aAAK,OAAO,SAAS;AAAA,MACzB;AACA,UAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW,YAAY;AACpE,cAAM,eAAe,KAAK,eAAe;AACzC,aAAK,OAAO,UAAU;AAAA,MAC1B;AACA,WAAK,OAAO,KAAK,GAAG;AAAA,IACxB,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EACA,SAAS;AACL,UAAM,EAAE,aAAa,SAAS,iBAAiB,sDAAa;AAC5D,UAAM,QAAQ;AACd,QAAI,OAAO,UAAU;AACrB,UAAM,EAAE,UAAU,KAAK;AACvB,SAAK,MAAM,QAAQ,CAAC,SAAS;AACzB,WAAK,OAAO,aAAa;AACzB,WAAK,OAAO,YAAY;AAExB,WAAK,OAAO,cAAe,SAAQ,KAAK,OAAO,SAAS,IAAI;AAC5D,WAAK,OAAO,OAAQ,MAAK,OAAO,QAAQ,KAAK,KAAK,OAAO;AACzD,WAAK,OAAO,MAAO,MAAK,OAAO,OAAO,KAAK,KAAK,OAAO;AACvD,WAAK,OAAO;AACZ,cAAQ,KAAK,OAAO,SAAS;AAAA,IACjC,CAAC;AACD,WAAO;AAAA,EACX;AACJ;;;;;;;;;;;;;;;;ACnDoD;AAGrC,MAAM,gBAAgB,0DAAiB,CAAC;AAAA,EAAvD;AAAA;AACI,kBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACTA,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAiJ;AACjJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,2HAAO;;;;AAI2F;AACnH,OAAO,iEAAe,2HAAO,IAAI,2HAAO,UAAU,2HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAmJ;AACnJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,6HAAO;;;;AAI6F;AACrH,OAAO,iEAAe,6HAAO,IAAI,6HAAO,UAAU,6HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAqJ;AACrJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,+HAAO;;;;AAI+F;AACvH,OAAO,iEAAe,+HAAO,IAAI,+HAAO,UAAU,+HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAkJ;AAClJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,4HAAO;;;;AAI4F;AACpH,OAAO,iEAAe,4HAAO,IAAI,4HAAO,UAAU,4HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAsJ;AACtJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,gIAAO;;;;AAIgG;AACxH,OAAO,iEAAe,gIAAO,IAAI,gIAAO,UAAU,gIAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAoJ;AACpJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,8HAAO;;;;AAI8F;AACtH,OAAO,iEAAe,8HAAO,IAAI,8HAAO,UAAU,8HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAiJ;AACjJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,2HAAO;;;;AAI2F;AACnH,OAAO,iEAAe,2HAAO,IAAI,2HAAO,UAAU,2HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAgJ;AAChJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,0HAAO;;;;AAI0F;AAClH,OAAO,iEAAe,0HAAO,IAAI,0HAAO,UAAU,0HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAiJ;AACjJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,2HAAO;;;;AAI2F;AACnH,OAAO,iEAAe,2HAAO,IAAI,2HAAO,UAAU,2HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAmJ;AACnJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,6HAAO;;;;AAI6F;AACrH,OAAO,iEAAe,6HAAO,IAAI,6HAAO,UAAU,6HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAsJ;AACtJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,gIAAO;;;;AAIgG;AACxH,OAAO,iEAAe,gIAAO,IAAI,gIAAO,UAAU,gIAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAkJ;AAClJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,4HAAO;;;;AAI4F;AACpH,OAAO,iEAAe,4HAAO,IAAI,4HAAO,UAAU,4HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAsJ;AACtJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,gIAAO;;;;AAIgG;AACxH,OAAO,iEAAe,gIAAO,IAAI,gIAAO,UAAU,gIAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAAkG;AAClG,MAAwF;AACxF,MAA+F;AAC/F,MAAkH;AAClH,MAA2G;AAC3G,MAA2G;AAC3G,MAAoJ;AACpJ;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,8HAAO;;;;AAI8F;AACtH,OAAO,iEAAe,8HAAO,IAAI,8HAAO,UAAU,8HAAO,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzB7E,MAA+F;AAC/F,MAAqF;AACrF,MAA4F;AAC5F,MAA+G;AAC/G,MAAwG;AACxG,MAAwG;AACxG,MAA4I;AAC5I;AACA;;AAEA;;AAEA,4BAA4B,qGAAmB;AAC/C,wBAAwB,kHAAa;;AAErC,uBAAuB,uGAAa;AACpC;AACA,iBAAiB,+FAAM;AACvB,6BAA6B,sGAAkB;;AAE/C,aAAa,0GAAG,CAAC,4HAAO;;;;AAIsF;AAC9G,OAAO,iEAAe,4HAAO,IAAI,4HAAO,UAAU,4HAAO,mBAAmB,EAAC;;;;;;;;;;;AC1BhE;;AAEb;;AAEA;AACA;;AAEA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;;AAEA;;AAEA,qBAAqB,6BAA6B;AAClD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;ACvGa;;AAEb;AACA;;AAEA;AACA;AACA,sDAAsD;;AAEtD;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;ACtCa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;ACVa;;AAEb;AACA;AACA,cAAc,KAAwC,GAAG,sBAAiB,GAAG,CAAI;;AAEjF;AACA;AACA;AACA;;AAEA;;;;;;;;;;ACXa;;AAEb;AACA;AACA;;AAEA;AACA,kDAAkD;AAClD;;AAEA;AACA,0CAA0C;AAC1C;;AAEA;;AAEA;AACA,iFAAiF;AACjF;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA,yDAAyD;AACzD,IAAI;;AAEJ;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;ACrEa;;AAEb;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;UCfA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;;;;;;;;;;;;;;;;ACA+C;AACQ","sources":["webpack://FaustUI/webpack/universalModuleDefinition","webpack://FaustUI/./node_modules/@shren/typed-event-emitter/dist/index.js","webpack://FaustUI/./src/components/Base.scss","webpack://FaustUI/./src/components/Button.scss","webpack://FaustUI/./src/components/Checkbox.scss","webpack://FaustUI/./src/components/Group.scss","webpack://FaustUI/./src/components/HBargraph.scss","webpack://FaustUI/./src/components/HSlider.scss","webpack://FaustUI/./src/components/Knob.scss","webpack://FaustUI/./src/components/Led.scss","webpack://FaustUI/./src/components/Menu.scss","webpack://FaustUI/./src/components/Nentry.scss","webpack://FaustUI/./src/components/Numerical.scss","webpack://FaustUI/./src/components/Radio.scss","webpack://FaustUI/./src/components/VBargraph.scss","webpack://FaustUI/./src/components/VSlider.scss","webpack://FaustUI/./src/index.scss","webpack://FaustUI/./node_modules/css-loader/dist/runtime/api.js","webpack://FaustUI/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://FaustUI/./src/FaustUI.ts","webpack://FaustUI/./src/components/AbstractComponent.ts","webpack://FaustUI/./src/components/AbstractItem.ts","webpack://FaustUI/./src/components/Button.ts","webpack://FaustUI/./src/components/Checkbox.ts","webpack://FaustUI/./src/components/Group.ts","webpack://FaustUI/./src/components/HBargraph.ts","webpack://FaustUI/./src/components/HSlider.ts","webpack://FaustUI/./src/components/Knob.ts","webpack://FaustUI/./src/components/Led.ts","webpack://FaustUI/./src/components/Menu.ts","webpack://FaustUI/./src/components/Nentry.ts","webpack://FaustUI/./src/components/Numerical.ts","webpack://FaustUI/./src/components/Radio.ts","webpack://FaustUI/./src/components/VBargraph.ts","webpack://FaustUI/./src/components/VSlider.ts","webpack://FaustUI/./src/components/utils.ts","webpack://FaustUI/./src/instantiate.ts","webpack://FaustUI/./src/layout/AbstractGroup.ts","webpack://FaustUI/./src/layout/AbstractInputItem.ts","webpack://FaustUI/./src/layout/AbstractItem.ts","webpack://FaustUI/./src/layout/AbstractOutputItem.ts","webpack://FaustUI/./src/layout/Button.ts","webpack://FaustUI/./src/layout/Checkbox.ts","webpack://FaustUI/./src/layout/HBargraph.ts","webpack://FaustUI/./src/layout/HGroup.ts","webpack://FaustUI/./src/layout/HSlider.ts","webpack://FaustUI/./src/layout/Knob.ts","webpack://FaustUI/./src/layout/Layout.ts","webpack://FaustUI/./src/layout/Led.ts","webpack://FaustUI/./src/layout/Menu.ts","webpack://FaustUI/./src/layout/Nentry.ts","webpack://FaustUI/./src/layout/Numerical.ts","webpack://FaustUI/./src/layout/Radio.ts","webpack://FaustUI/./src/layout/TGroup.ts","webpack://FaustUI/./src/layout/VBargraph.ts","webpack://FaustUI/./src/layout/VGroup.ts","webpack://FaustUI/./src/layout/VSlider.ts","webpack://FaustUI/./src/components/Base.scss?36b0","webpack://FaustUI/./src/components/Button.scss?dd49","webpack://FaustUI/./src/components/Checkbox.scss?0df7","webpack://FaustUI/./src/components/Group.scss?fa6e","webpack://FaustUI/./src/components/HBargraph.scss?cc52","webpack://FaustUI/./src/components/HSlider.scss?9cc5","webpack://FaustUI/./src/components/Knob.scss?4f65","webpack://FaustUI/./src/components/Led.scss?bd9b","webpack://FaustUI/./src/components/Menu.scss?bf9b","webpack://FaustUI/./src/components/Nentry.scss?7280","webpack://FaustUI/./src/components/Numerical.scss?6fd6","webpack://FaustUI/./src/components/Radio.scss?2535","webpack://FaustUI/./src/components/VBargraph.scss?5683","webpack://FaustUI/./src/components/VSlider.scss?b9c9","webpack://FaustUI/./src/index.scss?7223","webpack://FaustUI/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://FaustUI/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://FaustUI/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://FaustUI/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://FaustUI/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://FaustUI/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://FaustUI/webpack/bootstrap","webpack://FaustUI/webpack/runtime/compat get default export","webpack://FaustUI/webpack/runtime/define property getters","webpack://FaustUI/webpack/runtime/hasOwnProperty shorthand","webpack://FaustUI/webpack/runtime/make namespace object","webpack://FaustUI/webpack/runtime/nonce","webpack://FaustUI/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FaustUI\"] = factory();\n\telse\n\t\troot[\"FaustUI\"] = factory();\n})(self, () => {\nreturn ","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TypedEventEmitter = exports.$AnyEventType = void 0;\nexports.$AnyEventType = Symbol(\"__TypedEventListener_AnyEventType\");\nclass TypedEventEmitter {\n constructor() {\n this._listeners = { [exports.$AnyEventType]: [] };\n }\n get listeners() {\n return this._listeners;\n }\n getListeners(eventName) {\n if (!(eventName in this._listeners))\n this._listeners[eventName] = [];\n return this._listeners[eventName];\n }\n on(eventName, listener) {\n if (this.getListeners(eventName).indexOf(listener) === -1)\n this.getListeners(eventName).push(listener);\n }\n once(eventName, listener) {\n const listenerWithOff = (arg, emitter) => {\n const returnValue = listener(arg, emitter);\n this.off(eventName, listenerWithOff);\n return returnValue;\n };\n this.on(eventName, listenerWithOff);\n }\n onAny(listener) {\n this._listeners[exports.$AnyEventType].push(listener);\n }\n off(eventName, listener) {\n const i = this.getListeners(eventName).indexOf(listener);\n if (i !== -1)\n this.getListeners(eventName).splice(i, 1);\n }\n offAny(listener) {\n const i = this._listeners[exports.$AnyEventType].indexOf(listener);\n if (i !== -1)\n this._listeners[exports.$AnyEventType].splice(i, 1);\n }\n async emit(eventName, eventData, options) {\n var _a;\n let listeners = this.getListeners(eventName);\n let anyListeners = (options === null || options === void 0 ? void 0 : options.excludeAny) ? [] : this._listeners[exports.$AnyEventType];\n if (!listeners.length && !anyListeners.length)\n return [];\n if ((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.length) {\n const { exclude } = options;\n listeners = listeners.filter(l => exclude.indexOf(l) === -1);\n anyListeners = anyListeners.filter(l => exclude.indexOf(l) === -1);\n }\n return Promise.all([...listeners.map(f => f(eventData, this)), ...anyListeners.map(f => f(eventName, eventData, this))]);\n }\n async emitSerial(eventName, eventData, options) {\n var _a;\n let listeners = this.getListeners(eventName);\n let anyListeners = (options === null || options === void 0 ? void 0 : options.excludeAny) ? [] : this._listeners[exports.$AnyEventType];\n if (!listeners.length && !anyListeners.length)\n return [];\n if ((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.length) {\n const { exclude } = options;\n listeners = listeners.filter(l => exclude.indexOf(l) === -1);\n anyListeners = anyListeners.filter(l => exclude.indexOf(l) === -1);\n }\n const returnValues = [];\n for (let i = 0; i < listeners.length; i++) {\n const listener = listeners[i];\n returnValues[i] = await listener(eventData, this);\n }\n for (let i = 0; i < anyListeners.length; i++) {\n const listener = anyListeners[i];\n returnValues[listeners.length + i] = await listener(eventName, eventData, this);\n }\n return returnValues;\n }\n emitSync(eventName, eventData, options) {\n var _a;\n let listeners = this.getListeners(eventName);\n let anyListeners = (options === null || options === void 0 ? void 0 : options.excludeAny) ? [] : this._listeners[exports.$AnyEventType];\n if (!listeners.length && !anyListeners.length)\n return [];\n if ((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.length) {\n const { exclude } = options;\n listeners = listeners.filter(l => exclude.indexOf(l) === -1);\n anyListeners = anyListeners.filter(l => exclude.indexOf(l) === -1);\n }\n return [...listeners.map(f => f(eventData, this)), ...anyListeners.map(f => f(eventName, eventData, this))];\n }\n offAll(eventName) {\n if (eventName) {\n this._listeners[eventName] = [];\n }\n else {\n this._listeners = { [exports.$AnyEventType]: [] };\n }\n }\n listenerCount(eventName) {\n const anyListenerCount = this._listeners[exports.$AnyEventType].length;\n if (!(eventName in this._listeners))\n return anyListenerCount;\n return this._listeners[eventName].length + anyListenerCount;\n }\n}\nexports.TypedEventEmitter = TypedEventEmitter;\nexports.default = TypedEventEmitter;\n//# sourceMappingURL=index.js.map","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component {\\n display: flex;\\n position: absolute;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n.faust-ui-component:focus {\\n outline: none;\\n}\\n.faust-ui-component > .faust-ui-component-label {\\n position: relative;\\n margin-top: 4px;\\n width: 100%;\\n user-select: none;\\n}\\n.faust-ui-component > .faust-ui-component-label > canvas {\\n position: relative;\\n display: block;\\n max-width: 100%;\\n max-height: 100%;\\n}\\n.faust-ui-component input {\\n box-shadow: none;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Base.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,gBAAA;AACJ;AAAI;EACI,aAAA;AAER;AAAI;EACI,kBAAA;EACA,eAAA;EACA,WAAA;EACA,iBAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;AAGZ;AAAI;EACI,gBAAA;AAER\",\"sourcesContent\":[\".faust-ui-component {\\n display: flex;\\n position: absolute;\\n flex-direction: column;\\n overflow: hidden;\\n &:focus {\\n outline: none;\\n }\\n & > .faust-ui-component-label {\\n position: relative;\\n margin-top: 4px;\\n width: 100%;\\n user-select: none;\\n & > canvas {\\n position: relative;\\n display: block;\\n max-width: 100%;\\n max-height: 100%;\\n }\\n }\\n & input {\\n box-shadow: none;\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-button > div {\\n display: flex;\\n position: relative;\\n cursor: pointer;\\n border-width: 1px;\\n text-align: center;\\n border-radius: 4px;\\n flex: 1 0 auto;\\n border-style: solid;\\n}\\n.faust-ui-component.faust-ui-component-button > div > span {\\n user-select: none;\\n margin: auto;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Button.scss\"],\"names\":[],\"mappings\":\"AACI;EACI,aAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;EACA,cAAA;EACA,mBAAA;AAAR;AACQ;EACI,iBAAA;EACA,YAAA;AACZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-button {\\n & > div {\\n display: flex;\\n position: relative;\\n cursor: pointer;\\n border-width: 1px;\\n text-align: center;\\n border-radius: 4px;\\n flex: 1 0 auto;\\n border-style: solid;\\n & > span {\\n user-select: none;\\n margin: auto;\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-checkbox > div {\\n display: flex;\\n position: relative;\\n cursor: pointer;\\n border-width: 1px;\\n text-align: center;\\n border-radius: 1px;\\n flex: 1 0 auto;\\n border-style: solid;\\n}\\n.faust-ui-component.faust-ui-component-checkbox > div > span {\\n margin: auto;\\n user-select: none;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Checkbox.scss\"],\"names\":[],\"mappings\":\"AACI;EACI,aAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;EACA,cAAA;EACA,mBAAA;AAAR;AACQ;EACI,YAAA;EACA,iBAAA;AACZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-checkbox {\\n & > div {\\n display: flex;\\n position: relative;\\n cursor: pointer;\\n border-width: 1px;\\n text-align: center;\\n border-radius: 1px;\\n flex: 1 0 auto;\\n border-style: solid;\\n & > span {\\n margin: auto;\\n user-select: none;\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-group {\\n position: absolute;\\n display: block;\\n background-color: rgba(80, 80, 80, 0.75);\\n border-radius: 4px;\\n border: 1px rgba(255, 255, 255, 0.25) solid;\\n}\\n.faust-ui-group > .faust-ui-group-label {\\n position: relative;\\n margin: 4px;\\n width: calc(100% - 8px);\\n user-select: none;\\n}\\n.faust-ui-group > .faust-ui-group-label > canvas {\\n position: relative;\\n display: block;\\n max-width: 100%;\\n max-height: 100%;\\n}\\n.faust-ui-group .faust-ui-tgroup-tabs {\\n position: absolute;\\n display: inline-block;\\n white-space: nowrap;\\n left: 0px;\\n}\\n.faust-ui-group .faust-ui-tgroup-tabs .faust-ui-tgroup-tab {\\n position: relative;\\n display: inline-block;\\n border-radius: 5px;\\n cursor: pointer;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n user-select: none;\\n margin: 10px;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.5);\\n}\\n.faust-ui-group .faust-ui-tgroup-tabs .faust-ui-tgroup-tab:hover {\\n background-color: rgb(255, 255, 255);\\n}\\n.faust-ui-group .faust-ui-tgroup-tabs .faust-ui-tgroup-tab.active {\\n background-color: rgb(40, 40, 40);\\n color: white;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Group.scss\"],\"names\":[],\"mappings\":\"AACA;EACI,kBAAA;EACA,cAAA;EACA,wCAAA;EACA,kBAAA;EACA,2CAAA;AAAJ;AACI;EACI,kBAAA;EACA,WAAA;EACA,uBAAA;EACA,iBAAA;AACR;AAAQ;EACI,kBAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;AAEZ;AACI;EACI,kBAAA;EACA,qBAAA;EACA,mBAAA;EACA,SAAA;AACR;AAAQ;EACI,kBAAA;EACA,qBAAA;EACA,kBAAA;EACA,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,iBAAA;EACA,YAAA;EACA,kBAAA;EACA,0CAAA;AAEZ;AADY;EACI,oCAAA;AAGhB;AADY;EACI,iCAAA;EACA,YAAA;AAGhB\",\"sourcesContent\":[\"\\n.faust-ui-group {\\n position: absolute;\\n display: block;\\n background-color: rgba(80, 80, 80, 0.75);\\n border-radius: 4px;\\n border: 1px rgba(255, 255, 255, 0.25) solid;\\n & > .faust-ui-group-label {\\n position: relative;\\n margin: 4px;\\n width: calc(100% - 8px);\\n user-select: none;\\n & > canvas {\\n position: relative;\\n display: block;\\n max-width: 100%;\\n max-height: 100%;\\n }\\n }\\n & .faust-ui-tgroup-tabs {\\n position: absolute;\\n display: inline-block;\\n white-space: nowrap;\\n left: 0px;\\n & .faust-ui-tgroup-tab {\\n position: relative;\\n display: inline-block;\\n border-radius: 5px;\\n cursor: pointer;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n user-select: none;\\n margin: 10px;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.5);\\n &:hover {\\n background-color: rgba(255, 255, 255, 1);\\n }\\n &.active {\\n background-color: rgba(40, 40, 40, 1);\\n color: white;\\n }\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-label {\\n flex: 0 0 auto;\\n}\\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: row-reverse;\\n flex: 1 1 auto;\\n width: 100%;\\n height: auto;\\n}\\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv > .faust-ui-component-hbargraph-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n height: 100%;\\n margin: auto;\\n}\\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv > .faust-ui-component-hbargraph-canvasdiv > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-hbargraph > .faust-ui-component-hbargraph-flexdiv > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: auto 5px auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n width: calc(20% - 13px);\\n padding: 2px 4px;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/HBargraph.scss\"],\"names\":[],\"mappings\":\"AACI;EACI,cAAA;AAAR;AAEI;EACI,kBAAA;EACA,aAAA;EACA,2BAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;AAAR;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,YAAA;AACZ;AAAY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAEhB;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,uBAAA;EACA,gBAAA;AACZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-hbargraph {\\n & > .faust-ui-component-label {\\n flex: 0 0 auto;\\n }\\n & > .faust-ui-component-hbargraph-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: row-reverse;\\n flex: 1 1 auto;\\n width: 100%;\\n height: auto;\\n & > .faust-ui-component-hbargraph-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n height: 100%;\\n margin: auto;\\n & > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n }\\n }\\n & > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: auto 5px auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n width: calc(20% - 13px);\\n padding: 2px 4px;\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-hslider > .faust-ui-component-label {\\n flex: 0 0 auto;\\n}\\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: row-reverse;\\n flex: 1 1 auto;\\n width: 100%;\\n height: auto;\\n}\\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > .faust-ui-component-hslider-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n height: 100%;\\n margin: auto;\\n}\\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > .faust-ui-component-hslider-canvasdiv > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: auto 5px auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n width: calc(20% - 13px);\\n padding: 2px 4px;\\n -moz-appearance: textfield;\\n}\\n.faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-hslider > .faust-ui-component-hslider-flexdiv > input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/HSlider.scss\"],\"names\":[],\"mappings\":\"AACI;EACI,cAAA;AAAR;AAEI;EACI,kBAAA;EACA,aAAA;EACA,2BAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;AAAR;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,YAAA;AACZ;AAAY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAEhB;AACQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,uBAAA;EACA,gBAAA;EACA,0BAAA;AACZ;AAAY;EAEI,wBAAA;EACA,SAAA;AAChB\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-hslider {\\n & > .faust-ui-component-label {\\n flex: 0 0 auto;\\n }\\n & > .faust-ui-component-hslider-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: row-reverse;\\n flex: 1 1 auto;\\n width: 100%;\\n height: auto;\\n & > .faust-ui-component-hslider-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n height: 100%;\\n margin: auto;\\n & > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n }\\n }\\n & > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: auto 5px auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n width: calc(20% - 13px);\\n padding: 2px 4px;\\n -moz-appearance:textfield;\\n &::-webkit-inner-spin-button, \\n &::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-knob {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-knob > canvas {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n min-height: 50%;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-knob > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: 0px;\\n border-width: 0px;\\n border-radius: 4px;\\n max-width: calc(100% - 8px);\\n padding: 2px 4px;\\n -moz-appearance: textfield;\\n}\\n.faust-ui-component.faust-ui-component-knob > input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-knob > input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Knob.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,eAAA;EACA,WAAA;AAER;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,WAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,gBAAA;EACA,0BAAA;AAER;AADQ;EAEI,wBAAA;EACA,SAAA;AAEZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-knob {\\n align-items: center;\\n & > canvas {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n min-height: 50%;\\n width: 100%;\\n }\\n & > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: 0px;\\n border-width: 0px;\\n border-radius: 4px;\\n max-width: calc(100% - 8px);\\n padding: 2px 4px;\\n -moz-appearance:textfield;\\n &::-webkit-inner-spin-button, \\n &::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-led {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-led > .faust-ui-component-label {\\n flex: 0 0 auto;\\n}\\n.faust-ui-component.faust-ui-component-led > .faust-ui-component-led-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-led > .faust-ui-component-led-canvasdiv > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Led.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;AAER;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,WAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAGZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-led {\\n align-items: center;\\n & > .faust-ui-component-label {\\n flex: 0 0 auto;\\n }\\n & > .faust-ui-component-led-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n width: 100%;\\n & > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-menu {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-menu > select {\\n margin: 0px;\\n text-align: center;\\n border-width: 1px;\\n border-radius: 4px;\\n padding: 2px 4px;\\n width: calc(100% - 8px);\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Menu.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,uBAAA;AAER\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-menu {\\n align-items: center;\\n & > select {\\n margin: 0px;\\n text-align: center;\\n border-width: 1px;\\n border-radius: 4px;\\n padding: 2px 4px;\\n width: calc(100% - 8px);\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-nentry {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-nentry input {\\n margin: 0px;\\n text-align: center;\\n border-width: 1px;\\n border-radius: 4px;\\n padding: 2px 4px;\\n width: calc(100% - 8px);\\n}\\n.faust-ui-component.faust-ui-component-nentry input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-nentry input::-webkit-outer-spin-button {\\n opacity: 1;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Nentry.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,uBAAA;AAER;AADQ;EAEI,UAAA;AAEZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-nentry {\\n align-items: center;\\n & input {\\n margin: 0px;\\n text-align: center;\\n border-width: 1px;\\n border-radius: 4px;\\n padding: 2px 4px;\\n width: calc(100% - 8px);\\n &::-webkit-inner-spin-button, \\n &::-webkit-outer-spin-button {\\n opacity: 1;\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-numerical {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-numerical > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: auto;\\n border-width: 0px;\\n border-radius: 4px;\\n width: calc(100% - 8px);\\n padding: 2px 4px;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Numerical.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA,uBAAA;EACA,gBAAA;AAER\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-numerical {\\n align-items: center;\\n & > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: auto;\\n border-width: 0px;\\n border-radius: 4px;\\n width: calc(100% - 8px);\\n padding: 2px 4px;\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-radio {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-radio > .faust-ui-component-label {\\n flex: 0 0 auto;\\n margin-top: auto;\\n}\\n.faust-ui-component.faust-ui-component-radio > .faust-ui-component-radio-group {\\n flex: 0 0 auto;\\n margin-bottom: auto;\\n border-width: 1px;\\n border-radius: 4px;\\n padding: 2px 4px;\\n width: calc(100% - 8px);\\n}\\n.faust-ui-component.faust-ui-component-radio > .faust-ui-component-radio-group > div {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n overflow: hidden;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Radio.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;EACA,gBAAA;AAER;AAAI;EACI,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,uBAAA;AAER;AADQ;EACI,uBAAA;EACA,mBAAA;EACA,gBAAA;AAGZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-radio {\\n align-items: center;\\n & > .faust-ui-component-label {\\n flex: 0 0 auto;\\n margin-top: auto;\\n }\\n & > .faust-ui-component-radio-group {\\n flex: 0 0 auto;\\n margin-bottom: auto;\\n border-width: 1px;\\n border-radius: 4px;\\n padding: 2px 4px;\\n width: calc(100% - 8px);\\n & > div {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n overflow: hidden;\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-vbargraph {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-label {\\n flex: 0 0 auto;\\n}\\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n flex: 1 1 auto;\\n width: 100%;\\n height: inherit;\\n}\\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv > .faust-ui-component-vbargraph-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv > .faust-ui-component-vbargraph-canvasdiv > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-vbargraph > .faust-ui-component-vbargraph-flexdiv > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: 5px auto auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n height: 5%;\\n width: calc(100% - 8px);\\n padding: 2px 4px;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/VBargraph.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;AAER;AAAI;EACI,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,WAAA;AAGZ;AAFY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAIhB;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,uBAAA;EACA,gBAAA;AAGZ\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-vbargraph {\\n align-items: center;\\n & > .faust-ui-component-label {\\n flex: 0 0 auto;\\n }\\n & > .faust-ui-component-vbargraph-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n flex: 1 1 auto;\\n width: 100%;\\n height: inherit;\\n & > .faust-ui-component-vbargraph-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n width: 100%;\\n & > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n }\\n }\\n & > input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: 5px auto auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n height: 5%;\\n width: calc(100% - 8px);\\n padding: 2px 4px;\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-component.faust-ui-component-vslider {\\n align-items: center;\\n}\\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-label {\\n flex: 0 0 auto;\\n}\\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n flex: 1 1 auto;\\n width: 100%;\\n height: auto;\\n}\\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv > .faust-ui-component-vslider-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv > .faust-ui-component-vslider-canvasdiv > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n}\\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: 5px auto auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n height: 5%;\\n max-width: calc(100% - 8px);\\n padding: 2px 4px;\\n -moz-appearance: textfield;\\n}\\n.faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv input::-webkit-inner-spin-button, .faust-ui-component.faust-ui-component-vslider > .faust-ui-component-vslider-flexdiv input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/VSlider.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,mBAAA;AACJ;AAAI;EACI,cAAA;AAER;AAAI;EACI,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;AAER;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,WAAA;AAGZ;AAFY;EACI,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;AAIhB;AADQ;EACI,kBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,2CAAA;EACA,0BAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,2BAAA;EACA,gBAAA;EACA,0BAAA;AAGZ;AAFY;EAEI,wBAAA;EACA,SAAA;AAGhB\",\"sourcesContent\":[\".faust-ui-component.faust-ui-component-vslider {\\n align-items: center;\\n & > .faust-ui-component-label {\\n flex: 0 0 auto;\\n }\\n & > .faust-ui-component-vslider-flexdiv {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n flex: 1 1 auto;\\n width: 100%;\\n height: auto;\\n & > .faust-ui-component-vslider-canvasdiv {\\n position: relative;\\n display: block;\\n flex: 1 1 auto;\\n width: 100%;\\n & > canvas {\\n position: absolute;\\n display: block;\\n height: 100%;\\n width: 100%;\\n }\\n }\\n & input {\\n position: relative;\\n display: block;\\n flex: 0 1 auto;\\n text-align: center;\\n background-color: rgba(255, 255, 255, 0.25);\\n margin: 5px auto auto auto;\\n border-width: 0px;\\n border-radius: 4px;\\n height: 5%;\\n max-width: calc(100% - 8px);\\n padding: 2px 4px;\\n -moz-appearance:textfield;\\n &::-webkit-inner-spin-button, \\n &::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n }\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".faust-ui-root {\\n margin: 0px auto;\\n flex: 1 0 auto;\\n position: relative !important;\\n background-color: transparent !important;\\n border: none !important;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/index.scss\"],\"names\":[],\"mappings\":\"AAAA;EACI,gBAAA;EACA,cAAA;EACA,6BAAA;EACA,wCAAA;EACA,uBAAA;EACA,kMAAA;AACJ\",\"sourcesContent\":[\".faust-ui-root {\\n margin: 0px auto;\\n flex: 1 0 auto;\\n position: relative !important;\\n background-color: transparent !important;\\n border: none !important;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n\n content += cssWithMappingToString(item);\n\n if (needLayer) {\n content += \"}\";\n }\n\n if (item[2]) {\n content += \"}\";\n }\n\n if (item[4]) {\n content += \"}\";\n }\n\n return content;\n }).join(\"\");\n }; // import a list of modules into the list\n\n\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n }\n\n return [content].join(\"\\n\");\n};","import type { FaustUIDescriptor, FaustUIItem } from \"@grame/faustwasm\";\nimport Layout from \"./layout/Layout\";\nimport AbstractItem from \"./components/AbstractItem\";\nimport Group from \"./components/Group\";\nimport type { FaustUIGroupProps } from \"./components/types\";\nimport type { LayoutProps } from \"./types\";\nimport \"./index.scss\";\n\ninterface IOptions {\n root: HTMLDivElement;\n ui?: FaustUIDescriptor;\n listenWindowResize?: boolean;\n listenWindowMessage?: boolean;\n}\n\n/**\n * The main class of UI constructor,\n * listening to `resize` window event to resize component,\n * listening to `message` window event to change UI or param value.\n * See readme.\n */\nexport default class FaustUI {\n componentMap: { [path: string]: AbstractItem[] } = {};\n DOMroot: HTMLDivElement;\n faustUIRoot: Group;\n hostWindow: Window;\n grid: number;\n private _ui: FaustUIItem[];\n private _layout: LayoutProps;\n /**\n * Calculate incoming UI's layout, bind window events\n */\n constructor(options: IOptions) {\n const { root, ui: uiIn, listenWindowResize, listenWindowMessage } = options;\n this.DOMroot = root;\n this.ui = uiIn || [];\n if (typeof listenWindowResize === \"undefined\" || listenWindowResize === true) {\n window.addEventListener(\"resize\", () => {\n this.resize();\n });\n }\n if (typeof listenWindowMessage === \"undefined\" || listenWindowMessage === true) {\n window.addEventListener(\"message\", (e) => {\n const { data, source } = e;\n this.hostWindow = source as Window;\n const { type } = data;\n if (!type) return;\n if (type === \"ui\") {\n this.ui = data.ui;\n } else if (type === \"param\") {\n const { path, value } = data;\n this.paramChangeByDSP(path, value);\n }\n });\n }\n }\n /**\n * Render the UI to DOM root\n */\n mount() {\n this.componentMap = {};\n this.DOMroot.innerHTML = \"\";\n const props: FaustUIGroupProps = {\n label: \"\",\n type: \"vgroup\",\n items: this.ui,\n style: {\n grid: this.grid,\n width: this.layout.width,\n height: this.layout.height,\n left: this.layout.offsetLeft,\n top: this.layout.offsetTop\n },\n isRoot: true,\n emitter: this\n };\n this.faustUIRoot = new Group(props);\n this.faustUIRoot.componentWillMount();\n this.faustUIRoot.mount();\n this.DOMroot.appendChild(this.faustUIRoot.container);\n this.faustUIRoot.componentDidMount();\n }\n /**\n * This method should be called by components to register itself to map.\n */\n register(path: string, item: AbstractItem) {\n if (this.componentMap[path]) this.componentMap[path].push(item);\n else this.componentMap[path] = [item];\n }\n /**\n * Notify the component to change its value.\n */\n paramChangeByDSP(path: string, value: number) {\n if (this.componentMap[path]) this.componentMap[path].forEach(item => item.setState({ value }));\n }\n /**\n * Can be overriden, called by components when its value is changed by user.\n */\n paramChangeByUI = (path: string, value: number) => {\n if (!this.hostWindow) return;\n this.hostWindow.postMessage({ path, value, type: \"param\" }, \"*\");\n };\n /**\n * Calculate UI layout in grid then calculate grid size.\n */\n calc() {\n const { items, layout } = Layout.calc(this.ui);\n this._ui = items;\n this._layout = layout;\n this.calcGrid();\n }\n /**\n * Calculate grid size by DOM root size and layout size in grids.\n */\n calcGrid() {\n const { width, height } = this.DOMroot.getBoundingClientRect();\n const grid = Math.max(40, Math.min(width / this._layout.width, height / this._layout.height));\n this.grid = grid;\n return grid;\n }\n /**\n * Force recalculate grid size and resize UI\n */\n resize() {\n if (!this.faustUIRoot) return;\n this.calcGrid();\n this.faustUIRoot.setState({ style: { grid: this.grid } });\n }\n get ui() {\n return this._ui;\n }\n set ui(uiIn) {\n this._ui = uiIn;\n this.calc();\n this.mount();\n }\n get layout() {\n return this._layout;\n }\n get minWidth() {\n return this._layout.width * 40 + 1;\n }\n get minHeight() {\n return this._layout.height * 40 + 1;\n }\n}\n","import TypedEventEmitter from \"@shren/typed-event-emitter\";\n\nexport default abstract class AbstractComponent extends TypedEventEmitter {\n /**\n * The default state of the component.\n */\n static defaultProps: Record = {};\n get defaultProps() {\n return (this.constructor as typeof AbstractComponent).defaultProps as T;\n }\n /**\n * Here stores corrent state of component\n * change the state with `setState` method to fire state events\n * then UI parts will get notified and rerender\n */\n state: T;\n /**\n * Frame count in order to reduce frame rate\n */\n private $frame = 0;\n /**\n * Frame reducing factor, 1 = render at every browser rendering tick, 2 will skip one every two ticks.\n */\n frameReduce = 1;\n /**\n * Here stores current `requestAnimationFrame` reference\n * if we have a new state to render, we cancel the old one\n */\n private $raf: number;\n /**\n * `requestAnimationFrame` callback\n */\n private raf = () => {\n this.$frame++;\n if (this.$frame % this.frameReduce !== 0) {\n this.$raf = window.requestAnimationFrame(this.raf);\n return;\n }\n this.$raf = undefined;\n this.tasks.forEach(f => f());\n this.tasks = [];\n };\n /**\n * tasks to execute in next redering tick\n */\n private tasks: (() => any)[] = [];\n /**\n * Initiate default state with incoming state.\n */\n constructor(props?: T) {\n super();\n this.state = { ...this.defaultProps, ...props };\n }\n /**\n * set internal state and fire events for UI parts subscribed\n */\n setState(newState: Partial) {\n let shouldUpdate = false;\n for (const stateKey in newState) {\n const stateValue = newState[stateKey];\n if (stateKey in this.state && this.state[stateKey] !== stateValue) {\n this.state[stateKey] = stateValue;\n shouldUpdate = true;\n } else return;\n if (shouldUpdate) this.emit(stateKey, this.state[stateKey]);\n }\n }\n /**\n * Use this method to request a new rendering\n * schedule what you need to do in next render tick in `raf` callback\n */\n schedule(func: () => any) {\n if (this.tasks.indexOf(func) === -1) this.tasks.push(func);\n if (this.$raf) return;\n this.$raf = window.requestAnimationFrame(this.raf);\n }\n}\n","import AbstractComponent from \"./AbstractComponent\";\nimport { normalize, normExp, normLog } from \"./utils\";\nimport type { FaustUIItemStyle, FaustUIItemProps, PointerDownEvent, PointerDragEvent, PointerUpEvent } from \"./types\";\nimport \"./Base.scss\";\n\n/**\n * Abstract class that describes a FaustUI Component\n * this is an event emitter that emits every state change to inform UI renderer parts\n * Each UI parts could subscribe to a specific state such as `value`, `min`, `max` or `style`\n * when the event subscribed is fired, this part of ui updated using its own handler without updating the rest of UI parts\n * the types of events is restricted to the same as keys of `state` object:\n * `state` object is a `FaustUIItemProps` with a `style` object that contains `T` defined by child class.\n * Child class can override life cycle methods\n * `componentWillMount` prepare data before DOM get loads to page\n * `mount` get DOMs append to page\n * `componentDidMount` Now draw canvas etc.\n */\nexport default abstract class AbstractItem extends AbstractComponent> {\n /**\n * The default state of the component.\n */\n static defaultProps: FaustUIItemProps = {\n value: 0,\n active: true,\n focus: false,\n label: \"\",\n address: \"\",\n min: 0,\n max: 1,\n enums: {},\n type: \"float\",\n unit: \"\",\n scale: \"linear\",\n step: 0.01,\n style: { width: 45, height: 15, left: 0, top: 0, labelcolor: \"rgba(226, 222, 255, 0.5)\" }\n };\n /**\n * DOM Div container of the component\n */\n container: HTMLDivElement;\n /**\n * DOM Div container of label canvas\n */\n label: HTMLDivElement;\n /**\n * Use canvas as label to fit full text in.\n */\n labelCanvas: HTMLCanvasElement;\n labelCtx: CanvasRenderingContext2D;\n /**\n * Override this to get css work\n */\n className: string;\n frameReduce = 3;\n /**\n * Default DOM event listeners, unify mousedown and touchstart events\n * For mouse or touch events, please use `handlePointerDown` `handlePointerUp` `handlePointerDrag` callbacks\n */\n handleKeyDown = (e: KeyboardEvent) => {};\n handleKeyUp = (e: KeyboardEvent) => {};\n handleTouchStart = (e: TouchEvent) => {\n e.preventDefault();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n let prevX = e.touches[0].clientX;\n let prevY = e.touches[0].clientY;\n const fromX = prevX - rect.left;\n const fromY = prevY - rect.top;\n const prevValue = this.state.value;\n this.handlePointerDown({ x: fromX, y: fromY, originalEvent: e });\n const handleTouchMove = (e: TouchEvent) => {\n e.preventDefault();\n const clientX = e.changedTouches[0].clientX;\n const clientY = e.changedTouches[0].clientY;\n const movementX = clientX - prevX;\n const movementY = clientY - prevY;\n prevX = clientX;\n prevY = clientY;\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n this.handlePointerDrag({ prevValue, x, y, fromX, fromY, movementX, movementY, originalEvent: e });\n };\n const handleTouchEnd = (e: TouchEvent) => {\n e.preventDefault();\n const x = e.changedTouches[0].clientX - rect.left;\n const y = e.changedTouches[0].clientY - rect.top;\n this.handlePointerUp({ x, y, originalEvent: e });\n document.removeEventListener(\"touchmove\", handleTouchMove);\n document.removeEventListener(\"touchend\", handleTouchEnd);\n };\n document.addEventListener(\"touchmove\", handleTouchMove, { passive: false });\n document.addEventListener(\"touchend\", handleTouchEnd, { passive: false });\n };\n handleWheel = (e: WheelEvent) => {};\n handleClick = (e: MouseEvent) => {};\n handleMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).focus();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const fromX = e.clientX - rect.left;\n const fromY = e.clientY - rect.top;\n const prevValue = this.state.value;\n this.handlePointerDown({ x: fromX, y: fromY, originalEvent: e });\n const handleMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n this.handlePointerDrag({ prevValue, x, y, fromX, fromY, movementX: e.movementX, movementY: e.movementY, originalEvent: e });\n };\n const handleMouseUp = (e: MouseEvent) => {\n e.preventDefault();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n this.handlePointerUp({ x, y, originalEvent: e });\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n };\n handleMouseOver = (e: MouseEvent) => {};\n handleMouseOut = (e: MouseEvent) => {};\n handleContextMenu = (e: MouseEvent) => {};\n handlePointerDown = (e: PointerDownEvent) => {};\n handlePointerDrag = (e: PointerDragEvent) => {};\n handlePointerUp = (e: PointerUpEvent) => {};\n handleFocusIn = (e: FocusEvent) => this.setState({ focus: true });\n handleFocusOut = (e: FocusEvent) => this.setState({ focus: false });\n\n /**\n * Initiate default state with incoming state.\n */\n constructor(props?: FaustUIItemProps) {\n super(props);\n this.state.style = { ...this.defaultProps.style, ...props.style };\n if (this.state.emitter) this.state.emitter.register(this.state.address, this);\n }\n /**\n * Get a nearest valid number\n */\n toValidNumber(value: number) {\n const { min, max, step } = this.state;\n if (typeof min !== \"number\" || typeof max !== \"number\") return value;\n const v = Math.min(max, Math.max(min, value));\n if (!step) return v;\n return min + Math.floor((v - min) / step) * step;\n }\n /**\n * Use this method if you want the emitter to send value to DSP\n */\n setValue(valueIn: number) {\n const value = this.toValidNumber(valueIn);\n const changed = this.setState({ value });\n if (changed) this.change(value);\n return changed;\n }\n /**\n * Send value to DSP\n */\n change(valueIn?: number) {\n if (this.state.emitter) this.state.emitter.paramChangeByUI(this.state.address, typeof valueIn === \"number\" ? valueIn : this.state.value);\n }\n /**\n * set internal state and fire events for UI parts subscribed\n * This will not send anything to DSP\n * @returns is state updated\n */\n setState(newState: { [key in keyof FaustUIItemProps]?: FaustUIItemProps[key] }) {\n let shouldUpdate = false;\n for (const key in newState) {\n const stateKey = key as keyof FaustUIItemProps;\n const stateValue = newState[stateKey];\n if (stateKey === \"style\") {\n for (const styleKey in newState.style) {\n if (styleKey in this.state.style && this.state.style[styleKey] !== newState.style[styleKey]) {\n this.state.style[styleKey] = newState.style[styleKey];\n shouldUpdate = true;\n }\n }\n } else if (stateKey in this.state && this.state[stateKey] !== stateValue) {\n (this.state as any)[stateKey] = stateValue;\n shouldUpdate = true;\n } else return false;\n if (shouldUpdate) this.emit(stateKey, this.state[stateKey]);\n }\n return shouldUpdate;\n }\n /**\n * Create container with class name\n * override it with `super.componentWillMount();`\n */\n componentWillMount() {\n this.container = document.createElement(\"div\");\n this.container.className = [\"faust-ui-component\", \"faust-ui-component-\" + this.className].join(\" \");\n this.container.tabIndex = 1;\n this.container.id = this.state.address;\n if (this.state.tooltip) this.container.title = this.state.tooltip;\n this.label = document.createElement(\"div\");\n this.label.className = \"faust-ui-component-label\";\n this.labelCanvas = document.createElement(\"canvas\");\n this.labelCtx = this.labelCanvas.getContext(\"2d\");\n return this;\n }\n /**\n * Here append all child DOM to container\n */\n mount() {\n this.label.appendChild(this.labelCanvas);\n return this;\n }\n paintLabel(align?: CanvasTextAlign) {\n const label = this.state.label;\n const color = this.state.style.labelcolor;\n const ctx = this.labelCtx;\n const canvas = this.labelCanvas;\n let { width, height } = this.label.getBoundingClientRect();\n if (!width || !height) return this;\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.height = height;\n canvas.width = width;\n ctx.clearRect(0, 0, width, height);\n ctx.fillStyle = color;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = align || \"center\";\n ctx.font = `bold ${height * 0.9}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"`;\n ctx.fillText(label, align === \"left\" ? 0 : align === \"right\" ? width : width / 2, height / 2, width);\n return this;\n }\n /**\n * will call this method when mounted\n */\n componentDidMount() {\n const handleResize = () => {\n const { grid, left, top, width, height } = this.state.style;\n this.container.style.width = `${width * grid}px`;\n this.container.style.height = `${height * grid}px`;\n this.container.style.left = `${left * grid}px`;\n this.container.style.top = `${top * grid}px`;\n this.label.style.height = `${grid * 0.25}px`;\n this.paintLabel();\n };\n this.on(\"style\", () => this.schedule(handleResize));\n handleResize();\n return this;\n }\n /**\n * Count steps in range min-max with step\n */\n get stepsCount() {\n const { type, max, min, step, enums } = this.state;\n const maxSteps = type === \"enum\" ? enums.length : type === \"int\" ? max - min : (max - min) / step;\n if (step) {\n if (type === \"enum\") return enums.length;\n if (type === \"int\") return Math.min(Math.floor((max - min) / (Math.round(step) || 1)), maxSteps);\n return Math.floor((max - min) / step);\n }\n return maxSteps;\n }\n /**\n * Normalized value between 0 - 1.\n */\n get distance() {\n const { type, max, min, value, enums, scale } = this.state;\n return AbstractItem.getDistance({ type, max, min, value, enums, scale });\n }\n static getDistance(state: { value: number; min: number; max: number; enums?: { [key: string]: number }; type: \"enum\" | \"int\" | \"float\"; scale: \"linear\" | \"exp\" | \"log\" }) {\n const { type, max, min, value, enums, scale } = state;\n if (type === \"enum\") return value / (enums.length - 1);\n const v = scale === \"exp\" ? normLog(value, min, max) : scale === \"log\" ? normExp(value, min, max) : value;\n return normalize(v, min, max);\n }\n /**\n * Mousemove pixels for each step\n */\n get stepRange() {\n const full = 100;\n const stepsCount = this.stepsCount;\n return full / stepsCount;\n }\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemStyle, FaustUIItemProps } from \"./types\";\nimport \"./Button.scss\";\n\nexport interface FaustUIButtonStyle extends FaustUIItemStyle {\n fontname?: string;\n fontsize?: number;\n fontface?: \"normal\" | \"bold\" | \"italic\" | \"bold italic\";\n bgcolor?: string;\n bgoncolor?: string;\n bordercolor?: string;\n borderoncolor?: string;\n textcolor?: string;\n textoncolor?: string;\n}\nexport default class Button extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"normal\",\n bgcolor: \"rgba(40, 40, 40, 1)\",\n bgoncolor: \"rgba(18, 18, 18, 1)\",\n bordercolor: \"rgba(80, 80, 80, 1)\",\n borderoncolor: \"rgba(255, 165, 0, 1)\",\n textcolor: \"rgba(226, 222, 255, 0.5)\",\n textoncolor: \"rgba(255, 165, 0, 1)\"\n }\n };\n }\n className = \"button\";\n\n btn: HTMLDivElement;\n span: HTMLSpanElement;\n componentWillMount() {\n super.componentWillMount();\n this.btn = document.createElement(\"div\");\n this.span = document.createElement(\"span\");\n this.span.innerText = this.state.label;\n this.setStyle();\n return this;\n }\n setStyle = () => {\n const { value, style } = this.state;\n const { height, grid, fontsize, fontname, fontface, textcolor, textoncolor, bgoncolor, bgcolor, bordercolor, borderoncolor } = style;\n this.btn.style.backgroundColor = value ? bgoncolor : bgcolor;\n this.btn.style.borderColor = value ? borderoncolor : bordercolor;\n this.btn.style.color = value ? textoncolor : textcolor;\n this.btn.style.fontSize = `${fontsize || height * grid / 4}px`;\n this.btn.style.fontFamily = `${fontname}, sans-serif`;\n this.btn.style.fontStyle = fontface;\n };\n mount() {\n this.btn.appendChild(this.span);\n this.container.appendChild(this.btn);\n return super.mount();\n }\n componentDidMount() {\n super.componentDidMount();\n this.btn.addEventListener(\"mousedown\", this.handleMouseDown);\n this.btn.addEventListener(\"touchstart\", this.handleTouchStart);\n this.on(\"style\", () => this.schedule(this.setStyle));\n const labelChange = () => this.span.innerText = this.state.label;\n this.on(\"label\", () => this.schedule(labelChange));\n this.on(\"value\", () => this.schedule(this.setStyle));\n return this;\n }\n handlePointerDown = () => {\n this.setValue(1);\n };\n handlePointerUp = () => {\n this.setValue(0);\n };\n}\n","import Button from \"./Button\";\nimport \"./Checkbox.scss\";\n\nexport default class Checkbox extends Button {\n className = \"checkbox\";\n\n handlePointerDown = () => {\n this.setValue(1 - this.state.value);\n };\n handlePointerUp = () => {\n };\n}\n","import type { FaustUIMeta } from \"@grame/faustwasm\";\nimport AbstractComponent from \"./AbstractComponent\";\nimport AbstractItem from \"./AbstractItem\";\nimport HSlider from \"./HSlider\";\nimport VSlider from \"./VSlider\";\nimport Nentry from \"./Nentry\";\nimport Button from \"./Button\";\nimport Checkbox from \"./Checkbox\";\nimport Knob from \"./Knob\";\nimport Menu from \"./Menu\";\nimport Radio from \"./Radio\";\nimport Led from \"./Led\";\nimport Numerical from \"./Numerical\";\nimport HBargraph from \"./HBargraph\";\nimport VBargraph from \"./VBargraph\";\nimport Layout from \"../layout/Layout\";\nimport type FaustUI from \"../FaustUI\";\nimport type LayoutAbstractGroup from \"../layout/AbstractGroup\";\nimport type LayoutAbstractInputItem from \"../layout/AbstractInputItem\";\nimport type LayoutAbstractOutputItem from \"../layout/AbstractOutputItem\";\nimport type { FaustUIItemProps, FaustUIItemStyle, FaustUIGroupProps } from \"./types\";\nimport type { LayoutProps } from \"../types\";\nimport \"./Group.scss\";\n\nexport interface GroupProps extends FaustUIGroupProps {\n items?: (LayoutAbstractGroup | LayoutAbstractInputItem | LayoutAbstractOutputItem)[];\n}\nexport default class Group extends AbstractComponent {\n static parseMeta(metaIn: FaustUIMeta[]): { metaObject: FaustUIMeta; enums?: { [key: string]: number } } {\n const metaObject: FaustUIMeta = {};\n if (!metaIn) return { metaObject };\n metaIn.forEach(m => Object.assign(metaObject, m));\n if (metaObject.style) {\n const enumsRegex = /\\{(?:(?:'|_|-)(.+?)(?:'|_|-):([-+]?[0-9]*\\.?[0-9]+?);)+(?:(?:'|_|-)(.+?)(?:'|_|-):([-+]?[0-9]*\\.?[0-9]+?))\\}/;\n const matched = metaObject.style.match(enumsRegex);\n if (matched) {\n const itemsRegex = /(?:(?:'|_|-)(.+?)(?:'|_|-):([-+]?[0-9]*\\.?[0-9]+?))/g;\n const enums: { [key: string]: number } = {};\n let item;\n // eslint-disable-next-line no-cond-assign\n while (item = itemsRegex.exec(matched[0])) {\n enums[item[1]] = +item[2];\n }\n return { metaObject, enums };\n }\n }\n return { metaObject };\n }\n static getComponent(item: LayoutAbstractGroup | LayoutAbstractInputItem | LayoutAbstractOutputItem, emitter: FaustUI, grid: number) {\n const type = Layout.predictType(item);\n if (type.endsWith(\"group\")) {\n const { label, items, type, layout } = item as LayoutAbstractGroup;\n const props: GroupProps = {\n label,\n type,\n items,\n style: {\n grid,\n width: layout.width,\n height: layout.height,\n left: layout.offsetLeft,\n top: layout.offsetTop,\n labelcolor: \"rgba(255, 255, 255, 0.7)\"\n },\n emitter\n };\n return new Group(props);\n }\n const ioItem = item as LayoutAbstractInputItem | LayoutAbstractOutputItem;\n const { metaObject, enums } = this.parseMeta(ioItem.meta);\n const { tooltip, unit, scale } = metaObject;\n const { label, min, max, address, layout } = ioItem;\n const props: FaustUIItemProps = {\n label,\n address,\n tooltip,\n unit,\n scale: scale || \"linear\",\n emitter,\n enums,\n style: {\n grid,\n width: layout.width,\n height: layout.height,\n left: layout.offsetLeft,\n top: layout.offsetTop\n },\n type: \"float\",\n min: isFinite(min) ? min : 0,\n max: isFinite(max) ? max : 1,\n step: \"step\" in item ? +item.step : 1,\n value: \"init\" in item ? +item.init || 0 : 0\n };\n if (type === \"button\") return new Button(props);\n if (type === \"checkbox\") return new Checkbox(props);\n if (type === \"nentry\") return new Nentry(props);\n if (type === \"knob\") return new Knob(props);\n if (type === \"menu\") return new Menu(props);\n if (type === \"radio\") return new Radio(props);\n if (type === \"hslider\") return new HSlider(props);\n if (type === \"vslider\") return new VSlider(props);\n if (type === \"hbargraph\") return new HBargraph(props);\n if (type === \"vbargraph\") return new VBargraph(props);\n if (type === \"numerical\") return new Numerical(props);\n if (type === \"led\") return new Led(props);\n return null;\n }\n /**\n * DOM Div container of the group\n */\n container: HTMLDivElement;\n /**\n * DOM Div container of label canvas\n */\n label: HTMLDivElement;\n /**\n * Use canvas as label to fit full text in.\n */\n labelCanvas: HTMLCanvasElement;\n labelCtx: CanvasRenderingContext2D;\n tabs: HTMLDivElement;\n children: (AbstractItem | Group)[];\n layout: LayoutProps;\n setState(newState: { [key in keyof FaustUIGroupProps]?: FaustUIGroupProps[key] }) {\n let shouldUpdate = false;\n for (const key in newState) {\n const stateKey = key as keyof FaustUIGroupProps;\n const stateValue = newState[stateKey];\n if (stateKey === \"style\") {\n for (const key in newState.style) {\n const styleKey = key as keyof FaustUIItemStyle;\n if (styleKey in this.state.style && this.state.style[styleKey] !== newState.style[styleKey]) {\n (this.state.style as any)[styleKey] = newState.style[styleKey];\n shouldUpdate = true;\n }\n }\n } else if (stateKey in this.state && this.state[stateKey] !== stateValue) {\n (this.state as any)[stateKey] = stateValue;\n shouldUpdate = true;\n } else return;\n if (shouldUpdate) this.emit(stateKey, this.state[stateKey]);\n }\n }\n componentWillMount() {\n this.container = document.createElement(\"div\");\n this.tabs = document.createElement(\"div\");\n this.tabs.className = \"faust-ui-tgroup-tabs\";\n this.label = document.createElement(\"div\");\n this.label.className = \"faust-ui-group-label\";\n this.labelCanvas = document.createElement(\"canvas\");\n this.labelCtx = this.labelCanvas.getContext(\"2d\");\n this.updateUI();\n this.children.forEach(item => item.componentWillMount());\n return this;\n }\n paintLabel() {\n const label = this.state.label;\n const color = this.state.style.labelcolor;\n const ctx = this.labelCtx;\n const canvas = this.labelCanvas;\n let { width, height } = this.label.getBoundingClientRect();\n if (!width || !height) return this;\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.height = height;\n canvas.width = width;\n ctx.clearRect(0, 0, width, height);\n ctx.fillStyle = color;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.font = `bold ${height * 0.9}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"`;\n ctx.fillText(label, 0, height / 2, width);\n return this;\n }\n updateUI = () => {\n this.children = [];\n const { style, type, items, emitter, isRoot } = this.state as GroupProps;\n const { grid, left, top, width, height } = style;\n this.label.style.height = `${grid * 0.3}px`;\n this.container.style.left = `${left * grid}px`;\n this.container.style.top = `${top * grid}px`;\n this.container.style.width = `${width * grid}px`;\n this.container.style.height = `${height * grid}px`;\n this.container.className = [\"faust-ui-group\", `faust-ui-${type}`, `${isRoot ? \"faust-ui-root\" : \"\"}`].join(\" \");\n items.forEach((item) => {\n if (item.type.endsWith(\"group\")) {\n const component = Group.getComponent(item, emitter, grid);\n if (component) this.children.push(component);\n } else {\n const ioItem = item as LayoutAbstractInputItem | LayoutAbstractOutputItem;\n const itemComponent = Group.getComponent(ioItem, this.state.emitter, grid);\n if (itemComponent) this.children.push(itemComponent);\n }\n });\n if (type === \"tgroup\") {\n this.tabs.innerHTML = \"\";\n this.tabs.style.height = `${grid}px`;\n this.tabs.style.top = `${0.25 * grid}px`;\n this.state.items.forEach((item, i) => {\n const label = item.label;\n const tab = document.createElement(\"span\");\n tab.innerText = label;\n tab.className = \"faust-ui-tgroup-tab\";\n tab.style.fontSize = `${0.25 * grid}px`;\n tab.style.width = `${2 * grid - 20}px`;\n tab.style.height = `${grid - 20}px`;\n tab.style.lineHeight = `${grid - 20}px`;\n tab.addEventListener(\"click\", () => {\n const groups: HTMLDivElement[] = [];\n for (let j = 0; j < this.container.children.length; j++) {\n const element = this.container.children[j] as HTMLDivElement;\n if (j > 1) groups.push(element);\n }\n for (let j = 0; j < groups.length; j++) {\n const element = groups[j] as HTMLDivElement;\n element.style.visibility = i === j ? \"visible\" : \"hidden\";\n }\n for (let j = 0; j < this.tabs.children.length; j++) {\n const e = this.tabs.children[j];\n if (i !== j) {\n if (e.classList.contains(\"active\")) e.classList.remove(\"active\");\n } else e.classList.add(\"active\");\n }\n });\n this.tabs.appendChild(tab);\n });\n }\n };\n mount() {\n this.label.appendChild(this.labelCanvas);\n this.container.appendChild(this.label);\n if (this.tabs.children.length) this.container.appendChild(this.tabs);\n this.children.forEach((item) => {\n item.mount();\n this.container.appendChild(item.container);\n });\n return this;\n }\n componentDidMount() {\n const handleResize = () => {\n const { grid, left, top, width, height } = this.state.style;\n this.label.style.height = `${grid * 0.3}px`;\n this.container.style.width = `${width * grid}px`;\n this.container.style.height = `${height * grid}px`;\n this.container.style.left = `${left * grid}px`;\n this.container.style.top = `${top * grid}px`;\n if (this.state.type === \"tgroup\") {\n this.tabs.style.height = `${grid}px`;\n this.tabs.style.top = `${0.25 * grid}px`;\n for (let i = 0; i < this.tabs.children.length; i++) {\n const tab = this.tabs.children[i] as HTMLSpanElement;\n tab.style.fontSize = `${0.25 * grid}px`;\n tab.style.width = `${2 * grid - 20}px`;\n tab.style.height = `${grid - 20}px`;\n tab.style.lineHeight = `${grid - 20}px`;\n }\n }\n this.paintLabel();\n this.children.forEach(item => item.setState({ style: { grid } }));\n };\n this.on(\"style\", () => this.schedule(handleResize));\n const itemsChange = () => {\n this.updateUI();\n this.children.forEach(item => item.componentWillMount());\n };\n this.on(\"items\", () => this.schedule(itemsChange));\n const labelChange = () => {\n this.paintLabel();\n this.label.title = this.state.label;\n };\n this.on(\"label\", () => this.schedule(labelChange));\n this.paintLabel();\n if (this.tabs && this.tabs.children.length) (this.tabs.children[0] as HTMLSpanElement).click();\n this.children.forEach(item => item.componentDidMount());\n return this;\n }\n}\n","import AbstractItem from \"./AbstractItem\";\nimport VBargraph from \"./VBargraph\";\nimport \"./HBargraph.scss\";\n\nexport default class HBargraph extends VBargraph {\n className = \"hbargraph\";\n\n paintLabel() {\n return super.paintLabel(\"left\");\n }\n setStyle = () => {\n const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n this.input.style.fontSize = `${fontsize || height * grid * 0.2}px`;\n this.input.style.color = textcolor;\n this.container.style.backgroundColor = bgcolor;\n this.container.style.borderColor = bordercolor;\n };\n paint = () => {\n const { barwidth, barbgcolor, coldcolor, warmcolor, hotcolor, overloadcolor } = this.state.style;\n const { type, max, min, enums, scale, value } = this.state;\n const ctx = this.ctx;\n const canvas = this.canvas;\n let { width, height } = this.canvasDiv.getBoundingClientRect();\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.width = width;\n canvas.height = height;\n\n const drawWidth = width * 0.9;\n const drawHeight = barwidth || Math.min(height / 3, drawWidth * 0.05);\n const left = width * 0.05;\n const top = (height - drawHeight) * 0.5;\n this.paintValue = value;\n const paintValue = this.paintValue;\n if (paintValue > this.maxValue) {\n this.maxValue = paintValue;\n if (this.maxTimer) window.clearTimeout(this.maxTimer);\n this.maxTimer = window.setTimeout(() => {\n this.maxValue = this.paintValue;\n this.maxTimer = undefined;\n this.schedule(this.paint);\n }, 1000);\n }\n if (paintValue < this.maxValue && typeof this.maxTimer === \"undefined\") {\n this.maxTimer = window.setTimeout(() => {\n this.maxValue = this.paintValue;\n this.maxTimer = undefined;\n this.schedule(this.paint);\n }, 1000);\n }\n const maxValue = this.maxValue;\n const coldStop = (-18 - min) / (max - min);\n const warmStop = (-6 - min) / (max - min);\n const hotStop = (-3 - min) / (max - min);\n const overloadStop = Math.max(0, -min / (max - min));\n const gradient = ctx.createLinearGradient(left, 0, drawWidth, 0);\n if (coldStop <= 1 && coldStop >= 0) gradient.addColorStop(coldStop, coldcolor);\n else if (coldStop > 1) gradient.addColorStop(1, coldcolor);\n if (warmStop <= 1 && warmStop >= 0) gradient.addColorStop(warmStop, warmcolor);\n if (hotStop <= 1 && hotStop >= 0) gradient.addColorStop(hotStop, hotcolor);\n if (overloadStop <= 1 && overloadStop >= 0) gradient.addColorStop(overloadStop, overloadcolor);\n else if (overloadStop < 0) gradient.addColorStop(0, coldcolor);\n\n ctx.fillStyle = barbgcolor;\n if (paintValue < 0) ctx.fillRect(left, top, drawWidth * overloadStop, drawHeight);\n if (paintValue < max) ctx.fillRect(left + drawWidth * overloadStop + 1, top, drawWidth * (1 - overloadStop) - 1, drawHeight);\n ctx.fillStyle = gradient;\n if (paintValue > min) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(0, paintValue) }));\n ctx.fillRect(left, top, distance * drawWidth, drawHeight);\n }\n if (paintValue > 0) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(max, paintValue) }) - overloadStop);\n ctx.fillRect(left + overloadStop * drawWidth + 1, top, distance * drawWidth - 1, drawHeight);\n }\n if (maxValue > paintValue) {\n if (maxValue <= 0) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(0, maxValue) }));\n ctx.fillRect(left + distance * drawWidth - 1, top, 1, drawHeight);\n }\n if (maxValue > 0) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(max, maxValue) }) - overloadStop);\n ctx.fillRect(left + Math.min(drawWidth - 1, (overloadStop + distance) * drawWidth), top, 1, drawHeight);\n }\n }\n };\n}\n","import { fillRoundedRect } from \"./utils\";\nimport VSlider from \"./VSlider\";\nimport \"./HSlider.scss\";\n\nexport default class HSlider extends VSlider {\n className = \"hslider\";\n\n paintLabel() {\n return super.paintLabel(\"left\");\n }\n setStyle = () => {\n const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n this.input.style.fontSize = `${fontsize || height * grid * 0.2}px`;\n this.input.style.color = textcolor;\n this.container.style.backgroundColor = bgcolor;\n this.container.style.borderColor = bordercolor;\n };\n paint = () => {\n const { sliderwidth, sliderbgcolor, sliderbgoncolor, slidercolor } = this.state.style;\n const ctx = this.ctx;\n const canvas = this.canvas;\n const distance = this.distance;\n let { width, height } = this.canvasDiv.getBoundingClientRect();\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.width = width;\n canvas.height = height;\n\n const drawWidth = width * 0.9;\n const drawHeight = sliderwidth || Math.min(height / 3, drawWidth * 0.05);\n const left = width * 0.05;\n const top = (height - drawHeight) * 0.5;\n const borderRadius = drawHeight * 0.25;\n this.interactionRect = [left, 0, drawWidth, height];\n const grd = ctx.createLinearGradient(left, 0, left + drawWidth, 0);\n grd.addColorStop(Math.max(0, Math.min(1, distance)), sliderbgoncolor);\n grd.addColorStop(Math.max(0, Math.min(1, distance)), sliderbgcolor);\n ctx.fillStyle = grd;\n fillRoundedRect(ctx, left, top, drawWidth, drawHeight, borderRadius);\n // draw slider\n ctx.fillStyle = slidercolor;\n fillRoundedRect(ctx, left + drawWidth * distance - drawHeight, top - drawHeight, drawHeight * 2, drawHeight * 3, borderRadius);\n };\n}\n","import AbstractItem from \"./AbstractItem\";\nimport { toRad, normLog, normExp, denormalize, normalize } from \"./utils\";\nimport type { FaustUIItemProps, PointerDragEvent } from \"./types\";\nimport type { FaustUINentryStyle } from \"./Nentry\";\nimport \"./Knob.scss\";\n\ninterface FaustUIKnobStyle extends FaustUINentryStyle {\n knobwidth?: number;\n knobcolor?: string;\n knoboncolor?: string;\n needlecolor?: string;\n}\nexport default class Knob extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(18, 18, 18, 0)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\",\n knobwidth: undefined,\n knobcolor: \"rgba(18, 18, 18, 1)\",\n knoboncolor: \"rgba(255, 165, 0, 1)\",\n needlecolor: \"rgba(200, 200, 200, 0.75)\"\n }\n };\n }\n className = \"knob\";\n\n canvas: HTMLCanvasElement;\n inputNumber: HTMLInputElement;\n input: HTMLInputElement;\n ctx: CanvasRenderingContext2D;\n componentWillMount() {\n super.componentWillMount();\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = 10;\n this.canvas.height = 10;\n this.ctx = this.canvas.getContext(\"2d\");\n this.inputNumber = document.createElement(\"input\");\n this.inputNumber.type = \"number\";\n this.inputNumber.value = (+this.state.value.toFixed(3)).toString();\n this.inputNumber.max = this.state.max.toString();\n this.inputNumber.min = this.state.min.toString();\n this.inputNumber.step = this.state.step.toString();\n this.input = document.createElement(\"input\");\n this.input.value = this.inputNumber.value + (this.state.unit || \"\");\n this.input.spellcheck = false;\n this.setStyle();\n return this;\n }\n handleChange = (e: Event) => {\n const value = parseFloat((e.currentTarget as HTMLInputElement).value);\n if (isFinite(value)) {\n const changed = this.setValue(+this.inputNumber.value);\n if (changed) return;\n }\n this.input.value = this.inputNumber.value + (this.state.unit || \"\");\n };\n setStyle = () => {\n const { fontsize, height, grid, textcolor, bgcolor, bordercolor } = this.state.style;\n this.input.style.fontSize = `${fontsize || height * grid * 0.1}px`;\n this.input.style.color = textcolor;\n this.container.style.backgroundColor = bgcolor;\n this.container.style.borderColor = bordercolor;\n };\n componentDidMount() {\n super.componentDidMount();\n this.input.addEventListener(\"change\", this.handleChange);\n this.canvas.addEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.addEventListener(\"touchstart\", this.handleTouchStart, { passive: false });\n this.on(\"style\", () => {\n this.schedule(this.setStyle);\n this.schedule(this.paint);\n });\n this.on(\"label\", () => this.schedule(this.paintLabel));\n const valueChange = () => {\n this.inputNumber.value = (+this.state.value.toFixed(3)).toString();\n this.input.value = this.inputNumber.value + (this.state.unit || \"\");\n };\n this.on(\"value\", () => {\n this.schedule(valueChange);\n this.schedule(this.paint);\n });\n const maxChange = () => this.inputNumber.max = this.state.max.toString();\n this.on(\"max\", () => {\n this.schedule(maxChange);\n this.schedule(this.paint);\n });\n const minChange = () => this.inputNumber.min = this.state.min.toString();\n this.on(\"min\", () => {\n this.schedule(minChange);\n this.schedule(this.paint);\n });\n const stepChange = () => this.inputNumber.step = this.state.step.toString();\n this.on(\"step\", () => {\n this.schedule(stepChange);\n this.schedule(this.paint);\n });\n this.schedule(this.paint);\n return this;\n }\n mount() {\n this.container.appendChild(this.label);\n this.container.appendChild(this.canvas);\n this.container.appendChild(this.input);\n return super.mount();\n }\n paint = () => {\n const { knobwidth, knobcolor, knoboncolor, needlecolor } = this.state.style;\n const ctx = this.ctx;\n const canvas = this.canvas;\n const distance = this.distance;\n let { width, height } = this.canvas.getBoundingClientRect();\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.width = width;\n canvas.height = height;\n\n const start = 5 / 8 * Math.PI;\n const end = 19 / 8 * Math.PI;\n const valPos = start + toRad(distance * 315);\n const dialHeight = Math.min(width, height) * 0.75;\n const dialRadius = dialHeight * 0.5;\n const dialCenterX = width * 0.5;\n const dialCenterY = height * 0.5;\n // const arcStartX = dialCenterX + (dialHeight * 0.5 * Math.cos(start));\n // const arcStartY = dialCenterY + (dialHeight * 0.5 * Math.sin(start));\n // const arcEndX = dialCenterX + (dialHeight * 0.5 * Math.cos(end));\n // const arcEndY = dialCenterY + (dialHeight * 0.5 * Math.sin(end));\n const valuePosX = dialCenterX + (dialHeight * 0.5 * Math.cos(valPos));\n const valuePosY = dialCenterY + (dialHeight * 0.5 * Math.sin(valPos));\n const lineWidth = knobwidth || dialRadius * 0.2;\n\n ctx.strokeStyle = knobcolor;\n ctx.lineWidth = lineWidth;\n ctx.lineCap = \"round\";\n // draw background arc\n ctx.beginPath();\n ctx.arc(dialCenterX, dialCenterY, dialRadius, valPos, end);\n ctx.stroke();\n // draw value arc\n if (distance) {\n ctx.strokeStyle = knoboncolor;\n ctx.beginPath();\n ctx.arc(dialCenterX, dialCenterY, dialRadius, start, valPos);\n ctx.stroke();\n }\n // draw dial needle\n ctx.strokeStyle = needlecolor;\n ctx.beginPath();\n ctx.moveTo(dialCenterX, dialCenterY);\n ctx.lineTo(valuePosX, valuePosY);\n ctx.stroke();\n };\n getValueFromDelta(e: PointerDragEvent) {\n const { type, min, max, enums, scale } = this.state;\n const step = type === \"enum\" ? 1 : (this.state.step || 1);\n const stepRange = this.stepRange;\n const stepsCount = this.stepsCount;\n const range = 100;\n const prevDistance = AbstractItem.getDistance({ value: e.prevValue, type, min, max, enums, scale }) * range;\n const distance = prevDistance + e.fromY - e.y;\n const denormalized = denormalize(distance / range, min, max);\n const v = scale === \"exp\" ? normExp(denormalized, min, max) : scale === \"log\" ? normLog(denormalized, min, max) : denormalized;\n let steps = Math.round(normalize(v, min, max) * range / stepRange);\n steps = Math.min(stepsCount, Math.max(0, steps));\n if (type === \"enum\") return steps;\n if (type === \"int\") return Math.round(steps * step + min);\n return steps * step + min;\n }\n handlePointerDrag = (e: PointerDragEvent) => {\n const newValue = this.getValueFromDelta(e);\n if (newValue !== this.state.value) this.setValue(newValue);\n };\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemProps } from \"./types\";\nimport type { FaustUINentryStyle } from \"./Nentry\";\nimport \"./Led.scss\";\n\ninterface FaustUILedStyle extends FaustUINentryStyle {\n shape?: \"circle\" | \"square\";\n ledbgcolor?: string;\n coldcolor?: string;\n warmcolor?: string;\n hotcolor?: string;\n overloadcolor?: string;\n}\nexport default class Led extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(18, 18, 18, 0)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\",\n shape: \"circle\",\n ledbgcolor: \"rgba(18, 18, 18, 1)\",\n coldcolor: \"rgba(12, 248, 100, 1)\",\n warmcolor: \"rgba(195, 248, 100, 1)\",\n hotcolor: \"rgba(255, 193, 10, 1)\",\n overloadcolor: \"rgba(255, 10, 10, 1)\"\n }\n };\n }\n className = \"led\";\n\n canvasDiv: HTMLDivElement;\n canvas: HTMLCanvasElement;\n tempCanvas: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n tempCtx: CanvasRenderingContext2D;\n componentWillMount() {\n super.componentWillMount();\n this.canvasDiv = document.createElement(\"div\");\n this.canvasDiv.className = `faust-ui-component-${this.className}-canvasdiv`;\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = 10;\n this.canvas.height = 10;\n this.ctx = this.canvas.getContext(\"2d\");\n this.tempCanvas = document.createElement(\"canvas\");\n this.tempCtx = this.tempCanvas.getContext(\"2d\");\n this.tempCanvas.width = 128;\n this.tempCanvas.height = 1;\n this.setStyle();\n return this;\n }\n setStyle = () => {\n const { bgcolor, bordercolor } = this.state.style;\n this.container.style.backgroundColor = bgcolor;\n this.container.style.borderColor = bordercolor;\n };\n componentDidMount() {\n super.componentDidMount();\n this.canvas.addEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.addEventListener(\"touchstart\", this.handleTouchStart, { passive: false });\n this.on(\"style\", () => this.schedule(this.setStyle));\n this.on(\"label\", () => this.schedule(this.paintLabel));\n this.on(\"value\", () => this.schedule(this.paint));\n this.on(\"max\", () => this.schedule(this.paint));\n this.on(\"min\", () => this.schedule(this.paint));\n this.on(\"step\", () => this.schedule(this.paint));\n this.schedule(this.paint);\n return this;\n }\n mount() {\n this.canvasDiv.appendChild(this.canvas);\n this.container.appendChild(this.label);\n this.container.appendChild(this.canvasDiv);\n return super.mount();\n }\n paint = () => {\n const { shape, ledbgcolor, coldcolor, warmcolor, hotcolor, overloadcolor } = this.state.style;\n const { min, max } = this.state;\n const { canvas, ctx, tempCanvas, tempCtx, distance } = this;\n const { width, height } = canvas.getBoundingClientRect();\n canvas.width = width;\n canvas.height = height;\n\n const drawHeight = Math.min(height, width) * 0.75;\n const drawWidth = drawHeight;\n const left = (width - drawWidth) * 0.5;\n const top = (height - drawHeight) * 0.5;\n const coldStop = (-18 - min) / (max - min);\n const warmStop = (-6 - min) / (max - min);\n const hotStop = (-3 - min) / (max - min);\n const overloadStop = -min / (max - min);\n const gradient = tempCtx.createLinearGradient(0, 0, tempCanvas.width, 0);\n if (coldStop <= 1 && coldStop >= 0) gradient.addColorStop(coldStop, coldcolor);\n else if (coldStop > 1) gradient.addColorStop(1, coldcolor);\n if (warmStop <= 1 && warmStop >= 0) gradient.addColorStop(warmStop, warmcolor);\n if (hotStop <= 1 && hotStop >= 0) gradient.addColorStop(hotStop, hotcolor);\n if (overloadStop <= 1 && overloadStop >= 0) gradient.addColorStop(overloadStop, overloadcolor);\n else if (overloadStop < 0) gradient.addColorStop(0, coldcolor);\n tempCtx.fillStyle = gradient;\n tempCtx.fillRect(0, 0, tempCanvas.width, 10);\n const d = tempCtx.getImageData(Math.min(tempCanvas.width - 1, distance * tempCanvas.width), 0, 1, 1).data;\n if (distance) ctx.fillStyle = `rgb(${d[0]}, ${d[1]}, ${d[2]})`;\n else ctx.fillStyle = ledbgcolor;\n if (shape === \"circle\") ctx.arc(width / 2, height / 2, width / 2 - left, 0, 2 * Math.PI);\n else ctx.rect(left, top, drawWidth, drawHeight);\n ctx.fill();\n };\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemStyle, FaustUIItemProps } from \"./types\";\nimport \"./Menu.scss\";\n\nexport interface FaustUIMenuStyle extends FaustUIItemStyle {\n fontname?: string;\n fontsize?: number;\n fontface?: \"regular\" | \"bold\" | \"italic\" | \"bold italic\";\n bgcolor?: string;\n bordercolor?: string;\n labelcolor?: string;\n textcolor?: string;\n}\nexport default class Menu extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(255, 255, 255, 0.25)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\"\n }\n };\n }\n className = \"menu\";\n\n select: HTMLSelectElement;\n componentWillMount() {\n super.componentWillMount();\n this.select = document.createElement(\"select\");\n this.getOptions();\n this.setStyle();\n return this;\n }\n getOptions() {\n const { enums } = this.state;\n this.select.innerHTML = \"\";\n if (enums) {\n let i = 0;\n for (const key in enums) {\n const option = document.createElement(\"option\");\n option.value = enums[key].toString();\n option.text = key;\n if (i === 0) option.selected = true;\n this.select.appendChild(option);\n i++;\n }\n }\n }\n handleChange = (e: Event) => {\n this.setValue(+(e.currentTarget as HTMLInputElement).value);\n };\n setStyle = () => {\n const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n this.select.style.backgroundColor = bgcolor;\n this.select.style.borderColor = bordercolor;\n this.select.style.color = textcolor;\n this.select.style.fontSize = `${fontsize || height * grid / 4}px`;\n };\n componentDidMount() {\n super.componentDidMount();\n this.select.addEventListener(\"change\", this.handleChange);\n this.on(\"style\", () => this.schedule(this.setStyle));\n this.on(\"label\", () => this.schedule(this.paintLabel));\n this.on(\"enums\", () => this.schedule(this.getOptions));\n const valueChange = () => {\n for (let i = this.select.children.length - 1; i >= 0; i--) {\n const option = this.select.children[i] as HTMLOptionElement;\n if (+option.value === this.state.value) this.select.selectedIndex = i;\n }\n };\n this.on(\"value\", () => this.schedule(valueChange));\n valueChange();\n return this;\n }\n mount() {\n this.container.appendChild(this.label);\n this.container.appendChild(this.select);\n return super.mount();\n }\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemStyle, FaustUIItemProps } from \"./types\";\nimport \"./Nentry.scss\";\n\nexport interface FaustUINentryStyle extends FaustUIItemStyle {\n fontname?: string;\n fontsize?: number;\n fontface?: \"regular\" | \"bold\" | \"italic\" | \"bold italic\";\n bgcolor?: string;\n bordercolor?: string;\n labelcolor?: string;\n textcolor?: string;\n}\nexport default class Nentry extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(255, 255, 255, 0.25)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\"\n }\n };\n }\n className = \"nentry\";\n\n input: HTMLInputElement;\n componentWillMount() {\n super.componentWillMount();\n this.input = document.createElement(\"input\");\n this.input.type = \"number\";\n this.input.value = (+this.state.value.toFixed(3)).toString();\n this.input.max = this.state.max.toString();\n this.input.min = this.state.min.toString();\n this.input.step = this.state.step.toString();\n this.setStyle();\n return this;\n }\n handleChange = (e: Event) => {\n this.setValue(+(e.currentTarget as HTMLInputElement).value);\n };\n setStyle = () => {\n const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n this.input.style.backgroundColor = bgcolor;\n this.input.style.borderColor = bordercolor;\n this.input.style.color = textcolor;\n this.input.style.fontSize = `${fontsize || height * grid / 4}px`;\n };\n componentDidMount() {\n super.componentDidMount();\n this.input.addEventListener(\"change\", this.handleChange);\n this.on(\"style\", () => this.schedule(this.setStyle));\n this.on(\"label\", () => this.schedule(this.paintLabel));\n const valueChange = () => this.input.value = (+this.state.value.toFixed(3)).toString();\n this.on(\"value\", () => this.schedule(valueChange));\n const maxChange = () => this.input.max = this.state.max.toString();\n this.on(\"max\", () => this.schedule(maxChange));\n const minChange = () => this.input.min = this.state.min.toString();\n this.on(\"min\", () => this.schedule(minChange));\n const stepChange = () => this.input.step = this.state.step.toString();\n this.on(\"step\", () => this.schedule(stepChange));\n return this;\n }\n mount() {\n this.container.appendChild(this.label);\n this.container.appendChild(this.input);\n return super.mount();\n }\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemProps } from \"./types\";\nimport type { FaustUINentryStyle } from \"./Nentry\";\nimport \"./Numerical.scss\";\n\nexport default class Numerical extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(255, 255, 255, 0.25)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\"\n }\n };\n }\n className = \"numerical\";\n\n input: HTMLInputElement;\n componentWillMount() {\n super.componentWillMount();\n this.input = document.createElement(\"input\");\n this.input.disabled = true;\n this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || \"\");\n this.setStyle();\n return this;\n }\n setStyle = () => {\n const { height, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n this.input.style.backgroundColor = bgcolor;\n this.input.style.borderColor = bordercolor;\n this.input.style.color = textcolor;\n this.input.style.fontSize = `${fontsize || height * grid / 4}px`;\n };\n componentDidMount() {\n super.componentDidMount();\n this.on(\"style\", () => this.schedule(this.setStyle));\n this.on(\"label\", () => this.schedule(this.paintLabel));\n const valueChange = () => this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || \"\");\n this.on(\"value\", () => this.schedule(valueChange));\n return this;\n }\n mount() {\n this.container.appendChild(this.label);\n this.container.appendChild(this.input);\n return super.mount();\n }\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemStyle, FaustUIItemProps } from \"./types\";\nimport \"./Radio.scss\";\n\nexport interface FaustUIRadioStyle extends FaustUIItemStyle {\n fontname?: string;\n fontsize?: number;\n fontface?: \"regular\" | \"bold\" | \"italic\" | \"bold italic\";\n bgcolor?: string;\n bordercolor?: string;\n labelcolor?: string;\n textcolor?: string;\n}\nexport default class Radio extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(255, 255, 255, 0.25)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\"\n }\n };\n }\n className = \"radio\";\n\n group: HTMLDivElement;\n componentWillMount() {\n super.componentWillMount();\n this.group = document.createElement(\"div\");\n this.group.className = \"faust-ui-component-radio-group\";\n this.getOptions();\n this.setStyle();\n return this;\n }\n getOptions = () => {\n const { enums, address } = this.state;\n this.group.innerHTML = \"\";\n if (enums) {\n let i = 0;\n for (const key in enums) {\n const input = document.createElement(\"input\");\n const div = document.createElement(\"div\");\n input.value = enums[key].toString();\n input.name = address;\n input.type = \"radio\";\n if (i === 0) input.checked = true;\n input.addEventListener(\"change\", () => {\n if (input.checked) this.setValue(enums[key]);\n });\n div.appendChild(input);\n div.append(key);\n this.group.appendChild(div);\n i++;\n }\n }\n };\n setStyle = () => {\n const { height, width, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n const fontSize = Math.min(height * grid * 0.1, width * grid * 0.1);\n this.group.style.backgroundColor = bgcolor;\n this.group.style.borderColor = bordercolor;\n this.group.style.color = textcolor;\n this.group.style.fontSize = `${fontsize || fontSize}px`;\n };\n componentDidMount() {\n super.componentDidMount();\n this.on(\"style\", () => this.schedule(this.setStyle));\n this.on(\"label\", () => this.schedule(this.paintLabel));\n this.on(\"enums\", () => this.schedule(this.getOptions));\n const valueChange = () => {\n for (let i = this.group.children.length - 1; i >= 0; i--) {\n const input = this.group.children[i].querySelector(\"input\");\n if (+input.value === this.state.value) input.checked = true;\n }\n };\n this.on(\"value\", () => this.schedule(valueChange));\n valueChange();\n return this;\n }\n mount() {\n this.container.appendChild(this.label);\n this.container.appendChild(this.group);\n return super.mount();\n }\n}\n","import AbstractItem from \"./AbstractItem\";\nimport type { FaustUIItemProps } from \"./types\";\nimport type { FaustUINentryStyle } from \"./Nentry\";\nimport \"./VBargraph.scss\";\n\ninterface FaustUIBargraphStyle extends FaustUINentryStyle {\n barwidth?: number;\n barbgcolor?: string;\n coldcolor?: string;\n warmcolor?: string;\n hotcolor?: string;\n overloadcolor?: string;\n}\nexport default class VBargraph extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(18, 18, 18, 0)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\",\n barwidth: undefined,\n barbgcolor: \"rgba(18, 18, 18, 1)\",\n coldcolor: \"rgba(12, 248, 100, 1)\",\n warmcolor: \"rgba(195, 248, 100, 1)\",\n hotcolor: \"rgba(255, 193, 10, 1)\",\n overloadcolor: \"rgba(255, 10, 10, 1)\"\n }\n };\n }\n className = \"vbargraph\";\n\n canvas: HTMLCanvasElement;\n input: HTMLInputElement;\n flexDiv: HTMLDivElement;\n canvasDiv: HTMLDivElement;\n ctx: CanvasRenderingContext2D;\n componentWillMount() {\n super.componentWillMount();\n this.flexDiv = document.createElement(\"div\");\n this.flexDiv.className = `faust-ui-component-${this.className}-flexdiv`;\n this.canvasDiv = document.createElement(\"div\");\n this.canvasDiv.className = `faust-ui-component-${this.className}-canvasdiv`;\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = 10;\n this.canvas.height = 10;\n this.ctx = this.canvas.getContext(\"2d\");\n this.input = document.createElement(\"input\");\n this.input.disabled = true;\n this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || \"\");\n this.setStyle();\n return this;\n }\n setStyle = () => {\n const { height, width, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n const fontSize = Math.min(height * grid * 0.05, width * grid * 0.2);\n this.input.style.fontSize = `${fontsize || fontSize}px`;\n this.input.style.color = textcolor;\n this.container.style.backgroundColor = bgcolor;\n this.container.style.borderColor = bordercolor;\n };\n componentDidMount() {\n super.componentDidMount();\n this.canvas.addEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.addEventListener(\"touchstart\", this.handleTouchStart, { passive: false });\n this.on(\"style\", () => {\n this.schedule(this.setStyle);\n this.schedule(this.paint);\n });\n this.on(\"label\", () => this.schedule(this.paintLabel));\n const valueChange = () => this.input.value = (+this.state.value.toFixed(3)).toString() + (this.state.unit || \"\");\n this.on(\"value\", () => {\n this.schedule(valueChange);\n this.schedule(this.paint);\n });\n this.on(\"max\", () => this.schedule(this.paint));\n this.on(\"min\", () => this.schedule(this.paint));\n this.on(\"step\", () => this.schedule(this.paint));\n this.schedule(this.paint);\n return this;\n }\n mount() {\n this.canvasDiv.appendChild(this.canvas);\n this.flexDiv.appendChild(this.canvasDiv);\n this.flexDiv.appendChild(this.input);\n this.container.appendChild(this.label);\n this.container.appendChild(this.flexDiv);\n return super.mount();\n }\n paintValue = 0;\n maxValue = -Infinity;\n maxTimer: number;\n paint = () => {\n const { barwidth, barbgcolor, coldcolor, warmcolor, hotcolor, overloadcolor } = this.state.style;\n const { type, max, min, enums, scale, value } = this.state;\n const ctx = this.ctx;\n const canvas = this.canvas;\n let { width, height } = this.canvasDiv.getBoundingClientRect();\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.width = width;\n canvas.height = height;\n\n const drawHeight = height * 0.9;\n const drawWidth = barwidth || Math.min(width / 3, drawHeight * 0.05);\n const left = (width - drawWidth) * 0.5;\n const top = height * 0.05;\n this.paintValue = value;\n const paintValue = this.paintValue;\n if (paintValue > this.maxValue) {\n this.maxValue = paintValue;\n if (this.maxTimer) window.clearTimeout(this.maxTimer);\n this.maxTimer = window.setTimeout(() => {\n this.maxValue = this.paintValue;\n this.maxTimer = undefined;\n this.schedule(this.paint);\n }, 1000);\n }\n if (paintValue < this.maxValue && typeof this.maxTimer === \"undefined\") {\n this.maxTimer = window.setTimeout(() => {\n this.maxValue = this.paintValue;\n this.maxTimer = undefined;\n this.schedule(this.paint);\n }, 1000);\n }\n const maxValue = this.maxValue;\n const coldStop = (-18 - min) / (max - min);\n const warmStop = (-6 - min) / (max - min);\n const hotStop = (-3 - min) / (max - min);\n const overloadStop = Math.max(0, -min / (max - min));\n const gradient = ctx.createLinearGradient(0, drawHeight, 0, top);\n if (coldStop <= 1 && coldStop >= 0) gradient.addColorStop(coldStop, coldcolor);\n else if (coldStop > 1) gradient.addColorStop(1, coldcolor);\n if (warmStop <= 1 && warmStop >= 0) gradient.addColorStop(warmStop, warmcolor);\n if (hotStop <= 1 && hotStop >= 0) gradient.addColorStop(hotStop, hotcolor);\n if (overloadStop <= 1 && overloadStop >= 0) gradient.addColorStop(overloadStop, overloadcolor);\n else if (overloadStop < 0) gradient.addColorStop(0, coldcolor);\n\n ctx.fillStyle = barbgcolor;\n if (paintValue < 0) ctx.fillRect(left, top + (1 - overloadStop) * drawHeight, drawWidth, drawHeight * overloadStop);\n if (paintValue < max) ctx.fillRect(left, top, drawWidth, (1 - overloadStop) * drawHeight - 1);\n ctx.fillStyle = gradient;\n if (paintValue > min) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(0, paintValue) }));\n ctx.fillRect(left, top + (1 - distance) * drawHeight, drawWidth, drawHeight * distance);\n }\n if (paintValue > 0) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(max, paintValue) }) - overloadStop);\n ctx.fillRect(left, top + (1 - overloadStop - distance) * drawHeight, drawWidth, drawHeight * distance - 1);\n }\n if (maxValue > paintValue) {\n if (maxValue <= 0) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(0, maxValue) }));\n ctx.fillRect(left, top + (1 - distance) * drawHeight, drawWidth, 1);\n }\n if (maxValue > 0) {\n const distance = Math.max(0, AbstractItem.getDistance({ type, max, min, enums, scale, value: Math.min(max, maxValue) }) - overloadStop);\n ctx.fillRect(left, Math.max(top, top + (1 - overloadStop - distance) * drawHeight - 1), drawWidth, 1);\n }\n }\n };\n}\n","import AbstractItem from \"./AbstractItem\";\nimport { fillRoundedRect, normLog, normExp, denormalize, normalize } from \"./utils\";\nimport type { FaustUIItemProps, PointerDownEvent, PointerDragEvent } from \"./types\";\nimport type { FaustUINentryStyle } from \"./Nentry\";\nimport \"./VSlider.scss\";\n\ninterface FaustUISliderStyle extends FaustUINentryStyle {\n sliderwidth?: number;\n sliderbgcolor?: string;\n sliderbgoncolor?: string;\n slidercolor?: string;\n}\nexport default class VSlider extends AbstractItem {\n static get defaultProps(): FaustUIItemProps {\n const inherited = super.defaultProps;\n return {\n ...inherited,\n style: {\n ...inherited.style,\n fontname: \"Arial\",\n fontsize: undefined,\n fontface: \"regular\",\n bgcolor: \"rgba(18, 18, 18, 0)\",\n bordercolor: \"rgba(80, 80, 80, 0)\",\n labelcolor: \"rgba(226, 222, 255, 0.5)\",\n textcolor: \"rgba(18, 18, 18, 1)\",\n sliderwidth: undefined,\n sliderbgcolor: \"rgba(18, 18, 18, 1)\",\n sliderbgoncolor: \"rgba(255, 165, 0, 1)\",\n slidercolor: \"rgba(200, 200, 200, 0.75)\"\n }\n };\n }\n className = \"vslider\";\n\n canvas: HTMLCanvasElement;\n inputNumber: HTMLInputElement;\n input: HTMLInputElement;\n flexDiv: HTMLDivElement;\n canvasDiv: HTMLDivElement;\n ctx: CanvasRenderingContext2D;\n interactionRect: number[] = [0, 0, 0, 0];\n componentWillMount() {\n super.componentWillMount();\n this.flexDiv = document.createElement(\"div\");\n this.flexDiv.className = `faust-ui-component-${this.className}-flexdiv`;\n this.canvasDiv = document.createElement(\"div\");\n this.canvasDiv.className = `faust-ui-component-${this.className}-canvasdiv`;\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = 10;\n this.canvas.height = 10;\n this.ctx = this.canvas.getContext(\"2d\");\n this.inputNumber = document.createElement(\"input\");\n this.inputNumber.type = \"number\";\n this.inputNumber.value = (+this.state.value.toFixed(3)).toString();\n this.inputNumber.max = this.state.max.toString();\n this.inputNumber.min = this.state.min.toString();\n this.inputNumber.step = this.state.step.toString();\n this.input = document.createElement(\"input\");\n this.input.value = this.inputNumber.value + (this.state.unit || \"\");\n this.input.spellcheck = false;\n this.setStyle();\n return this;\n }\n handleChange = (e: Event) => {\n const value = parseFloat((e.currentTarget as HTMLInputElement).value);\n if (isFinite(value)) {\n const changed = this.setValue(+value);\n if (changed) return;\n }\n this.input.value = this.inputNumber.value + (this.state.unit || \"\");\n };\n setStyle = () => {\n const { height, width, grid, fontsize, textcolor, bgcolor, bordercolor } = this.state.style;\n const fontSize = Math.min(height * grid * 0.05, width * grid * 0.2);\n this.input.style.fontSize = `${fontsize || fontSize}px`;\n this.input.style.color = textcolor;\n this.container.style.backgroundColor = bgcolor;\n this.container.style.borderColor = bordercolor;\n };\n componentDidMount() {\n super.componentDidMount();\n this.input.addEventListener(\"change\", this.handleChange);\n this.canvas.addEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.addEventListener(\"touchstart\", this.handleTouchStart, { passive: false });\n this.on(\"style\", () => {\n this.schedule(this.setStyle);\n this.schedule(this.paint);\n });\n this.on(\"label\", () => this.schedule(this.paintLabel));\n const valueChange = () => {\n this.inputNumber.value = (+this.state.value.toFixed(3)).toString();\n this.input.value = this.inputNumber.value + (this.state.unit || \"\");\n };\n this.on(\"value\", () => {\n this.schedule(valueChange);\n this.schedule(this.paint);\n });\n const maxChange = () => this.inputNumber.max = this.state.max.toString();\n this.on(\"max\", () => {\n this.schedule(maxChange);\n this.schedule(this.paint);\n });\n const minChange = () => this.inputNumber.min = this.state.min.toString();\n this.on(\"min\", () => {\n this.schedule(minChange);\n this.schedule(this.paint);\n });\n const stepChange = () => this.inputNumber.step = this.state.step.toString();\n this.on(\"step\", () => {\n this.schedule(stepChange);\n this.schedule(this.paint);\n });\n this.schedule(this.paint);\n return this;\n }\n mount() {\n this.canvasDiv.appendChild(this.canvas);\n this.flexDiv.appendChild(this.canvasDiv);\n this.flexDiv.appendChild(this.input);\n this.container.appendChild(this.label);\n this.container.appendChild(this.flexDiv);\n return super.mount();\n }\n paint = () => {\n const { sliderwidth, sliderbgcolor, sliderbgoncolor, slidercolor } = this.state.style;\n const ctx = this.ctx;\n const canvas = this.canvas;\n const distance = this.distance;\n let { width, height } = this.canvasDiv.getBoundingClientRect();\n width = Math.floor(width);\n height = Math.floor(height);\n canvas.width = width;\n canvas.height = height;\n\n const drawHeight = height * 0.9;\n const drawWidth = sliderwidth || Math.min(width / 3, drawHeight * 0.05);\n const left = (width - drawWidth) * 0.5;\n const top = height * 0.05;\n const borderRadius = drawWidth * 0.25;\n this.interactionRect = [0, top, width, drawHeight];\n const grd = ctx.createLinearGradient(0, top, 0, top + drawHeight);\n grd.addColorStop(Math.max(0, Math.min(1, 1 - distance)), sliderbgcolor);\n grd.addColorStop(Math.max(0, Math.min(1, 1 - distance)), sliderbgoncolor);\n ctx.fillStyle = grd;\n fillRoundedRect(ctx, left, top, drawWidth, drawHeight, borderRadius);\n // draw slider\n ctx.fillStyle = slidercolor;\n fillRoundedRect(ctx, left - drawWidth, top + drawHeight * (1 - distance) - drawWidth, drawWidth * 3, drawWidth * 2, borderRadius);\n };\n get stepsCount() {\n const { type, max, min, step, enums } = this.state;\n const maxSteps = type === \"enum\" ? enums.length : type === \"int\" ? max - min : (max - min) / step;\n if (step) {\n if (type === \"enum\") return enums.length;\n if (type === \"int\") return Math.min(Math.floor((max - min) / (Math.round(step) || 0)), maxSteps);\n return Math.floor((max - min) / step);\n }\n return maxSteps;\n }\n get stepRange() {\n const full = this.interactionRect[this.className === \"vslider\" ? 3 : 2];\n const stepsCount = this.stepsCount;\n return full / stepsCount;\n }\n getValueFromPos(e: { x: number; y: number }) {\n const { type, min, max, scale } = this.state;\n const step = type === \"enum\" ? 1 : (this.state.step || 1);\n const stepRange = this.stepRange;\n const stepsCount = this.stepsCount;\n const distance = (this.className === \"vslider\" ? this.interactionRect[3] - (e.y - this.interactionRect[1]) : e.x - this.interactionRect[0]);\n const range = this.className === \"vslider\" ? this.interactionRect[3] : this.interactionRect[2];\n const denormalized = denormalize(distance / range, min, max);\n const v = scale === \"exp\" ? normExp(denormalized, min, max) : scale === \"log\" ? normLog(denormalized, min, max) : denormalized;\n let steps = Math.round(normalize(v, min, max) * range / stepRange);\n steps = Math.min(stepsCount, Math.max(0, steps));\n if (type === \"enum\") return steps;\n if (type === \"int\") return Math.round(steps * step + min);\n return steps * step + min;\n }\n handlePointerDown = (e: PointerDownEvent) => {\n const { value } = this.state;\n if (\n e.x < this.interactionRect[0]\n || e.x > this.interactionRect[0] + this.interactionRect[2]\n || e.y < this.interactionRect[1]\n || e.y > this.interactionRect[1] + this.interactionRect[3]\n ) return;\n const newValue = this.getValueFromPos(e);\n if (newValue !== value) this.setValue(this.getValueFromPos(e));\n };\n handlePointerDrag = (e: PointerDragEvent) => {\n const newValue = this.getValueFromPos(e);\n if (newValue !== this.state.value) this.setValue(newValue);\n };\n}\n","export const toMIDI = (f: number) => [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"][(f % 12 + 12) % 12] + Math.round(f / 12 - 2);\nexport const toRad = (degrees: number) => degrees * Math.PI / 180;\nexport const atodb = (a: number) => 20 * Math.log10(a);\nexport const dbtoa = (db: number) => 10 ** (db / 20);\nexport const denormalize = (x: number, min: number, max: number) => min + (max - min) * x;\nexport const normalize = (x: number, min: number, max: number) => (x - min) / (max - min) || 0;\nexport const normLog = (x: number, min: number, max: number) => {\n const normalized = normalize(x, min, max);\n const logMin = Math.log(Math.max(Number.EPSILON, min));\n const logMax = Math.log(Math.max(Number.EPSILON, max));\n const vLog = denormalize(normalized, logMin, logMax);\n const v = Math.exp(vLog);\n return Math.max(min, Math.min(max, v));\n};\nexport const iNormLog = (vIn: number, min: number, max: number) => {\n const v = Math.max(min, Math.min(max, vIn));\n const vLog = Math.log(Math.max(Number.EPSILON, v));\n const logMin = Math.log(Math.max(Number.EPSILON, min));\n const logMax = Math.log(Math.max(Number.EPSILON, max));\n const normalized = normalize(vLog, logMin, logMax);\n return denormalize(normalized, min, max);\n};\nexport const normExp = iNormLog;\nexport const iNormExp = normLog;\nexport const roundedRect = (ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number | number[]) => {\n const radii = [0, 0, 0, 0];\n if (typeof radius === \"number\") radii.fill(radius);\n else radius.forEach((v, i) => radii[i] = v);\n ctx.beginPath();\n ctx.moveTo(x + radii[0], y);\n ctx.lineTo(x + width - radii[1], y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radii[1]);\n ctx.lineTo(x + width, y + height - radii[2]);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radii[2], y + height);\n ctx.lineTo(x + radii[3], y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radii[3]);\n ctx.lineTo(x, y + radii[0]);\n ctx.quadraticCurveTo(x, y, x + radii[0], y);\n ctx.closePath();\n ctx.stroke();\n};\nexport const fillRoundedRect = (ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number | number[]) => {\n const radii = [0, 0, 0, 0];\n if (typeof radius === \"number\") radii.fill(radius);\n else radius.forEach((v, i) => radii[i] = v);\n ctx.beginPath();\n ctx.moveTo(x + radii[0], y);\n ctx.lineTo(x + width - radii[1], y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radii[1]);\n ctx.lineTo(x + width, y + height - radii[2]);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radii[2], y + height);\n ctx.lineTo(x + radii[3], y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radii[3]);\n ctx.lineTo(x, y + radii[0]);\n ctx.quadraticCurveTo(x, y, x + radii[0], y);\n ctx.closePath();\n ctx.fill();\n};\n","import FaustUI from \"./FaustUI\";\n\nconst instantiate = () => {\n const faustUI = new FaustUI({\n root: document.getElementById(\"root\") as HTMLDivElement,\n listenWindowResize: true,\n listenWindowMessage: true\n });\n let host: Window;\n window.addEventListener(\"message\", (e) => {\n const { source } = e;\n host = source as Window;\n });\n\n window.addEventListener(\"keydown\", (e) => {\n if (host) host.postMessage({ type: \"keydown\", key: e.key }, \"*\");\n });\n window.addEventListener(\"keyup\", (e) => {\n if (host) host.postMessage({ type: \"keyup\", key: e.key }, \"*\");\n });\n (window as any).faustUI = faustUI;\n};\n\nexport default instantiate;\n","import type { FaustUIGroupType } from \"@grame/faustwasm\";\nimport IItem from \"./IItem\";\nimport AbstractItem from \"./AbstractItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default abstract class AbstractGroup implements IItem {\n static padding = 0.2;\n static labelHeight = 0.25;\n static spaceBetween = 0.1;\n isRoot: boolean;\n type: FaustUIGroupType;\n label: string;\n items: (AbstractGroup | AbstractItem)[];\n layout: LayoutProps;\n\n constructor(group: { type: FaustUIGroupType; label: string; items: (AbstractGroup | AbstractItem)[] }, isRoot?: boolean) {\n this.isRoot = !!isRoot;\n Object.assign(this, group);\n const { hasHSizingDesc, hasVSizingDesc } = this;\n const sizing = hasHSizingDesc && hasVSizingDesc ? \"both\" : hasHSizingDesc ? \"horizontal\" : hasVSizingDesc ? \"vertical\" : \"none\";\n this.layout = {\n type: group.type,\n width: AbstractGroup.padding * 2,\n height: AbstractGroup.padding * 2 + AbstractGroup.labelHeight,\n sizing\n };\n }\n\n /**\n * find recursively if the group has horizontal-sizable item\n */\n get hasHSizingDesc(): boolean {\n return !!this.items.find((item) => {\n if (item instanceof AbstractGroup) return item.hasHSizingDesc;\n return item.layout.sizing === \"horizontal\" || item.layout.sizing === \"both\";\n });\n }\n /**\n * find recursively if the group has vertical-sizable item\n */\n get hasVSizingDesc(): boolean {\n return !!this.items.find((item) => {\n if (item instanceof AbstractGroup) return item.hasVSizingDesc;\n return item.layout.sizing === \"vertical\" || item.layout.sizing === \"both\";\n });\n }\n adjust() {\n return this;\n }\n expand(dX: number, dY: number) {\n return this;\n }\n offset() {\n return this;\n }\n}\n","import type { FaustUIInputItem } from \"@grame/faustwasm\";\nimport AbstractItem from \"./AbstractItem\";\n\nexport default abstract class AbstractInputItem extends AbstractItem {\n init: number;\n step: number;\n constructor(item: FaustUIInputItem) {\n super(item);\n this.init = +item.init || 0;\n this.step = +item.step || 1;\n }\n}\n","import type { FaustUIInputType, FaustUIItem, FaustUIMeta, FaustUIOutputType } from \"@grame/faustwasm\";\nimport type { LayoutProps } from \"../types\";\nimport type IItem from \"./IItem\";\n\nexport default abstract class AbstractItem implements IItem {\n type: FaustUIInputType | FaustUIOutputType;\n label: string;\n address: string;\n index: number;\n init: number;\n min: number;\n max: number;\n meta?: FaustUIMeta[];\n layout: LayoutProps;\n constructor(item: FaustUIItem) {\n Object.assign(this, item);\n this.min = isFinite(+this.min) ? +this.min : 0;\n this.max = isFinite(+this.max) ? +this.max : 1;\n }\n\n adjust(): this {\n return this;\n }\n expand(dX: number, dY: number): this {\n return this;\n }\n offset(): this {\n return this;\n }\n}\n","import AbstractItem from \"./AbstractItem\";\n\nexport default abstract class AbstractOutputItem extends AbstractItem {\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport { LayoutProps } from \"../types\";\n\nexport default class Button extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"button\",\n width: 2,\n height: 1,\n sizing: \"horizontal\"\n };\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport { LayoutProps } from \"../types\";\n\nexport default class Checkbox extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"checkbox\",\n width: 2,\n height: 1,\n sizing: \"horizontal\"\n };\n}\n","import AbstractOutputItem from \"./AbstractOutputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class HBargraph extends AbstractOutputItem {\n layout: LayoutProps = {\n type: \"hbargraph\",\n width: 5,\n height: 1,\n sizing: \"horizontal\"\n };\n}\n","import AbstractGroup from \"./AbstractGroup\";\n\nexport default class HGroup extends AbstractGroup {\n adjust() {\n this.items.forEach((item) => {\n item.adjust();\n this.layout.width += item.layout.width;\n this.layout.height = Math.max(this.layout.height, item.layout.height + 2 * AbstractGroup.padding + AbstractGroup.labelHeight);\n });\n this.layout.width += AbstractGroup.spaceBetween * (this.items.length - 1);\n if (this.layout.width < 1) this.layout.width += 1;\n return this;\n }\n expand(dX: number) {\n let hExpandItems = 0;\n this.items.forEach((item) => { // Count items that need to expand horizontally\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"horizontal\") hExpandItems++;\n });\n this.items.forEach((item) => {\n let dX$ = 0;\n let dY$ = 0; // Space available to expand for current item\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"horizontal\") {\n dX$ = hExpandItems ? dX / hExpandItems : 0;\n item.layout.width += dX$;\n }\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"vertical\") {\n dY$ = this.layout.height - 2 * AbstractGroup.padding - AbstractGroup.labelHeight - item.layout.height;\n item.layout.height += dY$;\n }\n item.expand(dX$, dY$);\n });\n // this.layout.width += dX;\n return this;\n }\n offset() {\n const { labelHeight, padding, spaceBetween } = AbstractGroup;\n let $left = padding;\n const $top = padding + labelHeight;\n const { height } = this.layout;\n this.items.forEach((item) => {\n item.layout.offsetLeft = $left;\n item.layout.offsetTop = $top;\n // center the item\n item.layout.offsetTop += (height - labelHeight - item.layout.height) / 2 - padding;\n item.layout.left = (this.layout.left || 0) + item.layout.offsetLeft;\n item.layout.top = (this.layout.top || 0) + item.layout.offsetTop;\n item.offset();\n $left += item.layout.width + spaceBetween;\n });\n return this;\n }\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class HSlider extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"hslider\",\n width: 5,\n height: 1,\n sizing: \"horizontal\"\n };\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class Knob extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"knob\",\n width: 1,\n height: 1.75,\n sizing: \"none\"\n };\n}\n","import type { FaustUIItem } from \"@grame/faustwasm\";\nimport HSlider from \"./HSlider\";\nimport VSlider from \"./VSlider\";\nimport Nentry from \"./Nentry\";\nimport Button from \"./Button\";\nimport Checkbox from \"./Checkbox\";\nimport Knob from \"./Knob\";\nimport Menu from \"./Menu\";\nimport Radio from \"./Radio\";\nimport Led from \"./Led\";\nimport Numerical from \"./Numerical\";\nimport HBargraph from \"./HBargraph\";\nimport VBargraph from \"./VBargraph\";\nimport HGroup from \"./HGroup\";\nimport VGroup from \"./VGroup\";\nimport TGroup from \"./TGroup\";\nimport type AbstractItem from \"./AbstractItem\";\nimport type AbstractGroup from \"./AbstractGroup\";\nimport type { TLayoutType } from \"../types\";\n\nexport default class Layout {\n /**\n * Get the rendering type of an item by parsing its metadata\n */\n static predictType(item: FaustUIItem): TLayoutType {\n if (item.type === \"vgroup\"\n || item.type === \"hgroup\"\n || item.type === \"tgroup\"\n || item.type === \"button\"\n || item.type === \"checkbox\"\n ) return item.type;\n if (item.type === \"hbargraph\" || item.type === \"vbargraph\") {\n if (item.meta && item.meta.find(meta => meta.style && meta.style.startsWith(\"led\"))) return \"led\";\n if (item.meta && item.meta.find(meta => meta.style && meta.style.startsWith(\"numerical\"))) return \"numerical\";\n return item.type;\n }\n if (item.type === \"hslider\" || item.type === \"nentry\" || item.type === \"vslider\") {\n if (item.meta && item.meta.find(meta => meta.style && meta.style.startsWith(\"knob\"))) return \"knob\";\n if (item.meta && item.meta.find(meta => meta.style && meta.style.startsWith(\"menu\"))) return \"menu\";\n if (item.meta && item.meta.find(meta => meta.style && meta.style.startsWith(\"radio\"))) return \"radio\";\n }\n return item.type;\n }\n /**\n * Get the Layout class constructor of an item\n */\n static getItem(item: FaustUIItem): AbstractItem | AbstractGroup {\n const Ctor = {\n hslider: HSlider,\n vslider: VSlider,\n nentry: Nentry,\n button: Button,\n checkbox: Checkbox,\n knob: Knob,\n menu: Menu,\n radio: Radio,\n led: Led,\n numerical: Numerical,\n hbargraph: HBargraph,\n vbargraph: VBargraph,\n hgroup: HGroup,\n vgroup: VGroup,\n tgroup: TGroup\n };\n const layoutType = this.predictType(item);\n return new Ctor[layoutType](item as any);\n }\n static getItems(items: FaustUIItem[]) {\n return items.map((item) => {\n if (\"items\" in item) item.items = this.getItems(item.items);\n return this.getItem(item);\n });\n }\n static calc(ui: FaustUIItem[]) {\n const rootGroup = new VGroup({ items: this.getItems(ui), type: \"vgroup\", label: \"\" }, true);\n rootGroup.adjust();\n rootGroup.expand(0, 0);\n rootGroup.offset();\n return rootGroup;\n }\n}\n","import AbstractOutputItem from \"./AbstractOutputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class Led extends AbstractOutputItem {\n layout: LayoutProps = {\n type: \"led\",\n width: 1,\n height: 1,\n sizing: \"none\"\n };\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class Menu extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"menu\",\n width: 2,\n height: 1,\n sizing: \"horizontal\"\n };\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class Nentry extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"nentry\",\n width: 1,\n height: 1,\n sizing: \"none\"\n };\n}\n","import AbstractOutputItem from \"./AbstractOutputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class Numerical extends AbstractOutputItem {\n layout: LayoutProps = {\n type: \"numerical\",\n width: 1,\n height: 1,\n sizing: \"none\"\n };\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class Radio extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"radio\",\n width: 2,\n height: 2, // TODO: vradio and hradio\n sizing: \"both\"\n };\n}\n","import AbstractGroup from \"./AbstractGroup\";\n\nexport default class TGroup extends AbstractGroup {\n static tabLayout = {\n width: 2,\n height: 1\n };\n adjust() {\n this.items.forEach((item) => {\n item.adjust();\n this.layout.width = Math.max(this.layout.width, item.layout.width + 2 * AbstractGroup.padding);\n this.layout.height = Math.max(this.layout.height, item.layout.height + 2 * AbstractGroup.padding + TGroup.labelHeight);\n });\n const tabsCount = this.items.length;\n this.layout.width = Math.max(this.layout.width, tabsCount * TGroup.tabLayout.width);\n this.layout.height += TGroup.tabLayout.height;\n if (this.layout.width < 1) this.layout.width += 1;\n return this;\n }\n expand() {\n const tabsCount = this.items.length;\n this.items.forEach((item) => {\n let dY$ = 0; // Space available to expand for current item\n let dX$ = 0;\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"horizontal\") dX$ = this.layout.width - 2 * AbstractGroup.padding - item.layout.width;\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"vertical\") dY$ = this.layout.height - 2 * AbstractGroup.padding - AbstractGroup.labelHeight - (tabsCount ? TGroup.tabLayout.height : 0) - item.layout.height;\n item.expand(dX$, dY$);\n });\n return this;\n }\n offset() {\n const { labelHeight, padding } = AbstractGroup;\n const $left = padding;\n const $top = padding + labelHeight + TGroup.tabLayout.height;\n this.items.forEach((item) => {\n item.layout.offsetLeft = $left;\n item.layout.offsetTop = $top;\n item.layout.left = (this.layout.left || 0) + item.layout.offsetLeft;\n item.layout.top = (this.layout.top || 0) + item.layout.offsetTop;\n item.offset();\n });\n return this;\n }\n}\n","import AbstractOutputItem from \"./AbstractOutputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class VBargraph extends AbstractOutputItem {\n layout: LayoutProps = {\n type: \"vbargraph\",\n width: 1,\n height: 5,\n sizing: \"vertical\"\n };\n}\n","import AbstractGroup from \"./AbstractGroup\";\n\nexport default class VGroup extends AbstractGroup {\n adjust() {\n this.items.forEach((item) => {\n item.adjust();\n this.layout.width = Math.max(this.layout.width, item.layout.width + 2 * AbstractGroup.padding);\n this.layout.height += item.layout.height;\n });\n this.layout.height += AbstractGroup.spaceBetween * (this.items.length - 1);\n if (this.layout.width < 1) this.layout.width += 1;\n return this;\n }\n expand(dX: number, dY: number) {\n let vExpandItems = 0;\n this.items.forEach((item) => {\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"vertical\") vExpandItems++;\n });\n this.items.forEach((item) => {\n let dX$ = 0;\n let dY$ = 0; // Space available to expand for current item\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"horizontal\") {\n dX$ = this.layout.width - 2 * AbstractGroup.padding - item.layout.width;\n item.layout.width += dX$;\n }\n if (item.layout.sizing === \"both\" || item.layout.sizing === \"vertical\") {\n dY$ = vExpandItems ? dY / vExpandItems : 0;\n item.layout.height += dY$;\n }\n item.expand(dX$, dY$);\n });\n // this.layout.height += dY;\n return this;\n }\n offset() {\n const { labelHeight, padding, spaceBetween } = AbstractGroup;\n const $left = padding;\n let $top = padding + labelHeight;\n const { width } = this.layout;\n this.items.forEach((item) => {\n item.layout.offsetLeft = $left;\n item.layout.offsetTop = $top;\n // center the item\n item.layout.offsetLeft += (width - item.layout.width) / 2 - padding;\n item.layout.left = (this.layout.left || 0) + item.layout.offsetLeft;\n item.layout.top = (this.layout.top || 0) + item.layout.offsetTop;\n item.offset();\n $top += item.layout.height + spaceBetween;\n });\n return this;\n }\n}\n","import AbstractInputItem from \"./AbstractInputItem\";\nimport type { LayoutProps } from \"../types\";\n\nexport default class VSlider extends AbstractInputItem {\n layout: LayoutProps = {\n type: \"vslider\",\n width: 1,\n height: 5,\n sizing: \"vertical\"\n };\n}\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Base.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Base.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Button.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Button.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Checkbox.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Checkbox.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Group.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Group.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./HBargraph.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./HBargraph.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./HSlider.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./HSlider.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Knob.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Knob.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Led.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Led.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Menu.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Menu.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Nentry.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Nentry.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Numerical.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Numerical.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Radio.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./Radio.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./VBargraph.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./VBargraph.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./VSlider.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./VSlider.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./index.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./index.scss\";\n export default content && content.locals ? content.locals : undefined;\n","\"use strict\";\n\nvar stylesInDOM = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n\n return updater;\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n\n stylesInDOM.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n/* istanbul ignore next */\n\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n}\n/* istanbul ignore next */\n\n\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n}\n\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\n\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\n\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n\n var needLayer = typeof obj.layer !== \"undefined\";\n\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n\n css += obj.css;\n\n if (needLayer) {\n css += \"}\";\n }\n\n if (obj.media) {\n css += \"}\";\n }\n\n if (obj.supports) {\n css += \"}\";\n }\n\n var sourceMap = obj.sourceMap;\n\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n options.styleTagTransform(css, styleElement, options.options);\n}\n\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n\n styleElement.parentNode.removeChild(styleElement);\n}\n/* istanbul ignore next */\n\n\nfunction domAPI(options) {\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\n\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n\n styleElement.appendChild(document.createTextNode(css));\n }\n}\n\nmodule.exports = styleTagTransform;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","export { default as FaustUI } from \"./FaustUI\";\nexport { default as instantiate } from \"./instantiate\";\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/faustwasm/libfaust-wasm.d.cts b/dist/faustwasm/libfaust-wasm.d.cts deleted file mode 100644 index 6dcb9603..00000000 --- a/dist/faustwasm/libfaust-wasm.d.cts +++ /dev/null @@ -1,3 +0,0 @@ -import { FaustModuleFactory } from "../src/types"; -declare const faustModuleFactory: FaustModuleFactory; -export default faustModuleFactory; diff --git a/dist/faustwasm/libfaust-wasm.d.ts b/dist/faustwasm/libfaust-wasm.d.ts deleted file mode 100644 index 6dcb9603..00000000 --- a/dist/faustwasm/libfaust-wasm.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { FaustModuleFactory } from "../src/types"; -declare const faustModuleFactory: FaustModuleFactory; -export default faustModuleFactory; diff --git a/dist/faustwasm/libfaust-wasm.data b/dist/faustwasm/libfaust-wasm.data deleted file mode 100644 index ff845a5e..00000000 Binary files a/dist/faustwasm/libfaust-wasm.data and /dev/null differ diff --git a/dist/faustwasm/libfaust-wasm.data.d.ts b/dist/faustwasm/libfaust-wasm.data.d.ts deleted file mode 100644 index 11303181..00000000 --- a/dist/faustwasm/libfaust-wasm.data.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const data: Uint8Array; -export default data; \ No newline at end of file diff --git a/dist/faustwasm/libfaust-wasm.js b/dist/faustwasm/libfaust-wasm.js deleted file mode 100644 index 1e2e69b4..00000000 --- a/dist/faustwasm/libfaust-wasm.js +++ /dev/null @@ -1,20 +0,0 @@ - -var FaustModule = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(FaustModule = {}) { - -var Module=typeof FaustModule!="undefined"?FaustModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});["_main","___getTypeName","__embind_initialize_bindings","_fflush","onRuntimeInitialized"].forEach(prop=>{if(!Object.getOwnPropertyDescriptor(Module["ready"],prop)){Object.defineProperty(Module["ready"],prop,{get:()=>abort("You are getting "+prop+" on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js"),set:()=>abort("You are setting "+prop+" on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")})}});if(!Module.expectedDataFileDownloads){Module.expectedDataFileDownloads=0}Module.expectedDataFileDownloads++;(function(){if(Module["ENVIRONMENT_IS_PTHREAD"])return;var loadPackage=function(metadata){var PACKAGE_PATH="";if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/")}else if(typeof process==="undefined"&&typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/")}var PACKAGE_NAME="libfaust-wasm.data";var REMOTE_PACKAGE_BASE="libfaust-wasm.data";if(typeof Module["locateFilePackage"]==="function"&&!Module["locateFile"]){Module["locateFile"]=Module["locateFilePackage"];err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)")}var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];function fetchRemotePackage(packageName,packageSize,callback,errback){if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){require("fs").readFile(packageName,function(err,contents){if(err){errback(err)}else{callback(contents.buffer)}});return}var xhr=new XMLHttpRequest;xhr.open("GET",packageName,true);xhr.responseType="arraybuffer";xhr.onprogress=function(event){var url=packageName;var size=packageSize;if(event.total)size=event.total;if(event.loaded){if(!xhr.addedTotal){xhr.addedTotal=true;if(!Module.dataFileDownloads)Module.dataFileDownloads={};Module.dataFileDownloads[url]={loaded:event.loaded,total:size}}else{Module.dataFileDownloads[url].loaded=event.loaded}var total=0;var loaded=0;var num=0;for(var download in Module.dataFileDownloads){var data=Module.dataFileDownloads[download];total+=data.total;loaded+=data.loaded;num++}total=Math.ceil(total*Module.expectedDataFileDownloads/num);if(Module["setStatus"])Module["setStatus"]("Downloading data... ("+loaded+"/"+total+")")}else if(!Module.dataFileDownloads){if(Module["setStatus"])Module["setStatus"]("Downloading data...")}};xhr.onerror=function(event){throw new Error("NetworkError for: "+packageName)};xhr.onload=function(event){if(xhr.status==200||xhr.status==304||xhr.status==206||xhr.status==0&&xhr.response){var packageData=xhr.response;callback(packageData)}else{throw new Error(xhr.statusText+" : "+xhr.responseURL)}};xhr.send(null)}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,function(data){if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}},handleError);function runWithFS(){function assert(check,msg){if(!check)throw msg+(new Error).stack}Module["FS_createPath"]("/","usr",true,true);Module["FS_createPath"]("/usr","rsrc",true,true);Module["FS_createPath"]("/usr","share",true,true);Module["FS_createPath"]("/usr/share","faust",true,true);function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"]("fp "+this.name)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"]("fp "+that.name);this.requests[this.name]=null}};var files=metadata["files"];for(var i=0;i{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(Module["ENVIRONMENT"]){throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)")}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;if(e&&typeof e=="object"&&e.stack){toLog=[e,e.stack]}err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){if(typeof process=="undefined"||!process.release||process.release.name!=="node")throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};readAsync=(filename,onload,onerror)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});var nodeMajor=process.version.match(/^v(\d+)\./)[1];if(nodeMajor<15){process["on"]("unhandledRejection",function(reason){throw reason})}quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof process=="object"&&typeof require==="function"||typeof window=="object"||typeof importScripts=="function")throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){let data;if(typeof readbuffer=="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data=="object");return data};readAsync=function readAsync(f,onload,onerror){setTimeout(()=>onload(readBinary(f)),0)};if(typeof clearTimeout=="undefined"){globalThis.clearTimeout=id=>{}}if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit=="function"){quit_=(status,toThrow)=>{logExceptionOnExit(toThrow);quit(status)}}if(typeof print!="undefined"){if(typeof console=="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!(typeof window=="object"||typeof importScripts=="function"))throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{throw new Error("environment detection error")}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;checkIncomingModuleAPI();if(Module["arguments"])arguments_=Module["arguments"];legacyModuleProp("arguments","arguments_");if(Module["thisProgram"])thisProgram=Module["thisProgram"];legacyModuleProp("thisProgram","thisProgram");if(Module["quit"])quit_=Module["quit"];legacyModuleProp("quit","quit_");assert(typeof Module["memoryInitializerPrefixURL"]=="undefined","Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead");assert(typeof Module["pthreadMainPrefixURL"]=="undefined","Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead");assert(typeof Module["cdInitializerPrefixURL"]=="undefined","Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead");assert(typeof Module["filePackagePrefixURL"]=="undefined","Module.filePackagePrefixURL option was removed, use Module.locateFile instead");assert(typeof Module["read"]=="undefined","Module.read option was removed (modify read_ in JS)");assert(typeof Module["readAsync"]=="undefined","Module.readAsync option was removed (modify readAsync in JS)");assert(typeof Module["readBinary"]=="undefined","Module.readBinary option was removed (modify readBinary in JS)");assert(typeof Module["setWindowTitle"]=="undefined","Module.setWindowTitle option was removed (modify setWindowTitle in JS)");assert(typeof Module["TOTAL_MEMORY"]=="undefined","Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY");legacyModuleProp("read","read_");legacyModuleProp("readAsync","readAsync");legacyModuleProp("readBinary","readBinary");legacyModuleProp("setWindowTitle","setWindowTitle");assert(!ENVIRONMENT_IS_SHELL,"shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable.");var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];legacyModuleProp("wasmBinary","wasmBinary");var noExitRuntime=Module["noExitRuntime"]||true;legacyModuleProp("noExitRuntime","noExitRuntime");if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed"+(text?": "+text:""))}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;if(u>1114111)warnOnce("Invalid Unicode code point "+ptrToString(u)+" encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).");heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){assert(typeof maxBytesToWrite=="number","stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!");return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}assert(!Module["STACK_SIZE"],"STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time");assert(typeof Int32Array!="undefined"&&typeof Float64Array!=="undefined"&&Int32Array.prototype.subarray!=undefined&&Int32Array.prototype.set!=undefined,"JS engine does not provide full typed array support");assert(!Module["wasmMemory"],"Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally");assert(!Module["INITIAL_MEMORY"],"Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically");var wasmTable;function writeStackCookie(){var max=_emscripten_stack_get_end();assert((max&3)==0);if(max==0){max+=4}HEAPU32[max>>2]=34821223;HEAPU32[max+4>>2]=2310721022;HEAPU32[0]=1668509029}function checkStackCookie(){if(ABORT)return;var max=_emscripten_stack_get_end();if(max==0){max+=4}var cookie1=HEAPU32[max>>2];var cookie2=HEAPU32[max+4>>2];if(cookie1!=34821223||cookie2!=2310721022){abort("Stack overflow! Stack cookie has been overwritten at "+ptrToString(max)+", expected hex dwords 0x89BACDFE and 0x2135467, but received "+ptrToString(cookie2)+" "+ptrToString(cookie1))}if(HEAPU32[0]!==1668509029){abort("Runtime error: The application has corrupted its heap memory area (address zero)!")}}(function(){var h16=new Int16Array(1);var h8=new Int8Array(h16.buffer);h16[0]=25459;if(h8[0]!==115||h8[1]!==99)throw"Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)"})();var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){assert(!runtimeInitialized);runtimeInitialized=true;checkStackCookie();if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function postRun(){checkStackCookie();if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}assert(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");assert(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");assert(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");assert(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;var runDependencyTracking={};function getUniqueRunDependency(id){var orig=id;while(1){if(!runDependencyTracking[id])return id;id=orig+Math.random()}}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(id){assert(!runDependencyTracking[id]);runDependencyTracking[id]=1;if(runDependencyWatcher===null&&typeof setInterval!="undefined"){runDependencyWatcher=setInterval(function(){if(ABORT){clearInterval(runDependencyWatcher);runDependencyWatcher=null;return}var shown=false;for(var dep in runDependencyTracking){if(!shown){shown=true;err("still waiting on run dependencies:")}err("dependency: "+dep)}if(shown){err("(end of list)")}},1e4)}}else{err("warning: run dependency added without ID")}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(id){assert(runDependencyTracking[id]);delete runDependencyTracking[id]}else{err("warning: run dependency removed without ID")}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}function createExportWrapper(name,fixedasm){return function(){var displayName=name;var asm=fixedasm;if(!fixedasm){asm=Module["asm"]}assert(runtimeInitialized,"native function `"+displayName+"` called before runtime initialization");if(!asm[name]){assert(asm[name],"exported native function `"+displayName+"` not found")}return asm[name].apply(null,arguments)}}var wasmBinaryFile;wasmBinaryFile="libfaust-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"env":wasmImports,"wasi_snapshot_preview1":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["memory"];assert(wasmMemory,"memory not found in wasm exports");updateMemoryViews();wasmTable=Module["asm"]["__indirect_function_table"];assert(wasmTable,"table not found in wasm exports");addOnInit(Module["asm"]["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");var trueModule=Module;function receiveInstantiationResult(result){assert(Module===trueModule,"the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?");trueModule=null;receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);if(isFileURI(wasmBinaryFile)){err("warning: Loading from a file URI ("+wasmBinaryFile+") is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing")}abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function legacyModuleProp(prop,newName){if(!Object.getOwnPropertyDescriptor(Module,prop)){Object.defineProperty(Module,prop,{configurable:true,get:function(){abort("Module."+prop+" has been replaced with plain "+newName+" (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}})}}function ignoredModuleProp(prop){if(Object.getOwnPropertyDescriptor(Module,prop)){abort("`Module."+prop+"` was supplied but `"+prop+"` not included in INCOMING_MODULE_JS_API")}}function isExportedByForceFilesystem(name){return name==="FS_createPath"||name==="FS_createDataFile"||name==="FS_createPreloadedFile"||name==="FS_unlink"||name==="addRunDependency"||name==="FS_createLazyFile"||name==="FS_createDevice"||name==="removeRunDependency"}function missingGlobal(sym,msg){if(typeof globalThis!=="undefined"){Object.defineProperty(globalThis,sym,{configurable:true,get:function(){warnOnce("`"+sym+"` is not longer defined by emscripten. "+msg);return undefined}})}}missingGlobal("buffer","Please use HEAP8.buffer or wasmMemory.buffer");function missingLibrarySymbol(sym){if(typeof globalThis!=="undefined"&&!Object.getOwnPropertyDescriptor(globalThis,sym)){Object.defineProperty(globalThis,sym,{configurable:true,get:function(){var msg="`"+sym+"` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line";var librarySymbol=sym;if(!librarySymbol.startsWith("_")){librarySymbol="$"+sym}msg+=" (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE="+librarySymbol+")";if(isExportedByForceFilesystem(sym)){msg+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"}warnOnce(msg);return undefined}})}unexportedRuntimeSymbol(sym)}function unexportedRuntimeSymbol(sym){if(!Object.getOwnPropertyDescriptor(Module,sym)){Object.defineProperty(Module,sym,{configurable:true,get:function(){var msg="'"+sym+"' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)";if(isExportedByForceFilesystem(sym)){msg+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"}abort(msg)}})}}var ASM_CONSTS={158104:$0=>{var dsp_code="";try{var xmlhttp=new XMLHttpRequest;xmlhttp.open("GET",Module.UTF8ToString($0),false);xmlhttp.send();if(xmlhttp.status==200){dsp_code=xmlhttp.responseText}}catch(e){console.log(e)}return allocate(intArrayFromString(dsp_code),"i8",ALLOC_STACK)}};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function ptrToString(ptr){assert(typeof ptr==="number");return"0x"+ptr.toString(16).padStart(8,"0")}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;assert(prev>0);return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch."}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort("internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported")}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var ERRNO_MESSAGES={0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"};var ERRNO_CODES={};function demangle(func){warnOnce("warning: build with -sDEMANGLE_SUPPORT to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{assert(typeof parent=="object");var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{if(typeof type=="string"){throw type}var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1);assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}};this.setErrno(errno);this.message=ERRNO_MESSAGES[errno];if(this.stack){Object.defineProperty(this,"stack",{value:(new Error).stack,writable:true});this.stack=demangleAll(this.stack)}};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;_fflush(0);for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload=(()=>{}),onerror=(()=>{}))=>{var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload=(()=>{}),onerror=(()=>{}))=>{var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},absolutePath:()=>{abort("FS.absolutePath has been removed; use PATH_FS.resolve instead")},createFolder:()=>{abort("FS.createFolder has been removed; use FS.mkdir instead")},createLink:()=>{abort("FS.createLink has been removed; use FS.symlink instead")},joinPath:()=>{abort("FS.joinPath has been removed; use PATH.join instead")},mmapAlloc:()=>{abort("FS.mmapAlloc has been replaced by the top level function mmapAlloc")},standardizePath:()=>{abort("FS.standardizePath has been removed; use PATH.normalize instead")}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){assert(SYSCALLS.varargs!=undefined);SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{assert(nfds<=64,"nfds must be less than or equal to 64");assert(!exceptfds,"exceptfds not supported");var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>2]=value;return value}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);assert(sock.stream.fd<64);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var structRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function __embind_finalize_value_object(structType){var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(field=>field.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))},write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":function(ptr){var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":function(destructors,o){for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError('Missing field: "'+fieldName+'"')}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{console.warn(info.leakWarning.stack.replace(/^Error: /,""));releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};var cls=$$.ptrType.registeredClass;info.leakWarning=new Error("Embind found a leaked C++ instance "+cls.name+" <"+ptrToString($$.ptr)+">.\n"+"We'll free it automatically in this case, but this functionality is not reliable across various environments.\n"+"Make sure to invoke .delete() manually once you're done with the instance instead.\n"+"Originally allocated");if("captureStackTrace"in Error){Error.captureStackTrace(info.leakWarning,RegisteredPointer_fromWireType)}finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){assert("dynCall_"+sig in Module,"bad function pointer type - dynCall function not found for sig '"+sig+"'");if(args&&args.length){assert(args.length===sig.substring(1).replace(/j/g,"--").length)}else{assert(sig.length==1)}var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}assert(wasmTable.get(funcPtr)==func,"JavaScript-side Wasm function table mirror is out of date!");return func}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}assert(getWasmTableEntry(ptr),"missing table entry in dynCall: "+ptr);var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn}function getDynCaller(sig,ptr){assert(sig.includes("j")||sig.includes("p"),"getDynCaller should only be called with i64 sigs");var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":function(destructors,value){return Emval.toHandle(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function embindRepr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!="number"&&typeof value!="boolean"){throw new TypeError('Cannot convert "'+embindRepr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{if(typeof value!="number"&&typeof value!="boolean"){throw new TypeError('Cannot convert "'+embindRepr(value)+'" to '+toTypeName)}if(valuemaxRange){throw new TypeError('Passing a number "'+embindRepr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){assert(outPtr%2==0,"Pointer passed to stringToUTF16 must be aligned to two bytes!");assert(typeof maxBytesToWrite=="number","stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!");if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){assert(ptr%4==0,"Pointer passed to UTF32ToString must be aligned to four bytes!");var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){assert(outPtr%4==0,"Pointer passed to stringToUTF32 must be aligned to four bytes!");assert(typeof maxBytesToWrite=="number","stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!");if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=()=>HEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value=="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_take_value(type,arg){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](arg);return Emval.toHandle(v)}function readI53FromI64(ptr){return HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}var __MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var __MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];function __yday_from_date(date){var isLeapYear=__isLeapYear(date.getFullYear());var monthDaysCumulative=isLeapYear?__MONTH_DAYS_LEAP_CUMULATIVE:__MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday}function __localtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=__yday_from_date(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function __tzset_js(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function _abort(){abort("native code called abort()")}var readEmAsmArgsArray=[];function readEmAsmArgs(sigPtr,buf){assert(Array.isArray(readEmAsmArgsArray));assert(buf%16==0);readEmAsmArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){var chr=String.fromCharCode(ch);var validChars=["d","f","i"];assert(validChars.includes(chr),"Invalid character "+ch+'("'+chr+'") in readEmAsmArgs! Use only ['+validChars+'], and do not specify "v" for void return argument.');buf+=ch!=105&buf;readEmAsmArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readEmAsmArgsArray}function runEmAsmFunction(code,sigPtr,argbuf){var args=readEmAsmArgs(sigPtr,argbuf);if(!ASM_CONSTS.hasOwnProperty(code))abort("No EM_ASM constant found at address "+code);return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_int(code,sigPtr,argbuf){return runEmAsmFunction(code,sigPtr,argbuf)}function _emscripten_date_now(){return Date.now()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){err("emscripten_realloc_buffer: Attempted to grow heap from "+b.byteLength+" bytes to "+size+" bytes, but got error: "+e)}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;assert(requestedSize>oldSize);var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){err("Cannot enlarge memory, asked to go up to "+requestedSize+" bytes, but the limit is "+maxHeapSize+" bytes!");return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}err("Failed to grow the heap from "+oldSize+" bytes to "+newSize+" bytes, not enough memory!");return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){assert(lo==lo>>>0||lo==(lo|0));assert(hi===(hi|0));return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function getHostByName(name){var ret=_malloc(20);var nameBuf=_malloc(name.length+1);stringToUTF8(name,nameBuf,name.length+1);HEAPU32[ret>>2]=nameBuf;var aliasesBuf=_malloc(4);HEAPU32[aliasesBuf>>2]=0;HEAPU32[ret+4>>2]=aliasesBuf;var afinet=2;HEAP32[ret+8>>2]=afinet;HEAP32[ret+12>>2]=4;var addrListBuf=_malloc(12);HEAPU32[addrListBuf>>2]=addrListBuf+8;HEAPU32[addrListBuf+4>>2]=0;HEAP32[addrListBuf+8>>2]=inetPton4(DNS.lookup_name(name));HEAPU32[ret+16>>2]=addrListBuf;return ret}function _gethostbyname(name){return getHostByName(UTF8ToString(name))}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){assert(array.length>=0,"writeArrayToMemory array must have a length (should be an array or typed array)");HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}stackCheckInit();preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();assert(!Module["_main"],'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]');postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}checkStackCookie()}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); - - - return FaustModule.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = FaustModule; -else if (typeof define === 'function' && define['amd']) - define([], function() { return FaustModule; }); -else if (typeof exports === 'object') - exports["FaustModule"] = FaustModule; diff --git a/dist/faustwasm/libfaust-wasm.wasm b/dist/faustwasm/libfaust-wasm.wasm deleted file mode 100644 index 7ad889da..00000000 Binary files a/dist/faustwasm/libfaust-wasm.wasm and /dev/null differ diff --git a/dist/faustwasm/libfaust-wasm.wasm.d.ts b/dist/faustwasm/libfaust-wasm.wasm.d.ts deleted file mode 100644 index 11303181..00000000 --- a/dist/faustwasm/libfaust-wasm.wasm.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const data: Uint8Array; -export default data; \ No newline at end of file diff --git a/dist/favicon.png b/dist/favicon.png deleted file mode 100644 index a83a3597..00000000 Binary files a/dist/favicon.png and /dev/null differ diff --git a/dist/icon/icon_192.png b/dist/icon/icon_192.png deleted file mode 100644 index 70d0d6ce..00000000 Binary files a/dist/icon/icon_192.png and /dev/null differ diff --git a/dist/icon/icon_512.png b/dist/icon/icon_512.png deleted file mode 100644 index 9958dc61..00000000 Binary files a/dist/icon/icon_512.png and /dev/null differ diff --git a/dist/index.html b/dist/index.html deleted file mode 100644 index a140ecc9..00000000 --- a/dist/index.html +++ /dev/null @@ -1,712 +0,0 @@ - - - - - - - - - - - - Faust IDE - - - - - -
-
-
-
- -
-
-
- Poly Voices -
- -
-
-
- Buffer Size -
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- -
-
- Mode -
- -
-
-
- Samples -
- -
-
-
- Sample Rate -
- -
-
-
- FFT Size -
- -
-
-
- FFT Overlap -
- -
-
- - -
- -
-
- -
- - -
-
- - -
-
-
- FFT Size -
- -
-
-
- FFT Overlap -
- -
-
-
- WinFunc -
- -
-
-
-
-
- -
-
-
-
-
-
-
-
- -
-
- -
-
-
- - -
-
- - -
-
-
- -
- -
- -
- -
-
-
- - -
- - - -
- - - \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 974ffd66..00000000 --- a/dist/index.js +++ /dev/null @@ -1,38160 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./src/Analyser.ts": -/*!*************************!*\ - !*** ./src/Analyser.ts ***! - \*************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Analyser: () => (/* binding */ Analyser) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/utils.ts"); - - - -/** - * This class provides a default handler for a buffer given by Faust2WebAudio. - * The handler analyses the buffer with FFT, then saves both time-domain and frequency-domain data. - * After each buffer is analysed, a drawHandler is called to display data. - */ -class Analyser { - /** - * KissFFT FFTR Constructor - */ - - /** - * Time Domain Data - */ - - /** - * Frequency Domain Data, overlap x2 gives same length as t - */ - - /** - * Events stored - */ - - /** - * Buffer count in t & f - */ - - /** - * current buffer index of dsp, used for events - */ - - /** - * current sample as index in t & f to draw - */ - - /** - * In on event mode, buffers count remaining to draw - */ - - /** - * KissFFT instance - */ - - /** - * This function property can be overwritten, will be called after each buffer received. - */ - - constructor(FFTR, buffers, drawMode, drawHandler) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "FFTR", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "t", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "f", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "e", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "buffers", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "$buffer", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "$", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_drawMode", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "capturing", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_fft", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_fftSize", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_fftOverlap", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "drawHandler", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "freqEstimated", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "plotHandler", (t, index, events, drawOffline) => { - if (!t.length) return; - if (this.drawMode === "offline" && !drawOffline) return; - if (drawOffline) { - this.$ = 0; - this.e = []; - } - var channels = t.length; - var bufferSize = t[0].length; - this.initCache(bufferSize, channels); - this.$ = index % this.buffers * bufferSize; - this.$buffer = index; - var $ = this.$, - fftSize = this.fftSize, - fftOverlap = this.fftOverlap, - fftHopSize = this.fftHopSize, - fftBins = this.fftBins, - fft = this.fft; - t.forEach((a, i) => { - this.t[i].set(a, $); - var fData; - for (var $fftEnd = $ + bufferSize - ($ + bufferSize) % fftHopSize; $fftEnd > $; $fftEnd -= fftHopSize) { - var $fft = $fftEnd - fftSize; - var t4fft = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.sliceWrap)(this.t[i], $fft, fftSize); - fData = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFrequencyDomainData)(t4fft, fft); - (0,_utils__WEBPACK_IMPORTED_MODULE_1__.setWrap)(this.f[i], fData, $fftEnd * fftOverlap / 2 - fftBins); - } - if (fData) this.freqEstimated = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.estimateFreq)(fData, this.sampleRate); - }); - this.e[index] = events || []; - delete this.e[index - this.buffers - 1]; - if (this.drawMode === "onevent") { - if (events && events.length && this.capturing === -1) this.capturing = this.buffers - 1; - if (this.capturing >= 0) this.capturing--; - if (this.capturing !== -1 || events && events.length) this.draw(); - } else if (this.drawMode === "manual") { - if (index === this.buffers - 1) this.draw(); - } else this.draw(); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "getSampleRate", () => 48000); - this.FFTR = FFTR; - this.buffers = buffers || 0; - this.drawMode = drawMode || "manual"; - this.drawHandler = drawHandler; - this._fftOverlap = 2; - this.capturing = -1; - this.fftSize = 256; - } - initCache(bufferSize, channels) { - var buffers = this.drawMode === "offline" ? 1 : this.buffers; - if (this.t && this.t.length === channels && this.t[0].length === bufferSize * buffers) return; - this.t = new Array(channels).fill(null).map(() => new Float32Array(bufferSize * buffers)); - this.f = new Array(channels).fill(null).map(() => new Float32Array(bufferSize * buffers * this.fftOverlap / 2).fill(-Infinity)); - this.$ = 0; - this.e = []; - } - draw() { - var t = this.t, - f = this.f, - e = this.e, - drawHandler = this.drawHandler, - drawMode = this.drawMode, - fftSize = this.fftSize, - fftOverlap = this.fftOverlap, - freqEstimated = this.freqEstimated, - sampleRate = this.sampleRate; - if (!drawHandler) return; - if (!t || !t.length) return; - if (drawMode === "offline") { - drawHandler({ - $: 0, - $buffer: 0, - bufferSize: t[0].length, - drawMode, - fftSize, - fftOverlap, - freqEstimated, - sampleRate, - t, - f, - e - }); - return; - } - var bufferSize = this.t[0].length / this.buffers; - var $ = (this.$ + bufferSize) % this.t[0].length; - var $buffer = this.$buffer + 1 - this.buffers; - if (this.drawMode === "continuous" || this.capturing > 0) this.drawHandler({ - $, - $buffer, - bufferSize, - drawMode, - fftSize, - fftOverlap, - freqEstimated, - sampleRate, - t, - f, - e - });else this.drawHandler({ - $, - $buffer, - bufferSize, - drawMode, - fftSize, - fftOverlap, - freqEstimated, - sampleRate, - t: this.t.map(a => a.slice()), - f: this.f.map(a => a.slice()), - e: this.e.slice() - }); - } - /** - * The function property can be overwritten to get the sampleRate differently. - * - * @memberof Analyser - */ - - get sampleRate() { - return this.getSampleRate(); - } - get drawMode() { - return this._drawMode; - } - set drawMode(modeIn) { - this._drawMode = modeIn; - this.draw(); - } - get fft() { - return this._fft; - } - get fftSize() { - return this._fftSize; - } - set fftSize(fftSizeIn) { - this._fftSize = fftSizeIn; - if (this.fft) this.fft.dispose(); - this._fft = new this.FFTR(fftSizeIn); - } - get fftOverlap() { - return this._fftOverlap; - } - set fftOverlap(fftOverlapIn) { - if (this._fftOverlap === fftOverlapIn) return; - this._fftOverlap = fftOverlapIn; - if (!this.t || !this.t.length || !this.t[0].length) return; - this.f = new Array(this.t.length).fill(null).map(() => new Float32Array(this.t[0].length * this.fftOverlap / 2).fill(-Infinity)); - } - get fftHopSize() { - return this.fftSize / this.fftOverlap; - } - get fftBins() { - return this.fftSize / 2; - } -} - -/***/ }), - -/***/ "./src/FFTUtils.ts": -/*!*************************!*\ - !*** ./src/FFTUtils.ts ***! - \*************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FFTUtils: () => (/* binding */ FFTUtils) -/* harmony export */ }); -var FFTUtils = class { - static get windowFunctions() { - return [ - // hamming - (i, N) => 0.54 - 0.46 * Math.cos(6.283185307179586 * i / (N - 1)), - // hann - (i, N) => 0.5 * (1 - Math.cos(6.283185307179586 * i / (N - 1))), - // blackman - (i, N) => { - var a0 = 0.42; - var a1 = 0.5; - var a2 = 0.08; - var f = 6.283185307179586 * i / (N - 1); - return a0 - a1 * Math.cos(f) + a2 * Math.cos(2 * f); - }, - // triangular - (i, N) => 1 - Math.abs(2 * (i - 0.5 * (N - 1)) / N)]; - } - static getFFT() { - // eslint-disable-next-line - var _kissfftwasm = globalThis.kissfftwasm, - instantiateKissFFTModule = _kissfftwasm.instantiateKissFFTModule, - KissFFT = _kissfftwasm.KissFFT; - return instantiateKissFFTModule().then(Module => new KissFFT(Module).FFTR); - } - static fftToSignal(f, r, i, b) { - var fftSize = f.length - 2; - var len = fftSize / 2 + 1; - var invFFTSize = 1 / fftSize; - for (var j = 0; j < len; j++) { - r[j] = f[2 * j] * invFFTSize; - if (i) i[j] = f[2 * j + 1] * invFFTSize; - if (b) b[j] = j; - } - } - static signalToFFT(r, i, f) { - for (var j = 0; j < r.length; j++) { - f[2 * j] = r[j]; - f[2 * j + 1] = i[j]; - } - } - static signalToNoFFT(r, i, f) { - f.set(r.subarray(1, r.length)); - f.set(i.subarray(0, i.length - 1), r.length - 1); - } -}; - -/***/ }), - -/***/ "./src/FileManager.ts": -/*!****************************!*\ - !*** ./src/FileManager.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FileManager: () => (/* binding */ FileManager) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _FileManager_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FileManager.scss */ "./src/FileManager.scss"); - - -/** - * FileManager UI, interactive with Emscripten Virtual File System - * - * @export - * @class FileManager - */ -class FileManager { - /** - * Root path in Emscripten FS - * - * @type {string} - * @memberof FileManager - */ - - /** - * Index of main DSP to execute - * - * @type {number} - * @memberof FileManager - */ - - /** - * Project files list - * - * @type {string[]} - * @memberof FileManager - */ - - /** - * File System reference - * - * @private - * @type {TFileSystem} - * @memberof FileManager - */ - - constructor(options) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "divLabel", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnExpand", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "spanLabel", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnNewFile", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "divFiles", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "divOverlay", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "container", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "path", "./"); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "$mainFile", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_fileList", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_fs", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "selectHandler", () => undefined); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "saveHandler", () => undefined); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "deleteHandler", () => undefined); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "mainFileChangeHandler", () => undefined); - this.container = options.container; - this.fs = options.fs; - this.path = options.path; - this.$mainFile = options.$mainFile; - this.selectHandler = options.selectHandler; - this.saveHandler = options.saveHandler; - this.deleteHandler = options.deleteHandler; - this.mainFileChangeHandler = options.mainFileChangeHandler; - this.getChildren(); - this.getFiles(); - this.bind(); - this.select(this._fileList[options.$mainFile]); - } - getChildren() { - for (var i = 0; i < this.container.children.length; i++) { - var e = this.container.children[i]; - if (e.classList.contains("filemanager-label")) this.divLabel = e; - if (e.classList.contains("filemanager-files")) this.divFiles = e; - if (e.classList.contains("filemanager-overlay")) this.divOverlay = e; - } - if (!this.divLabel) { - var divLabel = document.createElement("div"); - divLabel.classList.add("filemanager-label"); - this.container.appendChild(divLabel); - this.divLabel = divLabel; - } - for (var _i = 0; _i < this.divLabel.children.length; _i++) { - var _e = this.divLabel.children[_i]; - if (_e.classList.contains("filemanager-btn-expand")) this.btnExpand = _e; - if (_e.classList.contains("filemanager-span-label")) this.btnNewFile = _e; - if (_e.classList.contains("filemanager-btn-new-file")) this.btnNewFile = _e; - } - if (!this.btnExpand) { - var btnExpand = document.createElement("button"); - btnExpand.classList.add("filemanager-btn-expand", "filemanager-btn-icon", "expanded"); - this.divLabel.appendChild(btnExpand); - this.btnExpand = btnExpand; - } - if (!this.spanLabel) { - var spanLabel = document.createElement("span"); - spanLabel.classList.add("filemanager-span-label"); - spanLabel.innerText = "Project Files"; - this.divLabel.appendChild(spanLabel); - this.spanLabel = spanLabel; - } - if (!this.btnNewFile) { - var btnNewFile = document.createElement("button"); - btnNewFile.classList.add("filemanager-btn-new-file", "filemanager-btn-icon"); - btnNewFile.title = "New File"; - this.divLabel.appendChild(btnNewFile); - this.btnNewFile = btnNewFile; - } - if (!this.divFiles) { - var divFiles = document.createElement("div"); - divFiles.classList.add("filemanager-files"); - this.container.appendChild(divFiles); - this.divFiles = divFiles; - } - if (!this.divOverlay) { - var divOverlap = document.createElement("div"); - divOverlap.classList.add("filemanager-overlay"); - this.container.appendChild(divOverlap); - this.divOverlay = divOverlap; - } - } - bind() { - this.divLabel.addEventListener("click", () => { - this.expanded = !this.expanded; // File Manager UI can be folded. - }); - /** - * create a new file with name `untitled\d*.dsp`, - * Select the filename as editing - * - * @param {MouseEvent} e - */ - var newFileHandler = e => { - e.stopPropagation(); - e.preventDefault(); - var i = 1; - var fileName = "untitled".concat(i, ".dsp"); - while (this._fileList.indexOf(fileName) !== -1) { - fileName = "untitled".concat(++i, ".dsp"); - } - this.fs.writeFile(this.path + fileName, ""); - this._fileList.push(fileName); - var divFile = this.createFileDiv(fileName, true); - this.divFiles.appendChild(divFile); - if (this.saveHandler) this.saveHandler(fileName, "", this.mainCode); - this.select(fileName); - if (fileName.endsWith(".dsp")) this.setMain(this._fileList.length - 1); - var spanName = divFile.getElementsByClassName("filemanager-filename")[0]; - spanName.focus(); - var range = document.createRange(); - range.selectNodeContents(spanName); - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - }; - this.btnNewFile.addEventListener("click", newFileHandler); - // File drag and drop - var dragenterHandler = e => { - if (e.dataTransfer && e.dataTransfer.items.length && e.dataTransfer.items[0].kind === "file") { - e.preventDefault(); - e.stopPropagation(); - this.divOverlay.style.display = "block"; - } - }; - var dragendHandler = e => { - e.preventDefault(); - e.stopPropagation(); - this.divOverlay.style.display = ""; - }; - var dragoverHandler = e => { - e.preventDefault(); - e.stopPropagation(); - }; - /** - * Drop a new file into file manager - * if the filename exists or has illegal name, replace it by `untitled\d*.dsp` - * - * @param {DragEvent} e - */ - var dropHandler = e => { - this.divOverlay.style.display = ""; - if (e.dataTransfer && e.dataTransfer.files.length) { - e.preventDefault(); - e.stopPropagation(); - var file = e.dataTransfer.files[0]; - var reader = new FileReader(); - reader.onload = () => { - var fileName = this.newFile(file.name, reader.result.toString()); - this.select(fileName); - }; - reader.onerror = () => undefined; - reader.readAsText(file); - } - }; - this.container.addEventListener("dragenter", dragenterHandler); - this.container.addEventListener("dragover", dragenterHandler); - this.divOverlay.addEventListener("dragenter", dragoverHandler); - this.divOverlay.addEventListener("dragover", dragoverHandler); - this.divOverlay.addEventListener("dragleave", dragendHandler); - this.divOverlay.addEventListener("dragend", dragendHandler); - this.divOverlay.addEventListener("drop", dropHandler); - } - /** - * create a new file container with buttons - * - * @param {string} name - * @param {boolean} [editing] - * @returns - * @memberof FileManager - */ - createFileDiv(name, editing) { - var divFile = document.createElement("div"); - divFile.classList.add("filemanager-file"); - var spanName = document.createElement("span"); - spanName.classList.add("filemanager-filename"); - spanName.innerText = name; - divFile.dataset.filename = name; - if (editing) spanName.contentEditable = "true"; - var btnMain = document.createElement("button"); - btnMain.classList.add("filemanager-btn-main", "filemanager-btn-icon"); - btnMain.title = "Set as main DSP"; - var btnRename = document.createElement("button"); - btnRename.classList.add("filemanager-btn-rename", "filemanager-btn-icon"); - btnRename.title = "Rename"; - var btnDelete = document.createElement("button"); - btnDelete.classList.add("filemanager-btn-delete", "filemanager-btn-icon"); - btnDelete.title = "Delete"; - divFile.appendChild(btnMain); - divFile.appendChild(spanName); - divFile.appendChild(btnRename); - divFile.appendChild(btnDelete); - var fileName = spanName.innerText; - btnRename.addEventListener("click", e => { - e.stopPropagation(); - spanName.contentEditable = "true"; - spanName.focus(); - var range = document.createRange(); - range.selectNodeContents(spanName); - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - }); - spanName.addEventListener("blur", e => { - var newName = e.currentTarget.innerText.replace(/[^a-zA-Z0-9_.]/g, "") || "untitled.dsp"; - e.currentTarget.innerText = newName; - if (this.rename(fileName, newName)) fileName = newName; - e.currentTarget.contentEditable = "false"; - }); - spanName.addEventListener("keydown", e => { - e.stopPropagation(); - if (e.key === "Enter") e.currentTarget.blur(); - if (e.key.match(/[^a-zA-Z0-9_.]/)) e.preventDefault(); - }); - btnMain.addEventListener("mousedown", () => this.setMain(this._fileList.indexOf(fileName))); - btnMain.addEventListener("touchstart", () => this.setMain(this._fileList.indexOf(fileName))); - btnDelete.addEventListener("click", e => { - e.stopPropagation(); - var i = this._fileList.indexOf(fileName); - this.fs.unlink(this.path + fileName); - this._fileList.splice(i, 1); - divFile.remove(); - if (this.deleteHandler) this.deleteHandler(fileName, this.mainCode); - if (this._fileList.length === 0) { - var _fileName = this.newFile("untitled.dsp", "import(\"stdfaust.lib\");\nprocess = ba.pulsen(1, 10000) : pm.djembe(60, 0.3, 0.4, 1) <: dm.freeverb_demo;"); - this.select(_fileName); - } else { - this.select(this._fileList[0]); - } - if (this.$mainFile >= this._fileList.length) this.setMain(this._fileList.length - 1);else this.setMain(this.$mainFile); - }); - var handlePointerDown = () => this.select(fileName); - divFile.addEventListener("mousedown", handlePointerDown); - divFile.addEventListener("touchstart", handlePointerDown); - return divFile; - } - /** - * Change main DSP file with index in file list. - * - * @param {number} $ - * @returns - * @memberof FileManager - */ - setMain($) { - if ($ >= this._fileList.length) return; - this.$mainFile = $; - for (var i = 0; i < this.divFiles.children.length; i++) { - var e = this.divFiles.children[i]; - var btnMain = e.querySelector(".filemanager-btn-main"); - if (btnMain) { - if (i === $) btnMain.classList.add("active");else btnMain.classList.remove("active"); - } - } - if (this.mainFileChangeHandler) this.mainFileChangeHandler($, this.mainCode); - } - /** - * Get files from Emscripten Virtual File System. - * - * @memberof FileManager - */ - getFiles() { - this.divFiles.innerHTML = ""; - this._fileList = this.fs.readdir(this.path).filter(fileName => fileName !== "." && fileName !== ".." && this.fs.isFile(this.fs.stat(this.path + fileName).mode)); - this._fileList.forEach(fileName => { - var divFile = this.createFileDiv(fileName, false); - this.divFiles.appendChild(divFile); - }); - if (this._fileList.length === 0) { - var fileName = this.newFile("untitled.dsp", "import(\"stdfaust.lib\");\nprocess = ba.pulsen(1, 10000) : pm.djembe(60, 0.3, 0.4, 1) <: dm.freeverb_demo;"); - this.select(fileName); - } else { - this.select(this._fileList[0]); - } - if (this.$mainFile >= this._fileList.length) this.setMain(this._fileList.length - 1);else this.setMain(this.$mainFile); - } - rename(oldName, newName) { - if (oldName === newName) return false; - var i = this._fileList.indexOf(oldName); - var spanName; - var divFile; - for (var _i2 = 0; _i2 < this.divFiles.children.length; _i2++) { - var file = this.divFiles.children[_i2]; - if (file.dataset.filename === oldName) { - divFile = file; - spanName = file.getElementsByClassName("filemanager-filename")[0]; - break; - } - } - if (!divFile || !spanName) return false; - try { - this.fs.rename(this.path + oldName, this.path + newName); - } catch (e) { - spanName.focus(); - return false; - } - this._fileList[i] = newName; - spanName.innerText = newName; - spanName.contentEditable = "false"; - divFile.dataset.filename = newName; - if (this.saveHandler) this.saveHandler(newName, this.getValue(newName), this.mainCode); - this.select(newName); - this.deleteHandler(oldName, this.mainCode); - return true; - } - renameSelected(newName) { - this.rename(this.selected, newName); - } - newFile(fileNameIn, content) { - var fileName; - if (fileNameIn) fileName = fileNameIn.replace(/[^a-zA-Z0-9_.]/g, ""); - var extension = fileNameIn ? fileNameIn.split(".").slice(-1) || "lib" : "dsp"; - if (!fileName || this._fileList.indexOf(fileName) !== -1) { - var i = 1; - fileName = "untitled".concat(i, ".").concat(extension); - while (this._fileList.indexOf(fileName) !== -1) { - fileName = "untitled".concat(++i, ".").concat(extension); - } - } - this.fs.writeFile(this.path + fileName, content || ""); - this._fileList.push(fileName); - var divFile = this.createFileDiv(fileName, false); - this.divFiles.appendChild(divFile); - if (this.saveHandler) this.saveHandler(fileName, content || "", this.mainCode); - this.select(fileName); - if (fileName.endsWith(".dsp")) this.setMain(this._fileList.length - 1); - return fileName; - } - select(fileName) { - for (var i = 0; i < this.divFiles.children.length; i++) { - var divFile = this.divFiles.children[i]; - if (divFile.dataset.filename === fileName) divFile.classList.add("selected");else divFile.classList.remove("selected"); - } - if (this.selectHandler) this.selectHandler(fileName, this.fs.readFile(this.path + fileName, { - encoding: "utf8" - }), this.mainCode); - } - save(fileName, content) { - if (this.getValue(fileName) === content) return; - this.fs.writeFile(this.path + fileName, content); - if (this.saveHandler) this.saveHandler(fileName, content, this.mainCode); - } - saveAll() { - if (!this.saveHandler) return; - this._fileList.forEach(fileName => { - var content = this.getValue(fileName); - if (this.selectHandler && content) this.saveHandler(fileName, content, this.mainCode); - }); - } - setValue(value, useSelectHandler) { - var fileName = this.selected; - if (fileName) { - if (this.selectHandler && useSelectHandler !== false) this.selectHandler(fileName, value, this.mainCode); - this.save(fileName, value); - } - } - getValue(fileNameIn) { - var fileName = fileNameIn || this.selected; - return this.fs.readFile(this.path + fileName, { - encoding: "utf8" - }); - } - get selected() { - for (var i = 0; i < this.divFiles.children.length; i++) { - var divFile = this.divFiles.children[i]; - if (divFile.classList.contains("selected")) return divFile.dataset.filename; - } - return null; - } - get mainCode() { - var fileName = this._fileList[this.$mainFile]; - return fileName ? this.getValue(fileName) || "" : ""; - } - get mainFileName() { - return this._fileList[this.$mainFile]; - } - get mainFileNameWithoutSuffix() { - return this._fileList[this.$mainFile].split(".").slice(0, -1).join("."); - } - get allCodes() { - var codes = ""; - this._fileList.forEach(fileName => codes += (this.getValue(fileName) || "") + "\n"); - return codes; - } - get selectedCode() { - var selected = this.selected; - if (selected) return this.getValue(selected); - return this.mainCode; - } - set expanded(expanded) { - if (expanded) { - if (!this.btnExpand.classList.contains("expanded")) { - this.btnExpand.classList.add("expanded"); - this.divFiles.style.display = ""; - } - } else if (this.btnExpand.classList.contains("expanded")) { - this.btnExpand.classList.remove("expanded"); - this.divFiles.style.display = "none"; - } - } - get expanded() { - return this.btnExpand.classList.contains("expanded"); - } - get fs() { - return this._fs; - } - set fs(fsIn) { - this._fs = fsIn; - } -} - -/***/ }), - -/***/ "./src/Key2Midi.ts": -/*!*************************!*\ - !*** ./src/Key2Midi.ts ***! - \*************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Key2Midi: () => (/* binding */ Key2Midi) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); - -/** - * Keyboard Events to Midi Messages - * - * @class Key2Midi - */ -class Key2Midi { - /** - * Default Key Map use for key2midi - * - * @type {TKeyMap} - * @static - * @memberof Key2Midi - */ - - /** - * Current key map - * - * @type {TKeyMap} - * @memberof Key2Midi - */ - - /** - * Current offset - * - * @type {number} - * @memberof Key2Midi - */ - - /** - * Current velocity - * - * @type {number} - * @memberof Key2Midi - */ - - /** - * Current velocity map - * - * @type {number[]} - * @memberof Key2Midi - */ - - /** - * Handler for midi message output - * - * @type {(msg: number[]) => any} - * @memberof Key2Midi - */ - - /** - * Enable State - * - * @type {boolean} - * @memberof Key2Midi - */ - - /** - * Creates an instance of Key2Midi. - * @param {{ keyMap?: TKeyMap, offset?: number, velocity?: number, handler?: (msg: number[]) => any, enabled?: boolean }} [options] - * @memberof Key2Midi - */ - constructor(options) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "keyMap", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "offset", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "velocity", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "velMap", []); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handler", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "enabled", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleKeyDown", str => { - if (!this.enabled) return; - var converted = this.keyMap[str]; - if (typeof converted === "undefined") return; - if (typeof converted === "number") { - var note = converted + this.offset; - if (this.velMap[note]) return; - this.velMap[note] = this.velocity; - this.handler([144, converted + this.offset, this.velocity]); - return; - } - if (converted === "NEXT") { - this.flush(); - this.offset = Math.min(120, this.offset + 12); - return; - } - if (converted === "PREV") { - this.flush(); - this.offset = Math.max(0, this.offset - 12); - return; - } - if (converted === "VELUP") { - this.velocity = Math.min(120, this.velocity + 20); - return; - } - if (converted === "VELDOWN") { - this.velocity = Math.max(20, this.velocity - 20); - } - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleKeyUp", str => { - if (!this.enabled) return; - var converted = this.keyMap[str]; - if (typeof converted === "undefined") return; - if (typeof converted === "number") { - var note = converted + this.offset; - this.velMap[note] = 0; - this.handler([144, converted + this.offset, 0]); - } - }); - this.keyMap = options.keyMap || Key2Midi.KEY_MAP; - this.offset = options.offset || 36; - this.velocity = options.velocity || 60; - this.handler = options.handler || (() => undefined); - this.enabled = options.enabled || false && 0; - } - /** - * KeyDown Handler - * - * @param {string} str - * @returns {void} - * @memberof Key2Midi - */ - - /** - * KeyUp Handler - * - * @param {string} str - * @returns {void} - * @memberof Key2Midi - */ - - /** - * Mute All - * - * @returns {void} - * @memberof Key2Midi - */ - flush() { - if (!this.enabled) return; - for (var note = 0; note < 128; note++) { - if (this.velMap[note]) this.handler([144, note, 0]); - } - } -} -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(Key2Midi, "KEY_MAP", { - a: 0, - w: 1, - s: 2, - e: 3, - d: 4, - f: 5, - t: 6, - g: 7, - y: 8, - h: 9, - u: 10, - j: 11, - k: 12, - o: 13, - l: 14, - p: 15, - ";": 16, - z: "PREV", - x: "NEXT", - c: "VELDOWN", - v: "VELUP" -}); -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(Key2Midi, "KEY_MAP_FR", { - q: 0, - z: 1, - s: 2, - e: 3, - d: 4, - f: 5, - t: 6, - g: 7, - y: 8, - h: 9, - u: 10, - j: 11, - k: 12, - o: 13, - l: 14, - p: 15, - m: 16, - w: "PREV", - x: "NEXT", - c: "VELDOWN", - v: "VELUP" -}); - - -/***/ }), - -/***/ "./src/MeterNode.ts": -/*!**************************!*\ - !*** ./src/MeterNode.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ GainUI: () => (/* binding */ GainUI), -/* harmony export */ createMeterNode: () => (/* binding */ createMeterNode) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -/** - * Returns a ScriptProcessor that measures the RMSs of each channel in a buffer. - * The processor calls a `levelHandler` callback after calculating each buffer. - * - * @param {AudioContext} audioCtx - * @param {number} [gain] - * @param {number} [averaging] - * @param {(gains: number[]) => any} [gainHandler] - * @returns {MeterNode} - */ -var createMeterNode = (audioCtx, gain, averaging, gainHandler) => { - var node = audioCtx.createScriptProcessor(512, 8, 8); - node.levelHandler = gainHandler; - node.averaging = averaging || 0.95; - node.gain = gain || 1; - node.onaudioprocess = e => { - var levels = []; - var input = e.inputBuffer; - var output = e.outputBuffer; - for (var i = 0; i < input.numberOfChannels; i++) { - var inputBuffer = input.getChannelData(i); - var outputBuffer = output.getChannelData(i); - var l = inputBuffer.length; - var sum = 0; - for (var j = 0; j < l; j++) { - var samp = inputBuffer[j]; - outputBuffer[j] = samp; - sum += samp * samp; - } - levels.push(Math.pow(sum / l, 0.5)); - } - if (node.levelHandler) node.levelHandler(levels); - }; - return node; -}; -/** - * A Live-like meter UI with a gain controller. - * Range from -70dB to +10dB, linear in dB unit. - * Needs a MeterNode described above - * and a WebAudio GainNode to get the gain controller functional. - * - * @export - * @class GainUI - */ -class GainUI { - constructor(container, meterNode, gainNode, state) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "state", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "meterNode", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "gainNode", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "container", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "canvas", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "ctx", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "channels", 2); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "interactionRect", [0, 0, 0, 0]); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "$raf", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "$frame", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "frameReduce", 3); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "paintLevels", [-Infinity]); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "maxLevels", [-Infinity]); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "maxTimer", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleTouchStart", e => { - e.preventDefault(); - var rect = e.currentTarget.getBoundingClientRect(); - var prevX = e.touches[0].pageX; - var prevY = e.touches[0].pageY; - var fromX = prevX - rect.left; - var fromY = prevY - rect.top; - var prevValue = this.value; - this.handlePointerDown({ - x: fromX, - y: fromY, - originalEvent: e - }); - var handleTouchMove = e => { - e.preventDefault(); - var pageX = e.changedTouches[0].pageX; - var pageY = e.changedTouches[0].pageY; - var movementX = pageX - prevX; - var movementY = pageY - prevY; - prevX = pageX; - prevY = pageY; - var x = pageX - rect.left; - var y = pageY - rect.top; - this.handlePointerDrag({ - prevValue, - x, - y, - fromX, - fromY, - movementX, - movementY, - originalEvent: e - }); - }; - var handleTouchEnd = e => { - e.preventDefault(); - var x = e.changedTouches[0].pageX - rect.left; - var y = e.changedTouches[0].pageY - rect.top; - this.handlePointerUp({ - x, - y, - originalEvent: e - }); - document.removeEventListener("touchmove", handleTouchMove); - document.removeEventListener("touchend", handleTouchEnd); - }; - document.addEventListener("touchmove", handleTouchMove, { - passive: false - }); - document.addEventListener("touchend", handleTouchEnd, { - passive: false - }); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleMouseDown", e => { - e.preventDefault(); - e.currentTarget.focus(); - var rect = e.currentTarget.getBoundingClientRect(); - var fromX = e.pageX - rect.left; - var fromY = e.pageY - rect.top; - var prevValue = this.value; - this.handlePointerDown({ - x: fromX, - y: fromY, - originalEvent: e - }); - var handleMouseMove = e => { - e.preventDefault(); - var x = e.pageX - rect.left; - var y = e.pageY - rect.top; - this.handlePointerDrag({ - prevValue, - x, - y, - fromX, - fromY, - movementX: e.movementX, - movementY: e.movementY, - originalEvent: e - }); - }; - var handleMouseUp = e => { - e.preventDefault(); - var x = e.pageX - rect.left; - var y = e.pageY - rect.top; - this.handlePointerUp({ - x, - y, - originalEvent: e - }); - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - }; - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleDblClick", e => { - e.preventDefault(); - this.value = 0; - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handlePointerUp", e => {}); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "levelHandler", levels => { - var levelsIn = levels.map(e => 20 * Math.log10(e)); - if (this.state.levels.length === levelsIn.length && this.state.levels.every((v, i) => v === levelsIn[i])) return; - this.state.levels = levelsIn; - this.paint(); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "raf", () => { - this.$frame++; - if (this.$frame % this.frameReduce !== 0) { - this.$raf = window.requestAnimationFrame(this.raf); - return; - } - this.$raf = undefined; - var _this$state = this.state, - barwidth = _this$state.barwidth, - barbgcolor = _this$state.barbgcolor, - coldcolor = _this$state.coldcolor, - warmcolor = _this$state.warmcolor, - hotcolor = _this$state.hotcolor, - overloadcolor = _this$state.overloadcolor, - tribordercolor = _this$state.tribordercolor, - tricolor = _this$state.tricolor, - textcolor = _this$state.textcolor; - var _this$state2 = this.state, - min = _this$state2.min, - max = _this$state2.max, - value = _this$state2.value, - levels = _this$state2.levels; - var channels = Math.min(this.channels, levels.length); - var ctx = this.ctx; - var canvas = this.canvas; - var distance = this.distance; - var _canvas$getBoundingCl = canvas.getBoundingClientRect(), - width = _canvas$getBoundingCl.width; - canvas.width = width; - var height = barwidth * (channels * 1.5 + 2); - canvas.height = height; - var drawWidth = width; - var left = 0; - var top = 0; - this.interactionRect = [0, top, width, height]; - this.paintLevels = [...levels]; - var paintLevels = [...this.paintLevels]; - if (paintLevels.find((v, i) => v > this.maxLevels[i])) { - this.maxLevels = [...paintLevels]; - if (this.maxTimer) window.clearTimeout(this.maxTimer); - this.maxTimer = window.setTimeout(() => { - this.maxLevels = [...this.paintLevels]; - this.maxTimer = undefined; - this.raf(); - }, 1000); - } - if (paintLevels.find((v, i) => v < this.maxLevels[i]) && typeof this.maxTimer === "undefined") { - this.maxTimer = window.setTimeout(() => { - this.maxLevels = [...this.paintLevels]; - this.maxTimer = undefined; - this.raf(); - }, 1000); - } - var maxLevels = this.maxLevels; - var coldStop = (-18 - min) / (max - min); - var warmStop = (-6 - min) / (max - min); - var hotStop = (-3 - min) / (max - min); - var overloadStop = -min / (max - min); - var gradient = ctx.createLinearGradient(left, 0, drawWidth, 0); - if (coldStop <= 1 && coldStop >= 0) gradient.addColorStop(coldStop, coldcolor);else if (coldStop > 1) gradient.addColorStop(1, coldcolor); - if (warmStop <= 1 && warmStop >= 0) gradient.addColorStop(warmStop, warmcolor); - if (hotStop <= 1 && hotStop >= 0) gradient.addColorStop(hotStop, hotcolor); - if (overloadStop <= 1 && overloadStop >= 0) gradient.addColorStop(overloadStop, overloadcolor);else if (overloadStop < 0) gradient.addColorStop(0, coldcolor); - for (var i = 0; i < channels; i++) { - var level = paintLevels[i]; - var maxLevel = maxLevels[i]; - ctx.fillStyle = barbgcolor; - if (level < 0) ctx.fillRect(left, top, drawWidth * overloadStop, barwidth); - if (level < max) ctx.fillRect(left + drawWidth * overloadStop + 1, top, drawWidth * (1 - overloadStop) - 1, barwidth); - ctx.fillStyle = gradient; - if (level > min) { - var _distance = (Math.min(0, level) - min) / (max - min); - ctx.fillRect(left, top, _distance * drawWidth, barwidth); - } - if (level > 0) { - var _distance2 = Math.min(max, level) / (max - min); - ctx.fillRect(left + overloadStop * drawWidth + 1, top, _distance2 * drawWidth - 1, barwidth); - } - if (maxLevel > level) { - if (maxLevel <= 0) { - var _distance3 = (Math.min(0, maxLevel) - min) / (max - min); - ctx.fillRect(left + _distance3 * drawWidth - 1, top, 1, barwidth); - } - if (maxLevel > 0) { - var _distance4 = Math.min(max, maxLevel) / (max - min); - ctx.fillRect(left + Math.min(drawWidth - 1, (overloadStop + _distance4) * drawWidth), top, 1, barwidth); - } - } - top += 1.5 * barwidth; - } - ctx.lineWidth = 1; - ctx.strokeStyle = tribordercolor; - var triOrigin = [this.interactionRect[0] + this.interactionRect[2] * distance - 4, top - barwidth * 0.5]; - ctx.beginPath(); - ctx.moveTo(triOrigin[0], triOrigin[1] + 8); - ctx.lineTo(triOrigin[0] + 4, triOrigin[1]); - ctx.lineTo(triOrigin[0] + 8, triOrigin[1] + 8); - ctx.lineTo(triOrigin[0], triOrigin[1] + 8); - ctx.stroke(); - ctx.fillStyle = tricolor; - ctx.fill(); - ctx.font = "regular 10px Arial, sans-serif"; - ctx.fillStyle = textcolor; - ctx.textAlign = "left"; - ctx.fillText("".concat(value.toFixed(2), " dB"), 4, height - 2, width); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handlePointerDown", e => { - var value = this.state.value; - if (e.x < this.interactionRect[0] || e.x > this.interactionRect[0] + this.interactionRect[2] || e.y < this.interactionRect[1] || e.y > this.interactionRect[1] + this.interactionRect[3]) return; - var newValue = this.getValueFromPos(e); - if (newValue !== value) this.value = this.getValueFromPos(e); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handlePointerDrag", e => { - var newValue = this.getValueFromPos(e); - if (newValue !== this.state.value) this.value = newValue; - }); - this.container = container; - this.meterNode = meterNode; - this.gainNode = gainNode; - this.state = _objectSpread({ - min: -70, - max: 10, - value: 0, - step: 0.01, - levels: [-Infinity], - barwidth: 8, - barbgcolor: "rgba(18, 18, 18, 1)", - coldcolor: "rgba(12, 248, 100, 1)", - warmcolor: "rgba(195, 248, 100, 1)", - hotcolor: "rgba(255, 193, 10, 1)", - overloadcolor: "rgba(255, 10, 10, 1)", - textcolor: "rgba(255, 255, 255, 1)", - tribordercolor: "rgba(80, 80, 80, 1)", - tricolor: "rgba(165, 165, 165, 1)" - }, state || {}); - this.getChildren(); - this.bind(); - this.paint(); - } - getChildren() { - this.container.innerHTML = ""; - this.canvas = document.createElement("canvas"); - this.ctx = this.canvas.getContext("2d"); - this.container.appendChild(this.canvas); - } - bind() { - this.canvas.addEventListener("mousedown", this.handleMouseDown); - this.canvas.addEventListener("touchstart", this.handleTouchStart, { - passive: false - }); - this.canvas.addEventListener("dblclick", this.handleDblClick); - this.meterNode.levelHandler = this.levelHandler; - } - // eslint-disable-line @typescript-eslint/no-unused-vars - get value() { - return this.state.value; - } - set value(valueIn) { - this.state.value = valueIn; - this.gainNode.gain.setValueAtTime(valueIn <= -70 ? 0 : Math.pow(10, valueIn / 20), 0); - this.paint(); - } - get distance() { - var _this$state3 = this.state, - max = _this$state3.max, - min = _this$state3.min, - value = _this$state3.value; - return (value - min) / (max - min); - } - get trueSteps() { - var _this$state4 = this.state, - max = _this$state4.max, - min = _this$state4.min, - step = _this$state4.step; - var full = this.interactionRect[2]; - var maxSteps = full; - if (step) return Math.min(Math.floor((max - min) / step), maxSteps); - return maxSteps; - } - get stepRange() { - var full = this.interactionRect[2]; - var trueSteps = this.trueSteps; - return full / trueSteps; - } - paint() { - if (this.$raf) return; - this.$raf = window.requestAnimationFrame(this.raf); - } - getValueFromPos(e) { - var _this$state5 = this.state, - min = _this$state5.min, - max = _this$state5.max; - var stepRange = this.stepRange; - var trueSteps = this.trueSteps; - var step = (max - min) / trueSteps; - var steps = Math.round((e.x - this.interactionRect[0]) / stepRange); - steps = Math.min(trueSteps, Math.max(0, steps)); - return steps * step + min; - } -} - -/***/ }), - -/***/ "./src/Recorder.ts": -/*!*************************!*\ - !*** ./src/Recorder.ts ***! - \*************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Recorder: () => (/* binding */ Recorder) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! wav-encoder */ "./node_modules/wav-encoder/index.js"); - - - - -class Recorder { - constructor(sampleRate) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(this, "$start", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(this, "$last", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(this, "data", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(this, "sampleRate", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(this, "enabled", void 0); - this.enabled = false; - this.sampleRate = sampleRate || 44100; - } - reset($start) { - this.$start = $start; - this.$last = $start; - this.data = []; - } - append(buffer, index) { - if (!this.enabled) return this.totalSec; - if (index === 0 || !this.data || this.data.length === 0 || index !== ++this.$last) this.reset(index); - this.data.push(buffer); - return this.totalSec; - } - get totalSec() { - if (!this.data || !this.data.length || !this.data[0].length) return 0; - var sampleRate = this.sampleRate; - var buffers = this.data.length; - var bufferSize = this.data[0][0].length; - return bufferSize * buffers / sampleRate; - } - encode() { - var _this = this; - return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee() { - var sampleRate, buffers, channels, bufferSize, l, channelData, j, channel, i, bufferData; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - if (!(!_this.data || !_this.data.length || !_this.data[0].length)) { - _context.next = 2; - break; - } - return _context.abrupt("return", null); - case 2: - sampleRate = _this.sampleRate; - buffers = _this.data.length; - channels = _this.data[0].length; - bufferSize = _this.data[0][0].length; - l = buffers * bufferSize; - channelData = []; - for (j = 0; j < channels; j++) { - channel = new Float32Array(l); - for (i = 0; i < buffers; i++) { - bufferData = _this.data[i][j]; - channel.set(bufferData, i * bufferSize); - } - channelData.push(channel); - } - return _context.abrupt("return", (0,wav_encoder__WEBPACK_IMPORTED_MODULE_3__.encode)({ - sampleRate, - channelData - })); - case 10: - case "end": - return _context.stop(); - } - }, _callee); - }))(); - } -} - -/***/ }), - -/***/ "./src/Scope.ts": -/*!**********************!*\ - !*** ./src/Scope.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Scope: () => (/* binding */ Scope) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _Scope_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Scope.scss */ "./src/Scope.scss"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/utils.ts"); -/* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); - - - -var TScopeType; -(function (TScopeType) { - TScopeType[TScopeType["Oscilloscope"] = 0] = "Oscilloscope"; - TScopeType[TScopeType["Spectroscope"] = 1] = "Spectroscope"; - TScopeType[TScopeType["Spectrogram"] = 2] = "Spectrogram"; -})(TScopeType || (TScopeType = {})); -class Scope { - static drawOscilloscope(ctx, w, h, d, freq, sr, zoom, zoomOffset) { - this.drawBackground(ctx, w, h); - this.drawGrid(ctx, w, h); - var l = d.length; - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 2; - ctx.beginPath(); - // Fastest way to get min and max to have: 1. max abs value for y scaling, 2. mean value for zero-crossing - var min = d[0]; - var max = d[0]; - var i = d.length; - while (i--) { - var s = d[i]; - if (s < min) min = s;else if (s > max) max = s; - } - var $zerox = 0; - var thresh = (min + max) * 0.5 + 0.001; // the zero-crossing with "offset" - var period = sr / freq; - var times = Math.floor(l / period) - 1; - while (d[$zerox++] > thresh && $zerox < l); - if ($zerox >= l - 1) { - $zerox = 0; - } else { - while (d[$zerox++] < thresh && $zerox < l); - if ($zerox >= l - 1) { - $zerox = 0; - } - } - var drawL = times > 0 && isFinite(period) ? Math.min(period * times, l - $zerox) : l - $zerox; - var $0 = Math.round($zerox + drawL * zoomOffset); - var $1 = Math.round($zerox + drawL / zoom + drawL * zoomOffset); - for (var _i = $0; _i < $1; _i++) { - var x = w * (_i - $0) / ($1 - $0 - 1); - var y = h - (d[_i] * 0.5 + 0.5) * h; - if (_i === $0) ctx.moveTo(x, y);else ctx.lineTo(x, y); - } - ctx.stroke(); - } - static drawSpectroscope(ctx, w, h, d, zoom, zoomOffset) { - this.drawBackground(ctx, w, h); - this.drawGrid(ctx, w, h); - var l = d.length; - var $0 = Math.round(l * zoomOffset); - var $1 = Math.round(l / zoom + l * zoomOffset); - ctx.fillStyle = "#FFFFFF"; - ctx.beginPath(); - for (var i = $0; i < $1; i++) { - var x = w * (i - $0) / ($1 - $0); - var y = ((d[i] + 10) / 100 + 1) * h; - if (i === $0) ctx.moveTo(x, h - y);else ctx.lineTo(x, h - y); - } - ctx.lineTo(w, h); - ctx.lineTo(0, h); - ctx.closePath(); - ctx.fill(); - } - static drawOfflineSpectrogram(ctx, d, $) { - var l = d.length; - var h = ctx.canvas.height; - var step = Math.max(1, Math.round(l / h)); - var maxInStep; - ctx.fillStyle = "black"; - ctx.fillRect($, 0, 1, h); - var $h = h / l; - for (var i = 0; i < l; i++) { - var samp = d[i]; - var $step = i % step; - if ($step === 0) maxInStep = samp; - if ($step !== step - 1) { - if ($step !== 0 && samp > maxInStep) maxInStep = samp; - continue; - } - var normalized = Math.min(1, Math.max(0, (maxInStep + 10) / 100 + 1)); - if (normalized === 0) continue; - var hue = (normalized * 180 + 240) % 360; - var lum = normalized * 50; - ctx.fillStyle = "hsl(".concat(hue, ", 100%, ").concat(lum, "%)"); - ctx.fillRect($, (1 - i / l) * h, 1, Math.max(1, $h)); - } - } - static drawSpectrogram(ctx, tempCtx, $, w, h, d, zoom) { - this.drawBackground(ctx, w, h); - this.drawGrid(ctx, w, h); - ctx.save(); - ctx.globalCompositeOperation = "lighter"; - if ($ + 1 < tempCtx.canvas.width) { - var d$ = Math.round($ / tempCtx.canvas.width * w * zoom); - if (d$ < w) ctx.drawImage(tempCtx.canvas, $ + 1, 0, tempCtx.canvas.width - $ - 1, tempCtx.canvas.height, w - w * zoom, 0, w * zoom - d$, h); - if (d$) ctx.drawImage(tempCtx.canvas, 0, 0, $ + 1, tempCtx.canvas.height, w - d$, 0, d$, h); - } else { - ctx.drawImage(tempCtx.canvas, 0, 0, tempCtx.canvas.width, tempCtx.canvas.height, w - w * zoom, 0, w * zoom, h); - } - ctx.restore(); - } - static drawBackground(ctx, w, h) { - ctx.save(); - ctx.fillStyle = "#000000"; - ctx.fillRect(0, 0, w, h); - ctx.restore(); - } - static drawGrid(ctx, w, h) { - ctx.save(); - ctx.beginPath(); - ctx.lineWidth = 1; - ctx.strokeStyle = "#404040"; - for (var i = 0.25; i < 1; i += 0.25) { - ctx.moveTo(w * i, 0); - ctx.lineTo(w * i, h); - ctx.moveTo(0, h * i); - ctx.lineTo(w, h * i); - } - ctx.stroke(); - ctx.restore(); - } - static drawStats(ctx, w, h, freq, samp, rms, zoom, zoomMin, zoomMax) { - ctx.save(); - ctx.fillStyle = "rgba(0, 0, 0, 0.75)"; - ctx.fillRect(w - 50, 0, 50, 50); - if (typeof zoomMin === "number") ctx.fillRect(0, h - 16, 40, 16); - if (typeof zoomMax === "number") ctx.fillRect(w - 40, h - 16, 40, 16); - if (typeof zoom === "number") ctx.fillRect(w / 2 - 20, h - 16, 40, 16); - ctx.fillStyle = "#DDDD99"; - ctx.font = "bold 12px Consolas, monospace"; - if (typeof zoom === "number") { - ctx.textAlign = "center"; - ctx.fillText(zoom.toFixed(1) + "x", w / 2, h - 2, 40); - } - if (typeof zoomMin === "number") { - ctx.textAlign = "left"; - ctx.fillText(zoomMin.toFixed(0), 2, h - 2, 40); - } - ctx.textAlign = "right"; - if (typeof zoomMax === "number") ctx.fillText(zoomMax.toFixed(0), w - 2, h - 2, 40); - ctx.fillText((samp >= 0 ? "@+" : "@") + samp.toFixed(3), w - 2, 15, 50); - ctx.fillText(freq.toFixed(0) + "Hz", w - 2, 30, 50); - ctx.fillText("x̄:" + rms.toFixed(3), w - 2, 45, 50); - ctx.restore(); - } - static getIconClassName(typeIn) { - var prefix = "fas fa-sm "; - if (typeIn === TScopeType.Oscilloscope) return prefix + "fa-wave-square"; - if (typeIn === TScopeType.Spectroscope) return prefix + "fa-chart-bar"; - if (typeIn === TScopeType.Spectrogram) return prefix + "fa-water"; - return prefix; - } - constructor(options) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "raf", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "ctx", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "spectTempCtx", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "spectCol$", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_disabled", false); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_paused", false); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "frame", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "audioCtx", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "analyser", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "splitter", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_channel", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "channels", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "container", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "canvas", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnSwitch", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnSize", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnCh", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "iSwitch", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "type", TScopeType.Oscilloscope); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_zoom", 1); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_zoomOffset", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_size", 2048); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "t", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "ti", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "f", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "drawSpectrogram", false); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "draw", () => { - this.frame++; // Reduce frame rate - if (this.canvas.offsetParent !== null && this.frame % 3 === 0 && this.audioCtx && this.audioCtx.state === "running" && this.analyser) { - var ctx = this.ctx; - var sr = this.audioCtx.sampleRate; - var w = this.container.clientWidth; - var h = Math.floor(Math.min(w * 0.75, this.container.clientHeight)); - this.canvas.width = w; - this.canvas.height = h; - this.analyser.getFloatFrequencyData(this.f); - if (this.analyser.getFloatTimeDomainData) { - this.analyser.getFloatTimeDomainData(this.t); - } else { - // This is for Safari, what a shame - this.analyser.getByteTimeDomainData(this.ti); - this.ti.forEach((v, i) => this.t[i] = v / 128 - 1); - } - var freq = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.estimateFreq)(this.f, sr); - var samp = this.t[this.t.length - 1]; - var rms = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getRms)(this.t); - if (this.drawSpectrogram) Scope.drawOfflineSpectrogram(this.spectTempCtx, this.f, this.spectCol$); - if (this.type === TScopeType.Oscilloscope) { - Scope.drawOscilloscope(ctx, w, h, this.t, freq, sr, this.zoom, this.zoomOffset); - Scope.drawStats(ctx, w, h, freq, samp, rms, this.zoom); - } else if (this.type === TScopeType.Spectroscope) { - Scope.drawSpectroscope(ctx, w, h, this.f, this.zoom, this.zoomOffset); - Scope.drawStats(ctx, w, h, freq, samp, rms, this.zoom, sr / 2 * this.zoomOffset, sr / 2 / this.zoom + sr / 2 * this.zoomOffset); - } else if (this.type === TScopeType.Spectrogram) { - Scope.drawSpectrogram(ctx, this.spectTempCtx, this.spectCol$, w, h, this.f, this.zoom); - Scope.drawStats(ctx, w, h, freq, samp, rms, this.zoom); - } - this.spectCol$ = (this.spectCol$ + 1) % this.spectTempCtx.canvas.width; - } - this.raf = requestAnimationFrame(this.draw); - return this.raf; - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "drawPause", () => { - var ctx = this.ctx; - var w = this.canvas.width; - var h = this.canvas.height; - ctx.fillStyle = "#00000080"; - ctx.fillRect(0, 0, w, h); - ctx.fillStyle = "#FFFFFF"; - ctx.fillRect(w * 0.38, h * 0.35, w * 0.08, h * 0.3); - ctx.fillRect(w * 0.54, h * 0.35, w * 0.08, h * 0.3); - }); - Object.assign(this, options); - this.t = new Float32Array(this.analyser.fftSize); - this.ti = new Uint8Array(this.analyser.fftSize); - this.f = new Float32Array(this.analyser.frequencyBinCount); - this.getChildren(); - this.bind(); - if (!window.AudioWorklet) this.paused = true;else if (typeof options.paused === "undefined") this.paused = false; - } - getChildren() { - this.spectTempCtx = document.createElement("canvas").getContext("2d"); - this.spectTempCtx.canvas.height = 1024; - this.spectTempCtx.canvas.width = 1024; - var ctrl; - for (var i = 0; i < this.container.children.length; i++) { - var e = this.container.children[i]; - if (e.classList.contains("scope-controller")) ctrl = e; - if (e.classList.contains("scope-canvas")) this.canvas = e; - } - if (!ctrl) { - ctrl = document.createElement("div"); - ctrl.classList.add("scope-controller"); - this.container.appendChild(ctrl); - } - if (!this.canvas) { - var canvas = document.createElement("canvas"); - canvas.classList.add("scope-canvas"); - canvas.setAttribute("data-toggle", "tooltip"); - canvas.setAttribute("data-placement", "left"); - canvas.setAttribute("title", "Input analyser"); - this.container.appendChild(canvas); - this.canvas = canvas; - try { - $(canvas).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - } - - this.ctx = this.canvas.getContext("2d"); - for (var _i2 = 0; _i2 < ctrl.children.length; _i2++) { - var _e = ctrl.children[_i2]; - if (_e.classList.contains("scope-btn-switch")) this.btnSwitch = _e; - if (_e.classList.contains("scope-btn-size")) this.btnSize = _e; - if (_e.classList.contains("scope-btn-ch")) this.btnCh = _e; - } - if (!this.btnSwitch) { - var btn = document.createElement("button"); - btn.className = "scope-btn-switch btn btn-outline-light btn-sm btn-overlay btn-overlay-icon"; - btn.setAttribute("data-toggle", "tooltip"); - btn.setAttribute("data-placement", "top"); - btn.setAttribute("title", "Oscilloscope / Spectroscope / Spectrogram"); - ctrl.appendChild(btn); - this.btnSwitch = btn; - try { - $(btn).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - } - - if (!this.btnSize) { - var _btn = document.createElement("button"); - _btn.className = "scope-btn-size btn btn-outline-light btn-sm btn-overlay"; - _btn.setAttribute("data-toggle", "tooltip"); - _btn.setAttribute("data-placement", "top"); - _btn.setAttribute("title", "Analyser Size"); - _btn.innerText = this.analyser.fftSize + "samps"; - ctrl.appendChild(_btn); - this.btnSize = _btn; - try { - $(_btn).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - } - - if (!this.btnCh) { - var _btn2 = document.createElement("button"); - _btn2.className = "scope-btn-ch btn btn-outline-light btn-sm btn-overlay"; - _btn2.setAttribute("data-toggle", "tooltip"); - _btn2.setAttribute("data-placement", "top"); - _btn2.setAttribute("title", "Current Channel"); - _btn2.innerText = "ch " + (this._channel + 1).toString(); - ctrl.appendChild(_btn2); - this.btnCh = _btn2; - try { - $(_btn2).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - } - - for (var _i3 = 0; _i3 < this.btnSwitch.children.length; _i3++) { - var _e2 = this.btnSwitch.children[_i3]; - if (_e2.classList.contains("fas")) this.iSwitch = _e2; - } - if (!this.iSwitch) { - var _i4 = document.createElement("i"); - _i4.className = "fas fa-sm fa-wave-square"; - this.btnSwitch.appendChild(_i4); - this.iSwitch = _i4; - } - } - bind() { - this.btnSwitch.addEventListener("click", () => { - this.zoom = 1; - this.zoomOffset = 0; - this.type = (this.type + 1) % (this.drawSpectrogram ? 3 : 2); - this.iSwitch.className = Scope.getIconClassName(this.type); - }); - this.btnSize.addEventListener("click", () => { - this.zoom = 1; - this.zoomOffset = 0; - this.size = Scope.sizes[(Scope.sizes.indexOf(this.size) + 1) % 4]; - }); - this.btnCh.addEventListener("click", () => { - this.channel = (this.channel + 1) % this.channels; - }); - this.canvas.addEventListener("click", () => { - this.paused = !this.paused; - }); - this.canvas.addEventListener("wheel", e => { - var multiplier = Math.pow(1.5, e.deltaY > 0 ? -1 : 1); - var zoom = this.zoom; - var rect = this.canvas.getBoundingClientRect(); - var center = (e.pageX - rect.left) / rect.width / zoom + this.zoomOffset; - if (e.deltaY !== 0) { - this.zoom *= multiplier; - this.zoomOffset = center - center / this.zoom; - } - if (e.deltaX !== 0) this.zoomOffset += (e.deltaX > 0 ? 1 : -1) * 0.1; - }); - } - get size() { - return this._size; - } - set size(sizeIn) { - this.analyser.fftSize = sizeIn; - this.t = new Float32Array(this.analyser.fftSize); - this.ti = new Uint8Array(this.analyser.fftSize); - this.f = new Float32Array(this.analyser.frequencyBinCount); - this.btnSize.innerText = sizeIn.toString() + " samps"; - this._size = sizeIn; - } - get paused() { - return this._paused; - } - set paused(pausedIn) { - if (pausedIn === this.paused) return; - this._paused = pausedIn; - if (this.disabled) return; - if (this.paused) { - cancelAnimationFrame(this.raf); - this.raf = requestAnimationFrame(this.drawPause); - } else { - this.raf = requestAnimationFrame(this.draw); - } - } - get disabled() { - return this._disabled; - } - set disabled(disabledIn) { - if (disabledIn === this.disabled) return; - this._disabled = disabledIn; - if (this.paused) return; - if (this.disabled) { - cancelAnimationFrame(this.raf); - } else { - this.raf = requestAnimationFrame(this.draw); - } - } - get channel() { - return this._channel; - } - set channel(channelIn) { - if (channelIn >= this.channels) return; - var oldCh = this._channel; - this._channel = channelIn; - this.btnCh.innerText = "ch " + (this._channel + 1).toString(); - if (this._channel === oldCh) return; - this.splitter.connect(this.analyser, this._channel, 0); // Need to be done in the order, or Chrome inspect the graph and disable the analyser. - setTimeout(() => { - try { - this.splitter.disconnect(this.analyser, oldCh, 0); - } catch (_unused) {} // eslint-disable-line no-empty - }, 10); - this._channel = channelIn; - } - get zoom() { - return this._zoom; - } - set zoom(zoomIn) { - this._zoom = Math.min(16, Math.max(1, zoomIn)); - this.zoomOffset = this._zoomOffset; - } - get zoomOffset() { - return this._zoomOffset; - } - set zoomOffset(zoomOffsetIn) { - this._zoomOffset = Math.max(0, Math.min(1 - 1 / this._zoom, zoomOffsetIn)); - } -} -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(Scope, "sizes", [128, 512, 2048, 8192]); - -/***/ }), - -/***/ "./src/StaticScope.ts": -/*!****************************!*\ - !*** ./src/StaticScope.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ StaticScope: () => (/* binding */ StaticScope) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/utils.ts"); -/* harmony import */ var _StaticScope_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./StaticScope.scss */ "./src/StaticScope.scss"); -/* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); - - - -var EScopeMode; -(function (EScopeMode) { - EScopeMode[EScopeMode["Data"] = 0] = "Data"; - EScopeMode[EScopeMode["Interleaved"] = 1] = "Interleaved"; - EScopeMode[EScopeMode["Oscilloscope"] = 2] = "Oscilloscope"; - EScopeMode[EScopeMode["Spectroscope"] = 3] = "Spectroscope"; - EScopeMode[EScopeMode["Spectrogram"] = 4] = "Spectrogram"; -})(EScopeMode || (EScopeMode = {})); -class StaticScope { - static drawInterleaved(ctx, w, h, d, zoom, zoomOffset, vzoom, cursor) { - this.drawBackground(ctx, w, h); - if (!d) return; - var $ = d.$, - t = d.t, - freqEstimated = d.freqEstimated, - sampleRate = d.sampleRate, - drawMode = d.drawMode; - if (!t || !t.length || !t[0].length) return; - var l = t[0].length; - // Fastest way to get min and max to have: 1. max abs value for y scaling, 2. mean value for zero-crossing - var min = t[0][0]; - var max = t[0][0]; - var i = t.length; - var samp; - while (i--) { - var j = l; - while (j--) { - samp = t[i][j]; - if (samp < min) min = samp;else if (samp > max) max = samp; - } - } - var yFactor = Math.max(1, Math.abs(min), Math.abs(max)) * vzoom; - var $0 = 0; // Draw start - var $1 = l - 1; // Draw End - var $zerox = 0; - if (drawMode === "continuous" && l < sampleRate) { - // Stablize when window size < 1 sec - var thresh = (min + max) * 0.5 + 0.001; // the zero-crossing with "offset" - var period = sampleRate / freqEstimated; - var times = Math.floor(l / period) - 1; - while (t[0][(0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($zerox++, $, l)] > thresh && $zerox < l); - if ($zerox >= l - 1) { - $zerox = 0; - } else { - while (t[0][(0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($zerox++, $, l)] < thresh && $zerox < l); - if ($zerox >= l - 1) { - $zerox = 0; - } - } - var drawL = times > 0 && isFinite(period) ? Math.min(period * times, l - $zerox) : l - $zerox; - $0 = Math.round($zerox + drawL * zoomOffset); - $1 = Math.round($zerox + drawL / zoom + drawL * zoomOffset); - } else { - $0 = Math.round(l * zoomOffset); - $1 = Math.round(l / zoom + l * zoomOffset); - } - var left = 50; - var bottom = 20; - var hCh = (h - bottom) / t.length; // Height per channel - var eventsToDraw = this.drawGrid(ctx, w, h, $0 - $zerox, $1 - $zerox, $zerox, yFactor, d, EScopeMode.Interleaved); - var gridX = (w - left) / ($1 - $0 - 1); - var step = Math.max(1, Math.round(1 / gridX)); // horizontal draw step for optimization - ctx.lineWidth = 2; - for (var _i = 0; _i < t.length; _i++) { - ctx.beginPath(); - ctx.strokeStyle = "hsl(".concat(_i * 60, ", 100%, 85%)"); - var maxInStep = void 0; - var minInStep = void 0; - var $j = void 0; - var $step = void 0; - var x = void 0; - var y = void 0; - for (var _j = $0; _j < $1; _j++) { - $j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(_j, $, l); // True index - samp = t[_i][$j]; - $step = (_j - $0) % step; - if ($step === 0) { - maxInStep = samp; - minInStep = samp; - } else { - if (samp > maxInStep) maxInStep = samp; - if (samp < minInStep) minInStep = samp; - } - if ($step !== step - 1) continue; - x = (_j - $0) * gridX + left; - y = hCh * (_i + 0.5 - maxInStep / yFactor * 0.5); - if (_j === $0) ctx.moveTo(x, y);else ctx.lineTo(x, y); - if (minInStep !== maxInStep) { - y = hCh * (_i + 0.5 - minInStep / yFactor * 0.5); - ctx.lineTo(x, y); - } - } - ctx.stroke(); - } - eventsToDraw.forEach(params => this.drawEvent(ctx, w, h, ...params)); - if (cursor && cursor.x > left && cursor.y < h - bottom) { - var statsToDraw = { - values: [] - }; - var $cursor = Math.round($0 + (cursor.x - left) / gridX); - statsToDraw.values = []; - statsToDraw.x = ($cursor - $0) * gridX + left; - statsToDraw.xLabel = ($cursor - $zerox).toFixed(0); - var _$j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($cursor, $, l); - for (var _i2 = 0; _i2 < t.length; _i2++) { - var _samp = t[_i2][_$j]; - if (typeof _samp === "number") statsToDraw.values.push(_samp); - } - this.drawStats(ctx, w, h, statsToDraw); - } - } - static drawOscilloscope(ctx, w, h, d, zoom, zoomOffset, vzoom, cursor) { - this.drawBackground(ctx, w, h); - if (!d) return; - var $ = d.$, - t = d.t, - freqEstimated = d.freqEstimated, - sampleRate = d.sampleRate, - drawMode = d.drawMode; - if (!t || !t.length || !t[0].length) return; - var l = t[0].length; - // Fastest way to get min and max to have: 1. max abs value for y scaling, 2. mean value for zero-crossing - var min = t[0][0]; - var max = t[0][0]; - var i = t.length; - var samp; - while (i--) { - var j = l; - while (j--) { - samp = t[i][j]; - if (samp < min) min = samp;else if (samp > max) max = samp; - } - } - var yFactor = Math.max(1, Math.abs(min), Math.abs(max)) * vzoom; - var $0 = 0; // Draw start - var $1 = l - 1; // Draw End - var $zerox = 0; - if (drawMode === "continuous" && l < sampleRate) { - // Stablize when window size < 1 sec - var thresh = (min + max) * 0.5 + 0.001; // the zero-crossing with "offset" - var period = sampleRate / freqEstimated; - var times = Math.floor(l / period) - 1; - while (t[0][(0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($zerox++, $, l)] > thresh && $zerox < l); // Find first raise - if ($zerox >= l - 1) { - // Found nothing, no stablization - $zerox = 0; - } else { - while (t[0][(0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($zerox++, $, l)] < thresh && $zerox < l); // Find first drop - if ($zerox >= l - 1) { - $zerox = 0; - } - } - var drawL = times > 0 && isFinite(period) ? Math.min(period * times, l - $zerox) : l - $zerox; // length to draw - $0 = Math.round($zerox + drawL * zoomOffset); - $1 = Math.round($zerox + drawL / zoom + drawL * zoomOffset); - } else { - $0 = Math.round(l * zoomOffset); - $1 = Math.round(l / zoom + l * zoomOffset); - } - var left = 50; - var bottom = 20; - var eventsToDraw = this.drawGrid(ctx, w, h, $0 - $zerox, $1 - $zerox, $zerox, yFactor, d, EScopeMode.Oscilloscope); - var gridX = (w - left) / ($1 - $0 - 1); - var step = Math.max(1, Math.round(1 / gridX)); - ctx.lineWidth = 2; - for (var _i3 = 0; _i3 < t.length; _i3++) { - ctx.beginPath(); - ctx.strokeStyle = t.length === 1 ? "white" : "hsl(".concat(_i3 * 60, ", 100%, 85%)"); - var maxInStep = void 0; - var minInStep = void 0; - var $j = void 0; - var $step = void 0; - var x = void 0; - var y = void 0; - for (var _j2 = $0; _j2 < $1; _j2++) { - $j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(_j2, $, l); - samp = t[_i3][$j]; - $step = (_j2 - $0) % step; - if ($step === 0) { - maxInStep = samp; - minInStep = samp; - } else { - if (samp > maxInStep) maxInStep = samp; - if (samp < minInStep) minInStep = samp; - } - if ($step !== step - 1) continue; - x = (_j2 - $0) * gridX + left; - y = (h - bottom) * (0.5 - maxInStep / yFactor * 0.5); - if (_j2 === $0) ctx.moveTo(x, y);else ctx.lineTo(x, y); - if (minInStep !== maxInStep) { - y = (h - bottom) * (0.5 - minInStep / yFactor * 0.5); - ctx.lineTo(x, y); - } - } - ctx.stroke(); - } - eventsToDraw.forEach(params => this.drawEvent(ctx, w, h, ...params)); - if (cursor && cursor.x > left && cursor.y < h - bottom) { - var statsToDraw = { - values: [] - }; - var $cursor = Math.round($0 + (cursor.x - left) / gridX); - statsToDraw.values = []; - statsToDraw.x = ($cursor - $0) * gridX + left; - statsToDraw.xLabel = ($cursor - $zerox).toFixed(0); - var _$j2 = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($cursor, $, l); - for (var _i4 = 0; _i4 < t.length; _i4++) { - var _samp2 = t[_i4][_$j2]; - if (typeof _samp2 === "number") statsToDraw.values.push(_samp2); - } - this.drawStats(ctx, w, h, statsToDraw); - } - } - static drawSpectroscope(ctx, w, h, d, zoom, zoomOffset, cursor) { - this.drawBackground(ctx, w, h); - if (!d) return; - var $ = d.$, - f = d.f, - fftSize = d.fftSize, - fftOverlap = d.fftOverlap; - if (!f || !f.length || !f[0].length) return; - var fftBins = fftSize / 2; - var $f = $ * fftOverlap / 2; - $f -= $f % fftBins; - var l = f[0].length; - var $0 = l - fftBins + Math.round(fftBins * zoomOffset); - var $1 = l - fftBins + Math.round(fftBins / zoom + fftBins * zoomOffset); - var left = 50; - var bottom = 20; - var hCh = (h - bottom) / f.length; - var eventsToDraw = this.drawGrid(ctx, w, h, $0, $1, 0, 1, d, EScopeMode.Spectroscope); - var gridX = (w - left) / ($1 - $0 - 1); - var step = Math.max(1, Math.round(1 / gridX)); - for (var i = 0; i < f.length; i++) { - ctx.beginPath(); - ctx.fillStyle = f.length === 1 ? "white" : "hsl(".concat(i * 60, ", 100%, 85%)"); - var maxInStep = void 0; - for (var j = $0; j < $1; j++) { - var $j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(j, $f, l); - var samp = f[i][$j]; - var $step = (j - $0) % step; - if ($step === 0) maxInStep = samp; - if ($step !== step - 1) { - if ($step !== 0 && samp > maxInStep) maxInStep = samp; - continue; - } - var x = (j - $0) * gridX + left; - var y = hCh * (i + 1 - Math.min(1, Math.max(0, maxInStep / 100 + 1))); - if (j === $0) ctx.moveTo(x, y);else ctx.lineTo(x, y); - } - ctx.lineTo(w, hCh * (i + 1)); - ctx.lineTo(left, hCh * (i + 1)); - ctx.closePath(); - ctx.fill(); - } - eventsToDraw.forEach(params => this.drawEvent(ctx, w, h, ...params)); - if (cursor && cursor.x > left && cursor.y < h - bottom) { - var statsToDraw = { - values: [] - }; - var $cursor = $0 + Math.round((cursor.x - left) / gridX); - statsToDraw.values = []; - statsToDraw.x = ($cursor - $0) * gridX + left; - statsToDraw.xLabel = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.indexToFreq)($cursor, fftBins, d.sampleRate).toFixed(0); - var _$j3 = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($cursor, $f, l); - for (var _i5 = 0; _i5 < f.length; _i5++) { - var _samp3 = f[_i5][_$j3]; - if (typeof _samp3 === "number") statsToDraw.values.push(_samp3); - } - this.drawStats(ctx, w, h, statsToDraw); - } - } - static drawSpectrogram(ctx, tempCtx, w, h, d, zoom, zoomOffset, cursor) { - this.drawBackground(ctx, w, h); - if (!d) return; - var $ = d.$, - f = d.f, - fftSize = d.fftSize, - fftOverlap = d.fftOverlap; - if (!f || !f.length || !f[0].length) return; - var fftBins = fftSize / 2; - var $f = $ * fftOverlap / 2; - $f -= $f % fftBins; - var l = f[0].length / fftBins; - var $0fft = Math.floor(l * zoomOffset); - var $1fft = Math.ceil(l / zoom + l * zoomOffset); - var $0 = $0fft * fftBins; - var $1 = $1fft * fftBins; - var eventsToDraw = this.drawGrid(ctx, w, h, $0, $1, 0, 1, d, EScopeMode.Spectrogram); - ctx.save(); - ctx.globalCompositeOperation = "lighter"; - ctx.imageSmoothingEnabled = false; - var left = 50; - var bottom = 20; - var $0src = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($0fft, $f / fftBins, l); - var $1src = $0src + $1fft - $0fft; - if ($1src > l) { - var split$ = l - $0src; - ctx.drawImage(tempCtx.canvas, $0src, 0, split$, tempCtx.canvas.height, left, 0, split$ / ($1src - $0src) * (w - left), h - bottom); - ctx.drawImage(tempCtx.canvas, 0, 0, $1src - l - 0.01, tempCtx.canvas.height, split$ / ($1src - $0src) * (w - left) + left, 0, (1 - split$ / ($1src - $0src)) * (w - left), h - bottom); - } else { - ctx.drawImage(tempCtx.canvas, $0src, 0, $1src - $0src, tempCtx.canvas.height, left, 0, w - left, h - bottom); - } - ctx.restore(); - eventsToDraw.forEach(params => this.drawEvent(ctx, w, h, ...params)); - if (cursor && cursor.x > left && cursor.y < h - bottom) { - var statsToDraw = { - values: [] - }; - var gridX = (w - left) / ($1fft - $0fft); - var gridY = (h - bottom) / f.length / fftBins; - var $fft = $0fft + Math.floor((cursor.x - left) / gridX); - var $ch = Math.floor(cursor.y / gridY / fftBins); - var $bin = Math.floor((h - bottom - cursor.y) / gridY) % fftBins; - var $cursor = $fft * fftBins + $bin; - var $j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($cursor, $f, f[0].length); - var freq = $j % fftBins / fftBins * d.sampleRate / 2; - var samp = f[$ch][$j]; - if (typeof samp === "number") statsToDraw.values = [samp]; - statsToDraw.x = ($fft - $0fft + 0.5) * gridX + left; - statsToDraw.y = (($ch + 1) * fftBins - $bin) * gridY; - statsToDraw.xLabel = $fft.toFixed(0); - statsToDraw.yLabel = freq.toFixed(0); - this.drawStats(ctx, w, h, statsToDraw); - } - } - static drawOfflineSpectrogram(ctx, d, last$) { - if (!d) return last$; - var $ = d.$, - f = d.f, - fftSize = d.fftSize, - fftOverlap = d.fftOverlap; - if (!f || !f.length || !f[0].length) return last$; - var fftBins = fftSize / 2; - var $f = $ * fftOverlap / 2; - $f -= $f % fftBins; - var _ctx$canvas = ctx.canvas, - canvasWidth = _ctx$canvas.width, - h = _ctx$canvas.height; - var l = f[0].length; - var $0 = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(last$, 0, l); - var $1 = $0 >= $f ? $f + l : $f; - if ($1 - $0 < 0) return last$; - var $0fft = Math.floor($0 / fftBins); - var $1fft = Math.ceil($1 / fftBins); - var hCh = h / f.length; - var w = l / fftBins; - var $h = hCh / fftBins; - if (canvasWidth !== w) ctx.canvas.width = w; - var step = Math.max(1, Math.round(fftBins / hCh)); - for (var i = 0; i < f.length; i++) { - for (var j = $0fft; j < $1fft; j++) { - var maxInStep = void 0; - ctx.fillStyle = "black"; - ctx.fillRect(j % w, i * hCh, 1, hCh); - for (var k = 0; k < fftBins; k++) { - var samp = f[i][(0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(k, j * fftBins, l)]; - var $step = k % step; - if ($step === 0) maxInStep = samp; - if ($step !== step - 1) { - if ($step !== 0 && samp > maxInStep) maxInStep = samp; - continue; - } - var normalized = Math.min(1, Math.max(0, (maxInStep + 10) / 100 + 1)); - if (normalized === 0) continue; - var hue = (normalized * 180 + 240) % 360; - var lum = normalized * 50; - ctx.fillStyle = "hsl(".concat(hue, ", 100%, ").concat(lum, "%)"); - ctx.fillRect(j % w, (fftBins - k - 1) * $h + i * hCh, 1, Math.max(1, $h)); - } - } - } - return (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)($1, 0, l); - } - static drawBackground(ctx, w, h) { - ctx.save(); - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, w, h); - ctx.restore(); - } - static drawGrid(ctx, w, h, $0, $1, $zerox, yFactor, d, mode) { - ctx.save(); - ctx.setLineDash([]); - ctx.lineWidth = 1; - var t = d.t, - e = d.e, - bufferSize = d.bufferSize, - fftSize = d.fftSize, - fftOverlap = d.fftOverlap, - sampleRate = d.sampleRate; - var inFreqDomain = mode === EScopeMode.Spectrogram || mode === EScopeMode.Spectroscope; - var fftBins = fftSize / 2; - var channels = mode === EScopeMode.Oscilloscope ? 1 : t.length; - var unit = mode === EScopeMode.Spectrogram ? "Hz/frame" : mode === EScopeMode.Spectroscope ? "dB/Hz" : "lvl/samp"; - var eventsToDraw = []; - var $0buffer = $0 / bufferSize / (inFreqDomain ? fftOverlap / 2 : 1); - var $1buffer = $1 / bufferSize / (inFreqDomain ? fftOverlap / 2 : 1); - var hStep = Math.pow(2, Math.ceil(Math.log2($1buffer - $0buffer))) / 8; - $0buffer -= $0buffer % hStep; - $1buffer -= $0buffer % hStep; - var $buffer = (d.$buffer || 0) + Math.round($zerox / bufferSize / (inFreqDomain ? fftOverlap / 2 : 1)); - if (inFreqDomain) $buffer -= $buffer % (fftBins / bufferSize / fftOverlap / 2); - var left = 50; - var bottom = 20; - var eventStrokeStyle = "#ff8800"; - var bufferStrokeStyle = "#004000"; - var normalStrokeStyle = "#404040"; - ctx.fillStyle = "#DDDD99"; - ctx.font = "10px Consolas, monospace"; - ctx.textAlign = "right"; - ctx.textBaseline = "middle"; - ctx.fillText(unit, 45, h - 10, 40); - ctx.textAlign = "center"; - ctx.strokeStyle = "white"; - ctx.beginPath(); - ctx.moveTo(left, 0); - ctx.lineTo(left, h - bottom); - ctx.lineTo(w, h - bottom); - ctx.stroke(); - ctx.strokeStyle = bufferStrokeStyle; - for (var j = $0buffer; j < $1buffer; j += hStep) { - var $fft = j / (fftBins / bufferSize) * fftOverlap / 2; - var x = (j * bufferSize * (inFreqDomain ? fftOverlap / 2 : 1) - $0) / ($1 - $0 - 1) * (w - left) + left; - if (x < left) continue; - ctx.strokeStyle = j % 1 === 0 ? bufferStrokeStyle : normalStrokeStyle; - ctx.beginPath(); - ctx.moveTo(x, 0); - ctx.lineTo(x, h - bottom); - ctx.stroke(); - if (mode === EScopeMode.Spectrogram) { - if ($fft % 1 === 0) ctx.fillText($fft.toFixed(), Math.min(x, w - 20), h - 10); - } else if (mode === EScopeMode.Spectroscope) { - ctx.fillText(($fft % 1 * sampleRate / 2).toFixed(), Math.min(x, w - 20), h - 10); - } else { - ctx.fillText((j * bufferSize).toFixed(), Math.min(x, w - 20), h - 10); - } - } - if (e) { - ctx.strokeStyle = eventStrokeStyle; - for (var _j3 = Math.ceil($0buffer); _j3 < $1buffer; _j3++) { - if (e[$buffer + _j3] && e[$buffer + _j3].length) { - var _x = (_j3 * bufferSize * (inFreqDomain ? fftOverlap / 2 : 1) - $0) / ($1 - $0 - 1) * (w - left) + left; - if (_x < left) continue; - eventsToDraw.push([_x, e[$buffer + _j3]]); - ctx.beginPath(); - ctx.moveTo(_x, 0); - ctx.lineTo(_x, h - bottom); - ctx.stroke(); - } - } - } - ctx.strokeStyle = normalStrokeStyle; - var hCh = (h - bottom) / channels; - var vStep = 0.25; - while (yFactor / vStep > 2) vStep *= 2; // Maximum horizontal grids in channel one side = 2 - ctx.beginPath(); - ctx.textAlign = "right"; - var drawHLine = (y, yLabel) => { - ctx.moveTo(left, y); - ctx.lineTo(w, y); - ctx.fillText(yLabel, 45, Math.max(y, 10)); - }; - var _loop = function _loop() { - var y = (i + 0.5) * hCh; - var $ = 0.5; - var getYLabel = () => mode === EScopeMode.Spectrogram ? (0,_utils__WEBPACK_IMPORTED_MODULE_1__.indexToFreq)(fftBins * $, fftBins, sampleRate).toFixed(0) : mode === EScopeMode.Spectroscope ? (-100 + 100 * $).toFixed(0) : (-yFactor + 2 * yFactor * $).toFixed(2); - var yLabel = getYLabel(); - drawHLine(y, yLabel); - for (var _j4 = vStep; _j4 < yFactor; _j4 += vStep) { - $ = 0.5 - _j4 / yFactor / 2; - y = (i + 0.5 + _j4 / yFactor / 2) * hCh; - yLabel = getYLabel(); - drawHLine(y, yLabel); - $ = 0.5 + _j4 / yFactor / 2; - y = (i + 0.5 - _j4 / yFactor / 2) * hCh; - yLabel = getYLabel(); - drawHLine(y, yLabel); - } - }; - for (var i = 0; i < channels; i++) { - _loop(); - } - ctx.stroke(); - ctx.beginPath(); - ctx.setLineDash([4, 2]); - ctx.strokeStyle = "white"; - for (var _i6 = 1; _i6 < channels; _i6++) { - ctx.moveTo(0, _i6 * hCh); - ctx.lineTo(w, _i6 * hCh); - } - ctx.stroke(); - ctx.restore(); - return eventsToDraw; - } - static drawEvent(ctx, w, h, x, e) { - ctx.save(); - ctx.font = "bold 12px Consolas, monospace"; - ctx.fillStyle = "rgba(0, 0, 0, 0.75)"; - var eStrings = e.map(event => event.data.path ? "".concat(event.data.path, ": ").concat(event.data.value) : "".concat(event.type, ": ").concat(event.data.join(","))); - var textWidth = Math.max(...eStrings.map(s => ctx.measureText(s).width)) + 5; - if (w - x >= textWidth) { - ctx.fillRect(x, 0, textWidth, e.length * 15 + 2); - ctx.textAlign = "left"; - } else { - ctx.fillRect(x - textWidth, 0, textWidth, e.length * 15 + 2); - ctx.textAlign = "right"; - } - ctx.fillStyle = "#DDDD99"; - eStrings.forEach((s, i) => ctx.fillText(s, x, (i + 1) * 15, textWidth)); - ctx.restore(); - } - static drawStats(ctx, w, h, statsToDraw) { - var left = 50; - var bottom = 20; - ctx.save(); - ctx.lineWidth = 1; - ctx.strokeStyle = "#b0b0b0"; - ctx.beginPath(); - var x = statsToDraw.x, - y = statsToDraw.y, - xLabel = statsToDraw.xLabel, - yLabel = statsToDraw.yLabel, - values = statsToDraw.values; - if (x) { - ctx.moveTo(x, 0); - ctx.lineTo(x, h - bottom); - } - if (y) { - ctx.moveTo(left, y); - ctx.lineTo(w, y); - } - ctx.stroke(); - ctx.fillStyle = "rgba(0, 0, 0, 0.5)"; - if (xLabel) ctx.fillRect(Math.min(x - 20, w - 40), h - 18, 40, 16); - if (yLabel) ctx.fillRect(5, Math.max(0, y - 8), 45, 16); - ctx.fillStyle = "#DDDD99"; - ctx.font = "bold 12px Consolas, monospace"; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - if (xLabel) ctx.fillText(xLabel, Math.min(x, w - 20), h - 10, 40); - ctx.textAlign = "right"; - if (yLabel) ctx.fillText(yLabel, 40, Math.max(10, y), 40); - ctx.textBaseline = "bottom"; - var right = []; - values.forEach(v => right.push(v.toFixed(7))); - ctx.fillStyle = "rgba(0, 0, 0, 0.75)"; - ctx.fillRect(w - 70, 0, 80, right.length * 15 + 5); - ctx.fillStyle = "#DDDD99"; - right.forEach((s, i) => ctx.fillText(s, w - 2, (i + 1) * 15, 70)); - ctx.restore(); - } - static fillDivData(container, d) { - container.innerHTML = ""; - if (!d) return; - var $ = d.$, - t = d.t, - e = d.e; - if (!t || !t.length || !t[0].length) return; - var l = t[0].length; - for (var i = 0; i < t.length; i++) { - var ch = t[i]; - var divCh = document.createElement("div"); - divCh.classList.add("static-scope-channel"); - divCh.style.backgroundColor = t.length === 1 ? "#181818" : "hsl(".concat(i * 60, ", 100%, 10%)"); - for (var j = 0; j < Math.min(ch.length, 2048); j++) { - var $j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(j, $, l); - var divCell = document.createElement("div"); - divCell.classList.add("static-scope-cell"); - var $buffer = (d.$buffer || 0) + Math.floor(j / d.bufferSize); - if (e && e[$buffer] && e[$buffer].length && j % d.bufferSize === 0) divCell.classList.add("highlight"); - var spanIndex = document.createElement("span"); - spanIndex.innerText = j.toString(); - var spanSamp = document.createElement("span"); - spanSamp.innerText = ch[$j].toFixed(7); - divCell.appendChild(spanIndex); - divCell.appendChild(spanSamp); - divCh.appendChild(divCell); - } - if (ch.length > 2048) { - var _divCell = document.createElement("div"); - _divCell.classList.add("static-scope-cell"); - var _spanIndex = document.createElement("span"); - _spanIndex.innerText = "..."; - var _spanSamp = document.createElement("span"); - _spanSamp.innerText = "..."; - _divCell.appendChild(_spanIndex); - _divCell.appendChild(_spanSamp); - divCh.appendChild(_divCell); - } - container.appendChild(divCh); - } - } - static getIconClassName(typeIn) { - var prefix = "fas fa-sm "; - if (typeIn === EScopeMode.Data) return prefix + "fa-table"; - if (typeIn === EScopeMode.Interleaved) return prefix + "fa-water"; - if (typeIn === EScopeMode.Oscilloscope) return prefix + "fa-wave-square"; - if (typeIn === EScopeMode.Spectroscope) return prefix + "fa-chart-bar"; - if (typeIn === EScopeMode.Spectrogram) return prefix + "fa-align-justify"; - return prefix; - } - static getModeName(typeIn) { - if (typeIn === EScopeMode.Data) return "Data"; - if (typeIn === EScopeMode.Interleaved) return "Interleaved"; - if (typeIn === EScopeMode.Oscilloscope) return "Oscilloscope"; - if (typeIn === EScopeMode.Spectroscope) return "Spectroscope"; - if (typeIn === EScopeMode.Spectrogram) return "Spectrogram"; - return ""; - } - constructor(options) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "raf", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "ctx", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "container", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "canvas", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnSwitch", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnZoomOut", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnZoom", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnZoomIn", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "btnDownload", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "iSwitch", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "spanSwitch", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "divData", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "divDefault", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_mode", EScopeMode.Oscilloscope); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_zoom", { - oscilloscope: 1, - spectroscope: 1, - spectrogram: 1 - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_vzoom", { - oscilloscope: 1, - spectroscope: 1, - spectrogram: 1 - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "_zoomOffset", { - oscilloscope: 0, - spectroscope: 0, - spectrogram: 0 - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "data", { - drawMode: "manual", - t: undefined, - $: 0, - $buffer: 0, - bufferSize: 128, - fftSize: 256, - fftOverlap: 2 - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "cursor", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "dragging", false); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "spectTempCtx", void 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "lastSpect$", 0); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "drawSpectrogram", false); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "newDataArrived", false); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleMouseMove", e => { - if (!this.data || !this.data.t || !this.data.t.length || !this.data.t[0].length) return; - if (this.mode === EScopeMode.Data) return; - var w = this.container.clientWidth; - var h = this.container.clientHeight; - var rect = this.canvas.getBoundingClientRect(); - var x = e instanceof MouseEvent ? e.offsetX : e.touches[0].pageX - rect.left; - x = Math.max(0, Math.min(w, x)); - var y = e instanceof MouseEvent ? e.offsetY : e.touches[0].pageY - rect.top; - y = Math.max(0, Math.min(h, y)); - this.cursor = { - x, - y - }; - // if (this.data.drawMode === "continuous") return; - this.draw(); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleMouseDown", eDown => { - if (!this.data || !this.data.t || !this.data.t.length || !this.data.t[0].length) return; - if (this.mode === EScopeMode.Data) return; - eDown.preventDefault(); - eDown.stopPropagation(); - this.dragging = true; - this.canvas.style.cursor = "grab"; - var origZoom = this.zoom; - var origOffset = this.zoomOffset; - var prevX = eDown instanceof MouseEvent ? eDown.pageX : eDown.touches[0].pageX; - // let prevY = eDown instanceof MouseEvent ? eDown.pageY : eDown.touches[0].pageY; - var handleMouseMove = eMove => { - var x = eMove instanceof MouseEvent ? eMove.pageX : eMove.touches[0].pageX; - // const y = eMove instanceof MouseEvent ? eMove.pageY : eMove.touches[0].pageY; - var dX = x - prevX; - // const dY = y - prevY; - prevX = x; - // prevY = y; - // const multiplier = 1 / 1.015 ** dY; - var offset = -dX / this.zoom / this.canvas.width; - // if (multiplier !== 1) this.zoom *= multiplier; - if (offset !== 0) this.zoomOffset += offset; - if (this.zoom !== origZoom || this.zoomOffset !== origOffset) this.draw(); - }; - var handleMouseUp = () => { - this.dragging = false; - this.canvas.style.cursor = ""; - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("touchmove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - document.removeEventListener("touchend", handleMouseUp); - }; - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("touchmove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); - document.addEventListener("touchend", handleMouseUp); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "handleMouseLeave", () => { - if (!this.data || !this.data.t || !this.data.t.length || !this.data.t[0].length) return; - if (this.mode === EScopeMode.Data) return; - this.cursor = undefined; - this.draw(); - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "drawCallback", () => { - this.raf = undefined; - if (!this.data || !this.data.t || !this.data.t.length || !this.data.t[0].length) { - if (this.divDefault.style.display === "none") { - this.divDefault.style.display = "block"; - return; - } - } else if (this.divDefault.style.display !== "none") this.divDefault.style.display = "none"; - if (this.data && this.newDataArrived && this.drawSpectrogram) this.lastSpect$ = StaticScope.drawOfflineSpectrogram(this.spectTempCtx, this.data, this.lastSpect$); - if (this.data.drawMode === "continuous" && this.canvas.offsetParent === null) return; // not visible - var w = this.container.clientWidth; - var h = this.container.clientHeight; - if (this.canvas.width !== w) this.canvas.width = w; - if (this.canvas.height !== h) this.canvas.height = h; - if (this.mode === EScopeMode.Data) StaticScope.fillDivData(this.divData, this.data);else if (this.mode === EScopeMode.Interleaved) StaticScope.drawInterleaved(this.ctx, w, h, this.data, this.zoom, this.zoomOffset, this.vzoom, this.cursor);else if (this.mode === EScopeMode.Oscilloscope) StaticScope.drawOscilloscope(this.ctx, w, h, this.data, this.zoom, this.zoomOffset, this.vzoom, this.cursor);else if (this.mode === EScopeMode.Spectroscope) StaticScope.drawSpectroscope(this.ctx, w, h, this.data, this.zoom, this.zoomOffset, this.cursor);else if (this.mode === EScopeMode.Spectrogram) StaticScope.drawSpectrogram(this.ctx, this.spectTempCtx, w, h, this.data, this.zoom, this.zoomOffset, this.cursor); - this.newDataArrived = false; - }); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(this, "draw", data => { - if (data) { - this.data = data; - this.newDataArrived = true; - } - if (this.raf) return; - this.raf = requestAnimationFrame(this.drawCallback); - }); - Object.assign(this, options); - this.getChildren(); - this.bind(); - this.mode = EScopeMode.Oscilloscope; - } - getChildren() { - this.spectTempCtx = document.createElement("canvas").getContext("2d"); - this.spectTempCtx.canvas.height = 1024; - var ctrl; - for (var i = 0; i < this.container.children.length; i++) { - var e = this.container.children[i]; - if (e.classList.contains("static-scope-ui-controller")) ctrl = e; - if (e.classList.contains("static-scope-canvas")) this.canvas = e; - if (e.classList.contains("static-scope-data")) this.divData = e; - if (e.classList.contains("static-scope-default")) this.divDefault = e; - } - if (!ctrl) { - ctrl = document.createElement("div"); - ctrl.classList.add("static-scope-ui-controller"); - this.container.appendChild(ctrl); - } - if (!this.canvas) { - var canvas = document.createElement("canvas"); - canvas.classList.add("static-scope-canvas"); - this.container.appendChild(canvas); - this.canvas = canvas; - } - if (!this.divData) { - var divData = document.createElement("div"); - divData.classList.add("static-scope-data"); - this.container.appendChild(divData); - this.divData = divData; - } - if (!this.divDefault) { - var divDefault = document.createElement("div"); - divDefault.classList.add("static-scope-default", "alert", "alert-info"); - divDefault.setAttribute("role", "alert"); - divDefault.innerHTML = "
No Data
"; - this.container.appendChild(divDefault); - this.divDefault = divDefault; - } - this.ctx = this.canvas.getContext("2d"); - for (var _i7 = 0; _i7 < ctrl.children.length; _i7++) { - var _e = ctrl.children[_i7]; - if (_e.classList.contains("static-scope-ui-switch")) this.btnSwitch = _e; - if (_e.classList.contains("static-scope-ui-zoomout")) this.btnZoomOut = _e; - if (_e.classList.contains("static-scope-ui-zoom")) this.btnZoom = _e; - if (_e.classList.contains("static-scope-ui-zoomin")) this.btnZoomIn = _e; - if (_e.classList.contains("static-scope-ui-download")) this.btnDownload = _e; - } - if (!this.btnSwitch) { - var btn = document.createElement("button"); - btn.className = "static-scope-ui-switch btn btn-outline-light btn-sm btn-overlay btn-overlay-icon"; - btn.setAttribute("data-toggle", "tooltip"); - btn.setAttribute("data-placement", "top"); - btn.setAttribute("title", "Interleaved Scope / Stacked Scope / Data"); - ctrl.appendChild(btn); - try { - $(btn).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - this.btnSwitch = btn; - } - if (!this.btnZoomOut) { - var _btn = document.createElement("button"); - _btn.className = "static-scope-ui-zoomout btn btn-outline-light btn-sm btn-overlay btn-overlay-icon"; - _btn.setAttribute("data-toggle", "tooltip"); - _btn.setAttribute("data-placement", "top"); - _btn.setAttribute("title", "Zoom Out"); - _btn.innerHTML = ''; - ctrl.appendChild(_btn); - try { - $(_btn).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - this.btnZoomOut = _btn; - } - if (!this.btnZoom) { - var _btn2 = document.createElement("button"); - _btn2.className = "static-scope-ui-zoom btn btn-outline-light btn-sm btn-overlay"; - _btn2.setAttribute("data-toggle", "tooltip"); - _btn2.setAttribute("data-placement", "top"); - _btn2.setAttribute("title", "Reset Zoom"); - _btn2.innerText = "1.0x"; - ctrl.appendChild(_btn2); - try { - $(_btn2).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - this.btnZoom = _btn2; - } - if (!this.btnZoomIn) { - var _btn3 = document.createElement("button"); - _btn3.className = "static-scope-ui-zoomin btn btn-outline-light btn-sm btn-overlay btn-overlay-icon"; - _btn3.setAttribute("data-toggle", "tooltip"); - _btn3.setAttribute("data-placement", "top"); - _btn3.setAttribute("title", "Zoom In"); - _btn3.innerHTML = ''; - ctrl.appendChild(_btn3); - try { - $(_btn3).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - this.btnZoomIn = _btn3; - } - if (!this.btnDownload) { - var _btn4 = document.createElement("button"); - _btn4.className = "static-scope-ui-download btn btn-outline-light btn-sm btn-overlay btn-overlay-icon"; - _btn4.setAttribute("data-toggle", "tooltip"); - _btn4.setAttribute("data-placement", "top"); - _btn4.setAttribute("title", "Download Data"); - _btn4.innerHTML = ''; - ctrl.appendChild(_btn4); - try { - $(_btn4).tooltip({ - trigger: "hover", - boundary: "viewport" - }); - } catch (e) {} // eslint-disable-line no-empty - this.btnDownload = _btn4; - } - for (var _i8 = 0; _i8 < this.btnSwitch.children.length; _i8++) { - var _e2 = this.btnSwitch.children[_i8]; - if (_e2.classList.contains("fas")) this.iSwitch = _e2; - if (_e2 instanceof HTMLSpanElement) this.spanSwitch = _e2; - } - if (!this.iSwitch) { - var _i9 = document.createElement("i"); - _i9.className = "fas fa-sm fa-wave-square"; - this.btnSwitch.appendChild(_i9); - this.iSwitch = _i9; - } - if (!this.spanSwitch) { - var span = document.createElement("span"); - span.innerText = "Oscilloscope"; - this.btnSwitch.appendChild(span); - this.spanSwitch = span; - } - } - bind() { - this.btnSwitch.addEventListener("click", () => { - var newType = (this.mode + 1) % 5; - if (newType === EScopeMode.Spectrogram && !this.drawSpectrogram) newType = (newType + 1) % 5; - if (newType === EScopeMode.Data && this.data.drawMode === "continuous") newType = (newType + 1) % 5; - if (newType === EScopeMode.Interleaved && this.data.t && this.data.t.length === 1) newType = (newType + 1) % 5; - this.mode = newType; - }); - this.canvas.addEventListener("click", () => {}); - this.canvas.addEventListener("wheel", e => { - var left = 50; - var bottom = 20; - var multiplier = Math.pow(1.5, e.deltaY > 0 ? -1 : 1); - if (e.offsetX < left && e.offsetY < this.canvas.height - bottom) { - if (multiplier !== 1) this.vzoom *= 1 / multiplier; - this.draw(); - } else { - if (multiplier !== 1) this.zoom *= multiplier; - if (e.deltaX !== 0) this.zoomOffset += (e.deltaX > 0 ? 1 : -1) * 0.1; - this.handleMouseMove(e); - } - }); - this.btnZoomOut.addEventListener("click", () => { - this.zoom /= 1.5; - this.draw(); - }); - this.btnZoom.addEventListener("click", () => { - this.zoom = 1; - this.draw(); - }); - this.btnZoomIn.addEventListener("click", () => { - this.zoom *= 1.5; - this.draw(); - }); - this.btnDownload.addEventListener("click", () => { - var data = ""; - if (this.mode === EScopeMode.Data || this.mode === EScopeMode.Interleaved || this.mode === EScopeMode.Oscilloscope) { - if (this.data.t) { - var _this$data = this.data, - t = _this$data.t, - _$ = _this$data.$; - if (!t || !t.length || !t[0].length) return; - var l = t[0].length; - data += new Array(t.length).fill(null).map((v, i) => "channel".concat(i + 1)).join(",") + "\n"; - for (var j = 0; j < l; j++) { - for (var i = 0; i < t.length; i++) { - var $j = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(j, _$, l); - var samp = t[i][$j]; - data += samp + (i === t.length - 1 ? "\n" : ","); - } - } - } - } else if (this.mode === EScopeMode.Spectroscope) { - var _this$data2 = this.data, - _$2 = _this$data2.$, - f = _this$data2.f, - fftSize = _this$data2.fftSize, - fftOverlap = _this$data2.fftOverlap; - if (!f || !f.length || !f[0].length) return; - var fftBins = fftSize / 2; - var $f = _$2 * fftOverlap / 2; - $f -= $f % fftBins; - var _l = f[0].length; - data += new Array(f.length).fill(null).map((v, i) => "channel".concat(i + 1)).join(",") + "\n"; - for (var _j5 = _l - fftBins; _j5 < _l; _j5++) { - for (var _i10 = 0; _i10 < f.length; _i10++) { - var _$j4 = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(_j5, $f, _l); - var _samp4 = f[_i10][_$j4]; - data += _samp4 + (_i10 === f.length - 1 ? "\n" : ","); - } - } - } else if (this.mode === EScopeMode.Spectrogram) { - var _this$data3 = this.data, - _$3 = _this$data3.$, - _f = _this$data3.f, - _fftSize = _this$data3.fftSize, - _fftOverlap = _this$data3.fftOverlap; - if (!_f || !_f.length || !_f[0].length) return; - var _fftBins = _fftSize / 2; - var _$f = _$3 * _fftOverlap / 2; - _$f -= _$f % _fftBins; - var _l2 = _f[0].length; - data += new Array(_l2 / _fftBins).fill(null).map((v, i) => new Array(_f.length).fill(null).map((v, j) => "frame".concat(i + 1, "_channel").concat(j + 1)).join(",")).join(",") + "\n"; - for (var _j6 = 0; _j6 < _fftBins; _j6++) { - for (var h = 0; h < _l2 / _fftBins; h++) { - for (var _i11 = 0; _i11 < _f.length; _i11++) { - var _$j5 = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrap)(h * _fftBins + _j6, _$f, _l2); - var _samp5 = _f[_i11][_$j5]; - data += _samp5 + (_i11 === _f.length - 1 && h === _l2 / _fftBins - 1 ? "\n" : ","); - } - } - } - } - if (!data) return; - var blob = new Blob([data]); - var url = URL.createObjectURL(blob); - var a = document.createElement("a"); - a.href = url; - a.download = "data.csv"; - a.target = "_blank"; - a.click(); - }); - this.canvas.addEventListener("mousedown", this.handleMouseDown); - this.canvas.addEventListener("touchstart", this.handleMouseDown); - this.canvas.addEventListener("mousemove", this.handleMouseMove); - this.canvas.addEventListener("touchmove", this.handleMouseMove); - this.canvas.addEventListener("mouseleave", this.handleMouseLeave); - this.canvas.addEventListener("touchend", this.handleMouseLeave); - } - get zoomType() { - return this.mode === EScopeMode.Spectroscope ? "spectroscope" : this.mode === EScopeMode.Spectrogram ? "spectrogram" : "oscilloscope"; - } - get vzoom() { - return this._vzoom[this.zoomType]; - } - set vzoom(zoomIn) { - var maxZoom = 16; - this._vzoom[this.zoomType] = Math.min(maxZoom, Math.max(1, zoomIn)); - } - get zoom() { - return this._zoom[this.zoomType]; - } - set zoom(zoomIn) { - var maxZoom = this.data && this.data.t && this.data.t[0] ? Math.max(16, this.mode === EScopeMode.Spectroscope ? 16 : this.data.t[0].length / (this.inFreqDomain ? this.data.fftSize / 2 : this.data.bufferSize)) : 16; - var w = this.canvas.width; - var cursorIn = 0.5; - var left = 50; - if (this.cursor) cursorIn = Math.max(0, this.cursor.x - left) / (w - left); - var cursor = this.zoomOffset + cursorIn / this.zoom; - this._zoom[this.zoomType] = Math.min(maxZoom, Math.max(1, zoomIn)); - this.zoomOffset = cursor - cursorIn / this.zoom; - this.btnZoom.innerHTML = this.zoom.toFixed(1) + "x"; - } - get zoomOffset() { - return this._zoomOffset[this.zoomType]; - } - set zoomOffset(zoomOffsetIn) { - this._zoomOffset[this.zoomType] = Math.max(0, Math.min(1 - 1 / this.zoom, zoomOffsetIn)); - } - resetZoom() { - this._zoom = { - oscilloscope: 1, - spectroscope: 1, - spectrogram: 1 - }; - this._zoomOffset = { - oscilloscope: 0, - spectroscope: 0, - spectrogram: 0 - }; - } - get mode() { - return this._mode; - } - set mode(modeIn) { - this.iSwitch.className = StaticScope.getIconClassName(modeIn); - this.spanSwitch.innerText = StaticScope.getModeName(modeIn); - this._mode = modeIn; - if (modeIn === EScopeMode.Data) { - this.divData.style.display = ""; - this.canvas.style.display = "none"; - this.btnZoom.style.display = "none"; - this.btnZoomIn.style.display = "none"; - this.btnZoomOut.style.display = "none"; - } else { - this.divData.style.display = "none"; - this.canvas.style.display = ""; - this.btnZoom.style.display = ""; - this.btnZoomIn.style.display = ""; - this.btnZoomOut.style.display = ""; - } - this.draw(); - } - get inFreqDomain() { - return this.mode === EScopeMode.Spectrogram || this.mode === EScopeMode.Spectroscope; - } -} - -/***/ }), - -/***/ "./src/documentation.ts": -/*!******************************!*\ - !*** ./src/documentation.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ docSections: () => (/* binding */ docSections), -/* harmony export */ faustDocURL: () => (/* binding */ faustDocURL) -/* harmony export */ }); -// Definitions related to the libraries documentation system - -var faustDocURL = "https://faustlibraries.grame.fr/libs"; -var docSections = { - aa: "aanl", - an: "analyzers", - ba: "basics", - co: "compressors", - de: "delays", - dm: "demos", - dx: "dx7", - en: "envelopes", - fd: "fds", - fi: "filters", - ho: "hoa", - it: "interpolators", - ma: "maths", - mi: "mi", - ef: "misceffects", - os: "oscillators", - no: "noises", - pf: "phaflangers", - pm: "physmodels", - qu: "quantizers", - rm: "reducemaps", - re: "reverbs", - ro: "routes", - si: "signals", - so: "soundfiles", - sp: "spats", - sy: "synths", - ve: "vaeffects", - vl: "version", - wa: "webaudio", - wd: "wdmodels" -}; - -/***/ }), - -/***/ "./src/monaco-faust/register.ts": -/*!**************************************!*\ - !*** ./src/monaco-faust/register.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ faustLangRegister: () => (/* binding */ faustLangRegister) -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); - - -var faustLangRegister = /*#__PURE__*/function () { - var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(monacoEditor, faust) { - var faustLang, providers; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return Promise.all(/*! import() */[__webpack_require__.e("vendors-include-loader_node_modules_monaco-editor_esm_vs_editor_editor_main_js"), __webpack_require__.e("src_monaco-faust_FaustLang_ts-data_image_png_base64_iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8-ee670f")]).then(__webpack_require__.bind(__webpack_require__, /*! ./FaustLang */ "./src/monaco-faust/FaustLang.ts")); - case 2: - faustLang = _context.sent; - monacoEditor.languages.register(faustLang.language); - monacoEditor.languages.setLanguageConfiguration("faust", faustLang.config); - monacoEditor.editor.defineTheme("vs-dark", faustLang.theme); - _context.next = 8; - return faustLang.getProviders(faust); - case 8: - providers = _context.sent; - monacoEditor.languages.registerHoverProvider("faust", providers.hoverProvider); - monacoEditor.languages.setMonarchTokensProvider("faust", providers.tokensProvider); - monacoEditor.languages.registerCompletionItemProvider("faust", providers.completionItemProvider); - return _context.abrupt("return", { - providers, - faustLang - }); - case 13: - case "end": - return _context.stop(); - } - }, _callee); - })); - return function faustLangRegister(_x, _x2) { - return _ref.apply(this, arguments); - }; -}(); - -/***/ }), - -/***/ "./src/utils.ts": -/*!**********************!*\ - !*** ./src/utils.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ estimateFreq: () => (/* binding */ estimateFreq), -/* harmony export */ fillRectWrap: () => (/* binding */ fillRectWrap), -/* harmony export */ getFrequencyDomainData: () => (/* binding */ getFrequencyDomainData), -/* harmony export */ getRms: () => (/* binding */ getRms), -/* harmony export */ indexToFreq: () => (/* binding */ indexToFreq), -/* harmony export */ mod: () => (/* binding */ mod), -/* harmony export */ setWrap: () => (/* binding */ setWrap), -/* harmony export */ sliceWrap: () => (/* binding */ sliceWrap), -/* harmony export */ wrap: () => (/* binding */ wrap) -/* harmony export */ }); -/* harmony import */ var window_function_apply__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! window-function/apply */ "./node_modules/window-function/apply.js"); -/* harmony import */ var window_function_apply__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(window_function_apply__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var window_function__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! window-function */ "./node_modules/window-function/index.js"); -/* harmony import */ var window_function__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(window_function__WEBPACK_IMPORTED_MODULE_1__); - - - -/* eslint-disable no-param-reassign */ -/** - * Mod support wrapping with negative numbers - * - * @param {number} x - * @param {number} y - */ -var mod = (x, y) => (x % y + y) % y; -var wrap = (i, $, l) => mod(i + $, l); - -/** - * Copy a Float32Array by given offset and length, - * support negative pointer, will be wrapped correctly - * - * @param {Float32Array} src - * @param {number} [$begin] - * @param {number} [length] - * @returns - */ -var sliceWrap = (src, $begin, length) => { - if (typeof $begin === "undefined") $begin = 0; - if (typeof length === "undefined") length = src.length - $begin; - var dest = new Float32Array(length); - length = Math.min(src.length, length); - var $dest = 0; - while (length) { - $begin = mod($begin, src.length); - var amount = Math.min(length, src.length - $begin); - if ($begin === 0 && amount === src.length) dest.set(src, $dest);else dest.set(src.subarray($begin, $begin + amount), $dest); - $begin += amount; - length -= amount; - $dest += amount; - } - return dest; -}; - -/** - * Set a Float32Array with another by given offset, - * support negative pointer, will be wrapped correctly - * - * @param {Float32Array} dest - * @param {Float32Array} src - * @param {number} [$dest] - * @returns - */ -var setWrap = (dest, src, $dest) => { - if (typeof $dest === "undefined") $dest = 0; - var $src = 0; - var length = Math.min(dest.length, src.length); - while (length) { - $dest = mod($dest, dest.length); - var amount = Math.min(length, dest.length - $dest); - if ($src === 0 && amount === src.length) dest.set(src, $dest); - dest.set(sliceWrap(src, $src, amount), $dest); - $src += amount; - $dest += amount; - length -= amount; - } - return dest; -}; - -/** - * CanvasRenderingContext2D.fillRect with wrap - * - * @param {CanvasRenderingContext2D} ctx - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} h - */ -var fillRectWrap = (ctx, x, y, w, h, canvasWidth, canvasHeight) => { - var width = canvasWidth; - var height = canvasHeight; - if (!width && !height) { - var _ctx$canvas = ctx.canvas; - width = _ctx$canvas.width; - height = _ctx$canvas.height; - } else if (!width) width = ctx.canvas.width;else if (!height) height = ctx.canvas.height; - var $x = 0; - while ($x < w) { - var $y = 0; - var startX = wrap($x + x, 0, width); - var drawW = startX + w < width ? w : width - startX; - while ($y < h) { - var startY = wrap($y + y, 0, height); - var drawH = startY + h < height ? h : height - startY; - ctx.fillRect(startX, startY, drawW, drawH); - $y += drawH; - } - $x += drawW; - } -}; - -/** - * Calcute FFT power, result array is half sized - * - * @param {Float32Array} t - * @param {FFT} fft - * @returns - */ -var getFrequencyDomainData = (t, fft) => { - // eslint-disable-line arrow-body-style - var ffted = fft.forward(window_function_apply__WEBPACK_IMPORTED_MODULE_0___default()(t, window_function__WEBPACK_IMPORTED_MODULE_1__.blackman)); - var f = new Float32Array(t.length / 2); - for (var i = 0; i < f.length; i++) { - f[i] = 20 * Math.log10(Math.pow(Math.pow(ffted[i * 2], 2) + Math.pow(ffted[i * 2 + 1], 2), 0.5) / f.length * 2.38328); - } - return f; -}; -var estimateFreq = (fft, sampleRate) => { - var index = 0; - var max = -Infinity; - var i = fft.length; - while (i-- > 1) { - var cur = fft[i]; - if (cur <= max) continue; - max = cur; - index = i; - } - return sampleRate / 2 * index / fft.length; -}; -var indexToFreq = (i, fftBins, sampleRate) => i % fftBins / fftBins * sampleRate / 2; -var getRms = t => { - var i = t.length; - var squareSum = 0; - while (i--) { - squareSum += Math.pow(t[i], 2); - } - return Math.pow(squareSum / t.length, 0.5); -}; - -/***/ }), - -/***/ "./src/version.js": -/*!************************!*\ - !*** ./src/version.js ***! - \************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable @typescript-eslint/no-var-requires */ -var _require = __webpack_require__(/*! ../package.json */ "./package.json"), - version = _require.version; -module.exports = version; - -/***/ }), - -/***/ "./node_modules/bootstrap/js/dist/dropdown.js": -/*!****************************************************!*\ - !*** ./node_modules/bootstrap/js/dist/dropdown.js ***! - \****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/*! - * Bootstrap dropdown.js v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - true ? module.exports = factory(__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! popper.js */ "./node_modules/popper.js/dist/esm/popper.js"), __webpack_require__(/*! ./util.js */ "./node_modules/bootstrap/js/dist/util.js")) : - 0; -})(this, (function ($, Popper, Util) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper); - var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util); - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); - } - - /** - * Constants - */ - - var NAME = 'dropdown'; - var VERSION = '4.6.2'; - var DATA_KEY = 'bs.dropdown'; - var EVENT_KEY = "." + DATA_KEY; - var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME]; - var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key - - var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key - - var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key - - var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key - - var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key - - var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) - - var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); - var CLASS_NAME_DISABLED = 'disabled'; - var CLASS_NAME_SHOW = 'show'; - var CLASS_NAME_DROPUP = 'dropup'; - var CLASS_NAME_DROPRIGHT = 'dropright'; - var CLASS_NAME_DROPLEFT = 'dropleft'; - var CLASS_NAME_MENURIGHT = 'dropdown-menu-right'; - var CLASS_NAME_POSITION_STATIC = 'position-static'; - var EVENT_HIDE = "hide" + EVENT_KEY; - var EVENT_HIDDEN = "hidden" + EVENT_KEY; - var EVENT_SHOW = "show" + EVENT_KEY; - var EVENT_SHOWN = "shown" + EVENT_KEY; - var EVENT_CLICK = "click" + EVENT_KEY; - var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY; - var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY; - var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY; - var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]'; - var SELECTOR_FORM_CHILD = '.dropdown form'; - var SELECTOR_MENU = '.dropdown-menu'; - var SELECTOR_NAVBAR_NAV = '.navbar-nav'; - var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; - var PLACEMENT_TOP = 'top-start'; - var PLACEMENT_TOPEND = 'top-end'; - var PLACEMENT_BOTTOM = 'bottom-start'; - var PLACEMENT_BOTTOMEND = 'bottom-end'; - var PLACEMENT_RIGHT = 'right-start'; - var PLACEMENT_LEFT = 'left-start'; - var Default = { - offset: 0, - flip: true, - boundary: 'scrollParent', - reference: 'toggle', - display: 'dynamic', - popperConfig: null - }; - var DefaultType = { - offset: '(number|string|function)', - flip: 'boolean', - boundary: '(string|element)', - reference: '(string|element)', - display: 'string', - popperConfig: '(null|object)' - }; - /** - * Class definition - */ - - var Dropdown = /*#__PURE__*/function () { - function Dropdown(element, config) { - this._element = element; - this._popper = null; - this._config = this._getConfig(config); - this._menu = this._getMenuElement(); - this._inNavbar = this._detectNavbar(); - - this._addEventListeners(); - } // Getters - - - var _proto = Dropdown.prototype; - - // Public - _proto.toggle = function toggle() { - if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED)) { - return; - } - - var isActive = $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW); - - Dropdown._clearMenus(); - - if (isActive) { - return; - } - - this.show(true); - }; - - _proto.show = function show(usePopper) { - if (usePopper === void 0) { - usePopper = false; - } - - if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var showEvent = $__default["default"].Event(EVENT_SHOW, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $__default["default"](parent).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } // Totally disable Popper for Dropdowns in Navbar - - - if (!this._inNavbar && usePopper) { - // Check for Popper dependency - if (typeof Popper__default["default"] === 'undefined') { - throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); - } - - var referenceElement = this._element; - - if (this._config.reference === 'parent') { - referenceElement = parent; - } else if (Util__default["default"].isElement(this._config.reference)) { - referenceElement = this._config.reference; // Check if it's jQuery element - - if (typeof this._config.reference.jquery !== 'undefined') { - referenceElement = this._config.reference[0]; - } - } // If boundary is not `scrollParent`, then set position to `static` - // to allow the menu to "escape" the scroll parent's boundaries - // https://github.com/twbs/bootstrap/issues/24251 - - - if (this._config.boundary !== 'scrollParent') { - $__default["default"](parent).addClass(CLASS_NAME_POSITION_STATIC); - } - - this._popper = new Popper__default["default"](referenceElement, this._menu, this._getPopperConfig()); - } // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - - if ('ontouchstart' in document.documentElement && $__default["default"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) { - $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop); - } - - this._element.focus(); - - this._element.setAttribute('aria-expanded', true); - - $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW); - $__default["default"](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_SHOWN, relatedTarget)); - }; - - _proto.hide = function hide() { - if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default["default"](this._menu).hasClass(CLASS_NAME_SHOW)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var hideEvent = $__default["default"].Event(EVENT_HIDE, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $__default["default"](parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - if (this._popper) { - this._popper.destroy(); - } - - $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW); - $__default["default"](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_HIDDEN, relatedTarget)); - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY); - $__default["default"](this._element).off(EVENT_KEY); - this._element = null; - this._menu = null; - - if (this._popper !== null) { - this._popper.destroy(); - - this._popper = null; - } - }; - - _proto.update = function update() { - this._inNavbar = this._detectNavbar(); - - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - } // Private - ; - - _proto._addEventListeners = function _addEventListeners() { - var _this = this; - - $__default["default"](this._element).on(EVENT_CLICK, function (event) { - event.preventDefault(); - event.stopPropagation(); - - _this.toggle(); - }); - }; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, this.constructor.Default, $__default["default"](this._element).data(), config); - Util__default["default"].typeCheckConfig(NAME, config, this.constructor.DefaultType); - return config; - }; - - _proto._getMenuElement = function _getMenuElement() { - if (!this._menu) { - var parent = Dropdown._getParentFromElement(this._element); - - if (parent) { - this._menu = parent.querySelector(SELECTOR_MENU); - } - } - - return this._menu; - }; - - _proto._getPlacement = function _getPlacement() { - var $parentDropdown = $__default["default"](this._element.parentNode); - var placement = PLACEMENT_BOTTOM; // Handle dropup - - if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) { - placement = $__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP; - } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) { - placement = PLACEMENT_RIGHT; - } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) { - placement = PLACEMENT_LEFT; - } else if ($__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) { - placement = PLACEMENT_BOTTOMEND; - } - - return placement; - }; - - _proto._detectNavbar = function _detectNavbar() { - return $__default["default"](this._element).closest('.navbar').length > 0; - }; - - _proto._getOffset = function _getOffset() { - var _this2 = this; - - var offset = {}; - - if (typeof this._config.offset === 'function') { - offset.fn = function (data) { - data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element)); - return data; - }; - } else { - offset.offset = this._config.offset; - } - - return offset; - }; - - _proto._getPopperConfig = function _getPopperConfig() { - var popperConfig = { - placement: this._getPlacement(), - modifiers: { - offset: this._getOffset(), - flip: { - enabled: this._config.flip - }, - preventOverflow: { - boundariesElement: this._config.boundary - } - } - }; // Disable Popper if we have a static display - - if (this._config.display === 'static') { - popperConfig.modifiers.applyStyle = { - enabled: false - }; - } - - return _extends({}, popperConfig, this._config.popperConfig); - } // Static - ; - - Dropdown._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default["default"](this).data(DATA_KEY); - - var _config = typeof config === 'object' ? config : null; - - if (!data) { - data = new Dropdown(this, _config); - $__default["default"](this).data(DATA_KEY, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - Dropdown._clearMenus = function _clearMenus(event) { - if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { - return; - } - - var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE)); - - for (var i = 0, len = toggles.length; i < len; i++) { - var parent = Dropdown._getParentFromElement(toggles[i]); - - var context = $__default["default"](toggles[i]).data(DATA_KEY); - var relatedTarget = { - relatedTarget: toggles[i] - }; - - if (event && event.type === 'click') { - relatedTarget.clickEvent = event; - } - - if (!context) { - continue; - } - - var dropdownMenu = context._menu; - - if (!$__default["default"](parent).hasClass(CLASS_NAME_SHOW)) { - continue; - } - - if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default["default"].contains(parent, event.target)) { - continue; - } - - var hideEvent = $__default["default"].Event(EVENT_HIDE, relatedTarget); - $__default["default"](parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - continue; - } // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - - if ('ontouchstart' in document.documentElement) { - $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop); - } - - toggles[i].setAttribute('aria-expanded', 'false'); - - if (context._popper) { - context._popper.destroy(); - } - - $__default["default"](dropdownMenu).removeClass(CLASS_NAME_SHOW); - $__default["default"](parent).removeClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_HIDDEN, relatedTarget)); - } - }; - - Dropdown._getParentFromElement = function _getParentFromElement(element) { - var parent; - var selector = Util__default["default"].getSelectorFromElement(element); - - if (selector) { - parent = document.querySelector(selector); - } - - return parent || element.parentNode; - } // eslint-disable-next-line complexity - ; - - Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { - // If not input/textarea: - // - And not a key in REGEXP_KEYDOWN => not a dropdown command - // If input/textarea: - // - If space key => not a dropdown command - // - If key is other than escape - // - If key is not up or down => not a dropdown command - // - If trigger inside the menu => not a dropdown command - if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default["default"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { - return; - } - - if (this.disabled || $__default["default"](this).hasClass(CLASS_NAME_DISABLED)) { - return; - } - - var parent = Dropdown._getParentFromElement(this); - - var isActive = $__default["default"](parent).hasClass(CLASS_NAME_SHOW); - - if (!isActive && event.which === ESCAPE_KEYCODE) { - return; - } - - event.preventDefault(); - event.stopPropagation(); - - if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) { - if (event.which === ESCAPE_KEYCODE) { - $__default["default"](parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus'); - } - - $__default["default"](this).trigger('click'); - return; - } - - var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) { - return $__default["default"](item).is(':visible'); - }); - - if (items.length === 0) { - return; - } - - var index = items.indexOf(event.target); - - if (event.which === ARROW_UP_KEYCODE && index > 0) { - // Up - index--; - } - - if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { - // Down - index++; - } - - if (index < 0) { - index = 0; - } - - items[index].focus(); - }; - - _createClass(Dropdown, null, [{ - key: "VERSION", - get: function get() { - return VERSION; - } - }, { - key: "Default", - get: function get() { - return Default; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType; - } - }]); - - return Dropdown; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - event.preventDefault(); - event.stopPropagation(); - - Dropdown._jQueryInterface.call($__default["default"](this), 'toggle'); - }).on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) { - e.stopPropagation(); - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME] = Dropdown._jQueryInterface; - $__default["default"].fn[NAME].Constructor = Dropdown; - - $__default["default"].fn[NAME].noConflict = function () { - $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT; - return Dropdown._jQueryInterface; - }; - - return Dropdown; - -})); -//# sourceMappingURL=dropdown.js.map - - -/***/ }), - -/***/ "./node_modules/bootstrap/js/dist/modal.js": -/*!*************************************************!*\ - !*** ./node_modules/bootstrap/js/dist/modal.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/*! - * Bootstrap modal.js v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - true ? module.exports = factory(__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! ./util.js */ "./node_modules/bootstrap/js/dist/util.js")) : - 0; -})(this, (function ($, Util) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util); - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); - } - - /** - * Constants - */ - - var NAME = 'modal'; - var VERSION = '4.6.2'; - var DATA_KEY = 'bs.modal'; - var EVENT_KEY = "." + DATA_KEY; - var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME]; - var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key - - var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'; - var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'; - var CLASS_NAME_BACKDROP = 'modal-backdrop'; - var CLASS_NAME_OPEN = 'modal-open'; - var CLASS_NAME_FADE = 'fade'; - var CLASS_NAME_SHOW = 'show'; - var CLASS_NAME_STATIC = 'modal-static'; - var EVENT_HIDE = "hide" + EVENT_KEY; - var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY; - var EVENT_HIDDEN = "hidden" + EVENT_KEY; - var EVENT_SHOW = "show" + EVENT_KEY; - var EVENT_SHOWN = "shown" + EVENT_KEY; - var EVENT_FOCUSIN = "focusin" + EVENT_KEY; - var EVENT_RESIZE = "resize" + EVENT_KEY; - var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY; - var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY; - var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY; - var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY; - var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY; - var SELECTOR_DIALOG = '.modal-dialog'; - var SELECTOR_MODAL_BODY = '.modal-body'; - var SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]'; - var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]'; - var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; - var SELECTOR_STICKY_CONTENT = '.sticky-top'; - var Default = { - backdrop: true, - keyboard: true, - focus: true, - show: true - }; - var DefaultType = { - backdrop: '(boolean|string)', - keyboard: 'boolean', - focus: 'boolean', - show: 'boolean' - }; - /** - * Class definition - */ - - var Modal = /*#__PURE__*/function () { - function Modal(element, config) { - this._config = this._getConfig(config); - this._element = element; - this._dialog = element.querySelector(SELECTOR_DIALOG); - this._backdrop = null; - this._isShown = false; - this._isBodyOverflowing = false; - this._ignoreBackdropClick = false; - this._isTransitioning = false; - this._scrollbarWidth = 0; - } // Getters - - - var _proto = Modal.prototype; - - // Public - _proto.toggle = function toggle(relatedTarget) { - return this._isShown ? this.hide() : this.show(relatedTarget); - }; - - _proto.show = function show(relatedTarget) { - var _this = this; - - if (this._isShown || this._isTransitioning) { - return; - } - - var showEvent = $__default["default"].Event(EVENT_SHOW, { - relatedTarget: relatedTarget - }); - $__default["default"](this._element).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } - - this._isShown = true; - - if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE)) { - this._isTransitioning = true; - } - - this._checkScrollbar(); - - this._setScrollbar(); - - this._adjustDialog(); - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $__default["default"](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function (event) { - return _this.hide(event); - }); - $__default["default"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () { - $__default["default"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) { - if ($__default["default"](event.target).is(_this._element)) { - _this._ignoreBackdropClick = true; - } - }); - }); - - this._showBackdrop(function () { - return _this._showElement(relatedTarget); - }); - }; - - _proto.hide = function hide(event) { - var _this2 = this; - - if (event) { - event.preventDefault(); - } - - if (!this._isShown || this._isTransitioning) { - return; - } - - var hideEvent = $__default["default"].Event(EVENT_HIDE); - $__default["default"](this._element).trigger(hideEvent); - - if (!this._isShown || hideEvent.isDefaultPrevented()) { - return; - } - - this._isShown = false; - var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE); - - if (transition) { - this._isTransitioning = true; - } - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $__default["default"](document).off(EVENT_FOCUSIN); - $__default["default"](this._element).removeClass(CLASS_NAME_SHOW); - $__default["default"](this._element).off(EVENT_CLICK_DISMISS); - $__default["default"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS); - - if (transition) { - var transitionDuration = Util__default["default"].getTransitionDurationFromElement(this._element); - $__default["default"](this._element).one(Util__default["default"].TRANSITION_END, function (event) { - return _this2._hideModal(event); - }).emulateTransitionEnd(transitionDuration); - } else { - this._hideModal(); - } - }; - - _proto.dispose = function dispose() { - [window, this._element, this._dialog].forEach(function (htmlElement) { - return $__default["default"](htmlElement).off(EVENT_KEY); - }); - /** - * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` - * Do not move `document` in `htmlElements` array - * It will remove `EVENT_CLICK_DATA_API` event that should remain - */ - - $__default["default"](document).off(EVENT_FOCUSIN); - $__default["default"].removeData(this._element, DATA_KEY); - this._config = null; - this._element = null; - this._dialog = null; - this._backdrop = null; - this._isShown = null; - this._isBodyOverflowing = null; - this._ignoreBackdropClick = null; - this._isTransitioning = null; - this._scrollbarWidth = null; - }; - - _proto.handleUpdate = function handleUpdate() { - this._adjustDialog(); - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default, config); - Util__default["default"].typeCheckConfig(NAME, config, DefaultType); - return config; - }; - - _proto._triggerBackdropTransition = function _triggerBackdropTransition() { - var _this3 = this; - - var hideEventPrevented = $__default["default"].Event(EVENT_HIDE_PREVENTED); - $__default["default"](this._element).trigger(hideEventPrevented); - - if (hideEventPrevented.isDefaultPrevented()) { - return; - } - - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!isModalOverflowing) { - this._element.style.overflowY = 'hidden'; - } - - this._element.classList.add(CLASS_NAME_STATIC); - - var modalTransitionDuration = Util__default["default"].getTransitionDurationFromElement(this._dialog); - $__default["default"](this._element).off(Util__default["default"].TRANSITION_END); - $__default["default"](this._element).one(Util__default["default"].TRANSITION_END, function () { - _this3._element.classList.remove(CLASS_NAME_STATIC); - - if (!isModalOverflowing) { - $__default["default"](_this3._element).one(Util__default["default"].TRANSITION_END, function () { - _this3._element.style.overflowY = ''; - }).emulateTransitionEnd(_this3._element, modalTransitionDuration); - } - }).emulateTransitionEnd(modalTransitionDuration); - - this._element.focus(); - }; - - _proto._showElement = function _showElement(relatedTarget) { - var _this4 = this; - - var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE); - var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null; - - if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { - // Don't move modal's DOM position - document.body.appendChild(this._element); - } - - this._element.style.display = 'block'; - - this._element.removeAttribute('aria-hidden'); - - this._element.setAttribute('aria-modal', true); - - this._element.setAttribute('role', 'dialog'); - - if ($__default["default"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) { - modalBody.scrollTop = 0; - } else { - this._element.scrollTop = 0; - } - - if (transition) { - Util__default["default"].reflow(this._element); - } - - $__default["default"](this._element).addClass(CLASS_NAME_SHOW); - - if (this._config.focus) { - this._enforceFocus(); - } - - var shownEvent = $__default["default"].Event(EVENT_SHOWN, { - relatedTarget: relatedTarget - }); - - var transitionComplete = function transitionComplete() { - if (_this4._config.focus) { - _this4._element.focus(); - } - - _this4._isTransitioning = false; - $__default["default"](_this4._element).trigger(shownEvent); - }; - - if (transition) { - var transitionDuration = Util__default["default"].getTransitionDurationFromElement(this._dialog); - $__default["default"](this._dialog).one(Util__default["default"].TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); - } else { - transitionComplete(); - } - }; - - _proto._enforceFocus = function _enforceFocus() { - var _this5 = this; - - $__default["default"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop - .on(EVENT_FOCUSIN, function (event) { - if (document !== event.target && _this5._element !== event.target && $__default["default"](_this5._element).has(event.target).length === 0) { - _this5._element.focus(); - } - }); - }; - - _proto._setEscapeEvent = function _setEscapeEvent() { - var _this6 = this; - - if (this._isShown) { - $__default["default"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) { - if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) { - event.preventDefault(); - - _this6.hide(); - } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) { - _this6._triggerBackdropTransition(); - } - }); - } else if (!this._isShown) { - $__default["default"](this._element).off(EVENT_KEYDOWN_DISMISS); - } - }; - - _proto._setResizeEvent = function _setResizeEvent() { - var _this7 = this; - - if (this._isShown) { - $__default["default"](window).on(EVENT_RESIZE, function (event) { - return _this7.handleUpdate(event); - }); - } else { - $__default["default"](window).off(EVENT_RESIZE); - } - }; - - _proto._hideModal = function _hideModal() { - var _this8 = this; - - this._element.style.display = 'none'; - - this._element.setAttribute('aria-hidden', true); - - this._element.removeAttribute('aria-modal'); - - this._element.removeAttribute('role'); - - this._isTransitioning = false; - - this._showBackdrop(function () { - $__default["default"](document.body).removeClass(CLASS_NAME_OPEN); - - _this8._resetAdjustments(); - - _this8._resetScrollbar(); - - $__default["default"](_this8._element).trigger(EVENT_HIDDEN); - }); - }; - - _proto._removeBackdrop = function _removeBackdrop() { - if (this._backdrop) { - $__default["default"](this._backdrop).remove(); - this._backdrop = null; - } - }; - - _proto._showBackdrop = function _showBackdrop(callback) { - var _this9 = this; - - var animate = $__default["default"](this._element).hasClass(CLASS_NAME_FADE) ? CLASS_NAME_FADE : ''; - - if (this._isShown && this._config.backdrop) { - this._backdrop = document.createElement('div'); - this._backdrop.className = CLASS_NAME_BACKDROP; - - if (animate) { - this._backdrop.classList.add(animate); - } - - $__default["default"](this._backdrop).appendTo(document.body); - $__default["default"](this._element).on(EVENT_CLICK_DISMISS, function (event) { - if (_this9._ignoreBackdropClick) { - _this9._ignoreBackdropClick = false; - return; - } - - if (event.target !== event.currentTarget) { - return; - } - - if (_this9._config.backdrop === 'static') { - _this9._triggerBackdropTransition(); - } else { - _this9.hide(); - } - }); - - if (animate) { - Util__default["default"].reflow(this._backdrop); - } - - $__default["default"](this._backdrop).addClass(CLASS_NAME_SHOW); - - if (!callback) { - return; - } - - if (!animate) { - callback(); - return; - } - - var backdropTransitionDuration = Util__default["default"].getTransitionDurationFromElement(this._backdrop); - $__default["default"](this._backdrop).one(Util__default["default"].TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); - } else if (!this._isShown && this._backdrop) { - $__default["default"](this._backdrop).removeClass(CLASS_NAME_SHOW); - - var callbackRemove = function callbackRemove() { - _this9._removeBackdrop(); - - if (callback) { - callback(); - } - }; - - if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE)) { - var _backdropTransitionDuration = Util__default["default"].getTransitionDurationFromElement(this._backdrop); - - $__default["default"](this._backdrop).one(Util__default["default"].TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); - } else { - callbackRemove(); - } - } else if (callback) { - callback(); - } - } // ---------------------------------------------------------------------- - // the following methods are used to handle overflowing modals - // todo (fat): these should probably be refactored out of modal.js - // ---------------------------------------------------------------------- - ; - - _proto._adjustDialog = function _adjustDialog() { - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!this._isBodyOverflowing && isModalOverflowing) { - this._element.style.paddingLeft = this._scrollbarWidth + "px"; - } - - if (this._isBodyOverflowing && !isModalOverflowing) { - this._element.style.paddingRight = this._scrollbarWidth + "px"; - } - }; - - _proto._resetAdjustments = function _resetAdjustments() { - this._element.style.paddingLeft = ''; - this._element.style.paddingRight = ''; - }; - - _proto._checkScrollbar = function _checkScrollbar() { - var rect = document.body.getBoundingClientRect(); - this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth; - this._scrollbarWidth = this._getScrollbarWidth(); - }; - - _proto._setScrollbar = function _setScrollbar() { - var _this10 = this; - - if (this._isBodyOverflowing) { - // Note: DOMNode.style.paddingRight returns the actual value or '' if not set - // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set - var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); - var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding - - $__default["default"](fixedContent).each(function (index, element) { - var actualPadding = element.style.paddingRight; - var calculatedPadding = $__default["default"](element).css('padding-right'); - $__default["default"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); - }); // Adjust sticky content margin - - $__default["default"](stickyContent).each(function (index, element) { - var actualMargin = element.style.marginRight; - var calculatedMargin = $__default["default"](element).css('margin-right'); - $__default["default"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); - }); // Adjust body padding - - var actualPadding = document.body.style.paddingRight; - var calculatedPadding = $__default["default"](document.body).css('padding-right'); - $__default["default"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); - } - - $__default["default"](document.body).addClass(CLASS_NAME_OPEN); - }; - - _proto._resetScrollbar = function _resetScrollbar() { - // Restore fixed content padding - var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); - $__default["default"](fixedContent).each(function (index, element) { - var padding = $__default["default"](element).data('padding-right'); - $__default["default"](element).removeData('padding-right'); - element.style.paddingRight = padding ? padding : ''; - }); // Restore sticky content - - var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT)); - $__default["default"](elements).each(function (index, element) { - var margin = $__default["default"](element).data('margin-right'); - - if (typeof margin !== 'undefined') { - $__default["default"](element).css('margin-right', margin).removeData('margin-right'); - } - }); // Restore body padding - - var padding = $__default["default"](document.body).data('padding-right'); - $__default["default"](document.body).removeData('padding-right'); - document.body.style.paddingRight = padding ? padding : ''; - }; - - _proto._getScrollbarWidth = function _getScrollbarWidth() { - // thx d.walsh - var scrollDiv = document.createElement('div'); - scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER; - document.body.appendChild(scrollDiv); - var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - return scrollbarWidth; - } // Static - ; - - Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { - return this.each(function () { - var data = $__default["default"](this).data(DATA_KEY); - - var _config = _extends({}, Default, $__default["default"](this).data(), typeof config === 'object' && config ? config : {}); - - if (!data) { - data = new Modal(this, _config); - $__default["default"](this).data(DATA_KEY, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](relatedTarget); - } else if (_config.show) { - data.show(relatedTarget); - } - }); - }; - - _createClass(Modal, null, [{ - key: "VERSION", - get: function get() { - return VERSION; - } - }, { - key: "Default", - get: function get() { - return Default; - } - }]); - - return Modal; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - var _this11 = this; - - var target; - var selector = Util__default["default"].getSelectorFromElement(this); - - if (selector) { - target = document.querySelector(selector); - } - - var config = $__default["default"](target).data(DATA_KEY) ? 'toggle' : _extends({}, $__default["default"](target).data(), $__default["default"](this).data()); - - if (this.tagName === 'A' || this.tagName === 'AREA') { - event.preventDefault(); - } - - var $target = $__default["default"](target).one(EVENT_SHOW, function (showEvent) { - if (showEvent.isDefaultPrevented()) { - // Only register focus restorer if modal will actually get shown - return; - } - - $target.one(EVENT_HIDDEN, function () { - if ($__default["default"](_this11).is(':visible')) { - _this11.focus(); - } - }); - }); - - Modal._jQueryInterface.call($__default["default"](target), config, this); - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME] = Modal._jQueryInterface; - $__default["default"].fn[NAME].Constructor = Modal; - - $__default["default"].fn[NAME].noConflict = function () { - $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT; - return Modal._jQueryInterface; - }; - - return Modal; - -})); -//# sourceMappingURL=modal.js.map - - -/***/ }), - -/***/ "./node_modules/bootstrap/js/dist/tab.js": -/*!***********************************************!*\ - !*** ./node_modules/bootstrap/js/dist/tab.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/*! - * Bootstrap tab.js v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - true ? module.exports = factory(__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! ./util.js */ "./node_modules/bootstrap/js/dist/util.js")) : - 0; -})(this, (function ($, Util) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util); - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - /** - * Constants - */ - - var NAME = 'tab'; - var VERSION = '4.6.2'; - var DATA_KEY = 'bs.tab'; - var EVENT_KEY = "." + DATA_KEY; - var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME]; - var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'; - var CLASS_NAME_ACTIVE = 'active'; - var CLASS_NAME_DISABLED = 'disabled'; - var CLASS_NAME_FADE = 'fade'; - var CLASS_NAME_SHOW = 'show'; - var EVENT_HIDE = "hide" + EVENT_KEY; - var EVENT_HIDDEN = "hidden" + EVENT_KEY; - var EVENT_SHOW = "show" + EVENT_KEY; - var EVENT_SHOWN = "shown" + EVENT_KEY; - var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY; - var SELECTOR_DROPDOWN = '.dropdown'; - var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; - var SELECTOR_ACTIVE = '.active'; - var SELECTOR_ACTIVE_UL = '> li > .active'; - var SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]'; - var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; - var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active'; - /** - * Class definition - */ - - var Tab = /*#__PURE__*/function () { - function Tab(element) { - this._element = element; - } // Getters - - - var _proto = Tab.prototype; - - // Public - _proto.show = function show() { - var _this = this; - - if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default["default"](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || this._element.hasAttribute('disabled')) { - return; - } - - var target; - var previous; - var listElement = $__default["default"](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0]; - var selector = Util__default["default"].getSelectorFromElement(this._element); - - if (listElement) { - var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE; - previous = $__default["default"].makeArray($__default["default"](listElement).find(itemSelector)); - previous = previous[previous.length - 1]; - } - - var hideEvent = $__default["default"].Event(EVENT_HIDE, { - relatedTarget: this._element - }); - var showEvent = $__default["default"].Event(EVENT_SHOW, { - relatedTarget: previous - }); - - if (previous) { - $__default["default"](previous).trigger(hideEvent); - } - - $__default["default"](this._element).trigger(showEvent); - - if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) { - return; - } - - if (selector) { - target = document.querySelector(selector); - } - - this._activate(this._element, listElement); - - var complete = function complete() { - var hiddenEvent = $__default["default"].Event(EVENT_HIDDEN, { - relatedTarget: _this._element - }); - var shownEvent = $__default["default"].Event(EVENT_SHOWN, { - relatedTarget: previous - }); - $__default["default"](previous).trigger(hiddenEvent); - $__default["default"](_this._element).trigger(shownEvent); - }; - - if (target) { - this._activate(target, target.parentNode, complete); - } else { - complete(); - } - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY); - this._element = null; - } // Private - ; - - _proto._activate = function _activate(element, container, callback) { - var _this2 = this; - - var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default["default"](container).find(SELECTOR_ACTIVE_UL) : $__default["default"](container).children(SELECTOR_ACTIVE); - var active = activeElements[0]; - var isTransitioning = callback && active && $__default["default"](active).hasClass(CLASS_NAME_FADE); - - var complete = function complete() { - return _this2._transitionComplete(element, active, callback); - }; - - if (active && isTransitioning) { - var transitionDuration = Util__default["default"].getTransitionDurationFromElement(active); - $__default["default"](active).removeClass(CLASS_NAME_SHOW).one(Util__default["default"].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - }; - - _proto._transitionComplete = function _transitionComplete(element, active, callback) { - if (active) { - $__default["default"](active).removeClass(CLASS_NAME_ACTIVE); - var dropdownChild = $__default["default"](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0]; - - if (dropdownChild) { - $__default["default"](dropdownChild).removeClass(CLASS_NAME_ACTIVE); - } - - if (active.getAttribute('role') === 'tab') { - active.setAttribute('aria-selected', false); - } - } - - $__default["default"](element).addClass(CLASS_NAME_ACTIVE); - - if (element.getAttribute('role') === 'tab') { - element.setAttribute('aria-selected', true); - } - - Util__default["default"].reflow(element); - - if (element.classList.contains(CLASS_NAME_FADE)) { - element.classList.add(CLASS_NAME_SHOW); - } - - var parent = element.parentNode; - - if (parent && parent.nodeName === 'LI') { - parent = parent.parentNode; - } - - if (parent && $__default["default"](parent).hasClass(CLASS_NAME_DROPDOWN_MENU)) { - var dropdownElement = $__default["default"](element).closest(SELECTOR_DROPDOWN)[0]; - - if (dropdownElement) { - var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE)); - $__default["default"](dropdownToggleList).addClass(CLASS_NAME_ACTIVE); - } - - element.setAttribute('aria-expanded', true); - } - - if (callback) { - callback(); - } - } // Static - ; - - Tab._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $this = $__default["default"](this); - var data = $this.data(DATA_KEY); - - if (!data) { - data = new Tab(this); - $this.data(DATA_KEY, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Tab, null, [{ - key: "VERSION", - get: function get() { - return VERSION; - } - }]); - - return Tab; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - event.preventDefault(); - - Tab._jQueryInterface.call($__default["default"](this), 'show'); - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME] = Tab._jQueryInterface; - $__default["default"].fn[NAME].Constructor = Tab; - - $__default["default"].fn[NAME].noConflict = function () { - $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT; - return Tab._jQueryInterface; - }; - - return Tab; - -})); -//# sourceMappingURL=tab.js.map - - -/***/ }), - -/***/ "./node_modules/bootstrap/js/dist/tooltip.js": -/*!***************************************************!*\ - !*** ./node_modules/bootstrap/js/dist/tooltip.js ***! - \***************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/*! - * Bootstrap tooltip.js v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - true ? module.exports = factory(__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! popper.js */ "./node_modules/popper.js/dist/esm/popper.js"), __webpack_require__(/*! ./util.js */ "./node_modules/bootstrap/js/dist/util.js")) : - 0; -})(this, (function ($, Popper, Util) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper); - var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util); - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); - } - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.6.2): tools/sanitizer.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; - var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; - var DefaultWhitelist = { - // Global attributes allowed on any supplied element below. - '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], - a: ['target', 'href', 'title', 'rel'], - area: [], - b: [], - br: [], - col: [], - code: [], - div: [], - em: [], - hr: [], - h1: [], - h2: [], - h3: [], - h4: [], - h5: [], - h6: [], - i: [], - img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], - li: [], - ol: [], - p: [], - pre: [], - s: [], - small: [], - span: [], - sub: [], - sup: [], - strong: [], - u: [], - ul: [] - }; - /** - * A pattern that recognizes a commonly useful subset of URLs that are safe. - * - * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts - */ - - var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; - /** - * A pattern that matches safe data URLs. Only matches image, video and audio types. - * - * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts - */ - - var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; - - function allowedAttribute(attr, allowedAttributeList) { - var attrName = attr.nodeName.toLowerCase(); - - if (allowedAttributeList.indexOf(attrName) !== -1) { - if (uriAttrs.indexOf(attrName) !== -1) { - return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue)); - } - - return true; - } - - var regExp = allowedAttributeList.filter(function (attrRegex) { - return attrRegex instanceof RegExp; - }); // Check if a regular expression validates the attribute. - - for (var i = 0, len = regExp.length; i < len; i++) { - if (regExp[i].test(attrName)) { - return true; - } - } - - return false; - } - - function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { - if (unsafeHtml.length === 0) { - return unsafeHtml; - } - - if (sanitizeFn && typeof sanitizeFn === 'function') { - return sanitizeFn(unsafeHtml); - } - - var domParser = new window.DOMParser(); - var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); - var whitelistKeys = Object.keys(whiteList); - var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); - - var _loop = function _loop(i, len) { - var el = elements[i]; - var elName = el.nodeName.toLowerCase(); - - if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { - el.parentNode.removeChild(el); - return "continue"; - } - - var attributeList = [].slice.call(el.attributes); // eslint-disable-next-line unicorn/prefer-spread - - var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); - attributeList.forEach(function (attr) { - if (!allowedAttribute(attr, whitelistedAttributes)) { - el.removeAttribute(attr.nodeName); - } - }); - }; - - for (var i = 0, len = elements.length; i < len; i++) { - var _ret = _loop(i); - - if (_ret === "continue") continue; - } - - return createdDocument.body.innerHTML; - } - - /** - * Constants - */ - - var NAME = 'tooltip'; - var VERSION = '4.6.2'; - var DATA_KEY = 'bs.tooltip'; - var EVENT_KEY = "." + DATA_KEY; - var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME]; - var CLASS_PREFIX = 'bs-tooltip'; - var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); - var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; - var CLASS_NAME_FADE = 'fade'; - var CLASS_NAME_SHOW = 'show'; - var HOVER_STATE_SHOW = 'show'; - var HOVER_STATE_OUT = 'out'; - var SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; - var SELECTOR_ARROW = '.arrow'; - var TRIGGER_HOVER = 'hover'; - var TRIGGER_FOCUS = 'focus'; - var TRIGGER_CLICK = 'click'; - var TRIGGER_MANUAL = 'manual'; - var AttachmentMap = { - AUTO: 'auto', - TOP: 'top', - RIGHT: 'right', - BOTTOM: 'bottom', - LEFT: 'left' - }; - var Default = { - animation: true, - template: '', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - selector: false, - placement: 'top', - offset: 0, - container: false, - fallbackPlacement: 'flip', - boundary: 'scrollParent', - customClass: '', - sanitize: true, - sanitizeFn: null, - whiteList: DefaultWhitelist, - popperConfig: null - }; - var DefaultType = { - animation: 'boolean', - template: 'string', - title: '(string|element|function)', - trigger: 'string', - delay: '(number|object)', - html: 'boolean', - selector: '(string|boolean)', - placement: '(string|function)', - offset: '(number|string|function)', - container: '(string|element|boolean)', - fallbackPlacement: '(string|array)', - boundary: '(string|element)', - customClass: '(string|function)', - sanitize: 'boolean', - sanitizeFn: '(null|function)', - whiteList: 'object', - popperConfig: '(null|object)' - }; - var Event = { - HIDE: "hide" + EVENT_KEY, - HIDDEN: "hidden" + EVENT_KEY, - SHOW: "show" + EVENT_KEY, - SHOWN: "shown" + EVENT_KEY, - INSERTED: "inserted" + EVENT_KEY, - CLICK: "click" + EVENT_KEY, - FOCUSIN: "focusin" + EVENT_KEY, - FOCUSOUT: "focusout" + EVENT_KEY, - MOUSEENTER: "mouseenter" + EVENT_KEY, - MOUSELEAVE: "mouseleave" + EVENT_KEY - }; - /** - * Class definition - */ - - var Tooltip = /*#__PURE__*/function () { - function Tooltip(element, config) { - if (typeof Popper__default["default"] === 'undefined') { - throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); - } // Private - - - this._isEnabled = true; - this._timeout = 0; - this._hoverState = ''; - this._activeTrigger = {}; - this._popper = null; // Protected - - this.element = element; - this.config = this._getConfig(config); - this.tip = null; - - this._setListeners(); - } // Getters - - - var _proto = Tooltip.prototype; - - // Public - _proto.enable = function enable() { - this._isEnabled = true; - }; - - _proto.disable = function disable() { - this._isEnabled = false; - }; - - _proto.toggleEnabled = function toggleEnabled() { - this._isEnabled = !this._isEnabled; - }; - - _proto.toggle = function toggle(event) { - if (!this._isEnabled) { - return; - } - - if (event) { - var dataKey = this.constructor.DATA_KEY; - var context = $__default["default"](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default["default"](event.currentTarget).data(dataKey, context); - } - - context._activeTrigger.click = !context._activeTrigger.click; - - if (context._isWithActiveTrigger()) { - context._enter(null, context); - } else { - context._leave(null, context); - } - } else { - if ($__default["default"](this.getTipElement()).hasClass(CLASS_NAME_SHOW)) { - this._leave(null, this); - - return; - } - - this._enter(null, this); - } - }; - - _proto.dispose = function dispose() { - clearTimeout(this._timeout); - $__default["default"].removeData(this.element, this.constructor.DATA_KEY); - $__default["default"](this.element).off(this.constructor.EVENT_KEY); - $__default["default"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); - - if (this.tip) { - $__default["default"](this.tip).remove(); - } - - this._isEnabled = null; - this._timeout = null; - this._hoverState = null; - this._activeTrigger = null; - - if (this._popper) { - this._popper.destroy(); - } - - this._popper = null; - this.element = null; - this.config = null; - this.tip = null; - }; - - _proto.show = function show() { - var _this = this; - - if ($__default["default"](this.element).css('display') === 'none') { - throw new Error('Please use show on visible elements'); - } - - var showEvent = $__default["default"].Event(this.constructor.Event.SHOW); - - if (this.isWithContent() && this._isEnabled) { - $__default["default"](this.element).trigger(showEvent); - var shadowRoot = Util__default["default"].findShadowRoot(this.element); - var isInTheDom = $__default["default"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); - - if (showEvent.isDefaultPrevented() || !isInTheDom) { - return; - } - - var tip = this.getTipElement(); - var tipId = Util__default["default"].getUID(this.constructor.NAME); - tip.setAttribute('id', tipId); - this.element.setAttribute('aria-describedby', tipId); - this.setContent(); - - if (this.config.animation) { - $__default["default"](tip).addClass(CLASS_NAME_FADE); - } - - var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; - - var attachment = this._getAttachment(placement); - - this.addAttachmentClass(attachment); - - var container = this._getContainer(); - - $__default["default"](tip).data(this.constructor.DATA_KEY, this); - - if (!$__default["default"].contains(this.element.ownerDocument.documentElement, this.tip)) { - $__default["default"](tip).appendTo(container); - } - - $__default["default"](this.element).trigger(this.constructor.Event.INSERTED); - this._popper = new Popper__default["default"](this.element, tip, this._getPopperConfig(attachment)); - $__default["default"](tip).addClass(CLASS_NAME_SHOW); - $__default["default"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - if ('ontouchstart' in document.documentElement) { - $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop); - } - - var complete = function complete() { - if (_this.config.animation) { - _this._fixTransition(); - } - - var prevHoverState = _this._hoverState; - _this._hoverState = null; - $__default["default"](_this.element).trigger(_this.constructor.Event.SHOWN); - - if (prevHoverState === HOVER_STATE_OUT) { - _this._leave(null, _this); - } - }; - - if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE)) { - var transitionDuration = Util__default["default"].getTransitionDurationFromElement(this.tip); - $__default["default"](this.tip).one(Util__default["default"].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - } - }; - - _proto.hide = function hide(callback) { - var _this2 = this; - - var tip = this.getTipElement(); - var hideEvent = $__default["default"].Event(this.constructor.Event.HIDE); - - var complete = function complete() { - if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { - tip.parentNode.removeChild(tip); - } - - _this2._cleanTipClass(); - - _this2.element.removeAttribute('aria-describedby'); - - $__default["default"](_this2.element).trigger(_this2.constructor.Event.HIDDEN); - - if (_this2._popper !== null) { - _this2._popper.destroy(); - } - - if (callback) { - callback(); - } - }; - - $__default["default"](this.element).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - $__default["default"](tip).removeClass(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - if ('ontouchstart' in document.documentElement) { - $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop); - } - - this._activeTrigger[TRIGGER_CLICK] = false; - this._activeTrigger[TRIGGER_FOCUS] = false; - this._activeTrigger[TRIGGER_HOVER] = false; - - if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE)) { - var transitionDuration = Util__default["default"].getTransitionDurationFromElement(tip); - $__default["default"](tip).one(Util__default["default"].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - - this._hoverState = ''; - }; - - _proto.update = function update() { - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - } // Protected - ; - - _proto.isWithContent = function isWithContent() { - return Boolean(this.getTitle()); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $__default["default"](this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var tip = this.getTipElement(); - this.setElementContent($__default["default"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle()); - $__default["default"](tip).removeClass(CLASS_NAME_FADE + " " + CLASS_NAME_SHOW); - }; - - _proto.setElementContent = function setElementContent($element, content) { - if (typeof content === 'object' && (content.nodeType || content.jquery)) { - // Content is a DOM node or a jQuery - if (this.config.html) { - if (!$__default["default"](content).parent().is($element)) { - $element.empty().append(content); - } - } else { - $element.text($__default["default"](content).text()); - } - - return; - } - - if (this.config.html) { - if (this.config.sanitize) { - content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); - } - - $element.html(content); - } else { - $element.text(content); - } - }; - - _proto.getTitle = function getTitle() { - var title = this.element.getAttribute('data-original-title'); - - if (!title) { - title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; - } - - return title; - } // Private - ; - - _proto._getPopperConfig = function _getPopperConfig(attachment) { - var _this3 = this; - - var defaultBsConfig = { - placement: attachment, - modifiers: { - offset: this._getOffset(), - flip: { - behavior: this.config.fallbackPlacement - }, - arrow: { - element: SELECTOR_ARROW - }, - preventOverflow: { - boundariesElement: this.config.boundary - } - }, - onCreate: function onCreate(data) { - if (data.originalPlacement !== data.placement) { - _this3._handlePopperPlacementChange(data); - } - }, - onUpdate: function onUpdate(data) { - return _this3._handlePopperPlacementChange(data); - } - }; - return _extends({}, defaultBsConfig, this.config.popperConfig); - }; - - _proto._getOffset = function _getOffset() { - var _this4 = this; - - var offset = {}; - - if (typeof this.config.offset === 'function') { - offset.fn = function (data) { - data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element)); - return data; - }; - } else { - offset.offset = this.config.offset; - } - - return offset; - }; - - _proto._getContainer = function _getContainer() { - if (this.config.container === false) { - return document.body; - } - - if (Util__default["default"].isElement(this.config.container)) { - return $__default["default"](this.config.container); - } - - return $__default["default"](document).find(this.config.container); - }; - - _proto._getAttachment = function _getAttachment(placement) { - return AttachmentMap[placement.toUpperCase()]; - }; - - _proto._setListeners = function _setListeners() { - var _this5 = this; - - var triggers = this.config.trigger.split(' '); - triggers.forEach(function (trigger) { - if (trigger === 'click') { - $__default["default"](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { - return _this5.toggle(event); - }); - } else if (trigger !== TRIGGER_MANUAL) { - var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; - var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; - $__default["default"](_this5.element).on(eventIn, _this5.config.selector, function (event) { - return _this5._enter(event); - }).on(eventOut, _this5.config.selector, function (event) { - return _this5._leave(event); - }); - } - }); - - this._hideModalHandler = function () { - if (_this5.element) { - _this5.hide(); - } - }; - - $__default["default"](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); - - if (this.config.selector) { - this.config = _extends({}, this.config, { - trigger: 'manual', - selector: '' - }); - } else { - this._fixTitle(); - } - }; - - _proto._fixTitle = function _fixTitle() { - var titleType = typeof this.element.getAttribute('data-original-title'); - - if (this.element.getAttribute('title') || titleType !== 'string') { - this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); - this.element.setAttribute('title', ''); - } - }; - - _proto._enter = function _enter(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $__default["default"](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default["default"](event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; - } - - if ($__default["default"](context.getTipElement()).hasClass(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) { - context._hoverState = HOVER_STATE_SHOW; - return; - } - - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_SHOW; - - if (!context.config.delay || !context.config.delay.show) { - context.show(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HOVER_STATE_SHOW) { - context.show(); - } - }, context.config.delay.show); - }; - - _proto._leave = function _leave(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $__default["default"](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default["default"](event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false; - } - - if (context._isWithActiveTrigger()) { - return; - } - - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_OUT; - - if (!context.config.delay || !context.config.delay.hide) { - context.hide(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HOVER_STATE_OUT) { - context.hide(); - } - }, context.config.delay.hide); - }; - - _proto._isWithActiveTrigger = function _isWithActiveTrigger() { - for (var trigger in this._activeTrigger) { - if (this._activeTrigger[trigger]) { - return true; - } - } - - return false; - }; - - _proto._getConfig = function _getConfig(config) { - var dataAttributes = $__default["default"](this.element).data(); - Object.keys(dataAttributes).forEach(function (dataAttr) { - if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { - delete dataAttributes[dataAttr]; - } - }); - config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); - - if (typeof config.delay === 'number') { - config.delay = { - show: config.delay, - hide: config.delay - }; - } - - if (typeof config.title === 'number') { - config.title = config.title.toString(); - } - - if (typeof config.content === 'number') { - config.content = config.content.toString(); - } - - Util__default["default"].typeCheckConfig(NAME, config, this.constructor.DefaultType); - - if (config.sanitize) { - config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); - } - - return config; - }; - - _proto._getDelegateConfig = function _getDelegateConfig() { - var config = {}; - - if (this.config) { - for (var key in this.config) { - if (this.constructor.Default[key] !== this.config[key]) { - config[key] = this.config[key]; - } - } - } - - return config; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $__default["default"](this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); - - if (tabClass !== null && tabClass.length) { - $tip.removeClass(tabClass.join('')); - } - }; - - _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { - this.tip = popperData.instance.popper; - - this._cleanTipClass(); - - this.addAttachmentClass(this._getAttachment(popperData.placement)); - }; - - _proto._fixTransition = function _fixTransition() { - var tip = this.getTipElement(); - var initConfigAnimation = this.config.animation; - - if (tip.getAttribute('x-placement') !== null) { - return; - } - - $__default["default"](tip).removeClass(CLASS_NAME_FADE); - this.config.animation = false; - this.hide(); - this.show(); - this.config.animation = initConfigAnimation; - } // Static - ; - - Tooltip._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default["default"](this); - var data = $element.data(DATA_KEY); - - var _config = typeof config === 'object' && config; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Tooltip(this, _config); - $element.data(DATA_KEY, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Tooltip, null, [{ - key: "VERSION", - get: function get() { - return VERSION; - } - }, { - key: "Default", - get: function get() { - return Default; - } - }, { - key: "NAME", - get: function get() { - return NAME; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY; - } - }, { - key: "Event", - get: function get() { - return Event; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType; - } - }]); - - return Tooltip; - }(); - /** - * jQuery - */ - - - $__default["default"].fn[NAME] = Tooltip._jQueryInterface; - $__default["default"].fn[NAME].Constructor = Tooltip; - - $__default["default"].fn[NAME].noConflict = function () { - $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT; - return Tooltip._jQueryInterface; - }; - - return Tooltip; - -})); -//# sourceMappingURL=tooltip.js.map - - -/***/ }), - -/***/ "./node_modules/bootstrap/js/dist/util.js": -/*!************************************************!*\ - !*** ./node_modules/bootstrap/js/dist/util.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/*! - * Bootstrap util.js v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - true ? module.exports = factory(__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")) : - 0; -})(this, (function ($) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.6.2): util.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - /** - * Private TransitionEnd Helpers - */ - - var TRANSITION_END = 'transitionend'; - var MAX_UID = 1000000; - var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) - - function toType(obj) { - if (obj === null || typeof obj === 'undefined') { - return "" + obj; - } - - return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); - } - - function getSpecialTransitionEndEvent() { - return { - bindType: TRANSITION_END, - delegateType: TRANSITION_END, - handle: function handle(event) { - if ($__default["default"](event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params - } - - return undefined; - } - }; - } - - function transitionEndEmulator(duration) { - var _this = this; - - var called = false; - $__default["default"](this).one(Util.TRANSITION_END, function () { - called = true; - }); - setTimeout(function () { - if (!called) { - Util.triggerTransitionEnd(_this); - } - }, duration); - return this; - } - - function setTransitionEndSupport() { - $__default["default"].fn.emulateTransitionEnd = transitionEndEmulator; - $__default["default"].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); - } - /** - * Public Util API - */ - - - var Util = { - TRANSITION_END: 'bsTransitionEnd', - getUID: function getUID(prefix) { - do { - // eslint-disable-next-line no-bitwise - prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here - } while (document.getElementById(prefix)); - - return prefix; - }, - getSelectorFromElement: function getSelectorFromElement(element) { - var selector = element.getAttribute('data-target'); - - if (!selector || selector === '#') { - var hrefAttr = element.getAttribute('href'); - selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; - } - - try { - return document.querySelector(selector) ? selector : null; - } catch (_) { - return null; - } - }, - getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { - if (!element) { - return 0; - } // Get transition-duration of the element - - - var transitionDuration = $__default["default"](element).css('transition-duration'); - var transitionDelay = $__default["default"](element).css('transition-delay'); - var floatTransitionDuration = parseFloat(transitionDuration); - var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found - - if (!floatTransitionDuration && !floatTransitionDelay) { - return 0; - } // If multiple durations are defined, take the first - - - transitionDuration = transitionDuration.split(',')[0]; - transitionDelay = transitionDelay.split(',')[0]; - return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; - }, - reflow: function reflow(element) { - return element.offsetHeight; - }, - triggerTransitionEnd: function triggerTransitionEnd(element) { - $__default["default"](element).trigger(TRANSITION_END); - }, - supportsTransitionEnd: function supportsTransitionEnd() { - return Boolean(TRANSITION_END); - }, - isElement: function isElement(obj) { - return (obj[0] || obj).nodeType; - }, - typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { - for (var property in configTypes) { - if (Object.prototype.hasOwnProperty.call(configTypes, property)) { - var expectedTypes = configTypes[property]; - var value = config[property]; - var valueType = value && Util.isElement(value) ? 'element' : toType(value); - - if (!new RegExp(expectedTypes).test(valueType)) { - throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); - } - } - } - }, - findShadowRoot: function findShadowRoot(element) { - if (!document.documentElement.attachShadow) { - return null; - } // Can find the shadow root otherwise it'll return the document - - - if (typeof element.getRootNode === 'function') { - var root = element.getRootNode(); - return root instanceof ShadowRoot ? root : null; - } - - if (element instanceof ShadowRoot) { - return element; - } // when we don't find a shadow root - - - if (!element.parentNode) { - return null; - } - - return Util.findShadowRoot(element.parentNode); - }, - jQueryDetection: function jQueryDetection() { - if (typeof $__default["default"] === 'undefined') { - throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); - } - - var version = $__default["default"].fn.jquery.split(' ')[0].split('.'); - var minMajor = 1; - var ltMajor = 2; - var minMinor = 9; - var minPatch = 1; - var maxMajor = 4; - - if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { - throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); - } - } - }; - Util.jQueryDetection(); - setTransitionEndSupport(); - - return Util; - -})); -//# sourceMappingURL=util.js.map - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/@fortawesome/fontawesome-free/css/all.css": -/*!******************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/@fortawesome/fontawesome-free/css/all.css ***! - \******************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/getUrl.js */ "./node_modules/css-loader/dist/runtime/getUrl.js"); -/* harmony import */ var _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); -// Imports - - - -var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-brands-400.eot */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-brands-400.eot"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-brands-400.woff2 */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-brands-400.woff2"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-brands-400.woff */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-brands-400.woff"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-brands-400.ttf */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-brands-400.ttf"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_4___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-brands-400.svg */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-brands-400.svg"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_5___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-regular-400.eot */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-regular-400.eot"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_6___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-regular-400.woff2 */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-regular-400.woff2"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_7___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-regular-400.woff */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-regular-400.woff"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_8___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-regular-400.ttf */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-regular-400.ttf"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_9___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-regular-400.svg */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-regular-400.svg"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_10___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-solid-900.eot */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-solid-900.eot"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_11___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-solid-900.woff2 */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_12___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-solid-900.woff */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_13___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-solid-900.ttf */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-solid-900.ttf"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_14___ = new URL(/* asset import */ __webpack_require__(/*! ../webfonts/fa-solid-900.svg */ "./node_modules/@fortawesome/fontawesome-free/webfonts/fa-solid-900.svg"), __webpack_require__.b); -var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -var ___CSS_LOADER_URL_REPLACEMENT_0___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); -var ___CSS_LOADER_URL_REPLACEMENT_1___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___, { hash: "?#iefix" }); -var ___CSS_LOADER_URL_REPLACEMENT_2___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___); -var ___CSS_LOADER_URL_REPLACEMENT_3___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___); -var ___CSS_LOADER_URL_REPLACEMENT_4___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___); -var ___CSS_LOADER_URL_REPLACEMENT_5___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_4___, { hash: "#fontawesome" }); -var ___CSS_LOADER_URL_REPLACEMENT_6___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_5___); -var ___CSS_LOADER_URL_REPLACEMENT_7___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_5___, { hash: "?#iefix" }); -var ___CSS_LOADER_URL_REPLACEMENT_8___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_6___); -var ___CSS_LOADER_URL_REPLACEMENT_9___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_7___); -var ___CSS_LOADER_URL_REPLACEMENT_10___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_8___); -var ___CSS_LOADER_URL_REPLACEMENT_11___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_9___, { hash: "#fontawesome" }); -var ___CSS_LOADER_URL_REPLACEMENT_12___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_10___); -var ___CSS_LOADER_URL_REPLACEMENT_13___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_10___, { hash: "?#iefix" }); -var ___CSS_LOADER_URL_REPLACEMENT_14___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_11___); -var ___CSS_LOADER_URL_REPLACEMENT_15___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_12___); -var ___CSS_LOADER_URL_REPLACEMENT_16___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_13___); -var ___CSS_LOADER_URL_REPLACEMENT_17___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_14___, { hash: "#fontawesome" }); -// Module -___CSS_LOADER_EXPORT___.push([module.id, "/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\n.fa,\n.fas,\n.far,\n.fal,\n.fad,\n.fab {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n line-height: 1; }\n\n.fa-lg {\n font-size: 1.33333em;\n line-height: 0.75em;\n vertical-align: -.0667em; }\n\n.fa-xs {\n font-size: .75em; }\n\n.fa-sm {\n font-size: .875em; }\n\n.fa-1x {\n font-size: 1em; }\n\n.fa-2x {\n font-size: 2em; }\n\n.fa-3x {\n font-size: 3em; }\n\n.fa-4x {\n font-size: 4em; }\n\n.fa-5x {\n font-size: 5em; }\n\n.fa-6x {\n font-size: 6em; }\n\n.fa-7x {\n font-size: 7em; }\n\n.fa-8x {\n font-size: 8em; }\n\n.fa-9x {\n font-size: 9em; }\n\n.fa-10x {\n font-size: 10em; }\n\n.fa-fw {\n text-align: center;\n width: 1.25em; }\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0; }\n .fa-ul > li {\n position: relative; }\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit; }\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: .1em;\n padding: .2em .25em .15em; }\n\n.fa-pull-left {\n float: left; }\n\n.fa-pull-right {\n float: right; }\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: .3em; }\n\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: .3em; }\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg); }\n\n.fa-rotate-180 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg); }\n\n.fa-rotate-270 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1); }\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none; }\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n left: 0;\n position: absolute;\n text-align: center;\n width: 100%; }\n\n.fa-stack-1x {\n line-height: inherit; }\n\n.fa-stack-2x {\n font-size: 2em; }\n\n.fa-inverse {\n color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n.fa-500px:before {\n content: \"\\f26e\"; }\n\n.fa-accessible-icon:before {\n content: \"\\f368\"; }\n\n.fa-accusoft:before {\n content: \"\\f369\"; }\n\n.fa-acquisitions-incorporated:before {\n content: \"\\f6af\"; }\n\n.fa-ad:before {\n content: \"\\f641\"; }\n\n.fa-address-book:before {\n content: \"\\f2b9\"; }\n\n.fa-address-card:before {\n content: \"\\f2bb\"; }\n\n.fa-adjust:before {\n content: \"\\f042\"; }\n\n.fa-adn:before {\n content: \"\\f170\"; }\n\n.fa-adversal:before {\n content: \"\\f36a\"; }\n\n.fa-affiliatetheme:before {\n content: \"\\f36b\"; }\n\n.fa-air-freshener:before {\n content: \"\\f5d0\"; }\n\n.fa-airbnb:before {\n content: \"\\f834\"; }\n\n.fa-algolia:before {\n content: \"\\f36c\"; }\n\n.fa-align-center:before {\n content: \"\\f037\"; }\n\n.fa-align-justify:before {\n content: \"\\f039\"; }\n\n.fa-align-left:before {\n content: \"\\f036\"; }\n\n.fa-align-right:before {\n content: \"\\f038\"; }\n\n.fa-alipay:before {\n content: \"\\f642\"; }\n\n.fa-allergies:before {\n content: \"\\f461\"; }\n\n.fa-amazon:before {\n content: \"\\f270\"; }\n\n.fa-amazon-pay:before {\n content: \"\\f42c\"; }\n\n.fa-ambulance:before {\n content: \"\\f0f9\"; }\n\n.fa-american-sign-language-interpreting:before {\n content: \"\\f2a3\"; }\n\n.fa-amilia:before {\n content: \"\\f36d\"; }\n\n.fa-anchor:before {\n content: \"\\f13d\"; }\n\n.fa-android:before {\n content: \"\\f17b\"; }\n\n.fa-angellist:before {\n content: \"\\f209\"; }\n\n.fa-angle-double-down:before {\n content: \"\\f103\"; }\n\n.fa-angle-double-left:before {\n content: \"\\f100\"; }\n\n.fa-angle-double-right:before {\n content: \"\\f101\"; }\n\n.fa-angle-double-up:before {\n content: \"\\f102\"; }\n\n.fa-angle-down:before {\n content: \"\\f107\"; }\n\n.fa-angle-left:before {\n content: \"\\f104\"; }\n\n.fa-angle-right:before {\n content: \"\\f105\"; }\n\n.fa-angle-up:before {\n content: \"\\f106\"; }\n\n.fa-angry:before {\n content: \"\\f556\"; }\n\n.fa-angrycreative:before {\n content: \"\\f36e\"; }\n\n.fa-angular:before {\n content: \"\\f420\"; }\n\n.fa-ankh:before {\n content: \"\\f644\"; }\n\n.fa-app-store:before {\n content: \"\\f36f\"; }\n\n.fa-app-store-ios:before {\n content: \"\\f370\"; }\n\n.fa-apper:before {\n content: \"\\f371\"; }\n\n.fa-apple:before {\n content: \"\\f179\"; }\n\n.fa-apple-alt:before {\n content: \"\\f5d1\"; }\n\n.fa-apple-pay:before {\n content: \"\\f415\"; }\n\n.fa-archive:before {\n content: \"\\f187\"; }\n\n.fa-archway:before {\n content: \"\\f557\"; }\n\n.fa-arrow-alt-circle-down:before {\n content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-left:before {\n content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-right:before {\n content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-up:before {\n content: \"\\f35b\"; }\n\n.fa-arrow-circle-down:before {\n content: \"\\f0ab\"; }\n\n.fa-arrow-circle-left:before {\n content: \"\\f0a8\"; }\n\n.fa-arrow-circle-right:before {\n content: \"\\f0a9\"; }\n\n.fa-arrow-circle-up:before {\n content: \"\\f0aa\"; }\n\n.fa-arrow-down:before {\n content: \"\\f063\"; }\n\n.fa-arrow-left:before {\n content: \"\\f060\"; }\n\n.fa-arrow-right:before {\n content: \"\\f061\"; }\n\n.fa-arrow-up:before {\n content: \"\\f062\"; }\n\n.fa-arrows-alt:before {\n content: \"\\f0b2\"; }\n\n.fa-arrows-alt-h:before {\n content: \"\\f337\"; }\n\n.fa-arrows-alt-v:before {\n content: \"\\f338\"; }\n\n.fa-artstation:before {\n content: \"\\f77a\"; }\n\n.fa-assistive-listening-systems:before {\n content: \"\\f2a2\"; }\n\n.fa-asterisk:before {\n content: \"\\f069\"; }\n\n.fa-asymmetrik:before {\n content: \"\\f372\"; }\n\n.fa-at:before {\n content: \"\\f1fa\"; }\n\n.fa-atlas:before {\n content: \"\\f558\"; }\n\n.fa-atlassian:before {\n content: \"\\f77b\"; }\n\n.fa-atom:before {\n content: \"\\f5d2\"; }\n\n.fa-audible:before {\n content: \"\\f373\"; }\n\n.fa-audio-description:before {\n content: \"\\f29e\"; }\n\n.fa-autoprefixer:before {\n content: \"\\f41c\"; }\n\n.fa-avianex:before {\n content: \"\\f374\"; }\n\n.fa-aviato:before {\n content: \"\\f421\"; }\n\n.fa-award:before {\n content: \"\\f559\"; }\n\n.fa-aws:before {\n content: \"\\f375\"; }\n\n.fa-baby:before {\n content: \"\\f77c\"; }\n\n.fa-baby-carriage:before {\n content: \"\\f77d\"; }\n\n.fa-backspace:before {\n content: \"\\f55a\"; }\n\n.fa-backward:before {\n content: \"\\f04a\"; }\n\n.fa-bacon:before {\n content: \"\\f7e5\"; }\n\n.fa-bacteria:before {\n content: \"\\e059\"; }\n\n.fa-bacterium:before {\n content: \"\\e05a\"; }\n\n.fa-bahai:before {\n content: \"\\f666\"; }\n\n.fa-balance-scale:before {\n content: \"\\f24e\"; }\n\n.fa-balance-scale-left:before {\n content: \"\\f515\"; }\n\n.fa-balance-scale-right:before {\n content: \"\\f516\"; }\n\n.fa-ban:before {\n content: \"\\f05e\"; }\n\n.fa-band-aid:before {\n content: \"\\f462\"; }\n\n.fa-bandcamp:before {\n content: \"\\f2d5\"; }\n\n.fa-barcode:before {\n content: \"\\f02a\"; }\n\n.fa-bars:before {\n content: \"\\f0c9\"; }\n\n.fa-baseball-ball:before {\n content: \"\\f433\"; }\n\n.fa-basketball-ball:before {\n content: \"\\f434\"; }\n\n.fa-bath:before {\n content: \"\\f2cd\"; }\n\n.fa-battery-empty:before {\n content: \"\\f244\"; }\n\n.fa-battery-full:before {\n content: \"\\f240\"; }\n\n.fa-battery-half:before {\n content: \"\\f242\"; }\n\n.fa-battery-quarter:before {\n content: \"\\f243\"; }\n\n.fa-battery-three-quarters:before {\n content: \"\\f241\"; }\n\n.fa-battle-net:before {\n content: \"\\f835\"; }\n\n.fa-bed:before {\n content: \"\\f236\"; }\n\n.fa-beer:before {\n content: \"\\f0fc\"; }\n\n.fa-behance:before {\n content: \"\\f1b4\"; }\n\n.fa-behance-square:before {\n content: \"\\f1b5\"; }\n\n.fa-bell:before {\n content: \"\\f0f3\"; }\n\n.fa-bell-slash:before {\n content: \"\\f1f6\"; }\n\n.fa-bezier-curve:before {\n content: \"\\f55b\"; }\n\n.fa-bible:before {\n content: \"\\f647\"; }\n\n.fa-bicycle:before {\n content: \"\\f206\"; }\n\n.fa-biking:before {\n content: \"\\f84a\"; }\n\n.fa-bimobject:before {\n content: \"\\f378\"; }\n\n.fa-binoculars:before {\n content: \"\\f1e5\"; }\n\n.fa-biohazard:before {\n content: \"\\f780\"; }\n\n.fa-birthday-cake:before {\n content: \"\\f1fd\"; }\n\n.fa-bitbucket:before {\n content: \"\\f171\"; }\n\n.fa-bitcoin:before {\n content: \"\\f379\"; }\n\n.fa-bity:before {\n content: \"\\f37a\"; }\n\n.fa-black-tie:before {\n content: \"\\f27e\"; }\n\n.fa-blackberry:before {\n content: \"\\f37b\"; }\n\n.fa-blender:before {\n content: \"\\f517\"; }\n\n.fa-blender-phone:before {\n content: \"\\f6b6\"; }\n\n.fa-blind:before {\n content: \"\\f29d\"; }\n\n.fa-blog:before {\n content: \"\\f781\"; }\n\n.fa-blogger:before {\n content: \"\\f37c\"; }\n\n.fa-blogger-b:before {\n content: \"\\f37d\"; }\n\n.fa-bluetooth:before {\n content: \"\\f293\"; }\n\n.fa-bluetooth-b:before {\n content: \"\\f294\"; }\n\n.fa-bold:before {\n content: \"\\f032\"; }\n\n.fa-bolt:before {\n content: \"\\f0e7\"; }\n\n.fa-bomb:before {\n content: \"\\f1e2\"; }\n\n.fa-bone:before {\n content: \"\\f5d7\"; }\n\n.fa-bong:before {\n content: \"\\f55c\"; }\n\n.fa-book:before {\n content: \"\\f02d\"; }\n\n.fa-book-dead:before {\n content: \"\\f6b7\"; }\n\n.fa-book-medical:before {\n content: \"\\f7e6\"; }\n\n.fa-book-open:before {\n content: \"\\f518\"; }\n\n.fa-book-reader:before {\n content: \"\\f5da\"; }\n\n.fa-bookmark:before {\n content: \"\\f02e\"; }\n\n.fa-bootstrap:before {\n content: \"\\f836\"; }\n\n.fa-border-all:before {\n content: \"\\f84c\"; }\n\n.fa-border-none:before {\n content: \"\\f850\"; }\n\n.fa-border-style:before {\n content: \"\\f853\"; }\n\n.fa-bowling-ball:before {\n content: \"\\f436\"; }\n\n.fa-box:before {\n content: \"\\f466\"; }\n\n.fa-box-open:before {\n content: \"\\f49e\"; }\n\n.fa-box-tissue:before {\n content: \"\\e05b\"; }\n\n.fa-boxes:before {\n content: \"\\f468\"; }\n\n.fa-braille:before {\n content: \"\\f2a1\"; }\n\n.fa-brain:before {\n content: \"\\f5dc\"; }\n\n.fa-bread-slice:before {\n content: \"\\f7ec\"; }\n\n.fa-briefcase:before {\n content: \"\\f0b1\"; }\n\n.fa-briefcase-medical:before {\n content: \"\\f469\"; }\n\n.fa-broadcast-tower:before {\n content: \"\\f519\"; }\n\n.fa-broom:before {\n content: \"\\f51a\"; }\n\n.fa-brush:before {\n content: \"\\f55d\"; }\n\n.fa-btc:before {\n content: \"\\f15a\"; }\n\n.fa-buffer:before {\n content: \"\\f837\"; }\n\n.fa-bug:before {\n content: \"\\f188\"; }\n\n.fa-building:before {\n content: \"\\f1ad\"; }\n\n.fa-bullhorn:before {\n content: \"\\f0a1\"; }\n\n.fa-bullseye:before {\n content: \"\\f140\"; }\n\n.fa-burn:before {\n content: \"\\f46a\"; }\n\n.fa-buromobelexperte:before {\n content: \"\\f37f\"; }\n\n.fa-bus:before {\n content: \"\\f207\"; }\n\n.fa-bus-alt:before {\n content: \"\\f55e\"; }\n\n.fa-business-time:before {\n content: \"\\f64a\"; }\n\n.fa-buy-n-large:before {\n content: \"\\f8a6\"; }\n\n.fa-buysellads:before {\n content: \"\\f20d\"; }\n\n.fa-calculator:before {\n content: \"\\f1ec\"; }\n\n.fa-calendar:before {\n content: \"\\f133\"; }\n\n.fa-calendar-alt:before {\n content: \"\\f073\"; }\n\n.fa-calendar-check:before {\n content: \"\\f274\"; }\n\n.fa-calendar-day:before {\n content: \"\\f783\"; }\n\n.fa-calendar-minus:before {\n content: \"\\f272\"; }\n\n.fa-calendar-plus:before {\n content: \"\\f271\"; }\n\n.fa-calendar-times:before {\n content: \"\\f273\"; }\n\n.fa-calendar-week:before {\n content: \"\\f784\"; }\n\n.fa-camera:before {\n content: \"\\f030\"; }\n\n.fa-camera-retro:before {\n content: \"\\f083\"; }\n\n.fa-campground:before {\n content: \"\\f6bb\"; }\n\n.fa-canadian-maple-leaf:before {\n content: \"\\f785\"; }\n\n.fa-candy-cane:before {\n content: \"\\f786\"; }\n\n.fa-cannabis:before {\n content: \"\\f55f\"; }\n\n.fa-capsules:before {\n content: \"\\f46b\"; }\n\n.fa-car:before {\n content: \"\\f1b9\"; }\n\n.fa-car-alt:before {\n content: \"\\f5de\"; }\n\n.fa-car-battery:before {\n content: \"\\f5df\"; }\n\n.fa-car-crash:before {\n content: \"\\f5e1\"; }\n\n.fa-car-side:before {\n content: \"\\f5e4\"; }\n\n.fa-caravan:before {\n content: \"\\f8ff\"; }\n\n.fa-caret-down:before {\n content: \"\\f0d7\"; }\n\n.fa-caret-left:before {\n content: \"\\f0d9\"; }\n\n.fa-caret-right:before {\n content: \"\\f0da\"; }\n\n.fa-caret-square-down:before {\n content: \"\\f150\"; }\n\n.fa-caret-square-left:before {\n content: \"\\f191\"; }\n\n.fa-caret-square-right:before {\n content: \"\\f152\"; }\n\n.fa-caret-square-up:before {\n content: \"\\f151\"; }\n\n.fa-caret-up:before {\n content: \"\\f0d8\"; }\n\n.fa-carrot:before {\n content: \"\\f787\"; }\n\n.fa-cart-arrow-down:before {\n content: \"\\f218\"; }\n\n.fa-cart-plus:before {\n content: \"\\f217\"; }\n\n.fa-cash-register:before {\n content: \"\\f788\"; }\n\n.fa-cat:before {\n content: \"\\f6be\"; }\n\n.fa-cc-amazon-pay:before {\n content: \"\\f42d\"; }\n\n.fa-cc-amex:before {\n content: \"\\f1f3\"; }\n\n.fa-cc-apple-pay:before {\n content: \"\\f416\"; }\n\n.fa-cc-diners-club:before {\n content: \"\\f24c\"; }\n\n.fa-cc-discover:before {\n content: \"\\f1f2\"; }\n\n.fa-cc-jcb:before {\n content: \"\\f24b\"; }\n\n.fa-cc-mastercard:before {\n content: \"\\f1f1\"; }\n\n.fa-cc-paypal:before {\n content: \"\\f1f4\"; }\n\n.fa-cc-stripe:before {\n content: \"\\f1f5\"; }\n\n.fa-cc-visa:before {\n content: \"\\f1f0\"; }\n\n.fa-centercode:before {\n content: \"\\f380\"; }\n\n.fa-centos:before {\n content: \"\\f789\"; }\n\n.fa-certificate:before {\n content: \"\\f0a3\"; }\n\n.fa-chair:before {\n content: \"\\f6c0\"; }\n\n.fa-chalkboard:before {\n content: \"\\f51b\"; }\n\n.fa-chalkboard-teacher:before {\n content: \"\\f51c\"; }\n\n.fa-charging-station:before {\n content: \"\\f5e7\"; }\n\n.fa-chart-area:before {\n content: \"\\f1fe\"; }\n\n.fa-chart-bar:before {\n content: \"\\f080\"; }\n\n.fa-chart-line:before {\n content: \"\\f201\"; }\n\n.fa-chart-pie:before {\n content: \"\\f200\"; }\n\n.fa-check:before {\n content: \"\\f00c\"; }\n\n.fa-check-circle:before {\n content: \"\\f058\"; }\n\n.fa-check-double:before {\n content: \"\\f560\"; }\n\n.fa-check-square:before {\n content: \"\\f14a\"; }\n\n.fa-cheese:before {\n content: \"\\f7ef\"; }\n\n.fa-chess:before {\n content: \"\\f439\"; }\n\n.fa-chess-bishop:before {\n content: \"\\f43a\"; }\n\n.fa-chess-board:before {\n content: \"\\f43c\"; }\n\n.fa-chess-king:before {\n content: \"\\f43f\"; }\n\n.fa-chess-knight:before {\n content: \"\\f441\"; }\n\n.fa-chess-pawn:before {\n content: \"\\f443\"; }\n\n.fa-chess-queen:before {\n content: \"\\f445\"; }\n\n.fa-chess-rook:before {\n content: \"\\f447\"; }\n\n.fa-chevron-circle-down:before {\n content: \"\\f13a\"; }\n\n.fa-chevron-circle-left:before {\n content: \"\\f137\"; }\n\n.fa-chevron-circle-right:before {\n content: \"\\f138\"; }\n\n.fa-chevron-circle-up:before {\n content: \"\\f139\"; }\n\n.fa-chevron-down:before {\n content: \"\\f078\"; }\n\n.fa-chevron-left:before {\n content: \"\\f053\"; }\n\n.fa-chevron-right:before {\n content: \"\\f054\"; }\n\n.fa-chevron-up:before {\n content: \"\\f077\"; }\n\n.fa-child:before {\n content: \"\\f1ae\"; }\n\n.fa-chrome:before {\n content: \"\\f268\"; }\n\n.fa-chromecast:before {\n content: \"\\f838\"; }\n\n.fa-church:before {\n content: \"\\f51d\"; }\n\n.fa-circle:before {\n content: \"\\f111\"; }\n\n.fa-circle-notch:before {\n content: \"\\f1ce\"; }\n\n.fa-city:before {\n content: \"\\f64f\"; }\n\n.fa-clinic-medical:before {\n content: \"\\f7f2\"; }\n\n.fa-clipboard:before {\n content: \"\\f328\"; }\n\n.fa-clipboard-check:before {\n content: \"\\f46c\"; }\n\n.fa-clipboard-list:before {\n content: \"\\f46d\"; }\n\n.fa-clock:before {\n content: \"\\f017\"; }\n\n.fa-clone:before {\n content: \"\\f24d\"; }\n\n.fa-closed-captioning:before {\n content: \"\\f20a\"; }\n\n.fa-cloud:before {\n content: \"\\f0c2\"; }\n\n.fa-cloud-download-alt:before {\n content: \"\\f381\"; }\n\n.fa-cloud-meatball:before {\n content: \"\\f73b\"; }\n\n.fa-cloud-moon:before {\n content: \"\\f6c3\"; }\n\n.fa-cloud-moon-rain:before {\n content: \"\\f73c\"; }\n\n.fa-cloud-rain:before {\n content: \"\\f73d\"; }\n\n.fa-cloud-showers-heavy:before {\n content: \"\\f740\"; }\n\n.fa-cloud-sun:before {\n content: \"\\f6c4\"; }\n\n.fa-cloud-sun-rain:before {\n content: \"\\f743\"; }\n\n.fa-cloud-upload-alt:before {\n content: \"\\f382\"; }\n\n.fa-cloudflare:before {\n content: \"\\e07d\"; }\n\n.fa-cloudscale:before {\n content: \"\\f383\"; }\n\n.fa-cloudsmith:before {\n content: \"\\f384\"; }\n\n.fa-cloudversify:before {\n content: \"\\f385\"; }\n\n.fa-cocktail:before {\n content: \"\\f561\"; }\n\n.fa-code:before {\n content: \"\\f121\"; }\n\n.fa-code-branch:before {\n content: \"\\f126\"; }\n\n.fa-codepen:before {\n content: \"\\f1cb\"; }\n\n.fa-codiepie:before {\n content: \"\\f284\"; }\n\n.fa-coffee:before {\n content: \"\\f0f4\"; }\n\n.fa-cog:before {\n content: \"\\f013\"; }\n\n.fa-cogs:before {\n content: \"\\f085\"; }\n\n.fa-coins:before {\n content: \"\\f51e\"; }\n\n.fa-columns:before {\n content: \"\\f0db\"; }\n\n.fa-comment:before {\n content: \"\\f075\"; }\n\n.fa-comment-alt:before {\n content: \"\\f27a\"; }\n\n.fa-comment-dollar:before {\n content: \"\\f651\"; }\n\n.fa-comment-dots:before {\n content: \"\\f4ad\"; }\n\n.fa-comment-medical:before {\n content: \"\\f7f5\"; }\n\n.fa-comment-slash:before {\n content: \"\\f4b3\"; }\n\n.fa-comments:before {\n content: \"\\f086\"; }\n\n.fa-comments-dollar:before {\n content: \"\\f653\"; }\n\n.fa-compact-disc:before {\n content: \"\\f51f\"; }\n\n.fa-compass:before {\n content: \"\\f14e\"; }\n\n.fa-compress:before {\n content: \"\\f066\"; }\n\n.fa-compress-alt:before {\n content: \"\\f422\"; }\n\n.fa-compress-arrows-alt:before {\n content: \"\\f78c\"; }\n\n.fa-concierge-bell:before {\n content: \"\\f562\"; }\n\n.fa-confluence:before {\n content: \"\\f78d\"; }\n\n.fa-connectdevelop:before {\n content: \"\\f20e\"; }\n\n.fa-contao:before {\n content: \"\\f26d\"; }\n\n.fa-cookie:before {\n content: \"\\f563\"; }\n\n.fa-cookie-bite:before {\n content: \"\\f564\"; }\n\n.fa-copy:before {\n content: \"\\f0c5\"; }\n\n.fa-copyright:before {\n content: \"\\f1f9\"; }\n\n.fa-cotton-bureau:before {\n content: \"\\f89e\"; }\n\n.fa-couch:before {\n content: \"\\f4b8\"; }\n\n.fa-cpanel:before {\n content: \"\\f388\"; }\n\n.fa-creative-commons:before {\n content: \"\\f25e\"; }\n\n.fa-creative-commons-by:before {\n content: \"\\f4e7\"; }\n\n.fa-creative-commons-nc:before {\n content: \"\\f4e8\"; }\n\n.fa-creative-commons-nc-eu:before {\n content: \"\\f4e9\"; }\n\n.fa-creative-commons-nc-jp:before {\n content: \"\\f4ea\"; }\n\n.fa-creative-commons-nd:before {\n content: \"\\f4eb\"; }\n\n.fa-creative-commons-pd:before {\n content: \"\\f4ec\"; }\n\n.fa-creative-commons-pd-alt:before {\n content: \"\\f4ed\"; }\n\n.fa-creative-commons-remix:before {\n content: \"\\f4ee\"; }\n\n.fa-creative-commons-sa:before {\n content: \"\\f4ef\"; }\n\n.fa-creative-commons-sampling:before {\n content: \"\\f4f0\"; }\n\n.fa-creative-commons-sampling-plus:before {\n content: \"\\f4f1\"; }\n\n.fa-creative-commons-share:before {\n content: \"\\f4f2\"; }\n\n.fa-creative-commons-zero:before {\n content: \"\\f4f3\"; }\n\n.fa-credit-card:before {\n content: \"\\f09d\"; }\n\n.fa-critical-role:before {\n content: \"\\f6c9\"; }\n\n.fa-crop:before {\n content: \"\\f125\"; }\n\n.fa-crop-alt:before {\n content: \"\\f565\"; }\n\n.fa-cross:before {\n content: \"\\f654\"; }\n\n.fa-crosshairs:before {\n content: \"\\f05b\"; }\n\n.fa-crow:before {\n content: \"\\f520\"; }\n\n.fa-crown:before {\n content: \"\\f521\"; }\n\n.fa-crutch:before {\n content: \"\\f7f7\"; }\n\n.fa-css3:before {\n content: \"\\f13c\"; }\n\n.fa-css3-alt:before {\n content: \"\\f38b\"; }\n\n.fa-cube:before {\n content: \"\\f1b2\"; }\n\n.fa-cubes:before {\n content: \"\\f1b3\"; }\n\n.fa-cut:before {\n content: \"\\f0c4\"; }\n\n.fa-cuttlefish:before {\n content: \"\\f38c\"; }\n\n.fa-d-and-d:before {\n content: \"\\f38d\"; }\n\n.fa-d-and-d-beyond:before {\n content: \"\\f6ca\"; }\n\n.fa-dailymotion:before {\n content: \"\\e052\"; }\n\n.fa-dashcube:before {\n content: \"\\f210\"; }\n\n.fa-database:before {\n content: \"\\f1c0\"; }\n\n.fa-deaf:before {\n content: \"\\f2a4\"; }\n\n.fa-deezer:before {\n content: \"\\e077\"; }\n\n.fa-delicious:before {\n content: \"\\f1a5\"; }\n\n.fa-democrat:before {\n content: \"\\f747\"; }\n\n.fa-deploydog:before {\n content: \"\\f38e\"; }\n\n.fa-deskpro:before {\n content: \"\\f38f\"; }\n\n.fa-desktop:before {\n content: \"\\f108\"; }\n\n.fa-dev:before {\n content: \"\\f6cc\"; }\n\n.fa-deviantart:before {\n content: \"\\f1bd\"; }\n\n.fa-dharmachakra:before {\n content: \"\\f655\"; }\n\n.fa-dhl:before {\n content: \"\\f790\"; }\n\n.fa-diagnoses:before {\n content: \"\\f470\"; }\n\n.fa-diaspora:before {\n content: \"\\f791\"; }\n\n.fa-dice:before {\n content: \"\\f522\"; }\n\n.fa-dice-d20:before {\n content: \"\\f6cf\"; }\n\n.fa-dice-d6:before {\n content: \"\\f6d1\"; }\n\n.fa-dice-five:before {\n content: \"\\f523\"; }\n\n.fa-dice-four:before {\n content: \"\\f524\"; }\n\n.fa-dice-one:before {\n content: \"\\f525\"; }\n\n.fa-dice-six:before {\n content: \"\\f526\"; }\n\n.fa-dice-three:before {\n content: \"\\f527\"; }\n\n.fa-dice-two:before {\n content: \"\\f528\"; }\n\n.fa-digg:before {\n content: \"\\f1a6\"; }\n\n.fa-digital-ocean:before {\n content: \"\\f391\"; }\n\n.fa-digital-tachograph:before {\n content: \"\\f566\"; }\n\n.fa-directions:before {\n content: \"\\f5eb\"; }\n\n.fa-discord:before {\n content: \"\\f392\"; }\n\n.fa-discourse:before {\n content: \"\\f393\"; }\n\n.fa-disease:before {\n content: \"\\f7fa\"; }\n\n.fa-divide:before {\n content: \"\\f529\"; }\n\n.fa-dizzy:before {\n content: \"\\f567\"; }\n\n.fa-dna:before {\n content: \"\\f471\"; }\n\n.fa-dochub:before {\n content: \"\\f394\"; }\n\n.fa-docker:before {\n content: \"\\f395\"; }\n\n.fa-dog:before {\n content: \"\\f6d3\"; }\n\n.fa-dollar-sign:before {\n content: \"\\f155\"; }\n\n.fa-dolly:before {\n content: \"\\f472\"; }\n\n.fa-dolly-flatbed:before {\n content: \"\\f474\"; }\n\n.fa-donate:before {\n content: \"\\f4b9\"; }\n\n.fa-door-closed:before {\n content: \"\\f52a\"; }\n\n.fa-door-open:before {\n content: \"\\f52b\"; }\n\n.fa-dot-circle:before {\n content: \"\\f192\"; }\n\n.fa-dove:before {\n content: \"\\f4ba\"; }\n\n.fa-download:before {\n content: \"\\f019\"; }\n\n.fa-draft2digital:before {\n content: \"\\f396\"; }\n\n.fa-drafting-compass:before {\n content: \"\\f568\"; }\n\n.fa-dragon:before {\n content: \"\\f6d5\"; }\n\n.fa-draw-polygon:before {\n content: \"\\f5ee\"; }\n\n.fa-dribbble:before {\n content: \"\\f17d\"; }\n\n.fa-dribbble-square:before {\n content: \"\\f397\"; }\n\n.fa-dropbox:before {\n content: \"\\f16b\"; }\n\n.fa-drum:before {\n content: \"\\f569\"; }\n\n.fa-drum-steelpan:before {\n content: \"\\f56a\"; }\n\n.fa-drumstick-bite:before {\n content: \"\\f6d7\"; }\n\n.fa-drupal:before {\n content: \"\\f1a9\"; }\n\n.fa-dumbbell:before {\n content: \"\\f44b\"; }\n\n.fa-dumpster:before {\n content: \"\\f793\"; }\n\n.fa-dumpster-fire:before {\n content: \"\\f794\"; }\n\n.fa-dungeon:before {\n content: \"\\f6d9\"; }\n\n.fa-dyalog:before {\n content: \"\\f399\"; }\n\n.fa-earlybirds:before {\n content: \"\\f39a\"; }\n\n.fa-ebay:before {\n content: \"\\f4f4\"; }\n\n.fa-edge:before {\n content: \"\\f282\"; }\n\n.fa-edge-legacy:before {\n content: \"\\e078\"; }\n\n.fa-edit:before {\n content: \"\\f044\"; }\n\n.fa-egg:before {\n content: \"\\f7fb\"; }\n\n.fa-eject:before {\n content: \"\\f052\"; }\n\n.fa-elementor:before {\n content: \"\\f430\"; }\n\n.fa-ellipsis-h:before {\n content: \"\\f141\"; }\n\n.fa-ellipsis-v:before {\n content: \"\\f142\"; }\n\n.fa-ello:before {\n content: \"\\f5f1\"; }\n\n.fa-ember:before {\n content: \"\\f423\"; }\n\n.fa-empire:before {\n content: \"\\f1d1\"; }\n\n.fa-envelope:before {\n content: \"\\f0e0\"; }\n\n.fa-envelope-open:before {\n content: \"\\f2b6\"; }\n\n.fa-envelope-open-text:before {\n content: \"\\f658\"; }\n\n.fa-envelope-square:before {\n content: \"\\f199\"; }\n\n.fa-envira:before {\n content: \"\\f299\"; }\n\n.fa-equals:before {\n content: \"\\f52c\"; }\n\n.fa-eraser:before {\n content: \"\\f12d\"; }\n\n.fa-erlang:before {\n content: \"\\f39d\"; }\n\n.fa-ethereum:before {\n content: \"\\f42e\"; }\n\n.fa-ethernet:before {\n content: \"\\f796\"; }\n\n.fa-etsy:before {\n content: \"\\f2d7\"; }\n\n.fa-euro-sign:before {\n content: \"\\f153\"; }\n\n.fa-evernote:before {\n content: \"\\f839\"; }\n\n.fa-exchange-alt:before {\n content: \"\\f362\"; }\n\n.fa-exclamation:before {\n content: \"\\f12a\"; }\n\n.fa-exclamation-circle:before {\n content: \"\\f06a\"; }\n\n.fa-exclamation-triangle:before {\n content: \"\\f071\"; }\n\n.fa-expand:before {\n content: \"\\f065\"; }\n\n.fa-expand-alt:before {\n content: \"\\f424\"; }\n\n.fa-expand-arrows-alt:before {\n content: \"\\f31e\"; }\n\n.fa-expeditedssl:before {\n content: \"\\f23e\"; }\n\n.fa-external-link-alt:before {\n content: \"\\f35d\"; }\n\n.fa-external-link-square-alt:before {\n content: \"\\f360\"; }\n\n.fa-eye:before {\n content: \"\\f06e\"; }\n\n.fa-eye-dropper:before {\n content: \"\\f1fb\"; }\n\n.fa-eye-slash:before {\n content: \"\\f070\"; }\n\n.fa-facebook:before {\n content: \"\\f09a\"; }\n\n.fa-facebook-f:before {\n content: \"\\f39e\"; }\n\n.fa-facebook-messenger:before {\n content: \"\\f39f\"; }\n\n.fa-facebook-square:before {\n content: \"\\f082\"; }\n\n.fa-fan:before {\n content: \"\\f863\"; }\n\n.fa-fantasy-flight-games:before {\n content: \"\\f6dc\"; }\n\n.fa-fast-backward:before {\n content: \"\\f049\"; }\n\n.fa-fast-forward:before {\n content: \"\\f050\"; }\n\n.fa-faucet:before {\n content: \"\\e005\"; }\n\n.fa-fax:before {\n content: \"\\f1ac\"; }\n\n.fa-feather:before {\n content: \"\\f52d\"; }\n\n.fa-feather-alt:before {\n content: \"\\f56b\"; }\n\n.fa-fedex:before {\n content: \"\\f797\"; }\n\n.fa-fedora:before {\n content: \"\\f798\"; }\n\n.fa-female:before {\n content: \"\\f182\"; }\n\n.fa-fighter-jet:before {\n content: \"\\f0fb\"; }\n\n.fa-figma:before {\n content: \"\\f799\"; }\n\n.fa-file:before {\n content: \"\\f15b\"; }\n\n.fa-file-alt:before {\n content: \"\\f15c\"; }\n\n.fa-file-archive:before {\n content: \"\\f1c6\"; }\n\n.fa-file-audio:before {\n content: \"\\f1c7\"; }\n\n.fa-file-code:before {\n content: \"\\f1c9\"; }\n\n.fa-file-contract:before {\n content: \"\\f56c\"; }\n\n.fa-file-csv:before {\n content: \"\\f6dd\"; }\n\n.fa-file-download:before {\n content: \"\\f56d\"; }\n\n.fa-file-excel:before {\n content: \"\\f1c3\"; }\n\n.fa-file-export:before {\n content: \"\\f56e\"; }\n\n.fa-file-image:before {\n content: \"\\f1c5\"; }\n\n.fa-file-import:before {\n content: \"\\f56f\"; }\n\n.fa-file-invoice:before {\n content: \"\\f570\"; }\n\n.fa-file-invoice-dollar:before {\n content: \"\\f571\"; }\n\n.fa-file-medical:before {\n content: \"\\f477\"; }\n\n.fa-file-medical-alt:before {\n content: \"\\f478\"; }\n\n.fa-file-pdf:before {\n content: \"\\f1c1\"; }\n\n.fa-file-powerpoint:before {\n content: \"\\f1c4\"; }\n\n.fa-file-prescription:before {\n content: \"\\f572\"; }\n\n.fa-file-signature:before {\n content: \"\\f573\"; }\n\n.fa-file-upload:before {\n content: \"\\f574\"; }\n\n.fa-file-video:before {\n content: \"\\f1c8\"; }\n\n.fa-file-word:before {\n content: \"\\f1c2\"; }\n\n.fa-fill:before {\n content: \"\\f575\"; }\n\n.fa-fill-drip:before {\n content: \"\\f576\"; }\n\n.fa-film:before {\n content: \"\\f008\"; }\n\n.fa-filter:before {\n content: \"\\f0b0\"; }\n\n.fa-fingerprint:before {\n content: \"\\f577\"; }\n\n.fa-fire:before {\n content: \"\\f06d\"; }\n\n.fa-fire-alt:before {\n content: \"\\f7e4\"; }\n\n.fa-fire-extinguisher:before {\n content: \"\\f134\"; }\n\n.fa-firefox:before {\n content: \"\\f269\"; }\n\n.fa-firefox-browser:before {\n content: \"\\e007\"; }\n\n.fa-first-aid:before {\n content: \"\\f479\"; }\n\n.fa-first-order:before {\n content: \"\\f2b0\"; }\n\n.fa-first-order-alt:before {\n content: \"\\f50a\"; }\n\n.fa-firstdraft:before {\n content: \"\\f3a1\"; }\n\n.fa-fish:before {\n content: \"\\f578\"; }\n\n.fa-fist-raised:before {\n content: \"\\f6de\"; }\n\n.fa-flag:before {\n content: \"\\f024\"; }\n\n.fa-flag-checkered:before {\n content: \"\\f11e\"; }\n\n.fa-flag-usa:before {\n content: \"\\f74d\"; }\n\n.fa-flask:before {\n content: \"\\f0c3\"; }\n\n.fa-flickr:before {\n content: \"\\f16e\"; }\n\n.fa-flipboard:before {\n content: \"\\f44d\"; }\n\n.fa-flushed:before {\n content: \"\\f579\"; }\n\n.fa-fly:before {\n content: \"\\f417\"; }\n\n.fa-folder:before {\n content: \"\\f07b\"; }\n\n.fa-folder-minus:before {\n content: \"\\f65d\"; }\n\n.fa-folder-open:before {\n content: \"\\f07c\"; }\n\n.fa-folder-plus:before {\n content: \"\\f65e\"; }\n\n.fa-font:before {\n content: \"\\f031\"; }\n\n.fa-font-awesome:before {\n content: \"\\f2b4\"; }\n\n.fa-font-awesome-alt:before {\n content: \"\\f35c\"; }\n\n.fa-font-awesome-flag:before {\n content: \"\\f425\"; }\n\n.fa-font-awesome-logo-full:before {\n content: \"\\f4e6\"; }\n\n.fa-fonticons:before {\n content: \"\\f280\"; }\n\n.fa-fonticons-fi:before {\n content: \"\\f3a2\"; }\n\n.fa-football-ball:before {\n content: \"\\f44e\"; }\n\n.fa-fort-awesome:before {\n content: \"\\f286\"; }\n\n.fa-fort-awesome-alt:before {\n content: \"\\f3a3\"; }\n\n.fa-forumbee:before {\n content: \"\\f211\"; }\n\n.fa-forward:before {\n content: \"\\f04e\"; }\n\n.fa-foursquare:before {\n content: \"\\f180\"; }\n\n.fa-free-code-camp:before {\n content: \"\\f2c5\"; }\n\n.fa-freebsd:before {\n content: \"\\f3a4\"; }\n\n.fa-frog:before {\n content: \"\\f52e\"; }\n\n.fa-frown:before {\n content: \"\\f119\"; }\n\n.fa-frown-open:before {\n content: \"\\f57a\"; }\n\n.fa-fulcrum:before {\n content: \"\\f50b\"; }\n\n.fa-funnel-dollar:before {\n content: \"\\f662\"; }\n\n.fa-futbol:before {\n content: \"\\f1e3\"; }\n\n.fa-galactic-republic:before {\n content: \"\\f50c\"; }\n\n.fa-galactic-senate:before {\n content: \"\\f50d\"; }\n\n.fa-gamepad:before {\n content: \"\\f11b\"; }\n\n.fa-gas-pump:before {\n content: \"\\f52f\"; }\n\n.fa-gavel:before {\n content: \"\\f0e3\"; }\n\n.fa-gem:before {\n content: \"\\f3a5\"; }\n\n.fa-genderless:before {\n content: \"\\f22d\"; }\n\n.fa-get-pocket:before {\n content: \"\\f265\"; }\n\n.fa-gg:before {\n content: \"\\f260\"; }\n\n.fa-gg-circle:before {\n content: \"\\f261\"; }\n\n.fa-ghost:before {\n content: \"\\f6e2\"; }\n\n.fa-gift:before {\n content: \"\\f06b\"; }\n\n.fa-gifts:before {\n content: \"\\f79c\"; }\n\n.fa-git:before {\n content: \"\\f1d3\"; }\n\n.fa-git-alt:before {\n content: \"\\f841\"; }\n\n.fa-git-square:before {\n content: \"\\f1d2\"; }\n\n.fa-github:before {\n content: \"\\f09b\"; }\n\n.fa-github-alt:before {\n content: \"\\f113\"; }\n\n.fa-github-square:before {\n content: \"\\f092\"; }\n\n.fa-gitkraken:before {\n content: \"\\f3a6\"; }\n\n.fa-gitlab:before {\n content: \"\\f296\"; }\n\n.fa-gitter:before {\n content: \"\\f426\"; }\n\n.fa-glass-cheers:before {\n content: \"\\f79f\"; }\n\n.fa-glass-martini:before {\n content: \"\\f000\"; }\n\n.fa-glass-martini-alt:before {\n content: \"\\f57b\"; }\n\n.fa-glass-whiskey:before {\n content: \"\\f7a0\"; }\n\n.fa-glasses:before {\n content: \"\\f530\"; }\n\n.fa-glide:before {\n content: \"\\f2a5\"; }\n\n.fa-glide-g:before {\n content: \"\\f2a6\"; }\n\n.fa-globe:before {\n content: \"\\f0ac\"; }\n\n.fa-globe-africa:before {\n content: \"\\f57c\"; }\n\n.fa-globe-americas:before {\n content: \"\\f57d\"; }\n\n.fa-globe-asia:before {\n content: \"\\f57e\"; }\n\n.fa-globe-europe:before {\n content: \"\\f7a2\"; }\n\n.fa-gofore:before {\n content: \"\\f3a7\"; }\n\n.fa-golf-ball:before {\n content: \"\\f450\"; }\n\n.fa-goodreads:before {\n content: \"\\f3a8\"; }\n\n.fa-goodreads-g:before {\n content: \"\\f3a9\"; }\n\n.fa-google:before {\n content: \"\\f1a0\"; }\n\n.fa-google-drive:before {\n content: \"\\f3aa\"; }\n\n.fa-google-pay:before {\n content: \"\\e079\"; }\n\n.fa-google-play:before {\n content: \"\\f3ab\"; }\n\n.fa-google-plus:before {\n content: \"\\f2b3\"; }\n\n.fa-google-plus-g:before {\n content: \"\\f0d5\"; }\n\n.fa-google-plus-square:before {\n content: \"\\f0d4\"; }\n\n.fa-google-wallet:before {\n content: \"\\f1ee\"; }\n\n.fa-gopuram:before {\n content: \"\\f664\"; }\n\n.fa-graduation-cap:before {\n content: \"\\f19d\"; }\n\n.fa-gratipay:before {\n content: \"\\f184\"; }\n\n.fa-grav:before {\n content: \"\\f2d6\"; }\n\n.fa-greater-than:before {\n content: \"\\f531\"; }\n\n.fa-greater-than-equal:before {\n content: \"\\f532\"; }\n\n.fa-grimace:before {\n content: \"\\f57f\"; }\n\n.fa-grin:before {\n content: \"\\f580\"; }\n\n.fa-grin-alt:before {\n content: \"\\f581\"; }\n\n.fa-grin-beam:before {\n content: \"\\f582\"; }\n\n.fa-grin-beam-sweat:before {\n content: \"\\f583\"; }\n\n.fa-grin-hearts:before {\n content: \"\\f584\"; }\n\n.fa-grin-squint:before {\n content: \"\\f585\"; }\n\n.fa-grin-squint-tears:before {\n content: \"\\f586\"; }\n\n.fa-grin-stars:before {\n content: \"\\f587\"; }\n\n.fa-grin-tears:before {\n content: \"\\f588\"; }\n\n.fa-grin-tongue:before {\n content: \"\\f589\"; }\n\n.fa-grin-tongue-squint:before {\n content: \"\\f58a\"; }\n\n.fa-grin-tongue-wink:before {\n content: \"\\f58b\"; }\n\n.fa-grin-wink:before {\n content: \"\\f58c\"; }\n\n.fa-grip-horizontal:before {\n content: \"\\f58d\"; }\n\n.fa-grip-lines:before {\n content: \"\\f7a4\"; }\n\n.fa-grip-lines-vertical:before {\n content: \"\\f7a5\"; }\n\n.fa-grip-vertical:before {\n content: \"\\f58e\"; }\n\n.fa-gripfire:before {\n content: \"\\f3ac\"; }\n\n.fa-grunt:before {\n content: \"\\f3ad\"; }\n\n.fa-guilded:before {\n content: \"\\e07e\"; }\n\n.fa-guitar:before {\n content: \"\\f7a6\"; }\n\n.fa-gulp:before {\n content: \"\\f3ae\"; }\n\n.fa-h-square:before {\n content: \"\\f0fd\"; }\n\n.fa-hacker-news:before {\n content: \"\\f1d4\"; }\n\n.fa-hacker-news-square:before {\n content: \"\\f3af\"; }\n\n.fa-hackerrank:before {\n content: \"\\f5f7\"; }\n\n.fa-hamburger:before {\n content: \"\\f805\"; }\n\n.fa-hammer:before {\n content: \"\\f6e3\"; }\n\n.fa-hamsa:before {\n content: \"\\f665\"; }\n\n.fa-hand-holding:before {\n content: \"\\f4bd\"; }\n\n.fa-hand-holding-heart:before {\n content: \"\\f4be\"; }\n\n.fa-hand-holding-medical:before {\n content: \"\\e05c\"; }\n\n.fa-hand-holding-usd:before {\n content: \"\\f4c0\"; }\n\n.fa-hand-holding-water:before {\n content: \"\\f4c1\"; }\n\n.fa-hand-lizard:before {\n content: \"\\f258\"; }\n\n.fa-hand-middle-finger:before {\n content: \"\\f806\"; }\n\n.fa-hand-paper:before {\n content: \"\\f256\"; }\n\n.fa-hand-peace:before {\n content: \"\\f25b\"; }\n\n.fa-hand-point-down:before {\n content: \"\\f0a7\"; }\n\n.fa-hand-point-left:before {\n content: \"\\f0a5\"; }\n\n.fa-hand-point-right:before {\n content: \"\\f0a4\"; }\n\n.fa-hand-point-up:before {\n content: \"\\f0a6\"; }\n\n.fa-hand-pointer:before {\n content: \"\\f25a\"; }\n\n.fa-hand-rock:before {\n content: \"\\f255\"; }\n\n.fa-hand-scissors:before {\n content: \"\\f257\"; }\n\n.fa-hand-sparkles:before {\n content: \"\\e05d\"; }\n\n.fa-hand-spock:before {\n content: \"\\f259\"; }\n\n.fa-hands:before {\n content: \"\\f4c2\"; }\n\n.fa-hands-helping:before {\n content: \"\\f4c4\"; }\n\n.fa-hands-wash:before {\n content: \"\\e05e\"; }\n\n.fa-handshake:before {\n content: \"\\f2b5\"; }\n\n.fa-handshake-alt-slash:before {\n content: \"\\e05f\"; }\n\n.fa-handshake-slash:before {\n content: \"\\e060\"; }\n\n.fa-hanukiah:before {\n content: \"\\f6e6\"; }\n\n.fa-hard-hat:before {\n content: \"\\f807\"; }\n\n.fa-hashtag:before {\n content: \"\\f292\"; }\n\n.fa-hat-cowboy:before {\n content: \"\\f8c0\"; }\n\n.fa-hat-cowboy-side:before {\n content: \"\\f8c1\"; }\n\n.fa-hat-wizard:before {\n content: \"\\f6e8\"; }\n\n.fa-hdd:before {\n content: \"\\f0a0\"; }\n\n.fa-head-side-cough:before {\n content: \"\\e061\"; }\n\n.fa-head-side-cough-slash:before {\n content: \"\\e062\"; }\n\n.fa-head-side-mask:before {\n content: \"\\e063\"; }\n\n.fa-head-side-virus:before {\n content: \"\\e064\"; }\n\n.fa-heading:before {\n content: \"\\f1dc\"; }\n\n.fa-headphones:before {\n content: \"\\f025\"; }\n\n.fa-headphones-alt:before {\n content: \"\\f58f\"; }\n\n.fa-headset:before {\n content: \"\\f590\"; }\n\n.fa-heart:before {\n content: \"\\f004\"; }\n\n.fa-heart-broken:before {\n content: \"\\f7a9\"; }\n\n.fa-heartbeat:before {\n content: \"\\f21e\"; }\n\n.fa-helicopter:before {\n content: \"\\f533\"; }\n\n.fa-highlighter:before {\n content: \"\\f591\"; }\n\n.fa-hiking:before {\n content: \"\\f6ec\"; }\n\n.fa-hippo:before {\n content: \"\\f6ed\"; }\n\n.fa-hips:before {\n content: \"\\f452\"; }\n\n.fa-hire-a-helper:before {\n content: \"\\f3b0\"; }\n\n.fa-history:before {\n content: \"\\f1da\"; }\n\n.fa-hive:before {\n content: \"\\e07f\"; }\n\n.fa-hockey-puck:before {\n content: \"\\f453\"; }\n\n.fa-holly-berry:before {\n content: \"\\f7aa\"; }\n\n.fa-home:before {\n content: \"\\f015\"; }\n\n.fa-hooli:before {\n content: \"\\f427\"; }\n\n.fa-hornbill:before {\n content: \"\\f592\"; }\n\n.fa-horse:before {\n content: \"\\f6f0\"; }\n\n.fa-horse-head:before {\n content: \"\\f7ab\"; }\n\n.fa-hospital:before {\n content: \"\\f0f8\"; }\n\n.fa-hospital-alt:before {\n content: \"\\f47d\"; }\n\n.fa-hospital-symbol:before {\n content: \"\\f47e\"; }\n\n.fa-hospital-user:before {\n content: \"\\f80d\"; }\n\n.fa-hot-tub:before {\n content: \"\\f593\"; }\n\n.fa-hotdog:before {\n content: \"\\f80f\"; }\n\n.fa-hotel:before {\n content: \"\\f594\"; }\n\n.fa-hotjar:before {\n content: \"\\f3b1\"; }\n\n.fa-hourglass:before {\n content: \"\\f254\"; }\n\n.fa-hourglass-end:before {\n content: \"\\f253\"; }\n\n.fa-hourglass-half:before {\n content: \"\\f252\"; }\n\n.fa-hourglass-start:before {\n content: \"\\f251\"; }\n\n.fa-house-damage:before {\n content: \"\\f6f1\"; }\n\n.fa-house-user:before {\n content: \"\\e065\"; }\n\n.fa-houzz:before {\n content: \"\\f27c\"; }\n\n.fa-hryvnia:before {\n content: \"\\f6f2\"; }\n\n.fa-html5:before {\n content: \"\\f13b\"; }\n\n.fa-hubspot:before {\n content: \"\\f3b2\"; }\n\n.fa-i-cursor:before {\n content: \"\\f246\"; }\n\n.fa-ice-cream:before {\n content: \"\\f810\"; }\n\n.fa-icicles:before {\n content: \"\\f7ad\"; }\n\n.fa-icons:before {\n content: \"\\f86d\"; }\n\n.fa-id-badge:before {\n content: \"\\f2c1\"; }\n\n.fa-id-card:before {\n content: \"\\f2c2\"; }\n\n.fa-id-card-alt:before {\n content: \"\\f47f\"; }\n\n.fa-ideal:before {\n content: \"\\e013\"; }\n\n.fa-igloo:before {\n content: \"\\f7ae\"; }\n\n.fa-image:before {\n content: \"\\f03e\"; }\n\n.fa-images:before {\n content: \"\\f302\"; }\n\n.fa-imdb:before {\n content: \"\\f2d8\"; }\n\n.fa-inbox:before {\n content: \"\\f01c\"; }\n\n.fa-indent:before {\n content: \"\\f03c\"; }\n\n.fa-industry:before {\n content: \"\\f275\"; }\n\n.fa-infinity:before {\n content: \"\\f534\"; }\n\n.fa-info:before {\n content: \"\\f129\"; }\n\n.fa-info-circle:before {\n content: \"\\f05a\"; }\n\n.fa-innosoft:before {\n content: \"\\e080\"; }\n\n.fa-instagram:before {\n content: \"\\f16d\"; }\n\n.fa-instagram-square:before {\n content: \"\\e055\"; }\n\n.fa-instalod:before {\n content: \"\\e081\"; }\n\n.fa-intercom:before {\n content: \"\\f7af\"; }\n\n.fa-internet-explorer:before {\n content: \"\\f26b\"; }\n\n.fa-invision:before {\n content: \"\\f7b0\"; }\n\n.fa-ioxhost:before {\n content: \"\\f208\"; }\n\n.fa-italic:before {\n content: \"\\f033\"; }\n\n.fa-itch-io:before {\n content: \"\\f83a\"; }\n\n.fa-itunes:before {\n content: \"\\f3b4\"; }\n\n.fa-itunes-note:before {\n content: \"\\f3b5\"; }\n\n.fa-java:before {\n content: \"\\f4e4\"; }\n\n.fa-jedi:before {\n content: \"\\f669\"; }\n\n.fa-jedi-order:before {\n content: \"\\f50e\"; }\n\n.fa-jenkins:before {\n content: \"\\f3b6\"; }\n\n.fa-jira:before {\n content: \"\\f7b1\"; }\n\n.fa-joget:before {\n content: \"\\f3b7\"; }\n\n.fa-joint:before {\n content: \"\\f595\"; }\n\n.fa-joomla:before {\n content: \"\\f1aa\"; }\n\n.fa-journal-whills:before {\n content: \"\\f66a\"; }\n\n.fa-js:before {\n content: \"\\f3b8\"; }\n\n.fa-js-square:before {\n content: \"\\f3b9\"; }\n\n.fa-jsfiddle:before {\n content: \"\\f1cc\"; }\n\n.fa-kaaba:before {\n content: \"\\f66b\"; }\n\n.fa-kaggle:before {\n content: \"\\f5fa\"; }\n\n.fa-key:before {\n content: \"\\f084\"; }\n\n.fa-keybase:before {\n content: \"\\f4f5\"; }\n\n.fa-keyboard:before {\n content: \"\\f11c\"; }\n\n.fa-keycdn:before {\n content: \"\\f3ba\"; }\n\n.fa-khanda:before {\n content: \"\\f66d\"; }\n\n.fa-kickstarter:before {\n content: \"\\f3bb\"; }\n\n.fa-kickstarter-k:before {\n content: \"\\f3bc\"; }\n\n.fa-kiss:before {\n content: \"\\f596\"; }\n\n.fa-kiss-beam:before {\n content: \"\\f597\"; }\n\n.fa-kiss-wink-heart:before {\n content: \"\\f598\"; }\n\n.fa-kiwi-bird:before {\n content: \"\\f535\"; }\n\n.fa-korvue:before {\n content: \"\\f42f\"; }\n\n.fa-landmark:before {\n content: \"\\f66f\"; }\n\n.fa-language:before {\n content: \"\\f1ab\"; }\n\n.fa-laptop:before {\n content: \"\\f109\"; }\n\n.fa-laptop-code:before {\n content: \"\\f5fc\"; }\n\n.fa-laptop-house:before {\n content: \"\\e066\"; }\n\n.fa-laptop-medical:before {\n content: \"\\f812\"; }\n\n.fa-laravel:before {\n content: \"\\f3bd\"; }\n\n.fa-lastfm:before {\n content: \"\\f202\"; }\n\n.fa-lastfm-square:before {\n content: \"\\f203\"; }\n\n.fa-laugh:before {\n content: \"\\f599\"; }\n\n.fa-laugh-beam:before {\n content: \"\\f59a\"; }\n\n.fa-laugh-squint:before {\n content: \"\\f59b\"; }\n\n.fa-laugh-wink:before {\n content: \"\\f59c\"; }\n\n.fa-layer-group:before {\n content: \"\\f5fd\"; }\n\n.fa-leaf:before {\n content: \"\\f06c\"; }\n\n.fa-leanpub:before {\n content: \"\\f212\"; }\n\n.fa-lemon:before {\n content: \"\\f094\"; }\n\n.fa-less:before {\n content: \"\\f41d\"; }\n\n.fa-less-than:before {\n content: \"\\f536\"; }\n\n.fa-less-than-equal:before {\n content: \"\\f537\"; }\n\n.fa-level-down-alt:before {\n content: \"\\f3be\"; }\n\n.fa-level-up-alt:before {\n content: \"\\f3bf\"; }\n\n.fa-life-ring:before {\n content: \"\\f1cd\"; }\n\n.fa-lightbulb:before {\n content: \"\\f0eb\"; }\n\n.fa-line:before {\n content: \"\\f3c0\"; }\n\n.fa-link:before {\n content: \"\\f0c1\"; }\n\n.fa-linkedin:before {\n content: \"\\f08c\"; }\n\n.fa-linkedin-in:before {\n content: \"\\f0e1\"; }\n\n.fa-linode:before {\n content: \"\\f2b8\"; }\n\n.fa-linux:before {\n content: \"\\f17c\"; }\n\n.fa-lira-sign:before {\n content: \"\\f195\"; }\n\n.fa-list:before {\n content: \"\\f03a\"; }\n\n.fa-list-alt:before {\n content: \"\\f022\"; }\n\n.fa-list-ol:before {\n content: \"\\f0cb\"; }\n\n.fa-list-ul:before {\n content: \"\\f0ca\"; }\n\n.fa-location-arrow:before {\n content: \"\\f124\"; }\n\n.fa-lock:before {\n content: \"\\f023\"; }\n\n.fa-lock-open:before {\n content: \"\\f3c1\"; }\n\n.fa-long-arrow-alt-down:before {\n content: \"\\f309\"; }\n\n.fa-long-arrow-alt-left:before {\n content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-right:before {\n content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-up:before {\n content: \"\\f30c\"; }\n\n.fa-low-vision:before {\n content: \"\\f2a8\"; }\n\n.fa-luggage-cart:before {\n content: \"\\f59d\"; }\n\n.fa-lungs:before {\n content: \"\\f604\"; }\n\n.fa-lungs-virus:before {\n content: \"\\e067\"; }\n\n.fa-lyft:before {\n content: \"\\f3c3\"; }\n\n.fa-magento:before {\n content: \"\\f3c4\"; }\n\n.fa-magic:before {\n content: \"\\f0d0\"; }\n\n.fa-magnet:before {\n content: \"\\f076\"; }\n\n.fa-mail-bulk:before {\n content: \"\\f674\"; }\n\n.fa-mailchimp:before {\n content: \"\\f59e\"; }\n\n.fa-male:before {\n content: \"\\f183\"; }\n\n.fa-mandalorian:before {\n content: \"\\f50f\"; }\n\n.fa-map:before {\n content: \"\\f279\"; }\n\n.fa-map-marked:before {\n content: \"\\f59f\"; }\n\n.fa-map-marked-alt:before {\n content: \"\\f5a0\"; }\n\n.fa-map-marker:before {\n content: \"\\f041\"; }\n\n.fa-map-marker-alt:before {\n content: \"\\f3c5\"; }\n\n.fa-map-pin:before {\n content: \"\\f276\"; }\n\n.fa-map-signs:before {\n content: \"\\f277\"; }\n\n.fa-markdown:before {\n content: \"\\f60f\"; }\n\n.fa-marker:before {\n content: \"\\f5a1\"; }\n\n.fa-mars:before {\n content: \"\\f222\"; }\n\n.fa-mars-double:before {\n content: \"\\f227\"; }\n\n.fa-mars-stroke:before {\n content: \"\\f229\"; }\n\n.fa-mars-stroke-h:before {\n content: \"\\f22b\"; }\n\n.fa-mars-stroke-v:before {\n content: \"\\f22a\"; }\n\n.fa-mask:before {\n content: \"\\f6fa\"; }\n\n.fa-mastodon:before {\n content: \"\\f4f6\"; }\n\n.fa-maxcdn:before {\n content: \"\\f136\"; }\n\n.fa-mdb:before {\n content: \"\\f8ca\"; }\n\n.fa-medal:before {\n content: \"\\f5a2\"; }\n\n.fa-medapps:before {\n content: \"\\f3c6\"; }\n\n.fa-medium:before {\n content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n content: \"\\f3c7\"; }\n\n.fa-medkit:before {\n content: \"\\f0fa\"; }\n\n.fa-medrt:before {\n content: \"\\f3c8\"; }\n\n.fa-meetup:before {\n content: \"\\f2e0\"; }\n\n.fa-megaport:before {\n content: \"\\f5a3\"; }\n\n.fa-meh:before {\n content: \"\\f11a\"; }\n\n.fa-meh-blank:before {\n content: \"\\f5a4\"; }\n\n.fa-meh-rolling-eyes:before {\n content: \"\\f5a5\"; }\n\n.fa-memory:before {\n content: \"\\f538\"; }\n\n.fa-mendeley:before {\n content: \"\\f7b3\"; }\n\n.fa-menorah:before {\n content: \"\\f676\"; }\n\n.fa-mercury:before {\n content: \"\\f223\"; }\n\n.fa-meteor:before {\n content: \"\\f753\"; }\n\n.fa-microblog:before {\n content: \"\\e01a\"; }\n\n.fa-microchip:before {\n content: \"\\f2db\"; }\n\n.fa-microphone:before {\n content: \"\\f130\"; }\n\n.fa-microphone-alt:before {\n content: \"\\f3c9\"; }\n\n.fa-microphone-alt-slash:before {\n content: \"\\f539\"; }\n\n.fa-microphone-slash:before {\n content: \"\\f131\"; }\n\n.fa-microscope:before {\n content: \"\\f610\"; }\n\n.fa-microsoft:before {\n content: \"\\f3ca\"; }\n\n.fa-minus:before {\n content: \"\\f068\"; }\n\n.fa-minus-circle:before {\n content: \"\\f056\"; }\n\n.fa-minus-square:before {\n content: \"\\f146\"; }\n\n.fa-mitten:before {\n content: \"\\f7b5\"; }\n\n.fa-mix:before {\n content: \"\\f3cb\"; }\n\n.fa-mixcloud:before {\n content: \"\\f289\"; }\n\n.fa-mixer:before {\n content: \"\\e056\"; }\n\n.fa-mizuni:before {\n content: \"\\f3cc\"; }\n\n.fa-mobile:before {\n content: \"\\f10b\"; }\n\n.fa-mobile-alt:before {\n content: \"\\f3cd\"; }\n\n.fa-modx:before {\n content: \"\\f285\"; }\n\n.fa-monero:before {\n content: \"\\f3d0\"; }\n\n.fa-money-bill:before {\n content: \"\\f0d6\"; }\n\n.fa-money-bill-alt:before {\n content: \"\\f3d1\"; }\n\n.fa-money-bill-wave:before {\n content: \"\\f53a\"; }\n\n.fa-money-bill-wave-alt:before {\n content: \"\\f53b\"; }\n\n.fa-money-check:before {\n content: \"\\f53c\"; }\n\n.fa-money-check-alt:before {\n content: \"\\f53d\"; }\n\n.fa-monument:before {\n content: \"\\f5a6\"; }\n\n.fa-moon:before {\n content: \"\\f186\"; }\n\n.fa-mortar-pestle:before {\n content: \"\\f5a7\"; }\n\n.fa-mosque:before {\n content: \"\\f678\"; }\n\n.fa-motorcycle:before {\n content: \"\\f21c\"; }\n\n.fa-mountain:before {\n content: \"\\f6fc\"; }\n\n.fa-mouse:before {\n content: \"\\f8cc\"; }\n\n.fa-mouse-pointer:before {\n content: \"\\f245\"; }\n\n.fa-mug-hot:before {\n content: \"\\f7b6\"; }\n\n.fa-music:before {\n content: \"\\f001\"; }\n\n.fa-napster:before {\n content: \"\\f3d2\"; }\n\n.fa-neos:before {\n content: \"\\f612\"; }\n\n.fa-network-wired:before {\n content: \"\\f6ff\"; }\n\n.fa-neuter:before {\n content: \"\\f22c\"; }\n\n.fa-newspaper:before {\n content: \"\\f1ea\"; }\n\n.fa-nimblr:before {\n content: \"\\f5a8\"; }\n\n.fa-node:before {\n content: \"\\f419\"; }\n\n.fa-node-js:before {\n content: \"\\f3d3\"; }\n\n.fa-not-equal:before {\n content: \"\\f53e\"; }\n\n.fa-notes-medical:before {\n content: \"\\f481\"; }\n\n.fa-npm:before {\n content: \"\\f3d4\"; }\n\n.fa-ns8:before {\n content: \"\\f3d5\"; }\n\n.fa-nutritionix:before {\n content: \"\\f3d6\"; }\n\n.fa-object-group:before {\n content: \"\\f247\"; }\n\n.fa-object-ungroup:before {\n content: \"\\f248\"; }\n\n.fa-octopus-deploy:before {\n content: \"\\e082\"; }\n\n.fa-odnoklassniki:before {\n content: \"\\f263\"; }\n\n.fa-odnoklassniki-square:before {\n content: \"\\f264\"; }\n\n.fa-oil-can:before {\n content: \"\\f613\"; }\n\n.fa-old-republic:before {\n content: \"\\f510\"; }\n\n.fa-om:before {\n content: \"\\f679\"; }\n\n.fa-opencart:before {\n content: \"\\f23d\"; }\n\n.fa-openid:before {\n content: \"\\f19b\"; }\n\n.fa-opera:before {\n content: \"\\f26a\"; }\n\n.fa-optin-monster:before {\n content: \"\\f23c\"; }\n\n.fa-orcid:before {\n content: \"\\f8d2\"; }\n\n.fa-osi:before {\n content: \"\\f41a\"; }\n\n.fa-otter:before {\n content: \"\\f700\"; }\n\n.fa-outdent:before {\n content: \"\\f03b\"; }\n\n.fa-page4:before {\n content: \"\\f3d7\"; }\n\n.fa-pagelines:before {\n content: \"\\f18c\"; }\n\n.fa-pager:before {\n content: \"\\f815\"; }\n\n.fa-paint-brush:before {\n content: \"\\f1fc\"; }\n\n.fa-paint-roller:before {\n content: \"\\f5aa\"; }\n\n.fa-palette:before {\n content: \"\\f53f\"; }\n\n.fa-palfed:before {\n content: \"\\f3d8\"; }\n\n.fa-pallet:before {\n content: \"\\f482\"; }\n\n.fa-paper-plane:before {\n content: \"\\f1d8\"; }\n\n.fa-paperclip:before {\n content: \"\\f0c6\"; }\n\n.fa-parachute-box:before {\n content: \"\\f4cd\"; }\n\n.fa-paragraph:before {\n content: \"\\f1dd\"; }\n\n.fa-parking:before {\n content: \"\\f540\"; }\n\n.fa-passport:before {\n content: \"\\f5ab\"; }\n\n.fa-pastafarianism:before {\n content: \"\\f67b\"; }\n\n.fa-paste:before {\n content: \"\\f0ea\"; }\n\n.fa-patreon:before {\n content: \"\\f3d9\"; }\n\n.fa-pause:before {\n content: \"\\f04c\"; }\n\n.fa-pause-circle:before {\n content: \"\\f28b\"; }\n\n.fa-paw:before {\n content: \"\\f1b0\"; }\n\n.fa-paypal:before {\n content: \"\\f1ed\"; }\n\n.fa-peace:before {\n content: \"\\f67c\"; }\n\n.fa-pen:before {\n content: \"\\f304\"; }\n\n.fa-pen-alt:before {\n content: \"\\f305\"; }\n\n.fa-pen-fancy:before {\n content: \"\\f5ac\"; }\n\n.fa-pen-nib:before {\n content: \"\\f5ad\"; }\n\n.fa-pen-square:before {\n content: \"\\f14b\"; }\n\n.fa-pencil-alt:before {\n content: \"\\f303\"; }\n\n.fa-pencil-ruler:before {\n content: \"\\f5ae\"; }\n\n.fa-penny-arcade:before {\n content: \"\\f704\"; }\n\n.fa-people-arrows:before {\n content: \"\\e068\"; }\n\n.fa-people-carry:before {\n content: \"\\f4ce\"; }\n\n.fa-pepper-hot:before {\n content: \"\\f816\"; }\n\n.fa-perbyte:before {\n content: \"\\e083\"; }\n\n.fa-percent:before {\n content: \"\\f295\"; }\n\n.fa-percentage:before {\n content: \"\\f541\"; }\n\n.fa-periscope:before {\n content: \"\\f3da\"; }\n\n.fa-person-booth:before {\n content: \"\\f756\"; }\n\n.fa-phabricator:before {\n content: \"\\f3db\"; }\n\n.fa-phoenix-framework:before {\n content: \"\\f3dc\"; }\n\n.fa-phoenix-squadron:before {\n content: \"\\f511\"; }\n\n.fa-phone:before {\n content: \"\\f095\"; }\n\n.fa-phone-alt:before {\n content: \"\\f879\"; }\n\n.fa-phone-slash:before {\n content: \"\\f3dd\"; }\n\n.fa-phone-square:before {\n content: \"\\f098\"; }\n\n.fa-phone-square-alt:before {\n content: \"\\f87b\"; }\n\n.fa-phone-volume:before {\n content: \"\\f2a0\"; }\n\n.fa-photo-video:before {\n content: \"\\f87c\"; }\n\n.fa-php:before {\n content: \"\\f457\"; }\n\n.fa-pied-piper:before {\n content: \"\\f2ae\"; }\n\n.fa-pied-piper-alt:before {\n content: \"\\f1a8\"; }\n\n.fa-pied-piper-hat:before {\n content: \"\\f4e5\"; }\n\n.fa-pied-piper-pp:before {\n content: \"\\f1a7\"; }\n\n.fa-pied-piper-square:before {\n content: \"\\e01e\"; }\n\n.fa-piggy-bank:before {\n content: \"\\f4d3\"; }\n\n.fa-pills:before {\n content: \"\\f484\"; }\n\n.fa-pinterest:before {\n content: \"\\f0d2\"; }\n\n.fa-pinterest-p:before {\n content: \"\\f231\"; }\n\n.fa-pinterest-square:before {\n content: \"\\f0d3\"; }\n\n.fa-pizza-slice:before {\n content: \"\\f818\"; }\n\n.fa-place-of-worship:before {\n content: \"\\f67f\"; }\n\n.fa-plane:before {\n content: \"\\f072\"; }\n\n.fa-plane-arrival:before {\n content: \"\\f5af\"; }\n\n.fa-plane-departure:before {\n content: \"\\f5b0\"; }\n\n.fa-plane-slash:before {\n content: \"\\e069\"; }\n\n.fa-play:before {\n content: \"\\f04b\"; }\n\n.fa-play-circle:before {\n content: \"\\f144\"; }\n\n.fa-playstation:before {\n content: \"\\f3df\"; }\n\n.fa-plug:before {\n content: \"\\f1e6\"; }\n\n.fa-plus:before {\n content: \"\\f067\"; }\n\n.fa-plus-circle:before {\n content: \"\\f055\"; }\n\n.fa-plus-square:before {\n content: \"\\f0fe\"; }\n\n.fa-podcast:before {\n content: \"\\f2ce\"; }\n\n.fa-poll:before {\n content: \"\\f681\"; }\n\n.fa-poll-h:before {\n content: \"\\f682\"; }\n\n.fa-poo:before {\n content: \"\\f2fe\"; }\n\n.fa-poo-storm:before {\n content: \"\\f75a\"; }\n\n.fa-poop:before {\n content: \"\\f619\"; }\n\n.fa-portrait:before {\n content: \"\\f3e0\"; }\n\n.fa-pound-sign:before {\n content: \"\\f154\"; }\n\n.fa-power-off:before {\n content: \"\\f011\"; }\n\n.fa-pray:before {\n content: \"\\f683\"; }\n\n.fa-praying-hands:before {\n content: \"\\f684\"; }\n\n.fa-prescription:before {\n content: \"\\f5b1\"; }\n\n.fa-prescription-bottle:before {\n content: \"\\f485\"; }\n\n.fa-prescription-bottle-alt:before {\n content: \"\\f486\"; }\n\n.fa-print:before {\n content: \"\\f02f\"; }\n\n.fa-procedures:before {\n content: \"\\f487\"; }\n\n.fa-product-hunt:before {\n content: \"\\f288\"; }\n\n.fa-project-diagram:before {\n content: \"\\f542\"; }\n\n.fa-pump-medical:before {\n content: \"\\e06a\"; }\n\n.fa-pump-soap:before {\n content: \"\\e06b\"; }\n\n.fa-pushed:before {\n content: \"\\f3e1\"; }\n\n.fa-puzzle-piece:before {\n content: \"\\f12e\"; }\n\n.fa-python:before {\n content: \"\\f3e2\"; }\n\n.fa-qq:before {\n content: \"\\f1d6\"; }\n\n.fa-qrcode:before {\n content: \"\\f029\"; }\n\n.fa-question:before {\n content: \"\\f128\"; }\n\n.fa-question-circle:before {\n content: \"\\f059\"; }\n\n.fa-quidditch:before {\n content: \"\\f458\"; }\n\n.fa-quinscape:before {\n content: \"\\f459\"; }\n\n.fa-quora:before {\n content: \"\\f2c4\"; }\n\n.fa-quote-left:before {\n content: \"\\f10d\"; }\n\n.fa-quote-right:before {\n content: \"\\f10e\"; }\n\n.fa-quran:before {\n content: \"\\f687\"; }\n\n.fa-r-project:before {\n content: \"\\f4f7\"; }\n\n.fa-radiation:before {\n content: \"\\f7b9\"; }\n\n.fa-radiation-alt:before {\n content: \"\\f7ba\"; }\n\n.fa-rainbow:before {\n content: \"\\f75b\"; }\n\n.fa-random:before {\n content: \"\\f074\"; }\n\n.fa-raspberry-pi:before {\n content: \"\\f7bb\"; }\n\n.fa-ravelry:before {\n content: \"\\f2d9\"; }\n\n.fa-react:before {\n content: \"\\f41b\"; }\n\n.fa-reacteurope:before {\n content: \"\\f75d\"; }\n\n.fa-readme:before {\n content: \"\\f4d5\"; }\n\n.fa-rebel:before {\n content: \"\\f1d0\"; }\n\n.fa-receipt:before {\n content: \"\\f543\"; }\n\n.fa-record-vinyl:before {\n content: \"\\f8d9\"; }\n\n.fa-recycle:before {\n content: \"\\f1b8\"; }\n\n.fa-red-river:before {\n content: \"\\f3e3\"; }\n\n.fa-reddit:before {\n content: \"\\f1a1\"; }\n\n.fa-reddit-alien:before {\n content: \"\\f281\"; }\n\n.fa-reddit-square:before {\n content: \"\\f1a2\"; }\n\n.fa-redhat:before {\n content: \"\\f7bc\"; }\n\n.fa-redo:before {\n content: \"\\f01e\"; }\n\n.fa-redo-alt:before {\n content: \"\\f2f9\"; }\n\n.fa-registered:before {\n content: \"\\f25d\"; }\n\n.fa-remove-format:before {\n content: \"\\f87d\"; }\n\n.fa-renren:before {\n content: \"\\f18b\"; }\n\n.fa-reply:before {\n content: \"\\f3e5\"; }\n\n.fa-reply-all:before {\n content: \"\\f122\"; }\n\n.fa-replyd:before {\n content: \"\\f3e6\"; }\n\n.fa-republican:before {\n content: \"\\f75e\"; }\n\n.fa-researchgate:before {\n content: \"\\f4f8\"; }\n\n.fa-resolving:before {\n content: \"\\f3e7\"; }\n\n.fa-restroom:before {\n content: \"\\f7bd\"; }\n\n.fa-retweet:before {\n content: \"\\f079\"; }\n\n.fa-rev:before {\n content: \"\\f5b2\"; }\n\n.fa-ribbon:before {\n content: \"\\f4d6\"; }\n\n.fa-ring:before {\n content: \"\\f70b\"; }\n\n.fa-road:before {\n content: \"\\f018\"; }\n\n.fa-robot:before {\n content: \"\\f544\"; }\n\n.fa-rocket:before {\n content: \"\\f135\"; }\n\n.fa-rocketchat:before {\n content: \"\\f3e8\"; }\n\n.fa-rockrms:before {\n content: \"\\f3e9\"; }\n\n.fa-route:before {\n content: \"\\f4d7\"; }\n\n.fa-rss:before {\n content: \"\\f09e\"; }\n\n.fa-rss-square:before {\n content: \"\\f143\"; }\n\n.fa-ruble-sign:before {\n content: \"\\f158\"; }\n\n.fa-ruler:before {\n content: \"\\f545\"; }\n\n.fa-ruler-combined:before {\n content: \"\\f546\"; }\n\n.fa-ruler-horizontal:before {\n content: \"\\f547\"; }\n\n.fa-ruler-vertical:before {\n content: \"\\f548\"; }\n\n.fa-running:before {\n content: \"\\f70c\"; }\n\n.fa-rupee-sign:before {\n content: \"\\f156\"; }\n\n.fa-rust:before {\n content: \"\\e07a\"; }\n\n.fa-sad-cry:before {\n content: \"\\f5b3\"; }\n\n.fa-sad-tear:before {\n content: \"\\f5b4\"; }\n\n.fa-safari:before {\n content: \"\\f267\"; }\n\n.fa-salesforce:before {\n content: \"\\f83b\"; }\n\n.fa-sass:before {\n content: \"\\f41e\"; }\n\n.fa-satellite:before {\n content: \"\\f7bf\"; }\n\n.fa-satellite-dish:before {\n content: \"\\f7c0\"; }\n\n.fa-save:before {\n content: \"\\f0c7\"; }\n\n.fa-schlix:before {\n content: \"\\f3ea\"; }\n\n.fa-school:before {\n content: \"\\f549\"; }\n\n.fa-screwdriver:before {\n content: \"\\f54a\"; }\n\n.fa-scribd:before {\n content: \"\\f28a\"; }\n\n.fa-scroll:before {\n content: \"\\f70e\"; }\n\n.fa-sd-card:before {\n content: \"\\f7c2\"; }\n\n.fa-search:before {\n content: \"\\f002\"; }\n\n.fa-search-dollar:before {\n content: \"\\f688\"; }\n\n.fa-search-location:before {\n content: \"\\f689\"; }\n\n.fa-search-minus:before {\n content: \"\\f010\"; }\n\n.fa-search-plus:before {\n content: \"\\f00e\"; }\n\n.fa-searchengin:before {\n content: \"\\f3eb\"; }\n\n.fa-seedling:before {\n content: \"\\f4d8\"; }\n\n.fa-sellcast:before {\n content: \"\\f2da\"; }\n\n.fa-sellsy:before {\n content: \"\\f213\"; }\n\n.fa-server:before {\n content: \"\\f233\"; }\n\n.fa-servicestack:before {\n content: \"\\f3ec\"; }\n\n.fa-shapes:before {\n content: \"\\f61f\"; }\n\n.fa-share:before {\n content: \"\\f064\"; }\n\n.fa-share-alt:before {\n content: \"\\f1e0\"; }\n\n.fa-share-alt-square:before {\n content: \"\\f1e1\"; }\n\n.fa-share-square:before {\n content: \"\\f14d\"; }\n\n.fa-shekel-sign:before {\n content: \"\\f20b\"; }\n\n.fa-shield-alt:before {\n content: \"\\f3ed\"; }\n\n.fa-shield-virus:before {\n content: \"\\e06c\"; }\n\n.fa-ship:before {\n content: \"\\f21a\"; }\n\n.fa-shipping-fast:before {\n content: \"\\f48b\"; }\n\n.fa-shirtsinbulk:before {\n content: \"\\f214\"; }\n\n.fa-shoe-prints:before {\n content: \"\\f54b\"; }\n\n.fa-shopify:before {\n content: \"\\e057\"; }\n\n.fa-shopping-bag:before {\n content: \"\\f290\"; }\n\n.fa-shopping-basket:before {\n content: \"\\f291\"; }\n\n.fa-shopping-cart:before {\n content: \"\\f07a\"; }\n\n.fa-shopware:before {\n content: \"\\f5b5\"; }\n\n.fa-shower:before {\n content: \"\\f2cc\"; }\n\n.fa-shuttle-van:before {\n content: \"\\f5b6\"; }\n\n.fa-sign:before {\n content: \"\\f4d9\"; }\n\n.fa-sign-in-alt:before {\n content: \"\\f2f6\"; }\n\n.fa-sign-language:before {\n content: \"\\f2a7\"; }\n\n.fa-sign-out-alt:before {\n content: \"\\f2f5\"; }\n\n.fa-signal:before {\n content: \"\\f012\"; }\n\n.fa-signature:before {\n content: \"\\f5b7\"; }\n\n.fa-sim-card:before {\n content: \"\\f7c4\"; }\n\n.fa-simplybuilt:before {\n content: \"\\f215\"; }\n\n.fa-sink:before {\n content: \"\\e06d\"; }\n\n.fa-sistrix:before {\n content: \"\\f3ee\"; }\n\n.fa-sitemap:before {\n content: \"\\f0e8\"; }\n\n.fa-sith:before {\n content: \"\\f512\"; }\n\n.fa-skating:before {\n content: \"\\f7c5\"; }\n\n.fa-sketch:before {\n content: \"\\f7c6\"; }\n\n.fa-skiing:before {\n content: \"\\f7c9\"; }\n\n.fa-skiing-nordic:before {\n content: \"\\f7ca\"; }\n\n.fa-skull:before {\n content: \"\\f54c\"; }\n\n.fa-skull-crossbones:before {\n content: \"\\f714\"; }\n\n.fa-skyatlas:before {\n content: \"\\f216\"; }\n\n.fa-skype:before {\n content: \"\\f17e\"; }\n\n.fa-slack:before {\n content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n content: \"\\f3ef\"; }\n\n.fa-slash:before {\n content: \"\\f715\"; }\n\n.fa-sleigh:before {\n content: \"\\f7cc\"; }\n\n.fa-sliders-h:before {\n content: \"\\f1de\"; }\n\n.fa-slideshare:before {\n content: \"\\f1e7\"; }\n\n.fa-smile:before {\n content: \"\\f118\"; }\n\n.fa-smile-beam:before {\n content: \"\\f5b8\"; }\n\n.fa-smile-wink:before {\n content: \"\\f4da\"; }\n\n.fa-smog:before {\n content: \"\\f75f\"; }\n\n.fa-smoking:before {\n content: \"\\f48d\"; }\n\n.fa-smoking-ban:before {\n content: \"\\f54d\"; }\n\n.fa-sms:before {\n content: \"\\f7cd\"; }\n\n.fa-snapchat:before {\n content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n content: \"\\f2ac\"; }\n\n.fa-snapchat-square:before {\n content: \"\\f2ad\"; }\n\n.fa-snowboarding:before {\n content: \"\\f7ce\"; }\n\n.fa-snowflake:before {\n content: \"\\f2dc\"; }\n\n.fa-snowman:before {\n content: \"\\f7d0\"; }\n\n.fa-snowplow:before {\n content: \"\\f7d2\"; }\n\n.fa-soap:before {\n content: \"\\e06e\"; }\n\n.fa-socks:before {\n content: \"\\f696\"; }\n\n.fa-solar-panel:before {\n content: \"\\f5ba\"; }\n\n.fa-sort:before {\n content: \"\\f0dc\"; }\n\n.fa-sort-alpha-down:before {\n content: \"\\f15d\"; }\n\n.fa-sort-alpha-down-alt:before {\n content: \"\\f881\"; }\n\n.fa-sort-alpha-up:before {\n content: \"\\f15e\"; }\n\n.fa-sort-alpha-up-alt:before {\n content: \"\\f882\"; }\n\n.fa-sort-amount-down:before {\n content: \"\\f160\"; }\n\n.fa-sort-amount-down-alt:before {\n content: \"\\f884\"; }\n\n.fa-sort-amount-up:before {\n content: \"\\f161\"; }\n\n.fa-sort-amount-up-alt:before {\n content: \"\\f885\"; }\n\n.fa-sort-down:before {\n content: \"\\f0dd\"; }\n\n.fa-sort-numeric-down:before {\n content: \"\\f162\"; }\n\n.fa-sort-numeric-down-alt:before {\n content: \"\\f886\"; }\n\n.fa-sort-numeric-up:before {\n content: \"\\f163\"; }\n\n.fa-sort-numeric-up-alt:before {\n content: \"\\f887\"; }\n\n.fa-sort-up:before {\n content: \"\\f0de\"; }\n\n.fa-soundcloud:before {\n content: \"\\f1be\"; }\n\n.fa-sourcetree:before {\n content: \"\\f7d3\"; }\n\n.fa-spa:before {\n content: \"\\f5bb\"; }\n\n.fa-space-shuttle:before {\n content: \"\\f197\"; }\n\n.fa-speakap:before {\n content: \"\\f3f3\"; }\n\n.fa-speaker-deck:before {\n content: \"\\f83c\"; }\n\n.fa-spell-check:before {\n content: \"\\f891\"; }\n\n.fa-spider:before {\n content: \"\\f717\"; }\n\n.fa-spinner:before {\n content: \"\\f110\"; }\n\n.fa-splotch:before {\n content: \"\\f5bc\"; }\n\n.fa-spotify:before {\n content: \"\\f1bc\"; }\n\n.fa-spray-can:before {\n content: \"\\f5bd\"; }\n\n.fa-square:before {\n content: \"\\f0c8\"; }\n\n.fa-square-full:before {\n content: \"\\f45c\"; }\n\n.fa-square-root-alt:before {\n content: \"\\f698\"; }\n\n.fa-squarespace:before {\n content: \"\\f5be\"; }\n\n.fa-stack-exchange:before {\n content: \"\\f18d\"; }\n\n.fa-stack-overflow:before {\n content: \"\\f16c\"; }\n\n.fa-stackpath:before {\n content: \"\\f842\"; }\n\n.fa-stamp:before {\n content: \"\\f5bf\"; }\n\n.fa-star:before {\n content: \"\\f005\"; }\n\n.fa-star-and-crescent:before {\n content: \"\\f699\"; }\n\n.fa-star-half:before {\n content: \"\\f089\"; }\n\n.fa-star-half-alt:before {\n content: \"\\f5c0\"; }\n\n.fa-star-of-david:before {\n content: \"\\f69a\"; }\n\n.fa-star-of-life:before {\n content: \"\\f621\"; }\n\n.fa-staylinked:before {\n content: \"\\f3f5\"; }\n\n.fa-steam:before {\n content: \"\\f1b6\"; }\n\n.fa-steam-square:before {\n content: \"\\f1b7\"; }\n\n.fa-steam-symbol:before {\n content: \"\\f3f6\"; }\n\n.fa-step-backward:before {\n content: \"\\f048\"; }\n\n.fa-step-forward:before {\n content: \"\\f051\"; }\n\n.fa-stethoscope:before {\n content: \"\\f0f1\"; }\n\n.fa-sticker-mule:before {\n content: \"\\f3f7\"; }\n\n.fa-sticky-note:before {\n content: \"\\f249\"; }\n\n.fa-stop:before {\n content: \"\\f04d\"; }\n\n.fa-stop-circle:before {\n content: \"\\f28d\"; }\n\n.fa-stopwatch:before {\n content: \"\\f2f2\"; }\n\n.fa-stopwatch-20:before {\n content: \"\\e06f\"; }\n\n.fa-store:before {\n content: \"\\f54e\"; }\n\n.fa-store-alt:before {\n content: \"\\f54f\"; }\n\n.fa-store-alt-slash:before {\n content: \"\\e070\"; }\n\n.fa-store-slash:before {\n content: \"\\e071\"; }\n\n.fa-strava:before {\n content: \"\\f428\"; }\n\n.fa-stream:before {\n content: \"\\f550\"; }\n\n.fa-street-view:before {\n content: \"\\f21d\"; }\n\n.fa-strikethrough:before {\n content: \"\\f0cc\"; }\n\n.fa-stripe:before {\n content: \"\\f429\"; }\n\n.fa-stripe-s:before {\n content: \"\\f42a\"; }\n\n.fa-stroopwafel:before {\n content: \"\\f551\"; }\n\n.fa-studiovinari:before {\n content: \"\\f3f8\"; }\n\n.fa-stumbleupon:before {\n content: \"\\f1a4\"; }\n\n.fa-stumbleupon-circle:before {\n content: \"\\f1a3\"; }\n\n.fa-subscript:before {\n content: \"\\f12c\"; }\n\n.fa-subway:before {\n content: \"\\f239\"; }\n\n.fa-suitcase:before {\n content: \"\\f0f2\"; }\n\n.fa-suitcase-rolling:before {\n content: \"\\f5c1\"; }\n\n.fa-sun:before {\n content: \"\\f185\"; }\n\n.fa-superpowers:before {\n content: \"\\f2dd\"; }\n\n.fa-superscript:before {\n content: \"\\f12b\"; }\n\n.fa-supple:before {\n content: \"\\f3f9\"; }\n\n.fa-surprise:before {\n content: \"\\f5c2\"; }\n\n.fa-suse:before {\n content: \"\\f7d6\"; }\n\n.fa-swatchbook:before {\n content: \"\\f5c3\"; }\n\n.fa-swift:before {\n content: \"\\f8e1\"; }\n\n.fa-swimmer:before {\n content: \"\\f5c4\"; }\n\n.fa-swimming-pool:before {\n content: \"\\f5c5\"; }\n\n.fa-symfony:before {\n content: \"\\f83d\"; }\n\n.fa-synagogue:before {\n content: \"\\f69b\"; }\n\n.fa-sync:before {\n content: \"\\f021\"; }\n\n.fa-sync-alt:before {\n content: \"\\f2f1\"; }\n\n.fa-syringe:before {\n content: \"\\f48e\"; }\n\n.fa-table:before {\n content: \"\\f0ce\"; }\n\n.fa-table-tennis:before {\n content: \"\\f45d\"; }\n\n.fa-tablet:before {\n content: \"\\f10a\"; }\n\n.fa-tablet-alt:before {\n content: \"\\f3fa\"; }\n\n.fa-tablets:before {\n content: \"\\f490\"; }\n\n.fa-tachometer-alt:before {\n content: \"\\f3fd\"; }\n\n.fa-tag:before {\n content: \"\\f02b\"; }\n\n.fa-tags:before {\n content: \"\\f02c\"; }\n\n.fa-tape:before {\n content: \"\\f4db\"; }\n\n.fa-tasks:before {\n content: \"\\f0ae\"; }\n\n.fa-taxi:before {\n content: \"\\f1ba\"; }\n\n.fa-teamspeak:before {\n content: \"\\f4f9\"; }\n\n.fa-teeth:before {\n content: \"\\f62e\"; }\n\n.fa-teeth-open:before {\n content: \"\\f62f\"; }\n\n.fa-telegram:before {\n content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n content: \"\\f3fe\"; }\n\n.fa-temperature-high:before {\n content: \"\\f769\"; }\n\n.fa-temperature-low:before {\n content: \"\\f76b\"; }\n\n.fa-tencent-weibo:before {\n content: \"\\f1d5\"; }\n\n.fa-tenge:before {\n content: \"\\f7d7\"; }\n\n.fa-terminal:before {\n content: \"\\f120\"; }\n\n.fa-text-height:before {\n content: \"\\f034\"; }\n\n.fa-text-width:before {\n content: \"\\f035\"; }\n\n.fa-th:before {\n content: \"\\f00a\"; }\n\n.fa-th-large:before {\n content: \"\\f009\"; }\n\n.fa-th-list:before {\n content: \"\\f00b\"; }\n\n.fa-the-red-yeti:before {\n content: \"\\f69d\"; }\n\n.fa-theater-masks:before {\n content: \"\\f630\"; }\n\n.fa-themeco:before {\n content: \"\\f5c6\"; }\n\n.fa-themeisle:before {\n content: \"\\f2b2\"; }\n\n.fa-thermometer:before {\n content: \"\\f491\"; }\n\n.fa-thermometer-empty:before {\n content: \"\\f2cb\"; }\n\n.fa-thermometer-full:before {\n content: \"\\f2c7\"; }\n\n.fa-thermometer-half:before {\n content: \"\\f2c9\"; }\n\n.fa-thermometer-quarter:before {\n content: \"\\f2ca\"; }\n\n.fa-thermometer-three-quarters:before {\n content: \"\\f2c8\"; }\n\n.fa-think-peaks:before {\n content: \"\\f731\"; }\n\n.fa-thumbs-down:before {\n content: \"\\f165\"; }\n\n.fa-thumbs-up:before {\n content: \"\\f164\"; }\n\n.fa-thumbtack:before {\n content: \"\\f08d\"; }\n\n.fa-ticket-alt:before {\n content: \"\\f3ff\"; }\n\n.fa-tiktok:before {\n content: \"\\e07b\"; }\n\n.fa-times:before {\n content: \"\\f00d\"; }\n\n.fa-times-circle:before {\n content: \"\\f057\"; }\n\n.fa-tint:before {\n content: \"\\f043\"; }\n\n.fa-tint-slash:before {\n content: \"\\f5c7\"; }\n\n.fa-tired:before {\n content: \"\\f5c8\"; }\n\n.fa-toggle-off:before {\n content: \"\\f204\"; }\n\n.fa-toggle-on:before {\n content: \"\\f205\"; }\n\n.fa-toilet:before {\n content: \"\\f7d8\"; }\n\n.fa-toilet-paper:before {\n content: \"\\f71e\"; }\n\n.fa-toilet-paper-slash:before {\n content: \"\\e072\"; }\n\n.fa-toolbox:before {\n content: \"\\f552\"; }\n\n.fa-tools:before {\n content: \"\\f7d9\"; }\n\n.fa-tooth:before {\n content: \"\\f5c9\"; }\n\n.fa-torah:before {\n content: \"\\f6a0\"; }\n\n.fa-torii-gate:before {\n content: \"\\f6a1\"; }\n\n.fa-tractor:before {\n content: \"\\f722\"; }\n\n.fa-trade-federation:before {\n content: \"\\f513\"; }\n\n.fa-trademark:before {\n content: \"\\f25c\"; }\n\n.fa-traffic-light:before {\n content: \"\\f637\"; }\n\n.fa-trailer:before {\n content: \"\\e041\"; }\n\n.fa-train:before {\n content: \"\\f238\"; }\n\n.fa-tram:before {\n content: \"\\f7da\"; }\n\n.fa-transgender:before {\n content: \"\\f224\"; }\n\n.fa-transgender-alt:before {\n content: \"\\f225\"; }\n\n.fa-trash:before {\n content: \"\\f1f8\"; }\n\n.fa-trash-alt:before {\n content: \"\\f2ed\"; }\n\n.fa-trash-restore:before {\n content: \"\\f829\"; }\n\n.fa-trash-restore-alt:before {\n content: \"\\f82a\"; }\n\n.fa-tree:before {\n content: \"\\f1bb\"; }\n\n.fa-trello:before {\n content: \"\\f181\"; }\n\n.fa-trophy:before {\n content: \"\\f091\"; }\n\n.fa-truck:before {\n content: \"\\f0d1\"; }\n\n.fa-truck-loading:before {\n content: \"\\f4de\"; }\n\n.fa-truck-monster:before {\n content: \"\\f63b\"; }\n\n.fa-truck-moving:before {\n content: \"\\f4df\"; }\n\n.fa-truck-pickup:before {\n content: \"\\f63c\"; }\n\n.fa-tshirt:before {\n content: \"\\f553\"; }\n\n.fa-tty:before {\n content: \"\\f1e4\"; }\n\n.fa-tumblr:before {\n content: \"\\f173\"; }\n\n.fa-tumblr-square:before {\n content: \"\\f174\"; }\n\n.fa-tv:before {\n content: \"\\f26c\"; }\n\n.fa-twitch:before {\n content: \"\\f1e8\"; }\n\n.fa-twitter:before {\n content: \"\\f099\"; }\n\n.fa-twitter-square:before {\n content: \"\\f081\"; }\n\n.fa-typo3:before {\n content: \"\\f42b\"; }\n\n.fa-uber:before {\n content: \"\\f402\"; }\n\n.fa-ubuntu:before {\n content: \"\\f7df\"; }\n\n.fa-uikit:before {\n content: \"\\f403\"; }\n\n.fa-umbraco:before {\n content: \"\\f8e8\"; }\n\n.fa-umbrella:before {\n content: \"\\f0e9\"; }\n\n.fa-umbrella-beach:before {\n content: \"\\f5ca\"; }\n\n.fa-uncharted:before {\n content: \"\\e084\"; }\n\n.fa-underline:before {\n content: \"\\f0cd\"; }\n\n.fa-undo:before {\n content: \"\\f0e2\"; }\n\n.fa-undo-alt:before {\n content: \"\\f2ea\"; }\n\n.fa-uniregistry:before {\n content: \"\\f404\"; }\n\n.fa-unity:before {\n content: \"\\e049\"; }\n\n.fa-universal-access:before {\n content: \"\\f29a\"; }\n\n.fa-university:before {\n content: \"\\f19c\"; }\n\n.fa-unlink:before {\n content: \"\\f127\"; }\n\n.fa-unlock:before {\n content: \"\\f09c\"; }\n\n.fa-unlock-alt:before {\n content: \"\\f13e\"; }\n\n.fa-unsplash:before {\n content: \"\\e07c\"; }\n\n.fa-untappd:before {\n content: \"\\f405\"; }\n\n.fa-upload:before {\n content: \"\\f093\"; }\n\n.fa-ups:before {\n content: \"\\f7e0\"; }\n\n.fa-usb:before {\n content: \"\\f287\"; }\n\n.fa-user:before {\n content: \"\\f007\"; }\n\n.fa-user-alt:before {\n content: \"\\f406\"; }\n\n.fa-user-alt-slash:before {\n content: \"\\f4fa\"; }\n\n.fa-user-astronaut:before {\n content: \"\\f4fb\"; }\n\n.fa-user-check:before {\n content: \"\\f4fc\"; }\n\n.fa-user-circle:before {\n content: \"\\f2bd\"; }\n\n.fa-user-clock:before {\n content: \"\\f4fd\"; }\n\n.fa-user-cog:before {\n content: \"\\f4fe\"; }\n\n.fa-user-edit:before {\n content: \"\\f4ff\"; }\n\n.fa-user-friends:before {\n content: \"\\f500\"; }\n\n.fa-user-graduate:before {\n content: \"\\f501\"; }\n\n.fa-user-injured:before {\n content: \"\\f728\"; }\n\n.fa-user-lock:before {\n content: \"\\f502\"; }\n\n.fa-user-md:before {\n content: \"\\f0f0\"; }\n\n.fa-user-minus:before {\n content: \"\\f503\"; }\n\n.fa-user-ninja:before {\n content: \"\\f504\"; }\n\n.fa-user-nurse:before {\n content: \"\\f82f\"; }\n\n.fa-user-plus:before {\n content: \"\\f234\"; }\n\n.fa-user-secret:before {\n content: \"\\f21b\"; }\n\n.fa-user-shield:before {\n content: \"\\f505\"; }\n\n.fa-user-slash:before {\n content: \"\\f506\"; }\n\n.fa-user-tag:before {\n content: \"\\f507\"; }\n\n.fa-user-tie:before {\n content: \"\\f508\"; }\n\n.fa-user-times:before {\n content: \"\\f235\"; }\n\n.fa-users:before {\n content: \"\\f0c0\"; }\n\n.fa-users-cog:before {\n content: \"\\f509\"; }\n\n.fa-users-slash:before {\n content: \"\\e073\"; }\n\n.fa-usps:before {\n content: \"\\f7e1\"; }\n\n.fa-ussunnah:before {\n content: \"\\f407\"; }\n\n.fa-utensil-spoon:before {\n content: \"\\f2e5\"; }\n\n.fa-utensils:before {\n content: \"\\f2e7\"; }\n\n.fa-vaadin:before {\n content: \"\\f408\"; }\n\n.fa-vector-square:before {\n content: \"\\f5cb\"; }\n\n.fa-venus:before {\n content: \"\\f221\"; }\n\n.fa-venus-double:before {\n content: \"\\f226\"; }\n\n.fa-venus-mars:before {\n content: \"\\f228\"; }\n\n.fa-vest:before {\n content: \"\\e085\"; }\n\n.fa-vest-patches:before {\n content: \"\\e086\"; }\n\n.fa-viacoin:before {\n content: \"\\f237\"; }\n\n.fa-viadeo:before {\n content: \"\\f2a9\"; }\n\n.fa-viadeo-square:before {\n content: \"\\f2aa\"; }\n\n.fa-vial:before {\n content: \"\\f492\"; }\n\n.fa-vials:before {\n content: \"\\f493\"; }\n\n.fa-viber:before {\n content: \"\\f409\"; }\n\n.fa-video:before {\n content: \"\\f03d\"; }\n\n.fa-video-slash:before {\n content: \"\\f4e2\"; }\n\n.fa-vihara:before {\n content: \"\\f6a7\"; }\n\n.fa-vimeo:before {\n content: \"\\f40a\"; }\n\n.fa-vimeo-square:before {\n content: \"\\f194\"; }\n\n.fa-vimeo-v:before {\n content: \"\\f27d\"; }\n\n.fa-vine:before {\n content: \"\\f1ca\"; }\n\n.fa-virus:before {\n content: \"\\e074\"; }\n\n.fa-virus-slash:before {\n content: \"\\e075\"; }\n\n.fa-viruses:before {\n content: \"\\e076\"; }\n\n.fa-vk:before {\n content: \"\\f189\"; }\n\n.fa-vnv:before {\n content: \"\\f40b\"; }\n\n.fa-voicemail:before {\n content: \"\\f897\"; }\n\n.fa-volleyball-ball:before {\n content: \"\\f45f\"; }\n\n.fa-volume-down:before {\n content: \"\\f027\"; }\n\n.fa-volume-mute:before {\n content: \"\\f6a9\"; }\n\n.fa-volume-off:before {\n content: \"\\f026\"; }\n\n.fa-volume-up:before {\n content: \"\\f028\"; }\n\n.fa-vote-yea:before {\n content: \"\\f772\"; }\n\n.fa-vr-cardboard:before {\n content: \"\\f729\"; }\n\n.fa-vuejs:before {\n content: \"\\f41f\"; }\n\n.fa-walking:before {\n content: \"\\f554\"; }\n\n.fa-wallet:before {\n content: \"\\f555\"; }\n\n.fa-warehouse:before {\n content: \"\\f494\"; }\n\n.fa-watchman-monitoring:before {\n content: \"\\e087\"; }\n\n.fa-water:before {\n content: \"\\f773\"; }\n\n.fa-wave-square:before {\n content: \"\\f83e\"; }\n\n.fa-waze:before {\n content: \"\\f83f\"; }\n\n.fa-weebly:before {\n content: \"\\f5cc\"; }\n\n.fa-weibo:before {\n content: \"\\f18a\"; }\n\n.fa-weight:before {\n content: \"\\f496\"; }\n\n.fa-weight-hanging:before {\n content: \"\\f5cd\"; }\n\n.fa-weixin:before {\n content: \"\\f1d7\"; }\n\n.fa-whatsapp:before {\n content: \"\\f232\"; }\n\n.fa-whatsapp-square:before {\n content: \"\\f40c\"; }\n\n.fa-wheelchair:before {\n content: \"\\f193\"; }\n\n.fa-whmcs:before {\n content: \"\\f40d\"; }\n\n.fa-wifi:before {\n content: \"\\f1eb\"; }\n\n.fa-wikipedia-w:before {\n content: \"\\f266\"; }\n\n.fa-wind:before {\n content: \"\\f72e\"; }\n\n.fa-window-close:before {\n content: \"\\f410\"; }\n\n.fa-window-maximize:before {\n content: \"\\f2d0\"; }\n\n.fa-window-minimize:before {\n content: \"\\f2d1\"; }\n\n.fa-window-restore:before {\n content: \"\\f2d2\"; }\n\n.fa-windows:before {\n content: \"\\f17a\"; }\n\n.fa-wine-bottle:before {\n content: \"\\f72f\"; }\n\n.fa-wine-glass:before {\n content: \"\\f4e3\"; }\n\n.fa-wine-glass-alt:before {\n content: \"\\f5ce\"; }\n\n.fa-wix:before {\n content: \"\\f5cf\"; }\n\n.fa-wizards-of-the-coast:before {\n content: \"\\f730\"; }\n\n.fa-wodu:before {\n content: \"\\e088\"; }\n\n.fa-wolf-pack-battalion:before {\n content: \"\\f514\"; }\n\n.fa-won-sign:before {\n content: \"\\f159\"; }\n\n.fa-wordpress:before {\n content: \"\\f19a\"; }\n\n.fa-wordpress-simple:before {\n content: \"\\f411\"; }\n\n.fa-wpbeginner:before {\n content: \"\\f297\"; }\n\n.fa-wpexplorer:before {\n content: \"\\f2de\"; }\n\n.fa-wpforms:before {\n content: \"\\f298\"; }\n\n.fa-wpressr:before {\n content: \"\\f3e4\"; }\n\n.fa-wrench:before {\n content: \"\\f0ad\"; }\n\n.fa-x-ray:before {\n content: \"\\f497\"; }\n\n.fa-xbox:before {\n content: \"\\f412\"; }\n\n.fa-xing:before {\n content: \"\\f168\"; }\n\n.fa-xing-square:before {\n content: \"\\f169\"; }\n\n.fa-y-combinator:before {\n content: \"\\f23b\"; }\n\n.fa-yahoo:before {\n content: \"\\f19e\"; }\n\n.fa-yammer:before {\n content: \"\\f840\"; }\n\n.fa-yandex:before {\n content: \"\\f413\"; }\n\n.fa-yandex-international:before {\n content: \"\\f414\"; }\n\n.fa-yarn:before {\n content: \"\\f7e3\"; }\n\n.fa-yelp:before {\n content: \"\\f1e9\"; }\n\n.fa-yen-sign:before {\n content: \"\\f157\"; }\n\n.fa-yin-yang:before {\n content: \"\\f6ad\"; }\n\n.fa-yoast:before {\n content: \"\\f2b1\"; }\n\n.fa-youtube:before {\n content: \"\\f167\"; }\n\n.fa-youtube-square:before {\n content: \"\\f431\"; }\n\n.fa-zhihu:before {\n content: \"\\f63f\"; }\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto; }\n@font-face {\n font-family: 'Font Awesome 5 Brands';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") format(\"embedded-opentype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") format(\"woff2\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ") format(\"woff\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_4___ + ") format(\"truetype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_5___ + ") format(\"svg\"); }\n\n.fab {\n font-family: 'Font Awesome 5 Brands';\n font-weight: 400; }\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_6___ + ");\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_7___ + ") format(\"embedded-opentype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_8___ + ") format(\"woff2\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_9___ + ") format(\"woff\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_10___ + ") format(\"truetype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_11___ + ") format(\"svg\"); }\n\n.far {\n font-family: 'Font Awesome 5 Free';\n font-weight: 400; }\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_12___ + ");\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_13___ + ") format(\"embedded-opentype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_14___ + ") format(\"woff2\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_15___ + ") format(\"woff\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_16___ + ") format(\"truetype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_17___ + ") format(\"svg\"); }\n\n.fa,\n.fas {\n font-family: 'Font Awesome 5 Free';\n font-weight: 900; }\n", "",{"version":3,"sources":["webpack://./node_modules/@fortawesome/fontawesome-free/css/all.css"],"names":[],"mappings":"AAAA;;;EAGE;AACF;;;;;;EAME,kCAAkC;EAClC,mCAAmC;EACnC,qBAAqB;EACrB,kBAAkB;EAClB,oBAAoB;EACpB,oBAAoB;EACpB,cAAc,EAAE;;AAElB;EACE,oBAAoB;EACpB,mBAAmB;EACnB,wBAAwB,EAAE;;AAE5B;EACE,gBAAgB,EAAE;;AAEpB;EACE,iBAAiB,EAAE;;AAErB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,cAAc,EAAE;;AAElB;EACE,eAAe,EAAE;;AAEnB;EACE,kBAAkB;EAClB,aAAa,EAAE;;AAEjB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,eAAe,EAAE;EACjB;IACE,kBAAkB,EAAE;;AAExB;EACE,UAAU;EACV,kBAAkB;EAClB,kBAAkB;EAClB,UAAU;EACV,oBAAoB,EAAE;;AAExB;EACE,yBAAyB;EACzB,mBAAmB;EACnB,yBAAyB,EAAE;;AAE7B;EACE,WAAW,EAAE;;AAEf;EACE,YAAY,EAAE;;AAEhB;;;;;EAKE,kBAAkB,EAAE;;AAEtB;;;;;EAKE,iBAAiB,EAAE;;AAErB;EACE,6CAA6C;UACrC,qCAAqC,EAAE;;AAEjD;EACE,+CAA+C;UACvC,uCAAuC,EAAE;;AAEnD;EACE;IACE,+BAA+B;YACvB,uBAAuB,EAAE;EACnC;IACE,iCAAiC;YACzB,yBAAyB,EAAE,EAAE;;AAEzC;EACE;IACE,+BAA+B;YACvB,uBAAuB,EAAE;EACnC;IACE,iCAAiC;YACzB,yBAAyB,EAAE,EAAE;;AAEzC;EACE,sEAAsE;EACtE,gCAAgC;UACxB,wBAAwB,EAAE;;AAEpC;EACE,sEAAsE;EACtE,iCAAiC;UACzB,yBAAyB,EAAE;;AAErC;EACE,sEAAsE;EACtE,iCAAiC;UACzB,yBAAyB,EAAE;;AAErC;EACE,gFAAgF;EAChF,+BAA+B;UACvB,uBAAuB,EAAE;;AAEnC;EACE,gFAAgF;EAChF,+BAA+B;UACvB,uBAAuB,EAAE;;AAEnC;EACE,gFAAgF;EAChF,gCAAgC;UACxB,wBAAwB,EAAE;;AAEpC;;;;;;EAME,oBAAoB;UACZ,YAAY,EAAE;;AAExB;EACE,qBAAqB;EACrB,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,sBAAsB;EACtB,YAAY,EAAE;;AAEhB;;EAEE,OAAO;EACP,kBAAkB;EAClB,kBAAkB;EAClB,WAAW,EAAE;;AAEf;EACE,oBAAoB,EAAE;;AAExB;EACE,cAAc,EAAE;;AAElB;EACE,WAAW,EAAE;;AAEf;gEACgE;AAChE;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,gBAAgB,EAAE;;AAEpB;EACE,SAAS;EACT,sBAAsB;EACtB,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,kBAAkB;EAClB,UAAU,EAAE;;AAEd;EACE,UAAU;EACV,YAAY;EACZ,SAAS;EACT,iBAAiB;EACjB,gBAAgB;EAChB,WAAW,EAAE;AACf;EACE,oCAAoC;EACpC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAAyC;EACzC,4SAAmT,EAAE;;AAEvT;EACE,oCAAoC;EACpC,gBAAgB,EAAE;AACpB;EACE,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA0C;EAC1C,8SAAwT,EAAE;;AAE5T;EACE,kCAAkC;EAClC,gBAAgB,EAAE;AACpB;EACE,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,6CAAwC;EACxC,iTAA8S,EAAE;;AAElT;;EAEE,kCAAkC;EAClC,gBAAgB,EAAE","sourcesContent":["/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\n.fa,\n.fas,\n.far,\n.fal,\n.fad,\n.fab {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n line-height: 1; }\n\n.fa-lg {\n font-size: 1.33333em;\n line-height: 0.75em;\n vertical-align: -.0667em; }\n\n.fa-xs {\n font-size: .75em; }\n\n.fa-sm {\n font-size: .875em; }\n\n.fa-1x {\n font-size: 1em; }\n\n.fa-2x {\n font-size: 2em; }\n\n.fa-3x {\n font-size: 3em; }\n\n.fa-4x {\n font-size: 4em; }\n\n.fa-5x {\n font-size: 5em; }\n\n.fa-6x {\n font-size: 6em; }\n\n.fa-7x {\n font-size: 7em; }\n\n.fa-8x {\n font-size: 8em; }\n\n.fa-9x {\n font-size: 9em; }\n\n.fa-10x {\n font-size: 10em; }\n\n.fa-fw {\n text-align: center;\n width: 1.25em; }\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0; }\n .fa-ul > li {\n position: relative; }\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit; }\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: .1em;\n padding: .2em .25em .15em; }\n\n.fa-pull-left {\n float: left; }\n\n.fa-pull-right {\n float: right; }\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: .3em; }\n\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: .3em; }\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg); }\n\n.fa-rotate-180 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg); }\n\n.fa-rotate-270 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1); }\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none; }\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n left: 0;\n position: absolute;\n text-align: center;\n width: 100%; }\n\n.fa-stack-1x {\n line-height: inherit; }\n\n.fa-stack-2x {\n font-size: 2em; }\n\n.fa-inverse {\n color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n.fa-500px:before {\n content: \"\\f26e\"; }\n\n.fa-accessible-icon:before {\n content: \"\\f368\"; }\n\n.fa-accusoft:before {\n content: \"\\f369\"; }\n\n.fa-acquisitions-incorporated:before {\n content: \"\\f6af\"; }\n\n.fa-ad:before {\n content: \"\\f641\"; }\n\n.fa-address-book:before {\n content: \"\\f2b9\"; }\n\n.fa-address-card:before {\n content: \"\\f2bb\"; }\n\n.fa-adjust:before {\n content: \"\\f042\"; }\n\n.fa-adn:before {\n content: \"\\f170\"; }\n\n.fa-adversal:before {\n content: \"\\f36a\"; }\n\n.fa-affiliatetheme:before {\n content: \"\\f36b\"; }\n\n.fa-air-freshener:before {\n content: \"\\f5d0\"; }\n\n.fa-airbnb:before {\n content: \"\\f834\"; }\n\n.fa-algolia:before {\n content: \"\\f36c\"; }\n\n.fa-align-center:before {\n content: \"\\f037\"; }\n\n.fa-align-justify:before {\n content: \"\\f039\"; }\n\n.fa-align-left:before {\n content: \"\\f036\"; }\n\n.fa-align-right:before {\n content: \"\\f038\"; }\n\n.fa-alipay:before {\n content: \"\\f642\"; }\n\n.fa-allergies:before {\n content: \"\\f461\"; }\n\n.fa-amazon:before {\n content: \"\\f270\"; }\n\n.fa-amazon-pay:before {\n content: \"\\f42c\"; }\n\n.fa-ambulance:before {\n content: \"\\f0f9\"; }\n\n.fa-american-sign-language-interpreting:before {\n content: \"\\f2a3\"; }\n\n.fa-amilia:before {\n content: \"\\f36d\"; }\n\n.fa-anchor:before {\n content: \"\\f13d\"; }\n\n.fa-android:before {\n content: \"\\f17b\"; }\n\n.fa-angellist:before {\n content: \"\\f209\"; }\n\n.fa-angle-double-down:before {\n content: \"\\f103\"; }\n\n.fa-angle-double-left:before {\n content: \"\\f100\"; }\n\n.fa-angle-double-right:before {\n content: \"\\f101\"; }\n\n.fa-angle-double-up:before {\n content: \"\\f102\"; }\n\n.fa-angle-down:before {\n content: \"\\f107\"; }\n\n.fa-angle-left:before {\n content: \"\\f104\"; }\n\n.fa-angle-right:before {\n content: \"\\f105\"; }\n\n.fa-angle-up:before {\n content: \"\\f106\"; }\n\n.fa-angry:before {\n content: \"\\f556\"; }\n\n.fa-angrycreative:before {\n content: \"\\f36e\"; }\n\n.fa-angular:before {\n content: \"\\f420\"; }\n\n.fa-ankh:before {\n content: \"\\f644\"; }\n\n.fa-app-store:before {\n content: \"\\f36f\"; }\n\n.fa-app-store-ios:before {\n content: \"\\f370\"; }\n\n.fa-apper:before {\n content: \"\\f371\"; }\n\n.fa-apple:before {\n content: \"\\f179\"; }\n\n.fa-apple-alt:before {\n content: \"\\f5d1\"; }\n\n.fa-apple-pay:before {\n content: \"\\f415\"; }\n\n.fa-archive:before {\n content: \"\\f187\"; }\n\n.fa-archway:before {\n content: \"\\f557\"; }\n\n.fa-arrow-alt-circle-down:before {\n content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-left:before {\n content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-right:before {\n content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-up:before {\n content: \"\\f35b\"; }\n\n.fa-arrow-circle-down:before {\n content: \"\\f0ab\"; }\n\n.fa-arrow-circle-left:before {\n content: \"\\f0a8\"; }\n\n.fa-arrow-circle-right:before {\n content: \"\\f0a9\"; }\n\n.fa-arrow-circle-up:before {\n content: \"\\f0aa\"; }\n\n.fa-arrow-down:before {\n content: \"\\f063\"; }\n\n.fa-arrow-left:before {\n content: \"\\f060\"; }\n\n.fa-arrow-right:before {\n content: \"\\f061\"; }\n\n.fa-arrow-up:before {\n content: \"\\f062\"; }\n\n.fa-arrows-alt:before {\n content: \"\\f0b2\"; }\n\n.fa-arrows-alt-h:before {\n content: \"\\f337\"; }\n\n.fa-arrows-alt-v:before {\n content: \"\\f338\"; }\n\n.fa-artstation:before {\n content: \"\\f77a\"; }\n\n.fa-assistive-listening-systems:before {\n content: \"\\f2a2\"; }\n\n.fa-asterisk:before {\n content: \"\\f069\"; }\n\n.fa-asymmetrik:before {\n content: \"\\f372\"; }\n\n.fa-at:before {\n content: \"\\f1fa\"; }\n\n.fa-atlas:before {\n content: \"\\f558\"; }\n\n.fa-atlassian:before {\n content: \"\\f77b\"; }\n\n.fa-atom:before {\n content: \"\\f5d2\"; }\n\n.fa-audible:before {\n content: \"\\f373\"; }\n\n.fa-audio-description:before {\n content: \"\\f29e\"; }\n\n.fa-autoprefixer:before {\n content: \"\\f41c\"; }\n\n.fa-avianex:before {\n content: \"\\f374\"; }\n\n.fa-aviato:before {\n content: \"\\f421\"; }\n\n.fa-award:before {\n content: \"\\f559\"; }\n\n.fa-aws:before {\n content: \"\\f375\"; }\n\n.fa-baby:before {\n content: \"\\f77c\"; }\n\n.fa-baby-carriage:before {\n content: \"\\f77d\"; }\n\n.fa-backspace:before {\n content: \"\\f55a\"; }\n\n.fa-backward:before {\n content: \"\\f04a\"; }\n\n.fa-bacon:before {\n content: \"\\f7e5\"; }\n\n.fa-bacteria:before {\n content: \"\\e059\"; }\n\n.fa-bacterium:before {\n content: \"\\e05a\"; }\n\n.fa-bahai:before {\n content: \"\\f666\"; }\n\n.fa-balance-scale:before {\n content: \"\\f24e\"; }\n\n.fa-balance-scale-left:before {\n content: \"\\f515\"; }\n\n.fa-balance-scale-right:before {\n content: \"\\f516\"; }\n\n.fa-ban:before {\n content: \"\\f05e\"; }\n\n.fa-band-aid:before {\n content: \"\\f462\"; }\n\n.fa-bandcamp:before {\n content: \"\\f2d5\"; }\n\n.fa-barcode:before {\n content: \"\\f02a\"; }\n\n.fa-bars:before {\n content: \"\\f0c9\"; }\n\n.fa-baseball-ball:before {\n content: \"\\f433\"; }\n\n.fa-basketball-ball:before {\n content: \"\\f434\"; }\n\n.fa-bath:before {\n content: \"\\f2cd\"; }\n\n.fa-battery-empty:before {\n content: \"\\f244\"; }\n\n.fa-battery-full:before {\n content: \"\\f240\"; }\n\n.fa-battery-half:before {\n content: \"\\f242\"; }\n\n.fa-battery-quarter:before {\n content: \"\\f243\"; }\n\n.fa-battery-three-quarters:before {\n content: \"\\f241\"; }\n\n.fa-battle-net:before {\n content: \"\\f835\"; }\n\n.fa-bed:before {\n content: \"\\f236\"; }\n\n.fa-beer:before {\n content: \"\\f0fc\"; }\n\n.fa-behance:before {\n content: \"\\f1b4\"; }\n\n.fa-behance-square:before {\n content: \"\\f1b5\"; }\n\n.fa-bell:before {\n content: \"\\f0f3\"; }\n\n.fa-bell-slash:before {\n content: \"\\f1f6\"; }\n\n.fa-bezier-curve:before {\n content: \"\\f55b\"; }\n\n.fa-bible:before {\n content: \"\\f647\"; }\n\n.fa-bicycle:before {\n content: \"\\f206\"; }\n\n.fa-biking:before {\n content: \"\\f84a\"; }\n\n.fa-bimobject:before {\n content: \"\\f378\"; }\n\n.fa-binoculars:before {\n content: \"\\f1e5\"; }\n\n.fa-biohazard:before {\n content: \"\\f780\"; }\n\n.fa-birthday-cake:before {\n content: \"\\f1fd\"; }\n\n.fa-bitbucket:before {\n content: \"\\f171\"; }\n\n.fa-bitcoin:before {\n content: \"\\f379\"; }\n\n.fa-bity:before {\n content: \"\\f37a\"; }\n\n.fa-black-tie:before {\n content: \"\\f27e\"; }\n\n.fa-blackberry:before {\n content: \"\\f37b\"; }\n\n.fa-blender:before {\n content: \"\\f517\"; }\n\n.fa-blender-phone:before {\n content: \"\\f6b6\"; }\n\n.fa-blind:before {\n content: \"\\f29d\"; }\n\n.fa-blog:before {\n content: \"\\f781\"; }\n\n.fa-blogger:before {\n content: \"\\f37c\"; }\n\n.fa-blogger-b:before {\n content: \"\\f37d\"; }\n\n.fa-bluetooth:before {\n content: \"\\f293\"; }\n\n.fa-bluetooth-b:before {\n content: \"\\f294\"; }\n\n.fa-bold:before {\n content: \"\\f032\"; }\n\n.fa-bolt:before {\n content: \"\\f0e7\"; }\n\n.fa-bomb:before {\n content: \"\\f1e2\"; }\n\n.fa-bone:before {\n content: \"\\f5d7\"; }\n\n.fa-bong:before {\n content: \"\\f55c\"; }\n\n.fa-book:before {\n content: \"\\f02d\"; }\n\n.fa-book-dead:before {\n content: \"\\f6b7\"; }\n\n.fa-book-medical:before {\n content: \"\\f7e6\"; }\n\n.fa-book-open:before {\n content: \"\\f518\"; }\n\n.fa-book-reader:before {\n content: \"\\f5da\"; }\n\n.fa-bookmark:before {\n content: \"\\f02e\"; }\n\n.fa-bootstrap:before {\n content: \"\\f836\"; }\n\n.fa-border-all:before {\n content: \"\\f84c\"; }\n\n.fa-border-none:before {\n content: \"\\f850\"; }\n\n.fa-border-style:before {\n content: \"\\f853\"; }\n\n.fa-bowling-ball:before {\n content: \"\\f436\"; }\n\n.fa-box:before {\n content: \"\\f466\"; }\n\n.fa-box-open:before {\n content: \"\\f49e\"; }\n\n.fa-box-tissue:before {\n content: \"\\e05b\"; }\n\n.fa-boxes:before {\n content: \"\\f468\"; }\n\n.fa-braille:before {\n content: \"\\f2a1\"; }\n\n.fa-brain:before {\n content: \"\\f5dc\"; }\n\n.fa-bread-slice:before {\n content: \"\\f7ec\"; }\n\n.fa-briefcase:before {\n content: \"\\f0b1\"; }\n\n.fa-briefcase-medical:before {\n content: \"\\f469\"; }\n\n.fa-broadcast-tower:before {\n content: \"\\f519\"; }\n\n.fa-broom:before {\n content: \"\\f51a\"; }\n\n.fa-brush:before {\n content: \"\\f55d\"; }\n\n.fa-btc:before {\n content: \"\\f15a\"; }\n\n.fa-buffer:before {\n content: \"\\f837\"; }\n\n.fa-bug:before {\n content: \"\\f188\"; }\n\n.fa-building:before {\n content: \"\\f1ad\"; }\n\n.fa-bullhorn:before {\n content: \"\\f0a1\"; }\n\n.fa-bullseye:before {\n content: \"\\f140\"; }\n\n.fa-burn:before {\n content: \"\\f46a\"; }\n\n.fa-buromobelexperte:before {\n content: \"\\f37f\"; }\n\n.fa-bus:before {\n content: \"\\f207\"; }\n\n.fa-bus-alt:before {\n content: \"\\f55e\"; }\n\n.fa-business-time:before {\n content: \"\\f64a\"; }\n\n.fa-buy-n-large:before {\n content: \"\\f8a6\"; }\n\n.fa-buysellads:before {\n content: \"\\f20d\"; }\n\n.fa-calculator:before {\n content: \"\\f1ec\"; }\n\n.fa-calendar:before {\n content: \"\\f133\"; }\n\n.fa-calendar-alt:before {\n content: \"\\f073\"; }\n\n.fa-calendar-check:before {\n content: \"\\f274\"; }\n\n.fa-calendar-day:before {\n content: \"\\f783\"; }\n\n.fa-calendar-minus:before {\n content: \"\\f272\"; }\n\n.fa-calendar-plus:before {\n content: \"\\f271\"; }\n\n.fa-calendar-times:before {\n content: \"\\f273\"; }\n\n.fa-calendar-week:before {\n content: \"\\f784\"; }\n\n.fa-camera:before {\n content: \"\\f030\"; }\n\n.fa-camera-retro:before {\n content: \"\\f083\"; }\n\n.fa-campground:before {\n content: \"\\f6bb\"; }\n\n.fa-canadian-maple-leaf:before {\n content: \"\\f785\"; }\n\n.fa-candy-cane:before {\n content: \"\\f786\"; }\n\n.fa-cannabis:before {\n content: \"\\f55f\"; }\n\n.fa-capsules:before {\n content: \"\\f46b\"; }\n\n.fa-car:before {\n content: \"\\f1b9\"; }\n\n.fa-car-alt:before {\n content: \"\\f5de\"; }\n\n.fa-car-battery:before {\n content: \"\\f5df\"; }\n\n.fa-car-crash:before {\n content: \"\\f5e1\"; }\n\n.fa-car-side:before {\n content: \"\\f5e4\"; }\n\n.fa-caravan:before {\n content: \"\\f8ff\"; }\n\n.fa-caret-down:before {\n content: \"\\f0d7\"; }\n\n.fa-caret-left:before {\n content: \"\\f0d9\"; }\n\n.fa-caret-right:before {\n content: \"\\f0da\"; }\n\n.fa-caret-square-down:before {\n content: \"\\f150\"; }\n\n.fa-caret-square-left:before {\n content: \"\\f191\"; }\n\n.fa-caret-square-right:before {\n content: \"\\f152\"; }\n\n.fa-caret-square-up:before {\n content: \"\\f151\"; }\n\n.fa-caret-up:before {\n content: \"\\f0d8\"; }\n\n.fa-carrot:before {\n content: \"\\f787\"; }\n\n.fa-cart-arrow-down:before {\n content: \"\\f218\"; }\n\n.fa-cart-plus:before {\n content: \"\\f217\"; }\n\n.fa-cash-register:before {\n content: \"\\f788\"; }\n\n.fa-cat:before {\n content: \"\\f6be\"; }\n\n.fa-cc-amazon-pay:before {\n content: \"\\f42d\"; }\n\n.fa-cc-amex:before {\n content: \"\\f1f3\"; }\n\n.fa-cc-apple-pay:before {\n content: \"\\f416\"; }\n\n.fa-cc-diners-club:before {\n content: \"\\f24c\"; }\n\n.fa-cc-discover:before {\n content: \"\\f1f2\"; }\n\n.fa-cc-jcb:before {\n content: \"\\f24b\"; }\n\n.fa-cc-mastercard:before {\n content: \"\\f1f1\"; }\n\n.fa-cc-paypal:before {\n content: \"\\f1f4\"; }\n\n.fa-cc-stripe:before {\n content: \"\\f1f5\"; }\n\n.fa-cc-visa:before {\n content: \"\\f1f0\"; }\n\n.fa-centercode:before {\n content: \"\\f380\"; }\n\n.fa-centos:before {\n content: \"\\f789\"; }\n\n.fa-certificate:before {\n content: \"\\f0a3\"; }\n\n.fa-chair:before {\n content: \"\\f6c0\"; }\n\n.fa-chalkboard:before {\n content: \"\\f51b\"; }\n\n.fa-chalkboard-teacher:before {\n content: \"\\f51c\"; }\n\n.fa-charging-station:before {\n content: \"\\f5e7\"; }\n\n.fa-chart-area:before {\n content: \"\\f1fe\"; }\n\n.fa-chart-bar:before {\n content: \"\\f080\"; }\n\n.fa-chart-line:before {\n content: \"\\f201\"; }\n\n.fa-chart-pie:before {\n content: \"\\f200\"; }\n\n.fa-check:before {\n content: \"\\f00c\"; }\n\n.fa-check-circle:before {\n content: \"\\f058\"; }\n\n.fa-check-double:before {\n content: \"\\f560\"; }\n\n.fa-check-square:before {\n content: \"\\f14a\"; }\n\n.fa-cheese:before {\n content: \"\\f7ef\"; }\n\n.fa-chess:before {\n content: \"\\f439\"; }\n\n.fa-chess-bishop:before {\n content: \"\\f43a\"; }\n\n.fa-chess-board:before {\n content: \"\\f43c\"; }\n\n.fa-chess-king:before {\n content: \"\\f43f\"; }\n\n.fa-chess-knight:before {\n content: \"\\f441\"; }\n\n.fa-chess-pawn:before {\n content: \"\\f443\"; }\n\n.fa-chess-queen:before {\n content: \"\\f445\"; }\n\n.fa-chess-rook:before {\n content: \"\\f447\"; }\n\n.fa-chevron-circle-down:before {\n content: \"\\f13a\"; }\n\n.fa-chevron-circle-left:before {\n content: \"\\f137\"; }\n\n.fa-chevron-circle-right:before {\n content: \"\\f138\"; }\n\n.fa-chevron-circle-up:before {\n content: \"\\f139\"; }\n\n.fa-chevron-down:before {\n content: \"\\f078\"; }\n\n.fa-chevron-left:before {\n content: \"\\f053\"; }\n\n.fa-chevron-right:before {\n content: \"\\f054\"; }\n\n.fa-chevron-up:before {\n content: \"\\f077\"; }\n\n.fa-child:before {\n content: \"\\f1ae\"; }\n\n.fa-chrome:before {\n content: \"\\f268\"; }\n\n.fa-chromecast:before {\n content: \"\\f838\"; }\n\n.fa-church:before {\n content: \"\\f51d\"; }\n\n.fa-circle:before {\n content: \"\\f111\"; }\n\n.fa-circle-notch:before {\n content: \"\\f1ce\"; }\n\n.fa-city:before {\n content: \"\\f64f\"; }\n\n.fa-clinic-medical:before {\n content: \"\\f7f2\"; }\n\n.fa-clipboard:before {\n content: \"\\f328\"; }\n\n.fa-clipboard-check:before {\n content: \"\\f46c\"; }\n\n.fa-clipboard-list:before {\n content: \"\\f46d\"; }\n\n.fa-clock:before {\n content: \"\\f017\"; }\n\n.fa-clone:before {\n content: \"\\f24d\"; }\n\n.fa-closed-captioning:before {\n content: \"\\f20a\"; }\n\n.fa-cloud:before {\n content: \"\\f0c2\"; }\n\n.fa-cloud-download-alt:before {\n content: \"\\f381\"; }\n\n.fa-cloud-meatball:before {\n content: \"\\f73b\"; }\n\n.fa-cloud-moon:before {\n content: \"\\f6c3\"; }\n\n.fa-cloud-moon-rain:before {\n content: \"\\f73c\"; }\n\n.fa-cloud-rain:before {\n content: \"\\f73d\"; }\n\n.fa-cloud-showers-heavy:before {\n content: \"\\f740\"; }\n\n.fa-cloud-sun:before {\n content: \"\\f6c4\"; }\n\n.fa-cloud-sun-rain:before {\n content: \"\\f743\"; }\n\n.fa-cloud-upload-alt:before {\n content: \"\\f382\"; }\n\n.fa-cloudflare:before {\n content: \"\\e07d\"; }\n\n.fa-cloudscale:before {\n content: \"\\f383\"; }\n\n.fa-cloudsmith:before {\n content: \"\\f384\"; }\n\n.fa-cloudversify:before {\n content: \"\\f385\"; }\n\n.fa-cocktail:before {\n content: \"\\f561\"; }\n\n.fa-code:before {\n content: \"\\f121\"; }\n\n.fa-code-branch:before {\n content: \"\\f126\"; }\n\n.fa-codepen:before {\n content: \"\\f1cb\"; }\n\n.fa-codiepie:before {\n content: \"\\f284\"; }\n\n.fa-coffee:before {\n content: \"\\f0f4\"; }\n\n.fa-cog:before {\n content: \"\\f013\"; }\n\n.fa-cogs:before {\n content: \"\\f085\"; }\n\n.fa-coins:before {\n content: \"\\f51e\"; }\n\n.fa-columns:before {\n content: \"\\f0db\"; }\n\n.fa-comment:before {\n content: \"\\f075\"; }\n\n.fa-comment-alt:before {\n content: \"\\f27a\"; }\n\n.fa-comment-dollar:before {\n content: \"\\f651\"; }\n\n.fa-comment-dots:before {\n content: \"\\f4ad\"; }\n\n.fa-comment-medical:before {\n content: \"\\f7f5\"; }\n\n.fa-comment-slash:before {\n content: \"\\f4b3\"; }\n\n.fa-comments:before {\n content: \"\\f086\"; }\n\n.fa-comments-dollar:before {\n content: \"\\f653\"; }\n\n.fa-compact-disc:before {\n content: \"\\f51f\"; }\n\n.fa-compass:before {\n content: \"\\f14e\"; }\n\n.fa-compress:before {\n content: \"\\f066\"; }\n\n.fa-compress-alt:before {\n content: \"\\f422\"; }\n\n.fa-compress-arrows-alt:before {\n content: \"\\f78c\"; }\n\n.fa-concierge-bell:before {\n content: \"\\f562\"; }\n\n.fa-confluence:before {\n content: \"\\f78d\"; }\n\n.fa-connectdevelop:before {\n content: \"\\f20e\"; }\n\n.fa-contao:before {\n content: \"\\f26d\"; }\n\n.fa-cookie:before {\n content: \"\\f563\"; }\n\n.fa-cookie-bite:before {\n content: \"\\f564\"; }\n\n.fa-copy:before {\n content: \"\\f0c5\"; }\n\n.fa-copyright:before {\n content: \"\\f1f9\"; }\n\n.fa-cotton-bureau:before {\n content: \"\\f89e\"; }\n\n.fa-couch:before {\n content: \"\\f4b8\"; }\n\n.fa-cpanel:before {\n content: \"\\f388\"; }\n\n.fa-creative-commons:before {\n content: \"\\f25e\"; }\n\n.fa-creative-commons-by:before {\n content: \"\\f4e7\"; }\n\n.fa-creative-commons-nc:before {\n content: \"\\f4e8\"; }\n\n.fa-creative-commons-nc-eu:before {\n content: \"\\f4e9\"; }\n\n.fa-creative-commons-nc-jp:before {\n content: \"\\f4ea\"; }\n\n.fa-creative-commons-nd:before {\n content: \"\\f4eb\"; }\n\n.fa-creative-commons-pd:before {\n content: \"\\f4ec\"; }\n\n.fa-creative-commons-pd-alt:before {\n content: \"\\f4ed\"; }\n\n.fa-creative-commons-remix:before {\n content: \"\\f4ee\"; }\n\n.fa-creative-commons-sa:before {\n content: \"\\f4ef\"; }\n\n.fa-creative-commons-sampling:before {\n content: \"\\f4f0\"; }\n\n.fa-creative-commons-sampling-plus:before {\n content: \"\\f4f1\"; }\n\n.fa-creative-commons-share:before {\n content: \"\\f4f2\"; }\n\n.fa-creative-commons-zero:before {\n content: \"\\f4f3\"; }\n\n.fa-credit-card:before {\n content: \"\\f09d\"; }\n\n.fa-critical-role:before {\n content: \"\\f6c9\"; }\n\n.fa-crop:before {\n content: \"\\f125\"; }\n\n.fa-crop-alt:before {\n content: \"\\f565\"; }\n\n.fa-cross:before {\n content: \"\\f654\"; }\n\n.fa-crosshairs:before {\n content: \"\\f05b\"; }\n\n.fa-crow:before {\n content: \"\\f520\"; }\n\n.fa-crown:before {\n content: \"\\f521\"; }\n\n.fa-crutch:before {\n content: \"\\f7f7\"; }\n\n.fa-css3:before {\n content: \"\\f13c\"; }\n\n.fa-css3-alt:before {\n content: \"\\f38b\"; }\n\n.fa-cube:before {\n content: \"\\f1b2\"; }\n\n.fa-cubes:before {\n content: \"\\f1b3\"; }\n\n.fa-cut:before {\n content: \"\\f0c4\"; }\n\n.fa-cuttlefish:before {\n content: \"\\f38c\"; }\n\n.fa-d-and-d:before {\n content: \"\\f38d\"; }\n\n.fa-d-and-d-beyond:before {\n content: \"\\f6ca\"; }\n\n.fa-dailymotion:before {\n content: \"\\e052\"; }\n\n.fa-dashcube:before {\n content: \"\\f210\"; }\n\n.fa-database:before {\n content: \"\\f1c0\"; }\n\n.fa-deaf:before {\n content: \"\\f2a4\"; }\n\n.fa-deezer:before {\n content: \"\\e077\"; }\n\n.fa-delicious:before {\n content: \"\\f1a5\"; }\n\n.fa-democrat:before {\n content: \"\\f747\"; }\n\n.fa-deploydog:before {\n content: \"\\f38e\"; }\n\n.fa-deskpro:before {\n content: \"\\f38f\"; }\n\n.fa-desktop:before {\n content: \"\\f108\"; }\n\n.fa-dev:before {\n content: \"\\f6cc\"; }\n\n.fa-deviantart:before {\n content: \"\\f1bd\"; }\n\n.fa-dharmachakra:before {\n content: \"\\f655\"; }\n\n.fa-dhl:before {\n content: \"\\f790\"; }\n\n.fa-diagnoses:before {\n content: \"\\f470\"; }\n\n.fa-diaspora:before {\n content: \"\\f791\"; }\n\n.fa-dice:before {\n content: \"\\f522\"; }\n\n.fa-dice-d20:before {\n content: \"\\f6cf\"; }\n\n.fa-dice-d6:before {\n content: \"\\f6d1\"; }\n\n.fa-dice-five:before {\n content: \"\\f523\"; }\n\n.fa-dice-four:before {\n content: \"\\f524\"; }\n\n.fa-dice-one:before {\n content: \"\\f525\"; }\n\n.fa-dice-six:before {\n content: \"\\f526\"; }\n\n.fa-dice-three:before {\n content: \"\\f527\"; }\n\n.fa-dice-two:before {\n content: \"\\f528\"; }\n\n.fa-digg:before {\n content: \"\\f1a6\"; }\n\n.fa-digital-ocean:before {\n content: \"\\f391\"; }\n\n.fa-digital-tachograph:before {\n content: \"\\f566\"; }\n\n.fa-directions:before {\n content: \"\\f5eb\"; }\n\n.fa-discord:before {\n content: \"\\f392\"; }\n\n.fa-discourse:before {\n content: \"\\f393\"; }\n\n.fa-disease:before {\n content: \"\\f7fa\"; }\n\n.fa-divide:before {\n content: \"\\f529\"; }\n\n.fa-dizzy:before {\n content: \"\\f567\"; }\n\n.fa-dna:before {\n content: \"\\f471\"; }\n\n.fa-dochub:before {\n content: \"\\f394\"; }\n\n.fa-docker:before {\n content: \"\\f395\"; }\n\n.fa-dog:before {\n content: \"\\f6d3\"; }\n\n.fa-dollar-sign:before {\n content: \"\\f155\"; }\n\n.fa-dolly:before {\n content: \"\\f472\"; }\n\n.fa-dolly-flatbed:before {\n content: \"\\f474\"; }\n\n.fa-donate:before {\n content: \"\\f4b9\"; }\n\n.fa-door-closed:before {\n content: \"\\f52a\"; }\n\n.fa-door-open:before {\n content: \"\\f52b\"; }\n\n.fa-dot-circle:before {\n content: \"\\f192\"; }\n\n.fa-dove:before {\n content: \"\\f4ba\"; }\n\n.fa-download:before {\n content: \"\\f019\"; }\n\n.fa-draft2digital:before {\n content: \"\\f396\"; }\n\n.fa-drafting-compass:before {\n content: \"\\f568\"; }\n\n.fa-dragon:before {\n content: \"\\f6d5\"; }\n\n.fa-draw-polygon:before {\n content: \"\\f5ee\"; }\n\n.fa-dribbble:before {\n content: \"\\f17d\"; }\n\n.fa-dribbble-square:before {\n content: \"\\f397\"; }\n\n.fa-dropbox:before {\n content: \"\\f16b\"; }\n\n.fa-drum:before {\n content: \"\\f569\"; }\n\n.fa-drum-steelpan:before {\n content: \"\\f56a\"; }\n\n.fa-drumstick-bite:before {\n content: \"\\f6d7\"; }\n\n.fa-drupal:before {\n content: \"\\f1a9\"; }\n\n.fa-dumbbell:before {\n content: \"\\f44b\"; }\n\n.fa-dumpster:before {\n content: \"\\f793\"; }\n\n.fa-dumpster-fire:before {\n content: \"\\f794\"; }\n\n.fa-dungeon:before {\n content: \"\\f6d9\"; }\n\n.fa-dyalog:before {\n content: \"\\f399\"; }\n\n.fa-earlybirds:before {\n content: \"\\f39a\"; }\n\n.fa-ebay:before {\n content: \"\\f4f4\"; }\n\n.fa-edge:before {\n content: \"\\f282\"; }\n\n.fa-edge-legacy:before {\n content: \"\\e078\"; }\n\n.fa-edit:before {\n content: \"\\f044\"; }\n\n.fa-egg:before {\n content: \"\\f7fb\"; }\n\n.fa-eject:before {\n content: \"\\f052\"; }\n\n.fa-elementor:before {\n content: \"\\f430\"; }\n\n.fa-ellipsis-h:before {\n content: \"\\f141\"; }\n\n.fa-ellipsis-v:before {\n content: \"\\f142\"; }\n\n.fa-ello:before {\n content: \"\\f5f1\"; }\n\n.fa-ember:before {\n content: \"\\f423\"; }\n\n.fa-empire:before {\n content: \"\\f1d1\"; }\n\n.fa-envelope:before {\n content: \"\\f0e0\"; }\n\n.fa-envelope-open:before {\n content: \"\\f2b6\"; }\n\n.fa-envelope-open-text:before {\n content: \"\\f658\"; }\n\n.fa-envelope-square:before {\n content: \"\\f199\"; }\n\n.fa-envira:before {\n content: \"\\f299\"; }\n\n.fa-equals:before {\n content: \"\\f52c\"; }\n\n.fa-eraser:before {\n content: \"\\f12d\"; }\n\n.fa-erlang:before {\n content: \"\\f39d\"; }\n\n.fa-ethereum:before {\n content: \"\\f42e\"; }\n\n.fa-ethernet:before {\n content: \"\\f796\"; }\n\n.fa-etsy:before {\n content: \"\\f2d7\"; }\n\n.fa-euro-sign:before {\n content: \"\\f153\"; }\n\n.fa-evernote:before {\n content: \"\\f839\"; }\n\n.fa-exchange-alt:before {\n content: \"\\f362\"; }\n\n.fa-exclamation:before {\n content: \"\\f12a\"; }\n\n.fa-exclamation-circle:before {\n content: \"\\f06a\"; }\n\n.fa-exclamation-triangle:before {\n content: \"\\f071\"; }\n\n.fa-expand:before {\n content: \"\\f065\"; }\n\n.fa-expand-alt:before {\n content: \"\\f424\"; }\n\n.fa-expand-arrows-alt:before {\n content: \"\\f31e\"; }\n\n.fa-expeditedssl:before {\n content: \"\\f23e\"; }\n\n.fa-external-link-alt:before {\n content: \"\\f35d\"; }\n\n.fa-external-link-square-alt:before {\n content: \"\\f360\"; }\n\n.fa-eye:before {\n content: \"\\f06e\"; }\n\n.fa-eye-dropper:before {\n content: \"\\f1fb\"; }\n\n.fa-eye-slash:before {\n content: \"\\f070\"; }\n\n.fa-facebook:before {\n content: \"\\f09a\"; }\n\n.fa-facebook-f:before {\n content: \"\\f39e\"; }\n\n.fa-facebook-messenger:before {\n content: \"\\f39f\"; }\n\n.fa-facebook-square:before {\n content: \"\\f082\"; }\n\n.fa-fan:before {\n content: \"\\f863\"; }\n\n.fa-fantasy-flight-games:before {\n content: \"\\f6dc\"; }\n\n.fa-fast-backward:before {\n content: \"\\f049\"; }\n\n.fa-fast-forward:before {\n content: \"\\f050\"; }\n\n.fa-faucet:before {\n content: \"\\e005\"; }\n\n.fa-fax:before {\n content: \"\\f1ac\"; }\n\n.fa-feather:before {\n content: \"\\f52d\"; }\n\n.fa-feather-alt:before {\n content: \"\\f56b\"; }\n\n.fa-fedex:before {\n content: \"\\f797\"; }\n\n.fa-fedora:before {\n content: \"\\f798\"; }\n\n.fa-female:before {\n content: \"\\f182\"; }\n\n.fa-fighter-jet:before {\n content: \"\\f0fb\"; }\n\n.fa-figma:before {\n content: \"\\f799\"; }\n\n.fa-file:before {\n content: \"\\f15b\"; }\n\n.fa-file-alt:before {\n content: \"\\f15c\"; }\n\n.fa-file-archive:before {\n content: \"\\f1c6\"; }\n\n.fa-file-audio:before {\n content: \"\\f1c7\"; }\n\n.fa-file-code:before {\n content: \"\\f1c9\"; }\n\n.fa-file-contract:before {\n content: \"\\f56c\"; }\n\n.fa-file-csv:before {\n content: \"\\f6dd\"; }\n\n.fa-file-download:before {\n content: \"\\f56d\"; }\n\n.fa-file-excel:before {\n content: \"\\f1c3\"; }\n\n.fa-file-export:before {\n content: \"\\f56e\"; }\n\n.fa-file-image:before {\n content: \"\\f1c5\"; }\n\n.fa-file-import:before {\n content: \"\\f56f\"; }\n\n.fa-file-invoice:before {\n content: \"\\f570\"; }\n\n.fa-file-invoice-dollar:before {\n content: \"\\f571\"; }\n\n.fa-file-medical:before {\n content: \"\\f477\"; }\n\n.fa-file-medical-alt:before {\n content: \"\\f478\"; }\n\n.fa-file-pdf:before {\n content: \"\\f1c1\"; }\n\n.fa-file-powerpoint:before {\n content: \"\\f1c4\"; }\n\n.fa-file-prescription:before {\n content: \"\\f572\"; }\n\n.fa-file-signature:before {\n content: \"\\f573\"; }\n\n.fa-file-upload:before {\n content: \"\\f574\"; }\n\n.fa-file-video:before {\n content: \"\\f1c8\"; }\n\n.fa-file-word:before {\n content: \"\\f1c2\"; }\n\n.fa-fill:before {\n content: \"\\f575\"; }\n\n.fa-fill-drip:before {\n content: \"\\f576\"; }\n\n.fa-film:before {\n content: \"\\f008\"; }\n\n.fa-filter:before {\n content: \"\\f0b0\"; }\n\n.fa-fingerprint:before {\n content: \"\\f577\"; }\n\n.fa-fire:before {\n content: \"\\f06d\"; }\n\n.fa-fire-alt:before {\n content: \"\\f7e4\"; }\n\n.fa-fire-extinguisher:before {\n content: \"\\f134\"; }\n\n.fa-firefox:before {\n content: \"\\f269\"; }\n\n.fa-firefox-browser:before {\n content: \"\\e007\"; }\n\n.fa-first-aid:before {\n content: \"\\f479\"; }\n\n.fa-first-order:before {\n content: \"\\f2b0\"; }\n\n.fa-first-order-alt:before {\n content: \"\\f50a\"; }\n\n.fa-firstdraft:before {\n content: \"\\f3a1\"; }\n\n.fa-fish:before {\n content: \"\\f578\"; }\n\n.fa-fist-raised:before {\n content: \"\\f6de\"; }\n\n.fa-flag:before {\n content: \"\\f024\"; }\n\n.fa-flag-checkered:before {\n content: \"\\f11e\"; }\n\n.fa-flag-usa:before {\n content: \"\\f74d\"; }\n\n.fa-flask:before {\n content: \"\\f0c3\"; }\n\n.fa-flickr:before {\n content: \"\\f16e\"; }\n\n.fa-flipboard:before {\n content: \"\\f44d\"; }\n\n.fa-flushed:before {\n content: \"\\f579\"; }\n\n.fa-fly:before {\n content: \"\\f417\"; }\n\n.fa-folder:before {\n content: \"\\f07b\"; }\n\n.fa-folder-minus:before {\n content: \"\\f65d\"; }\n\n.fa-folder-open:before {\n content: \"\\f07c\"; }\n\n.fa-folder-plus:before {\n content: \"\\f65e\"; }\n\n.fa-font:before {\n content: \"\\f031\"; }\n\n.fa-font-awesome:before {\n content: \"\\f2b4\"; }\n\n.fa-font-awesome-alt:before {\n content: \"\\f35c\"; }\n\n.fa-font-awesome-flag:before {\n content: \"\\f425\"; }\n\n.fa-font-awesome-logo-full:before {\n content: \"\\f4e6\"; }\n\n.fa-fonticons:before {\n content: \"\\f280\"; }\n\n.fa-fonticons-fi:before {\n content: \"\\f3a2\"; }\n\n.fa-football-ball:before {\n content: \"\\f44e\"; }\n\n.fa-fort-awesome:before {\n content: \"\\f286\"; }\n\n.fa-fort-awesome-alt:before {\n content: \"\\f3a3\"; }\n\n.fa-forumbee:before {\n content: \"\\f211\"; }\n\n.fa-forward:before {\n content: \"\\f04e\"; }\n\n.fa-foursquare:before {\n content: \"\\f180\"; }\n\n.fa-free-code-camp:before {\n content: \"\\f2c5\"; }\n\n.fa-freebsd:before {\n content: \"\\f3a4\"; }\n\n.fa-frog:before {\n content: \"\\f52e\"; }\n\n.fa-frown:before {\n content: \"\\f119\"; }\n\n.fa-frown-open:before {\n content: \"\\f57a\"; }\n\n.fa-fulcrum:before {\n content: \"\\f50b\"; }\n\n.fa-funnel-dollar:before {\n content: \"\\f662\"; }\n\n.fa-futbol:before {\n content: \"\\f1e3\"; }\n\n.fa-galactic-republic:before {\n content: \"\\f50c\"; }\n\n.fa-galactic-senate:before {\n content: \"\\f50d\"; }\n\n.fa-gamepad:before {\n content: \"\\f11b\"; }\n\n.fa-gas-pump:before {\n content: \"\\f52f\"; }\n\n.fa-gavel:before {\n content: \"\\f0e3\"; }\n\n.fa-gem:before {\n content: \"\\f3a5\"; }\n\n.fa-genderless:before {\n content: \"\\f22d\"; }\n\n.fa-get-pocket:before {\n content: \"\\f265\"; }\n\n.fa-gg:before {\n content: \"\\f260\"; }\n\n.fa-gg-circle:before {\n content: \"\\f261\"; }\n\n.fa-ghost:before {\n content: \"\\f6e2\"; }\n\n.fa-gift:before {\n content: \"\\f06b\"; }\n\n.fa-gifts:before {\n content: \"\\f79c\"; }\n\n.fa-git:before {\n content: \"\\f1d3\"; }\n\n.fa-git-alt:before {\n content: \"\\f841\"; }\n\n.fa-git-square:before {\n content: \"\\f1d2\"; }\n\n.fa-github:before {\n content: \"\\f09b\"; }\n\n.fa-github-alt:before {\n content: \"\\f113\"; }\n\n.fa-github-square:before {\n content: \"\\f092\"; }\n\n.fa-gitkraken:before {\n content: \"\\f3a6\"; }\n\n.fa-gitlab:before {\n content: \"\\f296\"; }\n\n.fa-gitter:before {\n content: \"\\f426\"; }\n\n.fa-glass-cheers:before {\n content: \"\\f79f\"; }\n\n.fa-glass-martini:before {\n content: \"\\f000\"; }\n\n.fa-glass-martini-alt:before {\n content: \"\\f57b\"; }\n\n.fa-glass-whiskey:before {\n content: \"\\f7a0\"; }\n\n.fa-glasses:before {\n content: \"\\f530\"; }\n\n.fa-glide:before {\n content: \"\\f2a5\"; }\n\n.fa-glide-g:before {\n content: \"\\f2a6\"; }\n\n.fa-globe:before {\n content: \"\\f0ac\"; }\n\n.fa-globe-africa:before {\n content: \"\\f57c\"; }\n\n.fa-globe-americas:before {\n content: \"\\f57d\"; }\n\n.fa-globe-asia:before {\n content: \"\\f57e\"; }\n\n.fa-globe-europe:before {\n content: \"\\f7a2\"; }\n\n.fa-gofore:before {\n content: \"\\f3a7\"; }\n\n.fa-golf-ball:before {\n content: \"\\f450\"; }\n\n.fa-goodreads:before {\n content: \"\\f3a8\"; }\n\n.fa-goodreads-g:before {\n content: \"\\f3a9\"; }\n\n.fa-google:before {\n content: \"\\f1a0\"; }\n\n.fa-google-drive:before {\n content: \"\\f3aa\"; }\n\n.fa-google-pay:before {\n content: \"\\e079\"; }\n\n.fa-google-play:before {\n content: \"\\f3ab\"; }\n\n.fa-google-plus:before {\n content: \"\\f2b3\"; }\n\n.fa-google-plus-g:before {\n content: \"\\f0d5\"; }\n\n.fa-google-plus-square:before {\n content: \"\\f0d4\"; }\n\n.fa-google-wallet:before {\n content: \"\\f1ee\"; }\n\n.fa-gopuram:before {\n content: \"\\f664\"; }\n\n.fa-graduation-cap:before {\n content: \"\\f19d\"; }\n\n.fa-gratipay:before {\n content: \"\\f184\"; }\n\n.fa-grav:before {\n content: \"\\f2d6\"; }\n\n.fa-greater-than:before {\n content: \"\\f531\"; }\n\n.fa-greater-than-equal:before {\n content: \"\\f532\"; }\n\n.fa-grimace:before {\n content: \"\\f57f\"; }\n\n.fa-grin:before {\n content: \"\\f580\"; }\n\n.fa-grin-alt:before {\n content: \"\\f581\"; }\n\n.fa-grin-beam:before {\n content: \"\\f582\"; }\n\n.fa-grin-beam-sweat:before {\n content: \"\\f583\"; }\n\n.fa-grin-hearts:before {\n content: \"\\f584\"; }\n\n.fa-grin-squint:before {\n content: \"\\f585\"; }\n\n.fa-grin-squint-tears:before {\n content: \"\\f586\"; }\n\n.fa-grin-stars:before {\n content: \"\\f587\"; }\n\n.fa-grin-tears:before {\n content: \"\\f588\"; }\n\n.fa-grin-tongue:before {\n content: \"\\f589\"; }\n\n.fa-grin-tongue-squint:before {\n content: \"\\f58a\"; }\n\n.fa-grin-tongue-wink:before {\n content: \"\\f58b\"; }\n\n.fa-grin-wink:before {\n content: \"\\f58c\"; }\n\n.fa-grip-horizontal:before {\n content: \"\\f58d\"; }\n\n.fa-grip-lines:before {\n content: \"\\f7a4\"; }\n\n.fa-grip-lines-vertical:before {\n content: \"\\f7a5\"; }\n\n.fa-grip-vertical:before {\n content: \"\\f58e\"; }\n\n.fa-gripfire:before {\n content: \"\\f3ac\"; }\n\n.fa-grunt:before {\n content: \"\\f3ad\"; }\n\n.fa-guilded:before {\n content: \"\\e07e\"; }\n\n.fa-guitar:before {\n content: \"\\f7a6\"; }\n\n.fa-gulp:before {\n content: \"\\f3ae\"; }\n\n.fa-h-square:before {\n content: \"\\f0fd\"; }\n\n.fa-hacker-news:before {\n content: \"\\f1d4\"; }\n\n.fa-hacker-news-square:before {\n content: \"\\f3af\"; }\n\n.fa-hackerrank:before {\n content: \"\\f5f7\"; }\n\n.fa-hamburger:before {\n content: \"\\f805\"; }\n\n.fa-hammer:before {\n content: \"\\f6e3\"; }\n\n.fa-hamsa:before {\n content: \"\\f665\"; }\n\n.fa-hand-holding:before {\n content: \"\\f4bd\"; }\n\n.fa-hand-holding-heart:before {\n content: \"\\f4be\"; }\n\n.fa-hand-holding-medical:before {\n content: \"\\e05c\"; }\n\n.fa-hand-holding-usd:before {\n content: \"\\f4c0\"; }\n\n.fa-hand-holding-water:before {\n content: \"\\f4c1\"; }\n\n.fa-hand-lizard:before {\n content: \"\\f258\"; }\n\n.fa-hand-middle-finger:before {\n content: \"\\f806\"; }\n\n.fa-hand-paper:before {\n content: \"\\f256\"; }\n\n.fa-hand-peace:before {\n content: \"\\f25b\"; }\n\n.fa-hand-point-down:before {\n content: \"\\f0a7\"; }\n\n.fa-hand-point-left:before {\n content: \"\\f0a5\"; }\n\n.fa-hand-point-right:before {\n content: \"\\f0a4\"; }\n\n.fa-hand-point-up:before {\n content: \"\\f0a6\"; }\n\n.fa-hand-pointer:before {\n content: \"\\f25a\"; }\n\n.fa-hand-rock:before {\n content: \"\\f255\"; }\n\n.fa-hand-scissors:before {\n content: \"\\f257\"; }\n\n.fa-hand-sparkles:before {\n content: \"\\e05d\"; }\n\n.fa-hand-spock:before {\n content: \"\\f259\"; }\n\n.fa-hands:before {\n content: \"\\f4c2\"; }\n\n.fa-hands-helping:before {\n content: \"\\f4c4\"; }\n\n.fa-hands-wash:before {\n content: \"\\e05e\"; }\n\n.fa-handshake:before {\n content: \"\\f2b5\"; }\n\n.fa-handshake-alt-slash:before {\n content: \"\\e05f\"; }\n\n.fa-handshake-slash:before {\n content: \"\\e060\"; }\n\n.fa-hanukiah:before {\n content: \"\\f6e6\"; }\n\n.fa-hard-hat:before {\n content: \"\\f807\"; }\n\n.fa-hashtag:before {\n content: \"\\f292\"; }\n\n.fa-hat-cowboy:before {\n content: \"\\f8c0\"; }\n\n.fa-hat-cowboy-side:before {\n content: \"\\f8c1\"; }\n\n.fa-hat-wizard:before {\n content: \"\\f6e8\"; }\n\n.fa-hdd:before {\n content: \"\\f0a0\"; }\n\n.fa-head-side-cough:before {\n content: \"\\e061\"; }\n\n.fa-head-side-cough-slash:before {\n content: \"\\e062\"; }\n\n.fa-head-side-mask:before {\n content: \"\\e063\"; }\n\n.fa-head-side-virus:before {\n content: \"\\e064\"; }\n\n.fa-heading:before {\n content: \"\\f1dc\"; }\n\n.fa-headphones:before {\n content: \"\\f025\"; }\n\n.fa-headphones-alt:before {\n content: \"\\f58f\"; }\n\n.fa-headset:before {\n content: \"\\f590\"; }\n\n.fa-heart:before {\n content: \"\\f004\"; }\n\n.fa-heart-broken:before {\n content: \"\\f7a9\"; }\n\n.fa-heartbeat:before {\n content: \"\\f21e\"; }\n\n.fa-helicopter:before {\n content: \"\\f533\"; }\n\n.fa-highlighter:before {\n content: \"\\f591\"; }\n\n.fa-hiking:before {\n content: \"\\f6ec\"; }\n\n.fa-hippo:before {\n content: \"\\f6ed\"; }\n\n.fa-hips:before {\n content: \"\\f452\"; }\n\n.fa-hire-a-helper:before {\n content: \"\\f3b0\"; }\n\n.fa-history:before {\n content: \"\\f1da\"; }\n\n.fa-hive:before {\n content: \"\\e07f\"; }\n\n.fa-hockey-puck:before {\n content: \"\\f453\"; }\n\n.fa-holly-berry:before {\n content: \"\\f7aa\"; }\n\n.fa-home:before {\n content: \"\\f015\"; }\n\n.fa-hooli:before {\n content: \"\\f427\"; }\n\n.fa-hornbill:before {\n content: \"\\f592\"; }\n\n.fa-horse:before {\n content: \"\\f6f0\"; }\n\n.fa-horse-head:before {\n content: \"\\f7ab\"; }\n\n.fa-hospital:before {\n content: \"\\f0f8\"; }\n\n.fa-hospital-alt:before {\n content: \"\\f47d\"; }\n\n.fa-hospital-symbol:before {\n content: \"\\f47e\"; }\n\n.fa-hospital-user:before {\n content: \"\\f80d\"; }\n\n.fa-hot-tub:before {\n content: \"\\f593\"; }\n\n.fa-hotdog:before {\n content: \"\\f80f\"; }\n\n.fa-hotel:before {\n content: \"\\f594\"; }\n\n.fa-hotjar:before {\n content: \"\\f3b1\"; }\n\n.fa-hourglass:before {\n content: \"\\f254\"; }\n\n.fa-hourglass-end:before {\n content: \"\\f253\"; }\n\n.fa-hourglass-half:before {\n content: \"\\f252\"; }\n\n.fa-hourglass-start:before {\n content: \"\\f251\"; }\n\n.fa-house-damage:before {\n content: \"\\f6f1\"; }\n\n.fa-house-user:before {\n content: \"\\e065\"; }\n\n.fa-houzz:before {\n content: \"\\f27c\"; }\n\n.fa-hryvnia:before {\n content: \"\\f6f2\"; }\n\n.fa-html5:before {\n content: \"\\f13b\"; }\n\n.fa-hubspot:before {\n content: \"\\f3b2\"; }\n\n.fa-i-cursor:before {\n content: \"\\f246\"; }\n\n.fa-ice-cream:before {\n content: \"\\f810\"; }\n\n.fa-icicles:before {\n content: \"\\f7ad\"; }\n\n.fa-icons:before {\n content: \"\\f86d\"; }\n\n.fa-id-badge:before {\n content: \"\\f2c1\"; }\n\n.fa-id-card:before {\n content: \"\\f2c2\"; }\n\n.fa-id-card-alt:before {\n content: \"\\f47f\"; }\n\n.fa-ideal:before {\n content: \"\\e013\"; }\n\n.fa-igloo:before {\n content: \"\\f7ae\"; }\n\n.fa-image:before {\n content: \"\\f03e\"; }\n\n.fa-images:before {\n content: \"\\f302\"; }\n\n.fa-imdb:before {\n content: \"\\f2d8\"; }\n\n.fa-inbox:before {\n content: \"\\f01c\"; }\n\n.fa-indent:before {\n content: \"\\f03c\"; }\n\n.fa-industry:before {\n content: \"\\f275\"; }\n\n.fa-infinity:before {\n content: \"\\f534\"; }\n\n.fa-info:before {\n content: \"\\f129\"; }\n\n.fa-info-circle:before {\n content: \"\\f05a\"; }\n\n.fa-innosoft:before {\n content: \"\\e080\"; }\n\n.fa-instagram:before {\n content: \"\\f16d\"; }\n\n.fa-instagram-square:before {\n content: \"\\e055\"; }\n\n.fa-instalod:before {\n content: \"\\e081\"; }\n\n.fa-intercom:before {\n content: \"\\f7af\"; }\n\n.fa-internet-explorer:before {\n content: \"\\f26b\"; }\n\n.fa-invision:before {\n content: \"\\f7b0\"; }\n\n.fa-ioxhost:before {\n content: \"\\f208\"; }\n\n.fa-italic:before {\n content: \"\\f033\"; }\n\n.fa-itch-io:before {\n content: \"\\f83a\"; }\n\n.fa-itunes:before {\n content: \"\\f3b4\"; }\n\n.fa-itunes-note:before {\n content: \"\\f3b5\"; }\n\n.fa-java:before {\n content: \"\\f4e4\"; }\n\n.fa-jedi:before {\n content: \"\\f669\"; }\n\n.fa-jedi-order:before {\n content: \"\\f50e\"; }\n\n.fa-jenkins:before {\n content: \"\\f3b6\"; }\n\n.fa-jira:before {\n content: \"\\f7b1\"; }\n\n.fa-joget:before {\n content: \"\\f3b7\"; }\n\n.fa-joint:before {\n content: \"\\f595\"; }\n\n.fa-joomla:before {\n content: \"\\f1aa\"; }\n\n.fa-journal-whills:before {\n content: \"\\f66a\"; }\n\n.fa-js:before {\n content: \"\\f3b8\"; }\n\n.fa-js-square:before {\n content: \"\\f3b9\"; }\n\n.fa-jsfiddle:before {\n content: \"\\f1cc\"; }\n\n.fa-kaaba:before {\n content: \"\\f66b\"; }\n\n.fa-kaggle:before {\n content: \"\\f5fa\"; }\n\n.fa-key:before {\n content: \"\\f084\"; }\n\n.fa-keybase:before {\n content: \"\\f4f5\"; }\n\n.fa-keyboard:before {\n content: \"\\f11c\"; }\n\n.fa-keycdn:before {\n content: \"\\f3ba\"; }\n\n.fa-khanda:before {\n content: \"\\f66d\"; }\n\n.fa-kickstarter:before {\n content: \"\\f3bb\"; }\n\n.fa-kickstarter-k:before {\n content: \"\\f3bc\"; }\n\n.fa-kiss:before {\n content: \"\\f596\"; }\n\n.fa-kiss-beam:before {\n content: \"\\f597\"; }\n\n.fa-kiss-wink-heart:before {\n content: \"\\f598\"; }\n\n.fa-kiwi-bird:before {\n content: \"\\f535\"; }\n\n.fa-korvue:before {\n content: \"\\f42f\"; }\n\n.fa-landmark:before {\n content: \"\\f66f\"; }\n\n.fa-language:before {\n content: \"\\f1ab\"; }\n\n.fa-laptop:before {\n content: \"\\f109\"; }\n\n.fa-laptop-code:before {\n content: \"\\f5fc\"; }\n\n.fa-laptop-house:before {\n content: \"\\e066\"; }\n\n.fa-laptop-medical:before {\n content: \"\\f812\"; }\n\n.fa-laravel:before {\n content: \"\\f3bd\"; }\n\n.fa-lastfm:before {\n content: \"\\f202\"; }\n\n.fa-lastfm-square:before {\n content: \"\\f203\"; }\n\n.fa-laugh:before {\n content: \"\\f599\"; }\n\n.fa-laugh-beam:before {\n content: \"\\f59a\"; }\n\n.fa-laugh-squint:before {\n content: \"\\f59b\"; }\n\n.fa-laugh-wink:before {\n content: \"\\f59c\"; }\n\n.fa-layer-group:before {\n content: \"\\f5fd\"; }\n\n.fa-leaf:before {\n content: \"\\f06c\"; }\n\n.fa-leanpub:before {\n content: \"\\f212\"; }\n\n.fa-lemon:before {\n content: \"\\f094\"; }\n\n.fa-less:before {\n content: \"\\f41d\"; }\n\n.fa-less-than:before {\n content: \"\\f536\"; }\n\n.fa-less-than-equal:before {\n content: \"\\f537\"; }\n\n.fa-level-down-alt:before {\n content: \"\\f3be\"; }\n\n.fa-level-up-alt:before {\n content: \"\\f3bf\"; }\n\n.fa-life-ring:before {\n content: \"\\f1cd\"; }\n\n.fa-lightbulb:before {\n content: \"\\f0eb\"; }\n\n.fa-line:before {\n content: \"\\f3c0\"; }\n\n.fa-link:before {\n content: \"\\f0c1\"; }\n\n.fa-linkedin:before {\n content: \"\\f08c\"; }\n\n.fa-linkedin-in:before {\n content: \"\\f0e1\"; }\n\n.fa-linode:before {\n content: \"\\f2b8\"; }\n\n.fa-linux:before {\n content: \"\\f17c\"; }\n\n.fa-lira-sign:before {\n content: \"\\f195\"; }\n\n.fa-list:before {\n content: \"\\f03a\"; }\n\n.fa-list-alt:before {\n content: \"\\f022\"; }\n\n.fa-list-ol:before {\n content: \"\\f0cb\"; }\n\n.fa-list-ul:before {\n content: \"\\f0ca\"; }\n\n.fa-location-arrow:before {\n content: \"\\f124\"; }\n\n.fa-lock:before {\n content: \"\\f023\"; }\n\n.fa-lock-open:before {\n content: \"\\f3c1\"; }\n\n.fa-long-arrow-alt-down:before {\n content: \"\\f309\"; }\n\n.fa-long-arrow-alt-left:before {\n content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-right:before {\n content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-up:before {\n content: \"\\f30c\"; }\n\n.fa-low-vision:before {\n content: \"\\f2a8\"; }\n\n.fa-luggage-cart:before {\n content: \"\\f59d\"; }\n\n.fa-lungs:before {\n content: \"\\f604\"; }\n\n.fa-lungs-virus:before {\n content: \"\\e067\"; }\n\n.fa-lyft:before {\n content: \"\\f3c3\"; }\n\n.fa-magento:before {\n content: \"\\f3c4\"; }\n\n.fa-magic:before {\n content: \"\\f0d0\"; }\n\n.fa-magnet:before {\n content: \"\\f076\"; }\n\n.fa-mail-bulk:before {\n content: \"\\f674\"; }\n\n.fa-mailchimp:before {\n content: \"\\f59e\"; }\n\n.fa-male:before {\n content: \"\\f183\"; }\n\n.fa-mandalorian:before {\n content: \"\\f50f\"; }\n\n.fa-map:before {\n content: \"\\f279\"; }\n\n.fa-map-marked:before {\n content: \"\\f59f\"; }\n\n.fa-map-marked-alt:before {\n content: \"\\f5a0\"; }\n\n.fa-map-marker:before {\n content: \"\\f041\"; }\n\n.fa-map-marker-alt:before {\n content: \"\\f3c5\"; }\n\n.fa-map-pin:before {\n content: \"\\f276\"; }\n\n.fa-map-signs:before {\n content: \"\\f277\"; }\n\n.fa-markdown:before {\n content: \"\\f60f\"; }\n\n.fa-marker:before {\n content: \"\\f5a1\"; }\n\n.fa-mars:before {\n content: \"\\f222\"; }\n\n.fa-mars-double:before {\n content: \"\\f227\"; }\n\n.fa-mars-stroke:before {\n content: \"\\f229\"; }\n\n.fa-mars-stroke-h:before {\n content: \"\\f22b\"; }\n\n.fa-mars-stroke-v:before {\n content: \"\\f22a\"; }\n\n.fa-mask:before {\n content: \"\\f6fa\"; }\n\n.fa-mastodon:before {\n content: \"\\f4f6\"; }\n\n.fa-maxcdn:before {\n content: \"\\f136\"; }\n\n.fa-mdb:before {\n content: \"\\f8ca\"; }\n\n.fa-medal:before {\n content: \"\\f5a2\"; }\n\n.fa-medapps:before {\n content: \"\\f3c6\"; }\n\n.fa-medium:before {\n content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n content: \"\\f3c7\"; }\n\n.fa-medkit:before {\n content: \"\\f0fa\"; }\n\n.fa-medrt:before {\n content: \"\\f3c8\"; }\n\n.fa-meetup:before {\n content: \"\\f2e0\"; }\n\n.fa-megaport:before {\n content: \"\\f5a3\"; }\n\n.fa-meh:before {\n content: \"\\f11a\"; }\n\n.fa-meh-blank:before {\n content: \"\\f5a4\"; }\n\n.fa-meh-rolling-eyes:before {\n content: \"\\f5a5\"; }\n\n.fa-memory:before {\n content: \"\\f538\"; }\n\n.fa-mendeley:before {\n content: \"\\f7b3\"; }\n\n.fa-menorah:before {\n content: \"\\f676\"; }\n\n.fa-mercury:before {\n content: \"\\f223\"; }\n\n.fa-meteor:before {\n content: \"\\f753\"; }\n\n.fa-microblog:before {\n content: \"\\e01a\"; }\n\n.fa-microchip:before {\n content: \"\\f2db\"; }\n\n.fa-microphone:before {\n content: \"\\f130\"; }\n\n.fa-microphone-alt:before {\n content: \"\\f3c9\"; }\n\n.fa-microphone-alt-slash:before {\n content: \"\\f539\"; }\n\n.fa-microphone-slash:before {\n content: \"\\f131\"; }\n\n.fa-microscope:before {\n content: \"\\f610\"; }\n\n.fa-microsoft:before {\n content: \"\\f3ca\"; }\n\n.fa-minus:before {\n content: \"\\f068\"; }\n\n.fa-minus-circle:before {\n content: \"\\f056\"; }\n\n.fa-minus-square:before {\n content: \"\\f146\"; }\n\n.fa-mitten:before {\n content: \"\\f7b5\"; }\n\n.fa-mix:before {\n content: \"\\f3cb\"; }\n\n.fa-mixcloud:before {\n content: \"\\f289\"; }\n\n.fa-mixer:before {\n content: \"\\e056\"; }\n\n.fa-mizuni:before {\n content: \"\\f3cc\"; }\n\n.fa-mobile:before {\n content: \"\\f10b\"; }\n\n.fa-mobile-alt:before {\n content: \"\\f3cd\"; }\n\n.fa-modx:before {\n content: \"\\f285\"; }\n\n.fa-monero:before {\n content: \"\\f3d0\"; }\n\n.fa-money-bill:before {\n content: \"\\f0d6\"; }\n\n.fa-money-bill-alt:before {\n content: \"\\f3d1\"; }\n\n.fa-money-bill-wave:before {\n content: \"\\f53a\"; }\n\n.fa-money-bill-wave-alt:before {\n content: \"\\f53b\"; }\n\n.fa-money-check:before {\n content: \"\\f53c\"; }\n\n.fa-money-check-alt:before {\n content: \"\\f53d\"; }\n\n.fa-monument:before {\n content: \"\\f5a6\"; }\n\n.fa-moon:before {\n content: \"\\f186\"; }\n\n.fa-mortar-pestle:before {\n content: \"\\f5a7\"; }\n\n.fa-mosque:before {\n content: \"\\f678\"; }\n\n.fa-motorcycle:before {\n content: \"\\f21c\"; }\n\n.fa-mountain:before {\n content: \"\\f6fc\"; }\n\n.fa-mouse:before {\n content: \"\\f8cc\"; }\n\n.fa-mouse-pointer:before {\n content: \"\\f245\"; }\n\n.fa-mug-hot:before {\n content: \"\\f7b6\"; }\n\n.fa-music:before {\n content: \"\\f001\"; }\n\n.fa-napster:before {\n content: \"\\f3d2\"; }\n\n.fa-neos:before {\n content: \"\\f612\"; }\n\n.fa-network-wired:before {\n content: \"\\f6ff\"; }\n\n.fa-neuter:before {\n content: \"\\f22c\"; }\n\n.fa-newspaper:before {\n content: \"\\f1ea\"; }\n\n.fa-nimblr:before {\n content: \"\\f5a8\"; }\n\n.fa-node:before {\n content: \"\\f419\"; }\n\n.fa-node-js:before {\n content: \"\\f3d3\"; }\n\n.fa-not-equal:before {\n content: \"\\f53e\"; }\n\n.fa-notes-medical:before {\n content: \"\\f481\"; }\n\n.fa-npm:before {\n content: \"\\f3d4\"; }\n\n.fa-ns8:before {\n content: \"\\f3d5\"; }\n\n.fa-nutritionix:before {\n content: \"\\f3d6\"; }\n\n.fa-object-group:before {\n content: \"\\f247\"; }\n\n.fa-object-ungroup:before {\n content: \"\\f248\"; }\n\n.fa-octopus-deploy:before {\n content: \"\\e082\"; }\n\n.fa-odnoklassniki:before {\n content: \"\\f263\"; }\n\n.fa-odnoklassniki-square:before {\n content: \"\\f264\"; }\n\n.fa-oil-can:before {\n content: \"\\f613\"; }\n\n.fa-old-republic:before {\n content: \"\\f510\"; }\n\n.fa-om:before {\n content: \"\\f679\"; }\n\n.fa-opencart:before {\n content: \"\\f23d\"; }\n\n.fa-openid:before {\n content: \"\\f19b\"; }\n\n.fa-opera:before {\n content: \"\\f26a\"; }\n\n.fa-optin-monster:before {\n content: \"\\f23c\"; }\n\n.fa-orcid:before {\n content: \"\\f8d2\"; }\n\n.fa-osi:before {\n content: \"\\f41a\"; }\n\n.fa-otter:before {\n content: \"\\f700\"; }\n\n.fa-outdent:before {\n content: \"\\f03b\"; }\n\n.fa-page4:before {\n content: \"\\f3d7\"; }\n\n.fa-pagelines:before {\n content: \"\\f18c\"; }\n\n.fa-pager:before {\n content: \"\\f815\"; }\n\n.fa-paint-brush:before {\n content: \"\\f1fc\"; }\n\n.fa-paint-roller:before {\n content: \"\\f5aa\"; }\n\n.fa-palette:before {\n content: \"\\f53f\"; }\n\n.fa-palfed:before {\n content: \"\\f3d8\"; }\n\n.fa-pallet:before {\n content: \"\\f482\"; }\n\n.fa-paper-plane:before {\n content: \"\\f1d8\"; }\n\n.fa-paperclip:before {\n content: \"\\f0c6\"; }\n\n.fa-parachute-box:before {\n content: \"\\f4cd\"; }\n\n.fa-paragraph:before {\n content: \"\\f1dd\"; }\n\n.fa-parking:before {\n content: \"\\f540\"; }\n\n.fa-passport:before {\n content: \"\\f5ab\"; }\n\n.fa-pastafarianism:before {\n content: \"\\f67b\"; }\n\n.fa-paste:before {\n content: \"\\f0ea\"; }\n\n.fa-patreon:before {\n content: \"\\f3d9\"; }\n\n.fa-pause:before {\n content: \"\\f04c\"; }\n\n.fa-pause-circle:before {\n content: \"\\f28b\"; }\n\n.fa-paw:before {\n content: \"\\f1b0\"; }\n\n.fa-paypal:before {\n content: \"\\f1ed\"; }\n\n.fa-peace:before {\n content: \"\\f67c\"; }\n\n.fa-pen:before {\n content: \"\\f304\"; }\n\n.fa-pen-alt:before {\n content: \"\\f305\"; }\n\n.fa-pen-fancy:before {\n content: \"\\f5ac\"; }\n\n.fa-pen-nib:before {\n content: \"\\f5ad\"; }\n\n.fa-pen-square:before {\n content: \"\\f14b\"; }\n\n.fa-pencil-alt:before {\n content: \"\\f303\"; }\n\n.fa-pencil-ruler:before {\n content: \"\\f5ae\"; }\n\n.fa-penny-arcade:before {\n content: \"\\f704\"; }\n\n.fa-people-arrows:before {\n content: \"\\e068\"; }\n\n.fa-people-carry:before {\n content: \"\\f4ce\"; }\n\n.fa-pepper-hot:before {\n content: \"\\f816\"; }\n\n.fa-perbyte:before {\n content: \"\\e083\"; }\n\n.fa-percent:before {\n content: \"\\f295\"; }\n\n.fa-percentage:before {\n content: \"\\f541\"; }\n\n.fa-periscope:before {\n content: \"\\f3da\"; }\n\n.fa-person-booth:before {\n content: \"\\f756\"; }\n\n.fa-phabricator:before {\n content: \"\\f3db\"; }\n\n.fa-phoenix-framework:before {\n content: \"\\f3dc\"; }\n\n.fa-phoenix-squadron:before {\n content: \"\\f511\"; }\n\n.fa-phone:before {\n content: \"\\f095\"; }\n\n.fa-phone-alt:before {\n content: \"\\f879\"; }\n\n.fa-phone-slash:before {\n content: \"\\f3dd\"; }\n\n.fa-phone-square:before {\n content: \"\\f098\"; }\n\n.fa-phone-square-alt:before {\n content: \"\\f87b\"; }\n\n.fa-phone-volume:before {\n content: \"\\f2a0\"; }\n\n.fa-photo-video:before {\n content: \"\\f87c\"; }\n\n.fa-php:before {\n content: \"\\f457\"; }\n\n.fa-pied-piper:before {\n content: \"\\f2ae\"; }\n\n.fa-pied-piper-alt:before {\n content: \"\\f1a8\"; }\n\n.fa-pied-piper-hat:before {\n content: \"\\f4e5\"; }\n\n.fa-pied-piper-pp:before {\n content: \"\\f1a7\"; }\n\n.fa-pied-piper-square:before {\n content: \"\\e01e\"; }\n\n.fa-piggy-bank:before {\n content: \"\\f4d3\"; }\n\n.fa-pills:before {\n content: \"\\f484\"; }\n\n.fa-pinterest:before {\n content: \"\\f0d2\"; }\n\n.fa-pinterest-p:before {\n content: \"\\f231\"; }\n\n.fa-pinterest-square:before {\n content: \"\\f0d3\"; }\n\n.fa-pizza-slice:before {\n content: \"\\f818\"; }\n\n.fa-place-of-worship:before {\n content: \"\\f67f\"; }\n\n.fa-plane:before {\n content: \"\\f072\"; }\n\n.fa-plane-arrival:before {\n content: \"\\f5af\"; }\n\n.fa-plane-departure:before {\n content: \"\\f5b0\"; }\n\n.fa-plane-slash:before {\n content: \"\\e069\"; }\n\n.fa-play:before {\n content: \"\\f04b\"; }\n\n.fa-play-circle:before {\n content: \"\\f144\"; }\n\n.fa-playstation:before {\n content: \"\\f3df\"; }\n\n.fa-plug:before {\n content: \"\\f1e6\"; }\n\n.fa-plus:before {\n content: \"\\f067\"; }\n\n.fa-plus-circle:before {\n content: \"\\f055\"; }\n\n.fa-plus-square:before {\n content: \"\\f0fe\"; }\n\n.fa-podcast:before {\n content: \"\\f2ce\"; }\n\n.fa-poll:before {\n content: \"\\f681\"; }\n\n.fa-poll-h:before {\n content: \"\\f682\"; }\n\n.fa-poo:before {\n content: \"\\f2fe\"; }\n\n.fa-poo-storm:before {\n content: \"\\f75a\"; }\n\n.fa-poop:before {\n content: \"\\f619\"; }\n\n.fa-portrait:before {\n content: \"\\f3e0\"; }\n\n.fa-pound-sign:before {\n content: \"\\f154\"; }\n\n.fa-power-off:before {\n content: \"\\f011\"; }\n\n.fa-pray:before {\n content: \"\\f683\"; }\n\n.fa-praying-hands:before {\n content: \"\\f684\"; }\n\n.fa-prescription:before {\n content: \"\\f5b1\"; }\n\n.fa-prescription-bottle:before {\n content: \"\\f485\"; }\n\n.fa-prescription-bottle-alt:before {\n content: \"\\f486\"; }\n\n.fa-print:before {\n content: \"\\f02f\"; }\n\n.fa-procedures:before {\n content: \"\\f487\"; }\n\n.fa-product-hunt:before {\n content: \"\\f288\"; }\n\n.fa-project-diagram:before {\n content: \"\\f542\"; }\n\n.fa-pump-medical:before {\n content: \"\\e06a\"; }\n\n.fa-pump-soap:before {\n content: \"\\e06b\"; }\n\n.fa-pushed:before {\n content: \"\\f3e1\"; }\n\n.fa-puzzle-piece:before {\n content: \"\\f12e\"; }\n\n.fa-python:before {\n content: \"\\f3e2\"; }\n\n.fa-qq:before {\n content: \"\\f1d6\"; }\n\n.fa-qrcode:before {\n content: \"\\f029\"; }\n\n.fa-question:before {\n content: \"\\f128\"; }\n\n.fa-question-circle:before {\n content: \"\\f059\"; }\n\n.fa-quidditch:before {\n content: \"\\f458\"; }\n\n.fa-quinscape:before {\n content: \"\\f459\"; }\n\n.fa-quora:before {\n content: \"\\f2c4\"; }\n\n.fa-quote-left:before {\n content: \"\\f10d\"; }\n\n.fa-quote-right:before {\n content: \"\\f10e\"; }\n\n.fa-quran:before {\n content: \"\\f687\"; }\n\n.fa-r-project:before {\n content: \"\\f4f7\"; }\n\n.fa-radiation:before {\n content: \"\\f7b9\"; }\n\n.fa-radiation-alt:before {\n content: \"\\f7ba\"; }\n\n.fa-rainbow:before {\n content: \"\\f75b\"; }\n\n.fa-random:before {\n content: \"\\f074\"; }\n\n.fa-raspberry-pi:before {\n content: \"\\f7bb\"; }\n\n.fa-ravelry:before {\n content: \"\\f2d9\"; }\n\n.fa-react:before {\n content: \"\\f41b\"; }\n\n.fa-reacteurope:before {\n content: \"\\f75d\"; }\n\n.fa-readme:before {\n content: \"\\f4d5\"; }\n\n.fa-rebel:before {\n content: \"\\f1d0\"; }\n\n.fa-receipt:before {\n content: \"\\f543\"; }\n\n.fa-record-vinyl:before {\n content: \"\\f8d9\"; }\n\n.fa-recycle:before {\n content: \"\\f1b8\"; }\n\n.fa-red-river:before {\n content: \"\\f3e3\"; }\n\n.fa-reddit:before {\n content: \"\\f1a1\"; }\n\n.fa-reddit-alien:before {\n content: \"\\f281\"; }\n\n.fa-reddit-square:before {\n content: \"\\f1a2\"; }\n\n.fa-redhat:before {\n content: \"\\f7bc\"; }\n\n.fa-redo:before {\n content: \"\\f01e\"; }\n\n.fa-redo-alt:before {\n content: \"\\f2f9\"; }\n\n.fa-registered:before {\n content: \"\\f25d\"; }\n\n.fa-remove-format:before {\n content: \"\\f87d\"; }\n\n.fa-renren:before {\n content: \"\\f18b\"; }\n\n.fa-reply:before {\n content: \"\\f3e5\"; }\n\n.fa-reply-all:before {\n content: \"\\f122\"; }\n\n.fa-replyd:before {\n content: \"\\f3e6\"; }\n\n.fa-republican:before {\n content: \"\\f75e\"; }\n\n.fa-researchgate:before {\n content: \"\\f4f8\"; }\n\n.fa-resolving:before {\n content: \"\\f3e7\"; }\n\n.fa-restroom:before {\n content: \"\\f7bd\"; }\n\n.fa-retweet:before {\n content: \"\\f079\"; }\n\n.fa-rev:before {\n content: \"\\f5b2\"; }\n\n.fa-ribbon:before {\n content: \"\\f4d6\"; }\n\n.fa-ring:before {\n content: \"\\f70b\"; }\n\n.fa-road:before {\n content: \"\\f018\"; }\n\n.fa-robot:before {\n content: \"\\f544\"; }\n\n.fa-rocket:before {\n content: \"\\f135\"; }\n\n.fa-rocketchat:before {\n content: \"\\f3e8\"; }\n\n.fa-rockrms:before {\n content: \"\\f3e9\"; }\n\n.fa-route:before {\n content: \"\\f4d7\"; }\n\n.fa-rss:before {\n content: \"\\f09e\"; }\n\n.fa-rss-square:before {\n content: \"\\f143\"; }\n\n.fa-ruble-sign:before {\n content: \"\\f158\"; }\n\n.fa-ruler:before {\n content: \"\\f545\"; }\n\n.fa-ruler-combined:before {\n content: \"\\f546\"; }\n\n.fa-ruler-horizontal:before {\n content: \"\\f547\"; }\n\n.fa-ruler-vertical:before {\n content: \"\\f548\"; }\n\n.fa-running:before {\n content: \"\\f70c\"; }\n\n.fa-rupee-sign:before {\n content: \"\\f156\"; }\n\n.fa-rust:before {\n content: \"\\e07a\"; }\n\n.fa-sad-cry:before {\n content: \"\\f5b3\"; }\n\n.fa-sad-tear:before {\n content: \"\\f5b4\"; }\n\n.fa-safari:before {\n content: \"\\f267\"; }\n\n.fa-salesforce:before {\n content: \"\\f83b\"; }\n\n.fa-sass:before {\n content: \"\\f41e\"; }\n\n.fa-satellite:before {\n content: \"\\f7bf\"; }\n\n.fa-satellite-dish:before {\n content: \"\\f7c0\"; }\n\n.fa-save:before {\n content: \"\\f0c7\"; }\n\n.fa-schlix:before {\n content: \"\\f3ea\"; }\n\n.fa-school:before {\n content: \"\\f549\"; }\n\n.fa-screwdriver:before {\n content: \"\\f54a\"; }\n\n.fa-scribd:before {\n content: \"\\f28a\"; }\n\n.fa-scroll:before {\n content: \"\\f70e\"; }\n\n.fa-sd-card:before {\n content: \"\\f7c2\"; }\n\n.fa-search:before {\n content: \"\\f002\"; }\n\n.fa-search-dollar:before {\n content: \"\\f688\"; }\n\n.fa-search-location:before {\n content: \"\\f689\"; }\n\n.fa-search-minus:before {\n content: \"\\f010\"; }\n\n.fa-search-plus:before {\n content: \"\\f00e\"; }\n\n.fa-searchengin:before {\n content: \"\\f3eb\"; }\n\n.fa-seedling:before {\n content: \"\\f4d8\"; }\n\n.fa-sellcast:before {\n content: \"\\f2da\"; }\n\n.fa-sellsy:before {\n content: \"\\f213\"; }\n\n.fa-server:before {\n content: \"\\f233\"; }\n\n.fa-servicestack:before {\n content: \"\\f3ec\"; }\n\n.fa-shapes:before {\n content: \"\\f61f\"; }\n\n.fa-share:before {\n content: \"\\f064\"; }\n\n.fa-share-alt:before {\n content: \"\\f1e0\"; }\n\n.fa-share-alt-square:before {\n content: \"\\f1e1\"; }\n\n.fa-share-square:before {\n content: \"\\f14d\"; }\n\n.fa-shekel-sign:before {\n content: \"\\f20b\"; }\n\n.fa-shield-alt:before {\n content: \"\\f3ed\"; }\n\n.fa-shield-virus:before {\n content: \"\\e06c\"; }\n\n.fa-ship:before {\n content: \"\\f21a\"; }\n\n.fa-shipping-fast:before {\n content: \"\\f48b\"; }\n\n.fa-shirtsinbulk:before {\n content: \"\\f214\"; }\n\n.fa-shoe-prints:before {\n content: \"\\f54b\"; }\n\n.fa-shopify:before {\n content: \"\\e057\"; }\n\n.fa-shopping-bag:before {\n content: \"\\f290\"; }\n\n.fa-shopping-basket:before {\n content: \"\\f291\"; }\n\n.fa-shopping-cart:before {\n content: \"\\f07a\"; }\n\n.fa-shopware:before {\n content: \"\\f5b5\"; }\n\n.fa-shower:before {\n content: \"\\f2cc\"; }\n\n.fa-shuttle-van:before {\n content: \"\\f5b6\"; }\n\n.fa-sign:before {\n content: \"\\f4d9\"; }\n\n.fa-sign-in-alt:before {\n content: \"\\f2f6\"; }\n\n.fa-sign-language:before {\n content: \"\\f2a7\"; }\n\n.fa-sign-out-alt:before {\n content: \"\\f2f5\"; }\n\n.fa-signal:before {\n content: \"\\f012\"; }\n\n.fa-signature:before {\n content: \"\\f5b7\"; }\n\n.fa-sim-card:before {\n content: \"\\f7c4\"; }\n\n.fa-simplybuilt:before {\n content: \"\\f215\"; }\n\n.fa-sink:before {\n content: \"\\e06d\"; }\n\n.fa-sistrix:before {\n content: \"\\f3ee\"; }\n\n.fa-sitemap:before {\n content: \"\\f0e8\"; }\n\n.fa-sith:before {\n content: \"\\f512\"; }\n\n.fa-skating:before {\n content: \"\\f7c5\"; }\n\n.fa-sketch:before {\n content: \"\\f7c6\"; }\n\n.fa-skiing:before {\n content: \"\\f7c9\"; }\n\n.fa-skiing-nordic:before {\n content: \"\\f7ca\"; }\n\n.fa-skull:before {\n content: \"\\f54c\"; }\n\n.fa-skull-crossbones:before {\n content: \"\\f714\"; }\n\n.fa-skyatlas:before {\n content: \"\\f216\"; }\n\n.fa-skype:before {\n content: \"\\f17e\"; }\n\n.fa-slack:before {\n content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n content: \"\\f3ef\"; }\n\n.fa-slash:before {\n content: \"\\f715\"; }\n\n.fa-sleigh:before {\n content: \"\\f7cc\"; }\n\n.fa-sliders-h:before {\n content: \"\\f1de\"; }\n\n.fa-slideshare:before {\n content: \"\\f1e7\"; }\n\n.fa-smile:before {\n content: \"\\f118\"; }\n\n.fa-smile-beam:before {\n content: \"\\f5b8\"; }\n\n.fa-smile-wink:before {\n content: \"\\f4da\"; }\n\n.fa-smog:before {\n content: \"\\f75f\"; }\n\n.fa-smoking:before {\n content: \"\\f48d\"; }\n\n.fa-smoking-ban:before {\n content: \"\\f54d\"; }\n\n.fa-sms:before {\n content: \"\\f7cd\"; }\n\n.fa-snapchat:before {\n content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n content: \"\\f2ac\"; }\n\n.fa-snapchat-square:before {\n content: \"\\f2ad\"; }\n\n.fa-snowboarding:before {\n content: \"\\f7ce\"; }\n\n.fa-snowflake:before {\n content: \"\\f2dc\"; }\n\n.fa-snowman:before {\n content: \"\\f7d0\"; }\n\n.fa-snowplow:before {\n content: \"\\f7d2\"; }\n\n.fa-soap:before {\n content: \"\\e06e\"; }\n\n.fa-socks:before {\n content: \"\\f696\"; }\n\n.fa-solar-panel:before {\n content: \"\\f5ba\"; }\n\n.fa-sort:before {\n content: \"\\f0dc\"; }\n\n.fa-sort-alpha-down:before {\n content: \"\\f15d\"; }\n\n.fa-sort-alpha-down-alt:before {\n content: \"\\f881\"; }\n\n.fa-sort-alpha-up:before {\n content: \"\\f15e\"; }\n\n.fa-sort-alpha-up-alt:before {\n content: \"\\f882\"; }\n\n.fa-sort-amount-down:before {\n content: \"\\f160\"; }\n\n.fa-sort-amount-down-alt:before {\n content: \"\\f884\"; }\n\n.fa-sort-amount-up:before {\n content: \"\\f161\"; }\n\n.fa-sort-amount-up-alt:before {\n content: \"\\f885\"; }\n\n.fa-sort-down:before {\n content: \"\\f0dd\"; }\n\n.fa-sort-numeric-down:before {\n content: \"\\f162\"; }\n\n.fa-sort-numeric-down-alt:before {\n content: \"\\f886\"; }\n\n.fa-sort-numeric-up:before {\n content: \"\\f163\"; }\n\n.fa-sort-numeric-up-alt:before {\n content: \"\\f887\"; }\n\n.fa-sort-up:before {\n content: \"\\f0de\"; }\n\n.fa-soundcloud:before {\n content: \"\\f1be\"; }\n\n.fa-sourcetree:before {\n content: \"\\f7d3\"; }\n\n.fa-spa:before {\n content: \"\\f5bb\"; }\n\n.fa-space-shuttle:before {\n content: \"\\f197\"; }\n\n.fa-speakap:before {\n content: \"\\f3f3\"; }\n\n.fa-speaker-deck:before {\n content: \"\\f83c\"; }\n\n.fa-spell-check:before {\n content: \"\\f891\"; }\n\n.fa-spider:before {\n content: \"\\f717\"; }\n\n.fa-spinner:before {\n content: \"\\f110\"; }\n\n.fa-splotch:before {\n content: \"\\f5bc\"; }\n\n.fa-spotify:before {\n content: \"\\f1bc\"; }\n\n.fa-spray-can:before {\n content: \"\\f5bd\"; }\n\n.fa-square:before {\n content: \"\\f0c8\"; }\n\n.fa-square-full:before {\n content: \"\\f45c\"; }\n\n.fa-square-root-alt:before {\n content: \"\\f698\"; }\n\n.fa-squarespace:before {\n content: \"\\f5be\"; }\n\n.fa-stack-exchange:before {\n content: \"\\f18d\"; }\n\n.fa-stack-overflow:before {\n content: \"\\f16c\"; }\n\n.fa-stackpath:before {\n content: \"\\f842\"; }\n\n.fa-stamp:before {\n content: \"\\f5bf\"; }\n\n.fa-star:before {\n content: \"\\f005\"; }\n\n.fa-star-and-crescent:before {\n content: \"\\f699\"; }\n\n.fa-star-half:before {\n content: \"\\f089\"; }\n\n.fa-star-half-alt:before {\n content: \"\\f5c0\"; }\n\n.fa-star-of-david:before {\n content: \"\\f69a\"; }\n\n.fa-star-of-life:before {\n content: \"\\f621\"; }\n\n.fa-staylinked:before {\n content: \"\\f3f5\"; }\n\n.fa-steam:before {\n content: \"\\f1b6\"; }\n\n.fa-steam-square:before {\n content: \"\\f1b7\"; }\n\n.fa-steam-symbol:before {\n content: \"\\f3f6\"; }\n\n.fa-step-backward:before {\n content: \"\\f048\"; }\n\n.fa-step-forward:before {\n content: \"\\f051\"; }\n\n.fa-stethoscope:before {\n content: \"\\f0f1\"; }\n\n.fa-sticker-mule:before {\n content: \"\\f3f7\"; }\n\n.fa-sticky-note:before {\n content: \"\\f249\"; }\n\n.fa-stop:before {\n content: \"\\f04d\"; }\n\n.fa-stop-circle:before {\n content: \"\\f28d\"; }\n\n.fa-stopwatch:before {\n content: \"\\f2f2\"; }\n\n.fa-stopwatch-20:before {\n content: \"\\e06f\"; }\n\n.fa-store:before {\n content: \"\\f54e\"; }\n\n.fa-store-alt:before {\n content: \"\\f54f\"; }\n\n.fa-store-alt-slash:before {\n content: \"\\e070\"; }\n\n.fa-store-slash:before {\n content: \"\\e071\"; }\n\n.fa-strava:before {\n content: \"\\f428\"; }\n\n.fa-stream:before {\n content: \"\\f550\"; }\n\n.fa-street-view:before {\n content: \"\\f21d\"; }\n\n.fa-strikethrough:before {\n content: \"\\f0cc\"; }\n\n.fa-stripe:before {\n content: \"\\f429\"; }\n\n.fa-stripe-s:before {\n content: \"\\f42a\"; }\n\n.fa-stroopwafel:before {\n content: \"\\f551\"; }\n\n.fa-studiovinari:before {\n content: \"\\f3f8\"; }\n\n.fa-stumbleupon:before {\n content: \"\\f1a4\"; }\n\n.fa-stumbleupon-circle:before {\n content: \"\\f1a3\"; }\n\n.fa-subscript:before {\n content: \"\\f12c\"; }\n\n.fa-subway:before {\n content: \"\\f239\"; }\n\n.fa-suitcase:before {\n content: \"\\f0f2\"; }\n\n.fa-suitcase-rolling:before {\n content: \"\\f5c1\"; }\n\n.fa-sun:before {\n content: \"\\f185\"; }\n\n.fa-superpowers:before {\n content: \"\\f2dd\"; }\n\n.fa-superscript:before {\n content: \"\\f12b\"; }\n\n.fa-supple:before {\n content: \"\\f3f9\"; }\n\n.fa-surprise:before {\n content: \"\\f5c2\"; }\n\n.fa-suse:before {\n content: \"\\f7d6\"; }\n\n.fa-swatchbook:before {\n content: \"\\f5c3\"; }\n\n.fa-swift:before {\n content: \"\\f8e1\"; }\n\n.fa-swimmer:before {\n content: \"\\f5c4\"; }\n\n.fa-swimming-pool:before {\n content: \"\\f5c5\"; }\n\n.fa-symfony:before {\n content: \"\\f83d\"; }\n\n.fa-synagogue:before {\n content: \"\\f69b\"; }\n\n.fa-sync:before {\n content: \"\\f021\"; }\n\n.fa-sync-alt:before {\n content: \"\\f2f1\"; }\n\n.fa-syringe:before {\n content: \"\\f48e\"; }\n\n.fa-table:before {\n content: \"\\f0ce\"; }\n\n.fa-table-tennis:before {\n content: \"\\f45d\"; }\n\n.fa-tablet:before {\n content: \"\\f10a\"; }\n\n.fa-tablet-alt:before {\n content: \"\\f3fa\"; }\n\n.fa-tablets:before {\n content: \"\\f490\"; }\n\n.fa-tachometer-alt:before {\n content: \"\\f3fd\"; }\n\n.fa-tag:before {\n content: \"\\f02b\"; }\n\n.fa-tags:before {\n content: \"\\f02c\"; }\n\n.fa-tape:before {\n content: \"\\f4db\"; }\n\n.fa-tasks:before {\n content: \"\\f0ae\"; }\n\n.fa-taxi:before {\n content: \"\\f1ba\"; }\n\n.fa-teamspeak:before {\n content: \"\\f4f9\"; }\n\n.fa-teeth:before {\n content: \"\\f62e\"; }\n\n.fa-teeth-open:before {\n content: \"\\f62f\"; }\n\n.fa-telegram:before {\n content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n content: \"\\f3fe\"; }\n\n.fa-temperature-high:before {\n content: \"\\f769\"; }\n\n.fa-temperature-low:before {\n content: \"\\f76b\"; }\n\n.fa-tencent-weibo:before {\n content: \"\\f1d5\"; }\n\n.fa-tenge:before {\n content: \"\\f7d7\"; }\n\n.fa-terminal:before {\n content: \"\\f120\"; }\n\n.fa-text-height:before {\n content: \"\\f034\"; }\n\n.fa-text-width:before {\n content: \"\\f035\"; }\n\n.fa-th:before {\n content: \"\\f00a\"; }\n\n.fa-th-large:before {\n content: \"\\f009\"; }\n\n.fa-th-list:before {\n content: \"\\f00b\"; }\n\n.fa-the-red-yeti:before {\n content: \"\\f69d\"; }\n\n.fa-theater-masks:before {\n content: \"\\f630\"; }\n\n.fa-themeco:before {\n content: \"\\f5c6\"; }\n\n.fa-themeisle:before {\n content: \"\\f2b2\"; }\n\n.fa-thermometer:before {\n content: \"\\f491\"; }\n\n.fa-thermometer-empty:before {\n content: \"\\f2cb\"; }\n\n.fa-thermometer-full:before {\n content: \"\\f2c7\"; }\n\n.fa-thermometer-half:before {\n content: \"\\f2c9\"; }\n\n.fa-thermometer-quarter:before {\n content: \"\\f2ca\"; }\n\n.fa-thermometer-three-quarters:before {\n content: \"\\f2c8\"; }\n\n.fa-think-peaks:before {\n content: \"\\f731\"; }\n\n.fa-thumbs-down:before {\n content: \"\\f165\"; }\n\n.fa-thumbs-up:before {\n content: \"\\f164\"; }\n\n.fa-thumbtack:before {\n content: \"\\f08d\"; }\n\n.fa-ticket-alt:before {\n content: \"\\f3ff\"; }\n\n.fa-tiktok:before {\n content: \"\\e07b\"; }\n\n.fa-times:before {\n content: \"\\f00d\"; }\n\n.fa-times-circle:before {\n content: \"\\f057\"; }\n\n.fa-tint:before {\n content: \"\\f043\"; }\n\n.fa-tint-slash:before {\n content: \"\\f5c7\"; }\n\n.fa-tired:before {\n content: \"\\f5c8\"; }\n\n.fa-toggle-off:before {\n content: \"\\f204\"; }\n\n.fa-toggle-on:before {\n content: \"\\f205\"; }\n\n.fa-toilet:before {\n content: \"\\f7d8\"; }\n\n.fa-toilet-paper:before {\n content: \"\\f71e\"; }\n\n.fa-toilet-paper-slash:before {\n content: \"\\e072\"; }\n\n.fa-toolbox:before {\n content: \"\\f552\"; }\n\n.fa-tools:before {\n content: \"\\f7d9\"; }\n\n.fa-tooth:before {\n content: \"\\f5c9\"; }\n\n.fa-torah:before {\n content: \"\\f6a0\"; }\n\n.fa-torii-gate:before {\n content: \"\\f6a1\"; }\n\n.fa-tractor:before {\n content: \"\\f722\"; }\n\n.fa-trade-federation:before {\n content: \"\\f513\"; }\n\n.fa-trademark:before {\n content: \"\\f25c\"; }\n\n.fa-traffic-light:before {\n content: \"\\f637\"; }\n\n.fa-trailer:before {\n content: \"\\e041\"; }\n\n.fa-train:before {\n content: \"\\f238\"; }\n\n.fa-tram:before {\n content: \"\\f7da\"; }\n\n.fa-transgender:before {\n content: \"\\f224\"; }\n\n.fa-transgender-alt:before {\n content: \"\\f225\"; }\n\n.fa-trash:before {\n content: \"\\f1f8\"; }\n\n.fa-trash-alt:before {\n content: \"\\f2ed\"; }\n\n.fa-trash-restore:before {\n content: \"\\f829\"; }\n\n.fa-trash-restore-alt:before {\n content: \"\\f82a\"; }\n\n.fa-tree:before {\n content: \"\\f1bb\"; }\n\n.fa-trello:before {\n content: \"\\f181\"; }\n\n.fa-trophy:before {\n content: \"\\f091\"; }\n\n.fa-truck:before {\n content: \"\\f0d1\"; }\n\n.fa-truck-loading:before {\n content: \"\\f4de\"; }\n\n.fa-truck-monster:before {\n content: \"\\f63b\"; }\n\n.fa-truck-moving:before {\n content: \"\\f4df\"; }\n\n.fa-truck-pickup:before {\n content: \"\\f63c\"; }\n\n.fa-tshirt:before {\n content: \"\\f553\"; }\n\n.fa-tty:before {\n content: \"\\f1e4\"; }\n\n.fa-tumblr:before {\n content: \"\\f173\"; }\n\n.fa-tumblr-square:before {\n content: \"\\f174\"; }\n\n.fa-tv:before {\n content: \"\\f26c\"; }\n\n.fa-twitch:before {\n content: \"\\f1e8\"; }\n\n.fa-twitter:before {\n content: \"\\f099\"; }\n\n.fa-twitter-square:before {\n content: \"\\f081\"; }\n\n.fa-typo3:before {\n content: \"\\f42b\"; }\n\n.fa-uber:before {\n content: \"\\f402\"; }\n\n.fa-ubuntu:before {\n content: \"\\f7df\"; }\n\n.fa-uikit:before {\n content: \"\\f403\"; }\n\n.fa-umbraco:before {\n content: \"\\f8e8\"; }\n\n.fa-umbrella:before {\n content: \"\\f0e9\"; }\n\n.fa-umbrella-beach:before {\n content: \"\\f5ca\"; }\n\n.fa-uncharted:before {\n content: \"\\e084\"; }\n\n.fa-underline:before {\n content: \"\\f0cd\"; }\n\n.fa-undo:before {\n content: \"\\f0e2\"; }\n\n.fa-undo-alt:before {\n content: \"\\f2ea\"; }\n\n.fa-uniregistry:before {\n content: \"\\f404\"; }\n\n.fa-unity:before {\n content: \"\\e049\"; }\n\n.fa-universal-access:before {\n content: \"\\f29a\"; }\n\n.fa-university:before {\n content: \"\\f19c\"; }\n\n.fa-unlink:before {\n content: \"\\f127\"; }\n\n.fa-unlock:before {\n content: \"\\f09c\"; }\n\n.fa-unlock-alt:before {\n content: \"\\f13e\"; }\n\n.fa-unsplash:before {\n content: \"\\e07c\"; }\n\n.fa-untappd:before {\n content: \"\\f405\"; }\n\n.fa-upload:before {\n content: \"\\f093\"; }\n\n.fa-ups:before {\n content: \"\\f7e0\"; }\n\n.fa-usb:before {\n content: \"\\f287\"; }\n\n.fa-user:before {\n content: \"\\f007\"; }\n\n.fa-user-alt:before {\n content: \"\\f406\"; }\n\n.fa-user-alt-slash:before {\n content: \"\\f4fa\"; }\n\n.fa-user-astronaut:before {\n content: \"\\f4fb\"; }\n\n.fa-user-check:before {\n content: \"\\f4fc\"; }\n\n.fa-user-circle:before {\n content: \"\\f2bd\"; }\n\n.fa-user-clock:before {\n content: \"\\f4fd\"; }\n\n.fa-user-cog:before {\n content: \"\\f4fe\"; }\n\n.fa-user-edit:before {\n content: \"\\f4ff\"; }\n\n.fa-user-friends:before {\n content: \"\\f500\"; }\n\n.fa-user-graduate:before {\n content: \"\\f501\"; }\n\n.fa-user-injured:before {\n content: \"\\f728\"; }\n\n.fa-user-lock:before {\n content: \"\\f502\"; }\n\n.fa-user-md:before {\n content: \"\\f0f0\"; }\n\n.fa-user-minus:before {\n content: \"\\f503\"; }\n\n.fa-user-ninja:before {\n content: \"\\f504\"; }\n\n.fa-user-nurse:before {\n content: \"\\f82f\"; }\n\n.fa-user-plus:before {\n content: \"\\f234\"; }\n\n.fa-user-secret:before {\n content: \"\\f21b\"; }\n\n.fa-user-shield:before {\n content: \"\\f505\"; }\n\n.fa-user-slash:before {\n content: \"\\f506\"; }\n\n.fa-user-tag:before {\n content: \"\\f507\"; }\n\n.fa-user-tie:before {\n content: \"\\f508\"; }\n\n.fa-user-times:before {\n content: \"\\f235\"; }\n\n.fa-users:before {\n content: \"\\f0c0\"; }\n\n.fa-users-cog:before {\n content: \"\\f509\"; }\n\n.fa-users-slash:before {\n content: \"\\e073\"; }\n\n.fa-usps:before {\n content: \"\\f7e1\"; }\n\n.fa-ussunnah:before {\n content: \"\\f407\"; }\n\n.fa-utensil-spoon:before {\n content: \"\\f2e5\"; }\n\n.fa-utensils:before {\n content: \"\\f2e7\"; }\n\n.fa-vaadin:before {\n content: \"\\f408\"; }\n\n.fa-vector-square:before {\n content: \"\\f5cb\"; }\n\n.fa-venus:before {\n content: \"\\f221\"; }\n\n.fa-venus-double:before {\n content: \"\\f226\"; }\n\n.fa-venus-mars:before {\n content: \"\\f228\"; }\n\n.fa-vest:before {\n content: \"\\e085\"; }\n\n.fa-vest-patches:before {\n content: \"\\e086\"; }\n\n.fa-viacoin:before {\n content: \"\\f237\"; }\n\n.fa-viadeo:before {\n content: \"\\f2a9\"; }\n\n.fa-viadeo-square:before {\n content: \"\\f2aa\"; }\n\n.fa-vial:before {\n content: \"\\f492\"; }\n\n.fa-vials:before {\n content: \"\\f493\"; }\n\n.fa-viber:before {\n content: \"\\f409\"; }\n\n.fa-video:before {\n content: \"\\f03d\"; }\n\n.fa-video-slash:before {\n content: \"\\f4e2\"; }\n\n.fa-vihara:before {\n content: \"\\f6a7\"; }\n\n.fa-vimeo:before {\n content: \"\\f40a\"; }\n\n.fa-vimeo-square:before {\n content: \"\\f194\"; }\n\n.fa-vimeo-v:before {\n content: \"\\f27d\"; }\n\n.fa-vine:before {\n content: \"\\f1ca\"; }\n\n.fa-virus:before {\n content: \"\\e074\"; }\n\n.fa-virus-slash:before {\n content: \"\\e075\"; }\n\n.fa-viruses:before {\n content: \"\\e076\"; }\n\n.fa-vk:before {\n content: \"\\f189\"; }\n\n.fa-vnv:before {\n content: \"\\f40b\"; }\n\n.fa-voicemail:before {\n content: \"\\f897\"; }\n\n.fa-volleyball-ball:before {\n content: \"\\f45f\"; }\n\n.fa-volume-down:before {\n content: \"\\f027\"; }\n\n.fa-volume-mute:before {\n content: \"\\f6a9\"; }\n\n.fa-volume-off:before {\n content: \"\\f026\"; }\n\n.fa-volume-up:before {\n content: \"\\f028\"; }\n\n.fa-vote-yea:before {\n content: \"\\f772\"; }\n\n.fa-vr-cardboard:before {\n content: \"\\f729\"; }\n\n.fa-vuejs:before {\n content: \"\\f41f\"; }\n\n.fa-walking:before {\n content: \"\\f554\"; }\n\n.fa-wallet:before {\n content: \"\\f555\"; }\n\n.fa-warehouse:before {\n content: \"\\f494\"; }\n\n.fa-watchman-monitoring:before {\n content: \"\\e087\"; }\n\n.fa-water:before {\n content: \"\\f773\"; }\n\n.fa-wave-square:before {\n content: \"\\f83e\"; }\n\n.fa-waze:before {\n content: \"\\f83f\"; }\n\n.fa-weebly:before {\n content: \"\\f5cc\"; }\n\n.fa-weibo:before {\n content: \"\\f18a\"; }\n\n.fa-weight:before {\n content: \"\\f496\"; }\n\n.fa-weight-hanging:before {\n content: \"\\f5cd\"; }\n\n.fa-weixin:before {\n content: \"\\f1d7\"; }\n\n.fa-whatsapp:before {\n content: \"\\f232\"; }\n\n.fa-whatsapp-square:before {\n content: \"\\f40c\"; }\n\n.fa-wheelchair:before {\n content: \"\\f193\"; }\n\n.fa-whmcs:before {\n content: \"\\f40d\"; }\n\n.fa-wifi:before {\n content: \"\\f1eb\"; }\n\n.fa-wikipedia-w:before {\n content: \"\\f266\"; }\n\n.fa-wind:before {\n content: \"\\f72e\"; }\n\n.fa-window-close:before {\n content: \"\\f410\"; }\n\n.fa-window-maximize:before {\n content: \"\\f2d0\"; }\n\n.fa-window-minimize:before {\n content: \"\\f2d1\"; }\n\n.fa-window-restore:before {\n content: \"\\f2d2\"; }\n\n.fa-windows:before {\n content: \"\\f17a\"; }\n\n.fa-wine-bottle:before {\n content: \"\\f72f\"; }\n\n.fa-wine-glass:before {\n content: \"\\f4e3\"; }\n\n.fa-wine-glass-alt:before {\n content: \"\\f5ce\"; }\n\n.fa-wix:before {\n content: \"\\f5cf\"; }\n\n.fa-wizards-of-the-coast:before {\n content: \"\\f730\"; }\n\n.fa-wodu:before {\n content: \"\\e088\"; }\n\n.fa-wolf-pack-battalion:before {\n content: \"\\f514\"; }\n\n.fa-won-sign:before {\n content: \"\\f159\"; }\n\n.fa-wordpress:before {\n content: \"\\f19a\"; }\n\n.fa-wordpress-simple:before {\n content: \"\\f411\"; }\n\n.fa-wpbeginner:before {\n content: \"\\f297\"; }\n\n.fa-wpexplorer:before {\n content: \"\\f2de\"; }\n\n.fa-wpforms:before {\n content: \"\\f298\"; }\n\n.fa-wpressr:before {\n content: \"\\f3e4\"; }\n\n.fa-wrench:before {\n content: \"\\f0ad\"; }\n\n.fa-x-ray:before {\n content: \"\\f497\"; }\n\n.fa-xbox:before {\n content: \"\\f412\"; }\n\n.fa-xing:before {\n content: \"\\f168\"; }\n\n.fa-xing-square:before {\n content: \"\\f169\"; }\n\n.fa-y-combinator:before {\n content: \"\\f23b\"; }\n\n.fa-yahoo:before {\n content: \"\\f19e\"; }\n\n.fa-yammer:before {\n content: \"\\f840\"; }\n\n.fa-yandex:before {\n content: \"\\f413\"; }\n\n.fa-yandex-international:before {\n content: \"\\f414\"; }\n\n.fa-yarn:before {\n content: \"\\f7e3\"; }\n\n.fa-yelp:before {\n content: \"\\f1e9\"; }\n\n.fa-yen-sign:before {\n content: \"\\f157\"; }\n\n.fa-yin-yang:before {\n content: \"\\f6ad\"; }\n\n.fa-yoast:before {\n content: \"\\f2b1\"; }\n\n.fa-youtube:before {\n content: \"\\f167\"; }\n\n.fa-youtube-square:before {\n content: \"\\f431\"; }\n\n.fa-zhihu:before {\n content: \"\\f63f\"; }\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto; }\n@font-face {\n font-family: 'Font Awesome 5 Brands';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(\"../webfonts/fa-brands-400.eot\");\n src: url(\"../webfonts/fa-brands-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.woff\") format(\"woff\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-brands-400.svg#fontawesome\") format(\"svg\"); }\n\n.fab {\n font-family: 'Font Awesome 5 Brands';\n font-weight: 400; }\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(\"../webfonts/fa-regular-400.eot\");\n src: url(\"../webfonts/fa-regular-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.woff\") format(\"woff\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-regular-400.svg#fontawesome\") format(\"svg\"); }\n\n.far {\n font-family: 'Font Awesome 5 Free';\n font-weight: 400; }\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url(\"../webfonts/fa-solid-900.eot\");\n src: url(\"../webfonts/fa-solid-900.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.woff\") format(\"woff\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"), url(\"../webfonts/fa-solid-900.svg#fontawesome\") format(\"svg\"); }\n\n.fa,\n.fas {\n font-family: 'Font Awesome 5 Free';\n font-weight: 900; }\n"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/bootstrap/scss/bootstrap.scss": -/*!*********************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/bootstrap/scss/bootstrap.scss ***! - \*********************************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../css-loader/dist/runtime/getUrl.js */ "./node_modules/css-loader/dist/runtime/getUrl.js"); -/* harmony import */ var _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); -// Imports - - - -var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath fill=%27%2328a745%27 d=%27M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath fill=%27%2328a745%27 d=%27M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%274%27 height=%275%27 viewBox=%270 0 4 5%27%3e%3cpath fill=%27%23343a40%27 d=%27M2 0L0 2h4zm0 5L0 3h4z%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%274%27 height=%275%27 viewBox=%270 0 4 5%27%3e%3cpath fill=%27%23343a40%27 d=%27M2 0L0 2h4zm0 5L0 3h4z%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 fill=%27none%27 stroke=%27%23dc3545%27 viewBox=%270 0 12 12%27%3e%3ccircle cx=%276%27 cy=%276%27 r=%274.5%27/%3e%3cpath stroke-linejoin=%27round%27 d=%27M5.8 3.6h.4L6 6.5z%27/%3e%3ccircle cx=%276%27 cy=%278.2%27 r=%27.6%27 fill=%27%23dc3545%27 stroke=%27none%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 fill=%27none%27 stroke=%27%23dc3545%27 viewBox=%270 0 12 12%27%3e%3ccircle cx=%276%27 cy=%276%27 r=%274.5%27/%3e%3cpath stroke-linejoin=%27round%27 d=%27M5.8 3.6h.4L6 6.5z%27/%3e%3ccircle cx=%276%27 cy=%278.2%27 r=%27.6%27 fill=%27%23dc3545%27 stroke=%27none%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath fill=%27%23fff%27 d=%27M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath fill=%27%23fff%27 d=%27M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_4___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%274%27 height=%274%27 viewBox=%270 0 4 4%27%3e%3cpath stroke=%27%23fff%27 d=%27M0 2h4%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%274%27 height=%274%27 viewBox=%270 0 4 4%27%3e%3cpath stroke=%27%23fff%27 d=%27M0 2h4%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_5___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27%23fff%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27%23fff%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_6___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2730%27 height=%2730%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%280, 0, 0, 0.5%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2730%27 height=%2730%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%280, 0, 0, 0.5%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_7___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2730%27 height=%2730%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%28255, 255, 255, 0.5%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2730%27 height=%2730%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%28255, 255, 255, 0.5%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_8___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath d=%27M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath d=%27M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_9___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath d=%27M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z%27/%3e%3c/svg%3e */ "data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27 width=%278%27 height=%278%27 viewBox=%270 0 8 8%27%3e%3cpath d=%27M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z%27/%3e%3c/svg%3e"), __webpack_require__.b); -var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -var ___CSS_LOADER_URL_REPLACEMENT_0___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); -var ___CSS_LOADER_URL_REPLACEMENT_1___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___); -var ___CSS_LOADER_URL_REPLACEMENT_2___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___); -var ___CSS_LOADER_URL_REPLACEMENT_3___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___); -var ___CSS_LOADER_URL_REPLACEMENT_4___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_4___); -var ___CSS_LOADER_URL_REPLACEMENT_5___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_5___); -var ___CSS_LOADER_URL_REPLACEMENT_6___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_6___); -var ___CSS_LOADER_URL_REPLACEMENT_7___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_7___); -var ___CSS_LOADER_URL_REPLACEMENT_8___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_8___); -var ___CSS_LOADER_URL_REPLACEMENT_9___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_9___); -// Module -___CSS_LOADER_EXPORT___.push([module.id, "@charset \"UTF-8\";\n/*!\n * Bootstrap v4.6.2 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n}\na:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=button]::-moz-focus-inner,\n[type=reset]::-moz-focus-inner,\n[type=submit]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=radio],\ninput[type=checkbox] {\n box-sizing: border-box;\n padding: 0;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=number]::-webkit-inner-spin-button,\n[type=number]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=search]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 0.875em;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container,\n.container-fluid,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.no-gutters > .col,\n.no-gutters > [class*=col-] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-xl,\n.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg,\n.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md,\n.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm,\n.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col,\n.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.row-cols-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 33.3333333333%;\n max-width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 16.6666666667%;\n max-width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 33.3333333333%;\n max-width: 33.3333333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 16.6666666667%;\n max-width: 16.6666666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-md-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 33.3333333333%;\n max-width: 33.3333333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 16.6666666667%;\n max-width: 16.6666666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 33.3333333333%;\n max-width: 33.3333333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 16.6666666667%;\n max-width: 16.6666666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 33.3333333333%;\n max-width: 33.3333333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 16.6666666667%;\n max-width: 16.6666666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n}\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n.table-dark.table-bordered {\n border: 0;\n}\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\ninput[type=date].form-control,\ninput[type=time].form-control,\ninput[type=datetime-local].form-control,\ninput[type=month].form-control {\n appearance: none;\n}\n\nselect.form-control:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #495057;\n}\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n font-size: 1rem;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n.form-row > .col,\n.form-row > [class*=col-] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n.form-row > .col > .valid-tooltip, .form-row > [class*=col-] > .valid-tooltip {\n left: 5px;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem) !important;\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated select.form-control:valid, select.form-control.is-valid {\n padding-right: 3rem !important;\n background-position: right 1.5rem center;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc(0.75em + 2.3125rem) !important;\n background: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") right 0.75rem center/8px 10px no-repeat, #fff url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat;\n}\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n.form-row > .col > .invalid-tooltip, .form-row > [class*=col-] > .invalid-tooltip {\n left: 5px;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem) !important;\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated select.form-control:invalid, select.form-control.is-invalid {\n padding-right: 3rem !important;\n background-position: right 1.5rem center;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc(0.75em + 2.3125rem) !important;\n background: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") right 0.75rem center/8px 10px no-repeat, #fff url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat;\n}\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n.form-inline .form-check {\n width: 100%;\n}\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n.btn:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n.btn-primary:focus, .btn-primary.focus {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n.btn-secondary:focus, .btn-secondary.focus {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n.btn-success:focus, .btn-success.focus {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n.btn-info:focus, .btn-info.focus {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n.btn-warning:focus, .btn-warning.focus {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n.btn-danger:focus, .btn-danger.focus {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n.btn-light:focus, .btn-light.focus {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n.btn-dark:focus, .btn-dark.focus {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n}\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=submit].btn-block,\ninput[type=reset].btn-block,\ninput[type=button].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.width {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.width {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #e9ecef;\n}\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #adb5bd;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n.btn-group-toggle > .btn input[type=radio],\n.btn-group-toggle > .btn input[type=checkbox],\n.btn-group-toggle > .btn-group > .btn input[type=radio],\n.btn-group-toggle > .btn-group > .btn input[type=checkbox] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n margin-bottom: 0;\n}\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group:not(.has-validation) > .form-control:not(:last-child),\n.input-group:not(.has-validation) > .custom-select:not(:last-child),\n.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label,\n.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > .form-control:nth-last-child(n+3),\n.input-group.has-validation > .custom-select:nth-last-child(n+3),\n.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label,\n.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n.input-group-text input[type=radio],\n.input-group-text input[type=checkbox] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,\n.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,\n.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .btn,\n.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n z-index: 1;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n print-color-adjust: exact;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n left: 0;\n z-index: -1;\n width: 1rem;\n height: 1.25rem;\n opacity: 0;\n}\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: 1px solid #adb5bd;\n}\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: 50%/50% 50% no-repeat;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ");\n}\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_4___ + ");\n}\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_5___ + ");\n}\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: #fff url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") right 0.75rem center/8px 10px no-repeat;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n.custom-select::-ms-expand {\n display: none;\n}\n.custom-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #495057;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n overflow: hidden;\n opacity: 0;\n}\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n overflow: hidden;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: 1.4rem;\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n.custom-range:focus {\n outline: 0;\n}\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-link {\n margin-bottom: -1px;\n background-color: transparent;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n isolation: isolate;\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n background: none;\n border: 0;\n border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n.navbar .container,\n.navbar .container-fluid,\n.navbar .container-sm,\n.navbar .container-md,\n.navbar .container-lg,\n.navbar .container-xl {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: 50%/100% 100% no-repeat;\n}\n\n.navbar-nav-scroll {\n max-height: 75vh;\n overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid,\n .navbar-expand-sm > .container-sm,\n .navbar-expand-sm > .container-md,\n .navbar-expand-sm > .container-lg,\n .navbar-expand-sm > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid,\n .navbar-expand-sm > .container-sm,\n .navbar-expand-sm > .container-md,\n .navbar-expand-sm > .container-lg,\n .navbar-expand-sm > .container-xl {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid,\n .navbar-expand-md > .container-sm,\n .navbar-expand-md > .container-md,\n .navbar-expand-md > .container-lg,\n .navbar-expand-md > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid,\n .navbar-expand-md > .container-sm,\n .navbar-expand-md > .container-md,\n .navbar-expand-md > .container-lg,\n .navbar-expand-md > .container-xl {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid,\n .navbar-expand-lg > .container-sm,\n .navbar-expand-lg > .container-md,\n .navbar-expand-lg > .container-lg,\n .navbar-expand-lg > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid,\n .navbar-expand-lg > .container-sm,\n .navbar-expand-lg > .container-md,\n .navbar-expand-lg > .container-lg,\n .navbar-expand-lg > .container-xl {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid,\n .navbar-expand-xl > .container-sm,\n .navbar-expand-xl > .container-md,\n .navbar-expand-xl > .container-lg,\n .navbar-expand-xl > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid,\n .navbar-expand-xl > .container-sm,\n .navbar-expand-xl > .container-md,\n .navbar-expand-xl > .container-lg,\n .navbar-expand-xl > .container-xl {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n.navbar-expand > .container,\n.navbar-expand > .container-fluid,\n.navbar-expand > .container-sm,\n.navbar-expand > .container-md,\n.navbar-expand > .container-lg,\n.navbar-expand > .container-xl {\n padding-right: 0;\n padding-left: 0;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n.navbar-expand > .container,\n.navbar-expand > .container-fluid,\n.navbar-expand > .container-sm,\n.navbar-expand > .container-md,\n.navbar-expand > .container-lg,\n.navbar-expand > .container-xl {\n flex-wrap: nowrap;\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_6___ + ");\n}\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_7___ + ");\n}\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n min-height: 1px;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n flex-shrink: 0;\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n@media (min-width: 576px) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n flex: 1 0 0%;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n overflow-anchor: none;\n}\n.accordion > .card {\n overflow: hidden;\n}\n.accordion > .card:not(:last-of-type) {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.accordion > .card:not(:first-of-type) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.accordion > .card > .card-header {\n border-radius: 0;\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n.page-link:focus {\n z-index: 3;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n.page-item.active .page-link {\n z-index: 3;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n.alert-info hr {\n border-top-color: #abdde5;\n}\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n.alert-light hr {\n border-top-color: #ececf6;\n}\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n line-height: 0;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: 0.25rem;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: -1px;\n border-top-width: 1px;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 1px;\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.5;\n}\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 0.75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n flex-basis: 350px;\n max-width: 350px;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n opacity: 0;\n border-radius: 0.25rem;\n}\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n.toast.showing {\n opacity: 1;\n}\n.toast.show {\n display: block;\n opacity: 1;\n}\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n height: min-content;\n content: \"\";\n}\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n padding: 0.75rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: calc(0.3rem - 1px);\n border-bottom-left-radius: calc(0.3rem - 1px);\n}\n.modal-footer > * {\n margin: 0.25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n height: min-content;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: 0.9;\n}\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow {\n bottom: 0;\n}\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow {\n top: 0;\n}\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=top] {\n margin-bottom: 0.5rem;\n}\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=top] > .arrow {\n bottom: calc(-0.5rem - 1px);\n}\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=top] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=top] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=right] {\n margin-left: 0.5rem;\n}\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=right] > .arrow {\n left: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=right] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=right] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] {\n margin-top: 0.5rem;\n}\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=bottom] > .arrow {\n top: calc(-0.5rem - 1px);\n}\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=bottom] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=bottom] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=left] {\n margin-right: 0.5rem;\n}\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=left] > .arrow {\n right: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=left] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=left] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: 50%/100% 100% no-repeat;\n}\n\n.carousel-control-prev-icon {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_8___ + ");\n}\n\n.carousel-control-next-icon {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_9___ + ");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n border: 0.25em solid currentcolor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: 0.75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n background-color: currentcolor;\n border-radius: 50%;\n opacity: 0;\n animation: 0.75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n animation-duration: 1.5s;\n }\n}\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.85714286%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n.user-select-all {\n user-select: all !important;\n}\n\n.user-select-auto {\n user-select: auto !important;\n}\n\n.user-select-none {\n user-select: none !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n word-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}", "",{"version":3,"sources":["webpack://./node_modules/bootstrap/scss/bootstrap.scss","webpack://./node_modules/bootstrap/scss/_root.scss","webpack://./node_modules/bootstrap/scss/_reboot.scss","webpack://./node_modules/bootstrap/scss/_variables.scss","webpack://./node_modules/bootstrap/scss/vendor/_rfs.scss","webpack://./node_modules/bootstrap/scss/mixins/_hover.scss","webpack://./node_modules/bootstrap/scss/_type.scss","webpack://./node_modules/bootstrap/scss/mixins/_lists.scss","webpack://./node_modules/bootstrap/scss/_images.scss","webpack://./node_modules/bootstrap/scss/mixins/_image.scss","webpack://./node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack://./node_modules/bootstrap/scss/_code.scss","webpack://./node_modules/bootstrap/scss/_grid.scss","webpack://./node_modules/bootstrap/scss/mixins/_grid.scss","webpack://./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://./node_modules/bootstrap/scss/mixins/_grid-framework.scss","webpack://./node_modules/bootstrap/scss/_tables.scss","webpack://./node_modules/bootstrap/scss/mixins/_table-row.scss","webpack://./node_modules/bootstrap/scss/_forms.scss","webpack://./node_modules/bootstrap/scss/mixins/_transition.scss","webpack://./node_modules/bootstrap/scss/mixins/_forms.scss","webpack://./node_modules/bootstrap/scss/mixins/_gradients.scss","webpack://./node_modules/bootstrap/scss/_buttons.scss","webpack://./node_modules/bootstrap/scss/mixins/_buttons.scss","webpack://./node_modules/bootstrap/scss/_transitions.scss","webpack://./node_modules/bootstrap/scss/_dropdown.scss","webpack://./node_modules/bootstrap/scss/mixins/_caret.scss","webpack://./node_modules/bootstrap/scss/mixins/_nav-divider.scss","webpack://./node_modules/bootstrap/scss/_button-group.scss","webpack://./node_modules/bootstrap/scss/_input-group.scss","webpack://./node_modules/bootstrap/scss/_custom-forms.scss","webpack://./node_modules/bootstrap/scss/_nav.scss","webpack://./node_modules/bootstrap/scss/_navbar.scss","webpack://./node_modules/bootstrap/scss/_card.scss","webpack://./node_modules/bootstrap/scss/_breadcrumb.scss","webpack://./node_modules/bootstrap/scss/_pagination.scss","webpack://./node_modules/bootstrap/scss/mixins/_pagination.scss","webpack://./node_modules/bootstrap/scss/_badge.scss","webpack://./node_modules/bootstrap/scss/mixins/_badge.scss","webpack://./node_modules/bootstrap/scss/_jumbotron.scss","webpack://./node_modules/bootstrap/scss/_alert.scss","webpack://./node_modules/bootstrap/scss/mixins/_alert.scss","webpack://./node_modules/bootstrap/scss/_progress.scss","webpack://./node_modules/bootstrap/scss/_media.scss","webpack://./node_modules/bootstrap/scss/_list-group.scss","webpack://./node_modules/bootstrap/scss/mixins/_list-group.scss","webpack://./node_modules/bootstrap/scss/_close.scss","webpack://./node_modules/bootstrap/scss/_toasts.scss","webpack://./node_modules/bootstrap/scss/_modal.scss","webpack://./node_modules/bootstrap/scss/_tooltip.scss","webpack://./node_modules/bootstrap/scss/mixins/_reset-text.scss","webpack://./node_modules/bootstrap/scss/_popover.scss","webpack://./node_modules/bootstrap/scss/_carousel.scss","webpack://./node_modules/bootstrap/scss/mixins/_clearfix.scss","webpack://./node_modules/bootstrap/scss/_spinners.scss","webpack://./node_modules/bootstrap/scss/utilities/_align.scss","webpack://./node_modules/bootstrap/scss/mixins/_background-variant.scss","webpack://./node_modules/bootstrap/scss/utilities/_background.scss","webpack://./node_modules/bootstrap/scss/utilities/_borders.scss","webpack://./node_modules/bootstrap/scss/utilities/_display.scss","webpack://./node_modules/bootstrap/scss/utilities/_embed.scss","webpack://./node_modules/bootstrap/scss/utilities/_flex.scss","webpack://./node_modules/bootstrap/scss/utilities/_float.scss","webpack://./node_modules/bootstrap/scss/utilities/_interactions.scss","webpack://./node_modules/bootstrap/scss/utilities/_overflow.scss","webpack://./node_modules/bootstrap/scss/utilities/_position.scss","webpack://./node_modules/bootstrap/scss/utilities/_screenreaders.scss","webpack://./node_modules/bootstrap/scss/mixins/_screen-reader.scss","webpack://./node_modules/bootstrap/scss/utilities/_shadows.scss","webpack://./node_modules/bootstrap/scss/utilities/_sizing.scss","webpack://./node_modules/bootstrap/scss/utilities/_spacing.scss","webpack://./node_modules/bootstrap/scss/utilities/_stretched-link.scss","webpack://./node_modules/bootstrap/scss/utilities/_text.scss","webpack://./node_modules/bootstrap/scss/mixins/_text-truncate.scss","webpack://./node_modules/bootstrap/scss/mixins/_text-emphasis.scss","webpack://./node_modules/bootstrap/scss/mixins/_text-hide.scss","webpack://./node_modules/bootstrap/scss/utilities/_visibility.scss","webpack://./node_modules/bootstrap/scss/_print.scss"],"names":[],"mappings":"AAAA,gBAAgB;AAAhB;;;;;EAAA;ACAA;EAGI,eAAA;EAAA,iBAAA;EAAA,iBAAA;EAAA,eAAA;EAAA,cAAA;EAAA,iBAAA;EAAA,iBAAA;EAAA,gBAAA;EAAA,eAAA;EAAA,eAAA;EAAA,aAAA;EAAA,eAAA;EAAA,oBAAA;EAIA,kBAAA;EAAA,oBAAA;EAAA,kBAAA;EAAA,eAAA;EAAA,kBAAA;EAAA,iBAAA;EAAA,gBAAA;EAAA,eAAA;EAIA,kBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,uBAAA;EAKF,kOAAA;EACA,6GAAA;ADmBF;;AElBA;;;EAGE,sBAAA;AFqBF;;AElBA;EACE,uBAAA;EACA,iBAAA;EACA,8BAAA;EACA,6CAAA;AFqBF;;AEfA;EACE,cAAA;AFkBF;;AERA;EACE,SAAA;EACA,qNCsO4B;ECjGxB,eAAA;EFnIJ,gBC+O4B;ED9O5B,gBCmP4B;EDlP5B,cCnCS;EDoCT,gBAAA;EACA,sBC9CS;AHyDX;;AECA;EACE,qBAAA;AFEF;;AEOA;EACE,uBAAA;EACA,SAAA;EACA,iBAAA;AFJF;;AEiBA;EACE,aAAA;EACA,qBCiN4B;AH/N9B;;AEqBA;EACE,aAAA;EACA,mBCoF0B;AHtG5B;;AE6BA;;EAEE,0BAAA;EACA,iCAAA;EACA,YAAA;EACA,gBAAA;EACA,8BAAA;AF1BF;;AE6BA;EACE,mBAAA;EACA,kBAAA;EACA,oBAAA;AF1BF;;AE6BA;;;EAGE,aAAA;EACA,mBAAA;AF1BF;;AE6BA;;;;EAIE,gBAAA;AF1BF;;AE6BA;EACE,gBCkJ4B;AH5K9B;;AE6BA;EACE,qBAAA;EACA,cAAA;AF1BF;;AE6BA;EACE,gBAAA;AF1BF;;AE6BA;;EAEE,mBCqI4B;AH/J9B;;AE6BA;EEII,cAAA;AJ7BJ;;AEkCA;;EAEE,kBAAA;EEPE,cAAA;EFSF,cAAA;EACA,wBAAA;AF/BF;;AEkCA;EAAM,eAAA;AF9BN;;AE+BA;EAAM,WAAA;AF3BN;;AEkCA;EACE,cCXwC;EDYxC,qBCXwC;EDYxC,6BAAA;AF/BF;AKjJE;EHmLE,cCdsC;EDetC,0BCdsC;AHjB1C;;AEwCA;EACE,cAAA;EACA,qBAAA;AFrCF;AK1JE;EHkME,cAAA;EACA,qBAAA;AFrCJ;;AE8CA;;;;EAIE,iGC0D4B;EClH1B,cAAA;AJcJ;;AE8CA;EAEE,aAAA;EAEA,mBAAA;EAEA,cAAA;EAGA,6BAAA;AFhDF;;AEwDA;EAEE,gBAAA;AFtDF;;AE8DA;EACE,sBAAA;EACA,kBAAA;AF3DF;;AE8DA;EAGE,gBAAA;EACA,sBAAA;AF7DF;;AEqEA;EACE,yBAAA;AFlEF;;AEqEA;EACE,oBC8E4B;ED7E5B,uBC6E4B;ED5E5B,cCtQS;EDuQT,gBAAA;EACA,oBAAA;AFlEF;;AEyEA;EAEE,mBAAA;EACA,gCAAA;AFvEF;;AE+EA;EAEE,qBAAA;EACA,qBC4JsC;AHzOxC;;AEmFA;EAEE,gBAAA;AFjFF;;AEyFA;EACE,UAAA;AFtFF;;AEyFA;;;;;EAKE,SAAA;EACA,oBAAA;EEhKE,kBAAA;EFkKF,oBAAA;AFtFF;;AEyFA;;EAEE,iBAAA;AFtFF;;AEyFA;;EAEE,oBAAA;AFtFF;;AE4FA;EACE,eAAA;AFzFF;;AE+FA;EACE,iBAAA;AF5FF;;AEmGA;;;;EAIE,0BAAA;AFhGF;;AEyGI;;;;EACE,eAAA;AFnGN;;AEyGA;;;;EAIE,UAAA;EACA,kBAAA;AFtGF;;AEyGA;;EAEE,sBAAA;EACA,UAAA;AFtGF;;AE0GA;EACE,cAAA;EAEA,gBAAA;AFxGF;;AE2GA;EAME,YAAA;EAEA,UAAA;EACA,SAAA;EACA,SAAA;AF9GF;;AEmHA;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,UAAA;EACA,qBAAA;EE9OI,iBAAA;EFgPJ,oBAAA;EACA,cAAA;EACA,mBAAA;AFhHF;;AEmHA;EACE,wBAAA;AFhHF;;AEoHA;;EAEE,YAAA;AFjHF;;AEoHA;EAKE,oBAAA;EACA,wBAAA;AFrHF;;AE4HA;EACE,wBAAA;AFzHF;;AEiIA;EACE,aAAA;EACA,0BAAA;AF9HF;;AEqIA;EACE,qBAAA;AFlIF;;AEqIA;EACE,kBAAA;EACA,eAAA;AFlIF;;AEqIA;EACE,aAAA;AFlIF;;AEuIA;EACE,wBAAA;AFpIF;;AMxVA;;EAEE,qBHsS4B;EGpS5B,gBHsS4B;EGrS5B,gBHsS4B;AHoD9B;;AMtVA;EFqKM,iBAAA;AJqLN;;AMzVA;EFoKM,eAAA;AJyLN;;AM5VA;EFmKM,kBAAA;AJ6LN;;AM/VA;EFkKM,iBAAA;AJiMN;;AMlWA;EFiKM,kBAAA;AJqMN;;AMrWA;EFgKM,eAAA;AJyMN;;AMvWA;EF8JM,kBAAA;EE5JJ,gBHwS4B;AHkE9B;;AMtWA;EFwJM,eAAA;EEtJJ,gBH2R4B;EG1R5B,gBHkR4B;AHuF9B;;AMvWA;EFmJM,iBAAA;EEjJJ,gBHuR4B;EGtR5B,gBH6Q4B;AH6F9B;;AMxWA;EF8IM,iBAAA;EE5IJ,gBHmR4B;EGlR5B,gBHwQ4B;AHmG9B;;AMzWA;EFyIM,iBAAA;EEvIJ,gBH+Q4B;EG9Q5B,gBHmQ4B;AHyG9B;;AMpWA;EACE,gBHgFO;EG/EP,mBH+EO;EG9EP,SAAA;EACA,wCAAA;ANuWF;;AM/VA;;EFkGI,kBAAA;EE/FF,gBH2N4B;AHuI9B;;AM/VA;;EAEE,cHmQ4B;EGlQ5B,yBH2Q4B;AHuF9B;;AM1VA;EC/EE,eAAA;EACA,gBAAA;AP6aF;;AM1VA;ECpFE,eAAA;EACA,gBAAA;APkbF;;AM5VA;EACE,qBAAA;AN+VF;AM7VE;EACE,oBHqP0B;AH0G9B;;AMrVA;EF2DI,cAAA;EEzDF,yBAAA;ANwVF;;AMpVA;EACE,mBHuBO;EC6CH,kBAAA;AJoRN;;AMpVA;EACE,cAAA;EF+CE,kBAAA;EE7CF,cH1GS;AHicX;AMrVE;EACE,aAAA;ANuVJ;;AQ1cA;ECIE,eAAA;EAGA,YAAA;ATwcF;;AQzcA;EACE,gBLqgCkC;EKpgClC,sBLRS;EKST,yBAAA;EEEE,sBAAA;EDPF,eAAA;EAGA,YAAA;ATidF;;AQncA;EAEE,qBAAA;ARqcF;;AQlcA;EACE,qBAAA;EACA,cAAA;ARqcF;;AQlcA;EJ8HI,cAAA;EI5HF,cL3BS;AHgeX;;AW5eA;EPmKI,gBAAA;EOjKF,cRmCQ;EQlCR,qBAAA;AX+eF;AW5eE;EACE,cAAA;AX8eJ;;AWzeA;EACE,sBAAA;EPsJE,gBAAA;EOpJF,WRTS;EQUT,yBRDS;EOEP,qBAAA;AV4eJ;AWzeE;EACE,UAAA;EP8IA,eAAA;EO5IA,gBRyQ0B;AHkO9B;;AWreA;EACE,cAAA;EPqIE,gBAAA;EOnIF,cRjBS;AHyfX;AWreE;EPgIE,kBAAA;EO9HA,cAAA;EACA,kBAAA;AXueJ;;AWleA;EACE,iBRikCkC;EQhkClC,kBAAA;AXqeF;;AY7gBE;;;;;;ECDA,WAAA;EACA,mBAAA;EACA,kBAAA;EACA,kBAAA;EACA,iBAAA;AbuhBF;;AcpeI;EFzCE;IACE,gBT8Le;EHmVrB;AACF;Ac1eI;EFzCE;IACE,gBT8Le;EHwVrB;AACF;Ac/eI;EFzCE;IACE,gBT8Le;EH6VrB;AACF;AcpfI;EFzCE;IACE,iBT8Le;EHkWrB;AACF;AYrgBE;ECnCA,aAAA;EACA,eAAA;EACA,mBAAA;EACA,kBAAA;Ab2iBF;;AYrgBE;EACE,eAAA;EACA,cAAA;AZwgBJ;AYtgBI;;EAEE,gBAAA;EACA,eAAA;AZwgBN;;Ae9jBE;;;;;;EACE,kBAAA;EACA,WAAA;EACA,mBAAA;EACA,kBAAA;AfskBJ;;AehjBM;EACE,aAAA;EACA,YAAA;EACA,eAAA;AfmjBR;;AavhBE;EACE,cAAA;EACA,eAAA;Ab0hBJ;;Aa5hBE;EACE,aAAA;EACA,cAAA;Ab+hBJ;;AajiBE;EACE,wBAAA;EACA,yBAAA;AboiBJ;;AatiBE;EACE,aAAA;EACA,cAAA;AbyiBJ;;Aa3iBE;EACE,aAAA;EACA,cAAA;Ab8iBJ;;AahjBE;EACE,wBAAA;EACA,yBAAA;AbmjBJ;;AetkBM;EFCJ,cAAA;EACA,WAAA;EACA,eAAA;AbykBF;;AetkBU;EFbR,qBAAA;EAIA,sBAAA;AbolBF;;Ae3kBU;EFbR,sBAAA;EAIA,uBAAA;AbylBF;;AehlBU;EFbR,aAAA;EAIA,cAAA;Ab8lBF;;AerlBU;EFbR,sBAAA;EAIA,uBAAA;AbmmBF;;Ae1lBU;EFbR,sBAAA;EAIA,uBAAA;AbwmBF;;Ae/lBU;EFbR,aAAA;EAIA,cAAA;Ab6mBF;;AepmBU;EFbR,sBAAA;EAIA,uBAAA;AbknBF;;AezmBU;EFbR,sBAAA;EAIA,uBAAA;AbunBF;;Ae9mBU;EFbR,aAAA;EAIA,cAAA;Ab4nBF;;AennBU;EFbR,sBAAA;EAIA,uBAAA;AbioBF;;AexnBU;EFbR,sBAAA;EAIA,uBAAA;AbsoBF;;Ae7nBU;EFbR,cAAA;EAIA,eAAA;Ab2oBF;;Ae5nBM;EAAwB,SAAA;AfgoB9B;;Ae9nBM;EAAuB,SAAA;AfkoB7B;;Ae/nBQ;EAAwB,QADb;AfooBnB;;AenoBQ;EAAwB,QADb;AfwoBnB;;AevoBQ;EAAwB,QADb;Af4oBnB;;Ae3oBQ;EAAwB,QADb;AfgpBnB;;Ae/oBQ;EAAwB,QADb;AfopBnB;;AenpBQ;EAAwB,QADb;AfwpBnB;;AevpBQ;EAAwB,QADb;Af4pBnB;;Ae3pBQ;EAAwB,QADb;AfgqBnB;;Ae/pBQ;EAAwB,QADb;AfoqBnB;;AenqBQ;EAAwB,QADb;AfwqBnB;;AevqBQ;EAAwB,SADb;Af4qBnB;;Ae3qBQ;EAAwB,SADb;AfgrBnB;;Ae/qBQ;EAAwB,SADb;AforBnB;;Ae5qBY;EFhBV,wBAAA;AbgsBF;;AehrBY;EFhBV,yBAAA;AbosBF;;AeprBY;EFhBV,gBAAA;AbwsBF;;AexrBY;EFhBV,yBAAA;Ab4sBF;;Ae5rBY;EFhBV,yBAAA;AbgtBF;;AehsBY;EFhBV,gBAAA;AbotBF;;AepsBY;EFhBV,yBAAA;AbwtBF;;AexsBY;EFhBV,yBAAA;Ab4tBF;;Ae5sBY;EFhBV,gBAAA;AbguBF;;AehtBY;EFhBV,yBAAA;AbouBF;;AeptBY;EFhBV,yBAAA;AbwuBF;;AcnuBI;EC3BE;IACE,aAAA;IACA,YAAA;IACA,eAAA;EfkwBN;EatuBA;IACE,cAAA;IACA,eAAA;EbwuBF;Ea1uBA;IACE,aAAA;IACA,cAAA;Eb4uBF;Ea9uBA;IACE,wBAAA;IACA,yBAAA;EbgvBF;EalvBA;IACE,aAAA;IACA,cAAA;EbovBF;EatvBA;IACE,aAAA;IACA,cAAA;EbwvBF;Ea1vBA;IACE,wBAAA;IACA,yBAAA;Eb4vBF;Ee/wBI;IFCJ,cAAA;IACA,WAAA;IACA,eAAA;EbixBA;Ee9wBQ;IFbR,qBAAA;IAIA,sBAAA;Eb2xBA;EelxBQ;IFbR,sBAAA;IAIA,uBAAA;Eb+xBA;EetxBQ;IFbR,aAAA;IAIA,cAAA;EbmyBA;Ee1xBQ;IFbR,sBAAA;IAIA,uBAAA;EbuyBA;Ee9xBQ;IFbR,sBAAA;IAIA,uBAAA;Eb2yBA;EelyBQ;IFbR,aAAA;IAIA,cAAA;Eb+yBA;EetyBQ;IFbR,sBAAA;IAIA,uBAAA;EbmzBA;Ee1yBQ;IFbR,sBAAA;IAIA,uBAAA;EbuzBA;Ee9yBQ;IFbR,aAAA;IAIA,cAAA;Eb2zBA;EelzBQ;IFbR,sBAAA;IAIA,uBAAA;Eb+zBA;EetzBQ;IFbR,sBAAA;IAIA,uBAAA;Ebm0BA;Ee1zBQ;IFbR,cAAA;IAIA,eAAA;Ebu0BA;EexzBI;IAAwB,SAAA;Ef2zB5B;EezzBI;IAAuB,SAAA;Ef4zB3B;EezzBM;IAAwB,QADb;Ef6zBjB;Ee5zBM;IAAwB,QADb;Efg0BjB;Ee/zBM;IAAwB,QADb;Efm0BjB;Eel0BM;IAAwB,QADb;Efs0BjB;Eer0BM;IAAwB,QADb;Efy0BjB;Eex0BM;IAAwB,QADb;Ef40BjB;Ee30BM;IAAwB,QADb;Ef+0BjB;Ee90BM;IAAwB,QADb;Efk1BjB;Eej1BM;IAAwB,QADb;Efq1BjB;Eep1BM;IAAwB,QADb;Efw1BjB;Eev1BM;IAAwB,SADb;Ef21BjB;Ee11BM;IAAwB,SADb;Ef81BjB;Ee71BM;IAAwB,SADb;Efi2BjB;Eez1BU;IFhBV,cAAA;Eb42BA;Ee51BU;IFhBV,wBAAA;Eb+2BA;Ee/1BU;IFhBV,yBAAA;Ebk3BA;Eel2BU;IFhBV,gBAAA;Ebq3BA;Eer2BU;IFhBV,yBAAA;Ebw3BA;Eex2BU;IFhBV,yBAAA;Eb23BA;Ee32BU;IFhBV,gBAAA;Eb83BA;Ee92BU;IFhBV,yBAAA;Ebi4BA;Eej3BU;IFhBV,yBAAA;Ebo4BA;Eep3BU;IFhBV,gBAAA;Ebu4BA;Eev3BU;IFhBV,yBAAA;Eb04BA;Ee13BU;IFhBV,yBAAA;Eb64BA;AACF;Acz4BI;EC3BE;IACE,aAAA;IACA,YAAA;IACA,eAAA;Efu6BN;Ea34BA;IACE,cAAA;IACA,eAAA;Eb64BF;Ea/4BA;IACE,aAAA;IACA,cAAA;Ebi5BF;Ean5BA;IACE,wBAAA;IACA,yBAAA;Ebq5BF;Eav5BA;IACE,aAAA;IACA,cAAA;Eby5BF;Ea35BA;IACE,aAAA;IACA,cAAA;Eb65BF;Ea/5BA;IACE,wBAAA;IACA,yBAAA;Ebi6BF;Eep7BI;IFCJ,cAAA;IACA,WAAA;IACA,eAAA;Ebs7BA;Een7BQ;IFbR,qBAAA;IAIA,sBAAA;Ebg8BA;Eev7BQ;IFbR,sBAAA;IAIA,uBAAA;Ebo8BA;Ee37BQ;IFbR,aAAA;IAIA,cAAA;Ebw8BA;Ee/7BQ;IFbR,sBAAA;IAIA,uBAAA;Eb48BA;Een8BQ;IFbR,sBAAA;IAIA,uBAAA;Ebg9BA;Eev8BQ;IFbR,aAAA;IAIA,cAAA;Ebo9BA;Ee38BQ;IFbR,sBAAA;IAIA,uBAAA;Ebw9BA;Ee/8BQ;IFbR,sBAAA;IAIA,uBAAA;Eb49BA;Een9BQ;IFbR,aAAA;IAIA,cAAA;Ebg+BA;Eev9BQ;IFbR,sBAAA;IAIA,uBAAA;Ebo+BA;Ee39BQ;IFbR,sBAAA;IAIA,uBAAA;Ebw+BA;Ee/9BQ;IFbR,cAAA;IAIA,eAAA;Eb4+BA;Ee79BI;IAAwB,SAAA;Efg+B5B;Ee99BI;IAAuB,SAAA;Efi+B3B;Ee99BM;IAAwB,QADb;Efk+BjB;Eej+BM;IAAwB,QADb;Efq+BjB;Eep+BM;IAAwB,QADb;Efw+BjB;Eev+BM;IAAwB,QADb;Ef2+BjB;Ee1+BM;IAAwB,QADb;Ef8+BjB;Ee7+BM;IAAwB,QADb;Efi/BjB;Eeh/BM;IAAwB,QADb;Efo/BjB;Een/BM;IAAwB,QADb;Efu/BjB;Eet/BM;IAAwB,QADb;Ef0/BjB;Eez/BM;IAAwB,QADb;Ef6/BjB;Ee5/BM;IAAwB,SADb;EfggCjB;Ee//BM;IAAwB,SADb;EfmgCjB;EelgCM;IAAwB,SADb;EfsgCjB;Ee9/BU;IFhBV,cAAA;EbihCA;EejgCU;IFhBV,wBAAA;EbohCA;EepgCU;IFhBV,yBAAA;EbuhCA;EevgCU;IFhBV,gBAAA;Eb0hCA;Ee1gCU;IFhBV,yBAAA;Eb6hCA;Ee7gCU;IFhBV,yBAAA;EbgiCA;EehhCU;IFhBV,gBAAA;EbmiCA;EenhCU;IFhBV,yBAAA;EbsiCA;EethCU;IFhBV,yBAAA;EbyiCA;EezhCU;IFhBV,gBAAA;Eb4iCA;Ee5hCU;IFhBV,yBAAA;Eb+iCA;Ee/hCU;IFhBV,yBAAA;EbkjCA;AACF;Ac9iCI;EC3BE;IACE,aAAA;IACA,YAAA;IACA,eAAA;Ef4kCN;EahjCA;IACE,cAAA;IACA,eAAA;EbkjCF;EapjCA;IACE,aAAA;IACA,cAAA;EbsjCF;EaxjCA;IACE,wBAAA;IACA,yBAAA;Eb0jCF;Ea5jCA;IACE,aAAA;IACA,cAAA;Eb8jCF;EahkCA;IACE,aAAA;IACA,cAAA;EbkkCF;EapkCA;IACE,wBAAA;IACA,yBAAA;EbskCF;EezlCI;IFCJ,cAAA;IACA,WAAA;IACA,eAAA;Eb2lCA;EexlCQ;IFbR,qBAAA;IAIA,sBAAA;EbqmCA;Ee5lCQ;IFbR,sBAAA;IAIA,uBAAA;EbymCA;EehmCQ;IFbR,aAAA;IAIA,cAAA;Eb6mCA;EepmCQ;IFbR,sBAAA;IAIA,uBAAA;EbinCA;EexmCQ;IFbR,sBAAA;IAIA,uBAAA;EbqnCA;Ee5mCQ;IFbR,aAAA;IAIA,cAAA;EbynCA;EehnCQ;IFbR,sBAAA;IAIA,uBAAA;Eb6nCA;EepnCQ;IFbR,sBAAA;IAIA,uBAAA;EbioCA;EexnCQ;IFbR,aAAA;IAIA,cAAA;EbqoCA;Ee5nCQ;IFbR,sBAAA;IAIA,uBAAA;EbyoCA;EehoCQ;IFbR,sBAAA;IAIA,uBAAA;Eb6oCA;EepoCQ;IFbR,cAAA;IAIA,eAAA;EbipCA;EeloCI;IAAwB,SAAA;EfqoC5B;EenoCI;IAAuB,SAAA;EfsoC3B;EenoCM;IAAwB,QADb;EfuoCjB;EetoCM;IAAwB,QADb;Ef0oCjB;EezoCM;IAAwB,QADb;Ef6oCjB;Ee5oCM;IAAwB,QADb;EfgpCjB;Ee/oCM;IAAwB,QADb;EfmpCjB;EelpCM;IAAwB,QADb;EfspCjB;EerpCM;IAAwB,QADb;EfypCjB;EexpCM;IAAwB,QADb;Ef4pCjB;Ee3pCM;IAAwB,QADb;Ef+pCjB;Ee9pCM;IAAwB,QADb;EfkqCjB;EejqCM;IAAwB,SADb;EfqqCjB;EepqCM;IAAwB,SADb;EfwqCjB;EevqCM;IAAwB,SADb;Ef2qCjB;EenqCU;IFhBV,cAAA;EbsrCA;EetqCU;IFhBV,wBAAA;EbyrCA;EezqCU;IFhBV,yBAAA;Eb4rCA;Ee5qCU;IFhBV,gBAAA;Eb+rCA;Ee/qCU;IFhBV,yBAAA;EbksCA;EelrCU;IFhBV,yBAAA;EbqsCA;EerrCU;IFhBV,gBAAA;EbwsCA;EexrCU;IFhBV,yBAAA;Eb2sCA;Ee3rCU;IFhBV,yBAAA;Eb8sCA;Ee9rCU;IFhBV,gBAAA;EbitCA;EejsCU;IFhBV,yBAAA;EbotCA;EepsCU;IFhBV,yBAAA;EbutCA;AACF;AcntCI;EC3BE;IACE,aAAA;IACA,YAAA;IACA,eAAA;EfivCN;EartCA;IACE,cAAA;IACA,eAAA;EbutCF;EaztCA;IACE,aAAA;IACA,cAAA;Eb2tCF;Ea7tCA;IACE,wBAAA;IACA,yBAAA;Eb+tCF;EajuCA;IACE,aAAA;IACA,cAAA;EbmuCF;EaruCA;IACE,aAAA;IACA,cAAA;EbuuCF;EazuCA;IACE,wBAAA;IACA,yBAAA;Eb2uCF;Ee9vCI;IFCJ,cAAA;IACA,WAAA;IACA,eAAA;EbgwCA;Ee7vCQ;IFbR,qBAAA;IAIA,sBAAA;Eb0wCA;EejwCQ;IFbR,sBAAA;IAIA,uBAAA;Eb8wCA;EerwCQ;IFbR,aAAA;IAIA,cAAA;EbkxCA;EezwCQ;IFbR,sBAAA;IAIA,uBAAA;EbsxCA;Ee7wCQ;IFbR,sBAAA;IAIA,uBAAA;Eb0xCA;EejxCQ;IFbR,aAAA;IAIA,cAAA;Eb8xCA;EerxCQ;IFbR,sBAAA;IAIA,uBAAA;EbkyCA;EezxCQ;IFbR,sBAAA;IAIA,uBAAA;EbsyCA;Ee7xCQ;IFbR,aAAA;IAIA,cAAA;Eb0yCA;EejyCQ;IFbR,sBAAA;IAIA,uBAAA;Eb8yCA;EeryCQ;IFbR,sBAAA;IAIA,uBAAA;EbkzCA;EezyCQ;IFbR,cAAA;IAIA,eAAA;EbszCA;EevyCI;IAAwB,SAAA;Ef0yC5B;EexyCI;IAAuB,SAAA;Ef2yC3B;EexyCM;IAAwB,QADb;Ef4yCjB;Ee3yCM;IAAwB,QADb;Ef+yCjB;Ee9yCM;IAAwB,QADb;EfkzCjB;EejzCM;IAAwB,QADb;EfqzCjB;EepzCM;IAAwB,QADb;EfwzCjB;EevzCM;IAAwB,QADb;Ef2zCjB;Ee1zCM;IAAwB,QADb;Ef8zCjB;Ee7zCM;IAAwB,QADb;Efi0CjB;Eeh0CM;IAAwB,QADb;Efo0CjB;Een0CM;IAAwB,QADb;Efu0CjB;Eet0CM;IAAwB,SADb;Ef00CjB;Eez0CM;IAAwB,SADb;Ef60CjB;Ee50CM;IAAwB,SADb;Efg1CjB;Eex0CU;IFhBV,cAAA;Eb21CA;Ee30CU;IFhBV,wBAAA;Eb81CA;Ee90CU;IFhBV,yBAAA;Ebi2CA;Eej1CU;IFhBV,gBAAA;Ebo2CA;Eep1CU;IFhBV,yBAAA;Ebu2CA;Eev1CU;IFhBV,yBAAA;Eb02CA;Ee11CU;IFhBV,gBAAA;Eb62CA;Ee71CU;IFhBV,yBAAA;Ebg3CA;Eeh2CU;IFhBV,yBAAA;Ebm3CA;Een2CU;IFhBV,gBAAA;Ebs3CA;Eet2CU;IFhBV,yBAAA;Eby3CA;Eez2CU;IFhBV,yBAAA;Eb43CA;AACF;AgBh7CA;EACE,WAAA;EACA,mBbiIO;EahIP,cbSS;AHy6CX;AgB/6CE;;EAEE,gBbmV0B;EalV1B,mBAAA;EACA,6BAAA;AhBi7CJ;AgB96CE;EACE,sBAAA;EACA,gCAAA;AhBg7CJ;AgB76CE;EACE,6BAAA;AhB+6CJ;;AgBr6CE;;EAEE,eb6T0B;AH2mC9B;;AgB/5CA;EACE,yBAAA;AhBk6CF;AgBh6CE;;EAEE,yBAAA;AhBk6CJ;AgB95CI;;EAEE,wBAAA;AhBg6CN;;AgB15CE;;;;EAIE,SAAA;AhB65CJ;;AgBp5CE;EACE,qCbyR0B;AH8nC9B;;AKt9CE;EW2EI,cbvEK;EawEL,sCb8QwB;AHioC9B;;AiBj+CI;;;EAGE,yBD2F+B;AhBy4CrC;AiBh+CM;;;;EAIE,qBDmFyE;AhB+4CjF;;AKv+CE;EYiBM,yBAJe;AjB89CvB;AiBx9CQ;;EAEE,yBARa;AjBk+CvB;;AiBr/CI;;;EAGE,yBD2F+B;AhB65CrC;AiBp/CM;;;;EAIE,qBDmFyE;AhBm6CjF;;AK3/CE;EYiBM,yBAJe;AjBk/CvB;AiB5+CQ;;EAEE,yBARa;AjBs/CvB;;AiBzgDI;;;EAGE,yBD2F+B;AhBi7CrC;AiBxgDM;;;;EAIE,qBDmFyE;AhBu7CjF;;AK/gDE;EYiBM,yBAJe;AjBsgDvB;AiBhgDQ;;EAEE,yBARa;AjB0gDvB;;AiB7hDI;;;EAGE,yBD2F+B;AhBq8CrC;AiB5hDM;;;;EAIE,qBDmFyE;AhB28CjF;;AKniDE;EYiBM,yBAJe;AjB0hDvB;AiBphDQ;;EAEE,yBARa;AjB8hDvB;;AiBjjDI;;;EAGE,yBD2F+B;AhBy9CrC;AiBhjDM;;;;EAIE,qBDmFyE;AhB+9CjF;;AKvjDE;EYiBM,yBAJe;AjB8iDvB;AiBxiDQ;;EAEE,yBARa;AjBkjDvB;;AiBrkDI;;;EAGE,yBD2F+B;AhB6+CrC;AiBpkDM;;;;EAIE,qBDmFyE;AhBm/CjF;;AK3kDE;EYiBM,yBAJe;AjBkkDvB;AiB5jDQ;;EAEE,yBARa;AjBskDvB;;AiBzlDI;;;EAGE,yBD2F+B;AhBigDrC;AiBxlDM;;;;EAIE,qBDmFyE;AhBugDjF;;AK/lDE;EYiBM,yBAJe;AjBslDvB;AiBhlDQ;;EAEE,yBARa;AjB0lDvB;;AiB7mDI;;;EAGE,yBD2F+B;AhBqhDrC;AiB5mDM;;;;EAIE,qBDmFyE;AhB2hDjF;;AKnnDE;EYiBM,yBAJe;AjB0mDvB;AiBpmDQ;;EAEE,yBARa;AjB8mDvB;;AiBjoDI;;;EAGE,sCd6VwB;AHuyC9B;;AKjoDE;EYiBM,sCAJe;AjBwnDvB;AiBlnDQ;;EAEE,sCARa;AjB4nDvB;;AgBpiDI;EACE,Wb3GK;Ea4GL,yBbpGK;EaqGL,qBbiQwB;AHsyC9B;AgBliDI;EACE,cb5GK;Ea6GL,yBblHK;EamHL,qBblHK;AHspDX;;AgB/hDA;EACE,Wb3HS;Ea4HT,yBbpHS;AHspDX;AgBhiDE;;;EAGE,qBb6O0B;AHqzC9B;AgB/hDE;EACE,SAAA;AhBiiDJ;AgB7hDI;EACE,2CbiOwB;AH8zC9B;AKpqDE;EW4IM,WbjJG;EakJH,4Cb2NsB;AHg0C9B;;Ac3mDI;EEiGA;IAEI,cAAA;IACA,WAAA;IACA,gBAAA;IACA,iCAAA;EhB6gDN;EgB1gDM;IACE,SAAA;EhB4gDR;AACF;AcvnDI;EEiGA;IAEI,cAAA;IACA,WAAA;IACA,gBAAA;IACA,iCAAA;EhBwhDN;EgBrhDM;IACE,SAAA;EhBuhDR;AACF;AcloDI;EEiGA;IAEI,cAAA;IACA,WAAA;IACA,gBAAA;IACA,iCAAA;EhBmiDN;EgBhiDM;IACE,SAAA;EhBkiDR;AACF;Ac7oDI;EEiGA;IAEI,cAAA;IACA,WAAA;IACA,gBAAA;IACA,iCAAA;EhB8iDN;EgB3iDM;IACE,SAAA;EhB6iDR;AACF;AgBvjDI;EAEI,cAAA;EACA,WAAA;EACA,gBAAA;EACA,iCAAA;AhBwjDR;AgBrjDQ;EACE,SAAA;AhBujDV;;AkBpuDA;EACE,cAAA;EACA,WAAA;EACA,mCf2esC;Ee1etC,yBAAA;Ed0KI,eAAA;EcvKJ,gBfmR4B;EelR5B,gBfuR4B;EetR5B,cfDS;EeET,sBfTS;EeUT,4BAAA;EACA,yBAAA;ERAE,sBAAA;ESFE,wEDQJ;AlBkuDF;AmBtuDM;EDdN;ICeQ,gBAAA;EnByuDN;AACF;AkBpuDE;EACE,6BAAA;EACA,SAAA;AlBsuDJ;AoBtvDE;EACE,cAAA;EACA,sBjBRO;EiBSP,qBjBsdoC;EiBrdpC,UAAA;EAKE,gDjBqXwB;AH+3C9B;AkBtuDE;EACE,cfxBO;Ee0BP,UAAA;AlBuuDJ;AkB/tDE;EAEE,yBfxCO;Ee0CP,UAAA;AlB+tDJ;;AkBvtDE;;;;EACE,gBAAA;AlB6tDJ;;AkBvtDE;EACE,kBAAA;EACA,0BAAA;AlB0tDJ;AkBvtDE;EAME,cf/DO;EegEP,sBfvEO;AH2xDX;;AkB/sDA;;EAEE,cAAA;EACA,WAAA;AlBktDF;;AkBxsDA;EACE,iCAAA;EACA,oCAAA;EACA,gBAAA;EdiEE,kBAAA;Ec/DF,gBfgM4B;AH2gD9B;;AkBxsDA;EACE,+BAAA;EACA,kCAAA;Ed0EI,kBAAA;EcxEJ,gBf6H4B;AH8kD9B;;AkBxsDA;EACE,gCAAA;EACA,mCAAA;EdmEI,mBAAA;EcjEJ,gBfuH4B;AHolD9B;;AkBlsDA;EACE,cAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;EdoDI,eAAA;EclDJ,gBfmK4B;EelK5B,cfnHS;EeoHT,6BAAA;EACA,yBAAA;EACA,mBAAA;AlBqsDF;AkBnsDE;EAEE,gBAAA;EACA,eAAA;AlBosDJ;;AkBxrDA;EACE,kCf6VsC;Ee5VtC,uBAAA;Ed2BI,mBAAA;EczBJ,gBf+E4B;EOxN1B,qBAAA;AVq0DJ;;AkBxrDA;EACE,gCfsVsC;EerVtC,oBAAA;EdmBI,kBAAA;EcjBJ,gBfsE4B;EOvN1B,qBAAA;AV60DJ;;AkBtrDE;EAEE,YAAA;AlBwrDJ;;AkBprDA;EACE,YAAA;AlBurDF;;AkB/qDA;EACE,mBf2UsC;AHu2CxC;;AkB/qDA;EACE,cAAA;EACA,mBf4TsC;AHs3CxC;;AkB1qDA;EACE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,iBAAA;AlB6qDF;AkB3qDE;;EAEE,kBAAA;EACA,iBAAA;AlB6qDJ;;AkBpqDA;EACE,kBAAA;EACA,cAAA;EACA,qBfiSsC;AHs4CxC;;AkBpqDA;EACE,kBAAA;EACA,kBf6RsC;Ee5RtC,qBAAA;AlBuqDF;AkBpqDE;EAEE,cfzNO;AH83DX;;AkBjqDA;EACE,gBAAA;AlBoqDF;;AkBjqDA;EACE,oBAAA;EACA,mBAAA;EACA,eAAA;EACA,qBf8QsC;AHs5CxC;AkBjqDE;EACE,gBAAA;EACA,aAAA;EACA,uBfyQoC;EexQpC,cAAA;AlBmqDJ;;AoBh3DE;EACE,aAAA;EACA,WAAA;EACA,mBjB2coC;ECtVpC,kBAAA;EgBnHA,cFqNqC;AlB8pDzC;;AoBh3DE;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;EACA,uBAAA;EACA,kBAAA;EhBwHE,mBAAA;EgBtHF,gBjBuO0B;EiBtO1B,WAAA;EACA,wCAAA;EV9CA,sBAAA;AVk6DJ;AoB/2DI;EAEE,SAAA;ApBg3DN;;AoB32DI;;;;EAEE,cAAA;ApBg3DN;;AoB95DI;EAoDE,qBFkLmC;EE/KjC,+CAAA;EACA,yDAAA;EACA,4BAAA;EACA,2DAAA;EACA,gEAAA;ApB42DR;AoBz2DM;EACE,qBFuKiC;EEtKjC,gDAAA;ApB22DR;;AoB36DI;EAyEI,8BAAA;EACA,wCAAA;ApBs2DR;;AoBh7DI;EAmFI,oCjB6XgC;EiB5XhC,kFAAA;ApBi2DR;;AoBr7DI;EA2FE,qBF2ImC;EExIjC,kDAAA;EACA,wNAAA;ApB41DR;AoBz1DM;EACE,qBFmIiC;EElIjC,gDAAA;ApB21DR;;AoBp1DM;EACE,cF0HiC;AlB6tDzC;AoBp1DM;;;EAEE,cAAA;ApBu1DR;;AoBh1DM;EACE,cF6GiC;AlBsuDzC;AoBj1DQ;EACE,qBF0G+B;AlByuDzC;AoB90DQ;EACE,qBAAA;EC5JN,yBD6J2B;ApBg1D/B;AoB30DQ;EACE,gDAAA;ApB60DV;AoB10DQ;EACE,qBFyF+B;AlBmvDzC;;AoBn0DM;EACE,qBF+EiC;AlBuvDzC;AoBl0DQ;EACE,qBF0E+B;EEzE/B,gDAAA;ApBo0DV;;AoBr9DE;EACE,aAAA;EACA,WAAA;EACA,mBjB2coC;ECtVpC,kBAAA;EgBnHA,cFqNqC;AlBmwDzC;;AoBr9DE;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;EACA,uBAAA;EACA,kBAAA;EhBwHE,mBAAA;EgBtHF,gBjBuO0B;EiBtO1B,WAAA;EACA,wCAAA;EV9CA,sBAAA;AVugEJ;AoBp9DI;EAEE,SAAA;ApBq9DN;;AoBh9DI;;;;EAEE,cAAA;ApBq9DN;;AoBngEI;EAoDE,qBFkLmC;EE/KjC,+CAAA;EACA,yDAAA;EACA,4BAAA;EACA,2DAAA;EACA,gEAAA;ApBi9DR;AoB98DM;EACE,qBFuKiC;EEtKjC,gDAAA;ApBg9DR;;AoBhhEI;EAyEI,8BAAA;EACA,wCAAA;ApB28DR;;AoBrhEI;EAmFI,oCjB6XgC;EiB5XhC,kFAAA;ApBs8DR;;AoB1hEI;EA2FE,qBF2ImC;EExIjC,kDAAA;EACA,wNAAA;ApBi8DR;AoB97DM;EACE,qBFmIiC;EElIjC,gDAAA;ApBg8DR;;AoBz7DM;EACE,cF0HiC;AlBk0DzC;AoBz7DM;;;EAEE,cAAA;ApB47DR;;AoBr7DM;EACE,cF6GiC;AlB20DzC;AoBt7DQ;EACE,qBF0G+B;AlB80DzC;AoBn7DQ;EACE,qBAAA;EC5JN,yBD6J2B;ApBq7D/B;AoBh7DQ;EACE,gDAAA;ApBk7DV;AoB/6DQ;EACE,qBFyF+B;AlBw1DzC;;AoBx6DM;EACE,qBF+EiC;AlB41DzC;AoBv6DQ;EACE,qBF0E+B;EEzE/B,gDAAA;ApBy6DV;;AkBp1DA;EACE,aAAA;EACA,mBAAA;EACA,mBAAA;AlBu1DF;AkBl1DE;EACE,WAAA;AlBo1DJ;AcnjEI;EIoOA;IACE,aAAA;IACA,mBAAA;IACA,uBAAA;IACA,gBAAA;ElBk1DJ;EkB90DE;IACE,aAAA;IACA,cAAA;IACA,mBAAA;IACA,mBAAA;IACA,gBAAA;ElBg1DJ;EkB50DE;IACE,qBAAA;IACA,WAAA;IACA,sBAAA;ElB80DJ;EkB10DE;IACE,qBAAA;ElB40DJ;EkBz0DE;;IAEE,WAAA;ElB20DJ;EkBt0DE;IACE,aAAA;IACA,mBAAA;IACA,uBAAA;IACA,WAAA;IACA,eAAA;ElBw0DJ;EkBt0DE;IACE,kBAAA;IACA,cAAA;IACA,aAAA;IACA,qBfgLkC;Ie/KlC,cAAA;ElBw0DJ;EkBr0DE;IACE,mBAAA;IACA,uBAAA;ElBu0DJ;EkBr0DE;IACE,gBAAA;ElBu0DJ;AACF;;AsBzpEA;EACE,qBAAA;EAEA,gBnBuR4B;EmBtR5B,cnBMS;EmBLT,kBAAA;EAGA,sBAAA;EACA,iBAAA;EACA,6BAAA;EACA,6BAAA;ECuFA,yBAAA;EnB4EI,eAAA;EmB1EJ,gBpB2L4B;EOnR1B,sBAAA;ESFE,qIGGJ;AtB4pEF;AmB3pEM;EGdN;IHeQ,gBAAA;EnB8pEN;AACF;AKxqEE;EiBUE,cnBNO;EmBOP,qBAAA;AtBiqEJ;AsB9pEE;EAEE,UAAA;EACA,gDnB8W0B;AHizD9B;AsB3pEE;EAEE,anBkZ0B;AH0wD9B;AsBxpEE;EACE,eAAA;AtB0pEJ;AsB5oEA;;EAEE,oBAAA;AtB8oEF;;AsBroEE;EC3DA,WAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AHgoEf;AKhsEE;EkBAE,WAAA;EFNA,yBED2D;EAS3D,qBATqG;AvB4sEzG;AuBhsEE;EAEE,WAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,gDAAA;AvB6rEN;AuBxrEE;EAEE,WAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AHgpEf;AuBlrEE;EAGE,WAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvB4tE7L;AuB7qEI;EAKI,gDAAA;AvB2qER;;AsBnqEE;EC3DA,WAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AH8pEf;AK9tEE;EkBAE,WAAA;EFNA,yBED2D;EAS3D,qBATqG;AvB0uEzG;AuB9tEE;EAEE,WAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,iDAAA;AvB2tEN;AuBttEE;EAEE,WAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AH8qEf;AuBhtEE;EAGE,WAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvB0vE7L;AuB3sEI;EAKI,iDAAA;AvBysER;;AsBjsEE;EC3DA,WAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AH4rEf;AK5vEE;EkBAE,WAAA;EFNA,yBED2D;EAS3D,qBATqG;AvBwwEzG;AuB5vEE;EAEE,WAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,+CAAA;AvByvEN;AuBpvEE;EAEE,WAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AH4sEf;AuB9uEE;EAGE,WAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvBwxE7L;AuBzuEI;EAKI,+CAAA;AvBuuER;;AsB/tEE;EC3DA,WAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AH0tEf;AK1xEE;EkBAE,WAAA;EFNA,yBED2D;EAS3D,qBATqG;AvBsyEzG;AuB1xEE;EAEE,WAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,gDAAA;AvBuxEN;AuBlxEE;EAEE,WAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AH0uEf;AuB5wEE;EAGE,WAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvBszE7L;AuBvwEI;EAKI,gDAAA;AvBqwER;;AsB7vEE;EC3DA,cAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AHwvEf;AKxzEE;EkBAE,cAAA;EFNA,yBED2D;EAS3D,qBATqG;AvBo0EzG;AuBxzEE;EAEE,cAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,gDAAA;AvBqzEN;AuBhzEE;EAEE,cAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AHwwEf;AuB1yEE;EAGE,cAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvBo1E7L;AuBryEI;EAKI,gDAAA;AvBmyER;;AsB3xEE;EC3DA,WAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AHsxEf;AKt1EE;EkBAE,WAAA;EFNA,yBED2D;EAS3D,qBATqG;AvBk2EzG;AuBt1EE;EAEE,WAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,+CAAA;AvBm1EN;AuB90EE;EAEE,WAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AHsyEf;AuBx0EE;EAGE,WAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvBk3E7L;AuBn0EI;EAKI,+CAAA;AvBi0ER;;AsBzzEE;EC3DA,cAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AHozEf;AKp3EE;EkBAE,cAAA;EFNA,yBED2D;EAS3D,qBATqG;AvBg4EzG;AuBp3EE;EAEE,cAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,iDAAA;AvBi3EN;AuB52EE;EAEE,cAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AHo0Ef;AuBt2EE;EAGE,cAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvBg5E7L;AuBj2EI;EAKI,iDAAA;AvB+1ER;;AsBv1EE;EC3DA,WAAA;EFAE,yBlBsEW;EoBpEb,qBpBoEa;AHk1Ef;AKl5EE;EkBAE,WAAA;EFNA,yBED2D;EAS3D,qBATqG;AvB85EzG;AuBl5EE;EAEE,WAAA;EFbA,yBED2D;EAgB3D,qBAhBqG;EAqBnG,8CAAA;AvB+4EN;AuB14EE;EAEE,WAAA;EACA,yBpB0CW;EoBzCX,qBpByCW;AHk2Ef;AuBp4EE;EAGE,WAAA;EACA,yBAzC+I;EA6C/I,qBA7CyL;AvB86E7L;AuB/3EI;EAKI,8CAAA;AvB63ER;;AsB/2EE;ECPA,cpBYa;EoBXb,qBpBWa;AH+2Ef;AK/6EE;EkBwDE,WALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AHo3Ef;AuBv3EE;EAEE,+CAAA;AvBw3EJ;AuBr3EE;EAEE,cpBJW;EoBKX,6BAAA;AvBs3EJ;AuBn3EE;EAGE,WAAA;EACA,yBpBZW;EoBaX,qBpBbW;AHg4Ef;AuBj3EI;EAKI,+CAAA;AvB+2ER;;AsBx4EE;ECPA,cpBYa;EoBXb,qBpBWa;AHw4Ef;AKx8EE;EkBwDE,WALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AH64Ef;AuBh5EE;EAEE,iDAAA;AvBi5EJ;AuB94EE;EAEE,cpBJW;EoBKX,6BAAA;AvB+4EJ;AuB54EE;EAGE,WAAA;EACA,yBpBZW;EoBaX,qBpBbW;AHy5Ef;AuB14EI;EAKI,iDAAA;AvBw4ER;;AsBj6EE;ECPA,cpBYa;EoBXb,qBpBWa;AHi6Ef;AKj+EE;EkBwDE,WALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AHs6Ef;AuBz6EE;EAEE,+CAAA;AvB06EJ;AuBv6EE;EAEE,cpBJW;EoBKX,6BAAA;AvBw6EJ;AuBr6EE;EAGE,WAAA;EACA,yBpBZW;EoBaX,qBpBbW;AHk7Ef;AuBn6EI;EAKI,+CAAA;AvBi6ER;;AsB17EE;ECPA,cpBYa;EoBXb,qBpBWa;AH07Ef;AK1/EE;EkBwDE,WALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AH+7Ef;AuBl8EE;EAEE,gDAAA;AvBm8EJ;AuBh8EE;EAEE,cpBJW;EoBKX,6BAAA;AvBi8EJ;AuB97EE;EAGE,WAAA;EACA,yBpBZW;EoBaX,qBpBbW;AH28Ef;AuB57EI;EAKI,gDAAA;AvB07ER;;AsBn9EE;ECPA,cpBYa;EoBXb,qBpBWa;AHm9Ef;AKnhFE;EkBwDE,cALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AHw9Ef;AuB39EE;EAEE,+CAAA;AvB49EJ;AuBz9EE;EAEE,cpBJW;EoBKX,6BAAA;AvB09EJ;AuBv9EE;EAGE,cAAA;EACA,yBpBZW;EoBaX,qBpBbW;AHo+Ef;AuBr9EI;EAKI,+CAAA;AvBm9ER;;AsB5+EE;ECPA,cpBYa;EoBXb,qBpBWa;AH4+Ef;AK5iFE;EkBwDE,WALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AHi/Ef;AuBp/EE;EAEE,+CAAA;AvBq/EJ;AuBl/EE;EAEE,cpBJW;EoBKX,6BAAA;AvBm/EJ;AuBh/EE;EAGE,WAAA;EACA,yBpBZW;EoBaX,qBpBbW;AH6/Ef;AuB9+EI;EAKI,+CAAA;AvB4+ER;;AsBrgFE;ECPA,cpBYa;EoBXb,qBpBWa;AHqgFf;AKrkFE;EkBwDE,cALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AH0gFf;AuB7gFE;EAEE,iDAAA;AvB8gFJ;AuB3gFE;EAEE,cpBJW;EoBKX,6BAAA;AvB4gFJ;AuBzgFE;EAGE,cAAA;EACA,yBpBZW;EoBaX,qBpBbW;AHshFf;AuBvgFI;EAKI,iDAAA;AvBqgFR;;AsB9hFE;ECPA,cpBYa;EoBXb,qBpBWa;AH8hFf;AK9lFE;EkBwDE,WALgD;EAMhD,yBpBOW;EoBNX,qBpBMW;AHmiFf;AuBtiFE;EAEE,8CAAA;AvBuiFJ;AuBpiFE;EAEE,cpBJW;EoBKX,6BAAA;AvBqiFJ;AuBliFE;EAGE,WAAA;EACA,yBpBZW;EoBaX,qBpBbW;AH+iFf;AuBhiFI;EAKI,8CAAA;AvB8hFR;;AsB5iFA;EACE,gBnB6M4B;EmB5M5B,cnB2FwC;EmB1FxC,qBnB2FwC;AHo9E1C;AKxnFE;EiB4EE,cnByFsC;EmBxFtC,0BnByFsC;AHs9E1C;AsB5iFE;EAEE,0BnBoFsC;AHy9E1C;AsB1iFE;EAEE,cnBtFO;EmBuFP,oBAAA;AtB2iFJ;;AsBhiFA;ECPE,oBAAA;EnB4EI,kBAAA;EmB1EJ,gBpB+H4B;EOvN1B,qBAAA;AVooFJ;;AsBniFA;ECXE,uBAAA;EnB4EI,mBAAA;EmB1EJ,gBpBgI4B;EOxN1B,qBAAA;AV2oFJ;;AsBjiFA;EACE,cAAA;EACA,WAAA;AtBoiFF;AsBjiFE;EACE,kBnBwT0B;AH2uE9B;;AsB3hFE;;;EACE,WAAA;AtBgiFJ;;AwB3qFA;ELgBM,gCKfJ;AxB8qFF;AmB3pFM;EKpBN;ILqBQ,gBAAA;EnB8pFN;AACF;AwBjrFE;EACE,UAAA;AxBmrFJ;;AwB9qFE;EACE,aAAA;AxBirFJ;;AwB7qFA;EACE,kBAAA;EACA,SAAA;EACA,gBAAA;ELDI,6BKEJ;AxBgrFF;AmB9qFM;EKNN;ILOQ,gBAAA;EnBirFN;AACF;AwBnrFE;EACE,QAAA;EACA,YAAA;ELNE,4BKOF;AxBqrFJ;AmBxrFM;EKAJ;ILCM,gBAAA;EnB2rFN;AACF;;AyBhtFA;;;;EAIE,kBAAA;AzBmtFF;;AyBhtFA;EACE,mBAAA;AzBmtFF;A0B/rFI;EACE,qBAAA;EACA,oBvB+NwB;EuB9NxB,uBvB6NwB;EuB5NxB,WAAA;EAhCJ,uBAAA;EACA,qCAAA;EACA,gBAAA;EACA,oCAAA;A1BkuFF;A0B7qFI;EACE,cAAA;A1B+qFN;;AyBztFA;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,atBypBkC;EsBxpBlC,aAAA;EACA,WAAA;EACA,gBtBiuBkC;EsBhuBlC,iBAAA;EACA,oBAAA;ErB2JI,eAAA;EqBzJJ,ctBXS;EsBYT,gBAAA;EACA,gBAAA;EACA,sBtBvBS;EsBwBT,4BAAA;EACA,qCAAA;EfdE,sBAAA;AV2uFJ;;AyBptFI;EACE,WAAA;EACA,OAAA;AzButFN;;AyBptFI;EACE,QAAA;EACA,UAAA;AzButFN;;Ac3sFI;EWnBA;IACE,WAAA;IACA,OAAA;EzBkuFJ;EyB/tFE;IACE,QAAA;IACA,UAAA;EzBiuFJ;AACF;ActtFI;EWnBA;IACE,WAAA;IACA,OAAA;EzB4uFJ;EyBzuFE;IACE,QAAA;IACA,UAAA;EzB2uFJ;AACF;AchuFI;EWnBA;IACE,WAAA;IACA,OAAA;EzBsvFJ;EyBnvFE;IACE,QAAA;IACA,UAAA;EzBqvFJ;AACF;Ac1uFI;EWnBA;IACE,WAAA;IACA,OAAA;EzBgwFJ;EyB7vFE;IACE,QAAA;IACA,UAAA;EzB+vFJ;AACF;AyBxvFE;EACE,SAAA;EACA,YAAA;EACA,aAAA;EACA,uBtB+rBgC;AH2jEpC;A0BzxFI;EACE,qBAAA;EACA,oBvB+NwB;EuB9NxB,uBvB6NwB;EuB5NxB,WAAA;EAzBJ,aAAA;EACA,qCAAA;EACA,0BAAA;EACA,oCAAA;A1BqzFF;A0BvwFI;EACE,cAAA;A1BywFN;;AyB9vFE;EACE,MAAA;EACA,WAAA;EACA,UAAA;EACA,aAAA;EACA,qBtBirBgC;AHglEpC;A0B9yFI;EACE,qBAAA;EACA,oBvB+NwB;EuB9NxB,uBvB6NwB;EuB5NxB,WAAA;EAlBJ,mCAAA;EACA,eAAA;EACA,sCAAA;EACA,wBAAA;A1Bm0FF;A0B5xFI;EACE,cAAA;A1B8xFN;AyBzwFI;EACE,iBAAA;AzB2wFN;;AyBrwFE;EACE,MAAA;EACA,WAAA;EACA,UAAA;EACA,aAAA;EACA,sBtBgqBgC;AHwmEpC;A0Bt0FI;EACE,qBAAA;EACA,oBvB+NwB;EuB9NxB,uBvB6NwB;EuB5NxB,WAAA;A1Bw0FN;A0B7zFM;EACE,aAAA;A1B+zFR;A0B5zFM;EACE,qBAAA;EACA,qBvB4MsB;EuB3MtB,uBvB0MsB;EuBzMtB,WAAA;EA9BN,mCAAA;EACA,yBAAA;EACA,sCAAA;A1B61FF;A0B5zFI;EACE,cAAA;A1B8zFN;AyBxxFI;EACE,iBAAA;AzB0xFN;;AyBlxFE;EAIE,WAAA;EACA,YAAA;AzBkxFJ;;AyB7wFA;EE9GE,SAAA;EACA,gBAAA;EACA,gBAAA;EACA,6BAAA;A3B+3FF;;AyB7wFA;EACE,cAAA;EACA,WAAA;EACA,uBAAA;EACA,WAAA;EACA,gBtBiK4B;EsBhK5B,ctBhHS;EsBiHT,mBAAA;EAEA,mBAAA;EACA,6BAAA;EACA,SAAA;AzB+wFF;AKp4FE;EoBoIE,ctBonBgC;EsBnnBhC,qBAAA;EJ/IA,yBlBGO;AHg5FX;AyBhwFE;EAEE,WtBpJO;EsBqJP,qBAAA;EJtJA,yBlBoP0B;AHoqF9B;AyB9vFE;EAEE,ctBtJO;EsBuJP,oBAAA;EACA,6BAAA;AzB+vFJ;;AyBvvFA;EACE,cAAA;AzB0vFF;;AyBtvFA;EACE,cAAA;EACA,sBtBimBkC;EsBhmBlC,gBAAA;ErBAI,mBAAA;EqBEJ,ctBzKS;EsB0KT,mBAAA;AzByvFF;;AyBrvFA;EACE,cAAA;EACA,uBAAA;EACA,ctB9KS;AHs6FX;;A4Bn7FA;;EAEE,kBAAA;EACA,oBAAA;EACA,sBAAA;A5Bs7FF;A4Bp7FE;;EACE,kBAAA;EACA,cAAA;A5Bu7FJ;AKt7FE;;EuBII,UAAA;A5Bs7FN;A4Bp7FI;;;;EAGE,UAAA;A5Bu7FN;;A4Bj7FA;EACE,aAAA;EACA,eAAA;EACA,2BAAA;A5Bo7FF;A4Bl7FE;EACE,WAAA;A5Bo7FJ;;A4B96FE;;EAEE,iBAAA;A5Bi7FJ;A4B76FE;;ElBXE,0BAAA;EACA,6BAAA;AV47FJ;A4B76FE;;ElBFE,yBAAA;EACA,4BAAA;AVm7FJ;;A4Bh6FA;EACE,wBAAA;EACA,uBAAA;A5Bm6FF;A4Bj6FE;EAGE,cAAA;A5Bi6FJ;A4B95FE;EACE,eAAA;A5Bg6FJ;;A4B55FA;EACE,uBAAA;EACA,sBAAA;A5B+5FF;;A4B55FA;EACE,sBAAA;EACA,qBAAA;A5B+5FF;;A4B34FA;EACE,sBAAA;EACA,uBAAA;EACA,uBAAA;A5B84FF;A4B54FE;;EAEE,WAAA;A5B84FJ;A4B34FE;;EAEE,gBAAA;A5B64FJ;A4Bz4FE;;ElBrFE,6BAAA;EACA,4BAAA;AVk+FJ;A4Bz4FE;;ElBxGE,yBAAA;EACA,0BAAA;AVq/FJ;;A4B13FE;;EAEE,gBAAA;A5B63FJ;A4B33FI;;;;EAEE,kBAAA;EACA,sBAAA;EACA,oBAAA;A5B+3FN;;A6BxhGA;EACE,kBAAA;EACA,aAAA;EACA,eAAA;EACA,oBAAA;EACA,WAAA;A7B2hGF;A6BzhGE;;;;EAIE,kBAAA;EACA,cAAA;EACA,SAAA;EACA,YAAA;EACA,gBAAA;A7B2hGJ;A6BzhGI;;;;;;;;;;;;EAGE,iBAAA;A7BoiGN;A6B/hGE;;;EAGE,UAAA;A7BiiGJ;A6B7hGE;EACE,UAAA;A7B+hGJ;A6B1hGI;;EnBIA,yBAAA;EACA,4BAAA;AV0hGJ;A6B1hGE;EACE,aAAA;EACA,mBAAA;A7B4hGJ;A6B1hGI;EnBnBA,0BAAA;EACA,6BAAA;AVgjGJ;A6B5hGI;EnBPA,yBAAA;EACA,4BAAA;AVsiGJ;A6B5hGI;;;;EnBzBA,0BAAA;EACA,6BAAA;AV2jGJ;A6B1hGI;;;;EnBlCA,0BAAA;EACA,6BAAA;AVkkGJ;;A6BjhGA;;EAEE,aAAA;A7BohGF;A6B/gGE;;EACE,kBAAA;EACA,UAAA;A7BkhGJ;A6BhhGI;;EACE,UAAA;A7BmhGN;A6B/gGE;;;;;;;;EAIE,iBAAA;A7BqhGJ;;A6BjhGA;EAAuB,kBAAA;A7BqhGvB;;A6BphGA;EAAsB,iBAAA;A7BwhGtB;;A6BhhGA;EACE,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,gBAAA;EzB2DI,eAAA;EyBzDJ,gB1BqK4B;E0BpK5B,gB1ByK4B;E0BxK5B,c1B/GS;E0BgHT,kBAAA;EACA,mBAAA;EACA,yB1BvHS;E0BwHT,yBAAA;EnB/GE,sBAAA;AVmoGJ;A6BhhGE;;EAEE,aAAA;A7BkhGJ;;A6BxgGA;;EAEE,gC1BmWsC;AHwqFxC;;A6BxgGA;;;;;;EAME,oBAAA;EzBwBI,kBAAA;EyBtBJ,gB1B2E4B;EOvN1B,qBAAA;AVwpGJ;;A6BxgGA;;EAEE,kC1BiVsC;AH0rFxC;;A6BxgGA;;;;;;EAME,uBAAA;EzBOI,mBAAA;EyBLJ,gB1B2D4B;EOxN1B,qBAAA;AVyqGJ;;A6BxgGA;;EAEE,sBAAA;A7B2gGF;;A6BhgGA;;;;;;;;EnB9JI,0BAAA;EACA,6BAAA;AVyqGJ;;A6BjgGA;;;;;;EnB3JI,yBAAA;EACA,4BAAA;AVqqGJ;;A8B7sGA;EACE,kBAAA;EACA,UAAA;EACA,cAAA;EACA,kBAAA;EACA,oBAAA;EACA,yBAAA;A9BgtGF;;A8B7sGA;EACE,oBAAA;EACA,kB3ByfsC;AHutFxC;;A8B7sGA;EACE,kBAAA;EACA,OAAA;EACA,WAAA;EACA,W3BqfsC;E2BpftC,eAAA;EACA,UAAA;A9BgtGF;A8B9sGE;EACE,W3BzBO;E2B0BP,qB3ByN0B;EkBpP1B,yBlBoP0B;AHw/F9B;A8B5sGE;EAKI,gD3BgWwB;AH02F9B;A8BtsGE;EACE,qB3BsboC;AHkxFxC;A8BrsGE;EACE,W3B7CO;E2B8CP,yB3Bkf4C;E2Bjf5C,qB3Bif4C;AHstFhD;A8BhsGI;EACE,c3BjDK;AHmvGX;A8BhsGM;EACE,yB3BxDG;AH0vGX;;A8BxrGA;EACE,kBAAA;EACA,gBAAA;EAEA,mBAAA;A9B0rGF;A8BtrGE;EACE,kBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,W3BwboC;E2BvbpC,Y3BuboC;E2BtbpC,oBAAA;EACA,WAAA;EACA,sB3BrFO;E2BsFP,yBAAA;A9BwrGJ;A8BnrGE;EACE,kBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,W3ByaoC;E2BxapC,Y3BwaoC;E2BvapC,WAAA;EACA,iCAAA;A9BqrGJ;;A8B3qGE;EpBlGE,sBAAA;AVixGJ;A8B1qGI;EACE,yDAAA;A9B4qGN;A8BvqGI;EACE,qB3B0HwB;EkBpP1B,yBlBoP0B;AHgjG9B;A8BtqGI;EACE,yDAAA;A9BwqGN;A8BnqGI;ETpIA,wClByhB4C;AHixFhD;A8BnqGI;ETvIA,wClByhB4C;AHoxFhD;;A8B3pGE;EAEE,kB3B0Z4C;AHmwFhD;A8BzpGI;EACE,yDAAA;A9B2pGN;A8BtpGI;ET9JA,wClByhB4C;AH8xFhD;;A8B9oGA;EACE,qBAAA;A9BipGF;A8B9oGI;EACE,cAAA;EACA,c3BkY0C;E2BjY1C,mBAAA;EAEA,qB3BgY0C;AH+wFhD;A8B5oGI;EACE,wBAAA;EACA,0BAAA;EACA,uB3B2X0C;E2B1X1C,wB3B0X0C;E2BzX1C,yB3BpLK;E2BsLL,qB3BsX0C;EgBxiB1C,yIWmLA;A9B6oGN;AmB5zGM;EWuKF;IXtKI,gBAAA;EnB+zGN;AACF;A8B7oGI;EACE,sB3BlMK;E2BmML,8BAAA;A9B+oGN;A8B1oGI;ETzMA,wClByhB4C;AH6zFhD;;A8BhoGA;EACE,qBAAA;EACA,WAAA;EACA,mC3BqRsC;E2BpRtC,0CAAA;E1B5CI,eAAA;E0B+CJ,gB3B6D4B;E2B5D5B,gB3BiE4B;E2BhE5B,c3BvNS;E2BwNT,sBAAA;EACA,gGAAA;EACA,yBAAA;EpBtNE,sBAAA;EoByNF,gBAAA;A9BioGF;A8B/nGE;EACE,qB3BwPoC;E2BvPpC,UAAA;EAKE,gD3BmW8B;AH0xFpC;A8B1nGI;EAME,c3B/OK;E2BgPL,sB3BvPK;AH82GX;A8BnnGE;EAEE,YAAA;EACA,sB3B+H0B;E2B9H1B,sBAAA;A9BonGJ;A8BjnGE;EACE,c3B7PO;E2B8PP,yB3BlQO;AHq3GX;A8B/mGE;EACE,aAAA;A9BinGJ;A8B7mGE;EACE,kBAAA;EACA,0BAAA;A9B+mGJ;;A8B3mGA;EACE,kC3B0NsC;E2BzNtC,oB3BiH4B;E2BhH5B,uB3BgH4B;E2B/G5B,oB3BgH4B;EC1NxB,mBAAA;AJytGN;;A8B3mGA;EACE,gC3BmNsC;E2BlNtC,mB3B8G4B;E2B7G5B,sB3B6G4B;E2B5G5B,kB3B6G4B;EC/NxB,kBAAA;AJiuGN;;A8BtmGA;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,mC3BiMsC;E2BhMtC,gBAAA;A9BymGF;;A8BtmGA;EACE,kBAAA;EACA,UAAA;EACA,WAAA;EACA,mC3ByLsC;E2BxLtC,SAAA;EACA,gBAAA;EACA,UAAA;A9BymGF;A8BvmGE;EACE,qB3BqKoC;E2BpKpC,gD3ByE0B;AHgiG9B;A8BrmGE;EAEE,yB3B/TO;AHq6GX;A8BlmGI;EACE,iB3B2Ta;AHyyFnB;A8BhmGE;EACE,0BAAA;A9BkmGJ;;A8B9lGA;EACE,kBAAA;EACA,MAAA;EACA,QAAA;EACA,OAAA;EACA,UAAA;EACA,mC3BwJsC;E2BvJtC,yBAAA;EACA,gBAAA;EAEA,gB3BhE4B;E2BiE5B,gB3B5D4B;E2B6D5B,c3BpVS;E2BqVT,sB3B5VS;E2B6VT,yBAAA;EpBlVE,sBAAA;AVm7GJ;A8B7lGE;EACE,kBAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,cAAA;EACA,6B3BiIoC;E2BhIpC,yBAAA;EACA,gB3B5E0B;E2B6E1B,c3BpWO;E2BqWP,iBAAA;ET7WA,yBlBGO;E2B4WP,oBAAA;EpBnWA,kCAAA;AVm8GJ;;A8BrlGA;EACE,WAAA;EACA,cAAA;EACA,UAAA;EACA,6BAAA;EACA,gBAAA;A9BwlGF;A8BtlGE;EACE,UAAA;A9BwlGJ;A8BplGI;EAA0B,gE3BoOe;AHm3F7C;A8BtlGI;EAA0B,gE3BmOe;AHs3F7C;A8BxlGI;EAA0B,gE3BkOe;AHy3F7C;A8BxlGE;EACE,SAAA;A9B0lGJ;A8BvlGE;EACE,W3BoNyC;E2BnNzC,Y3BmNyC;E2BlNzC,oBAAA;ETlZA,yBlBoP0B;E2BgK1B,S3BmNyC;EO3lBzC,mBAAA;ESFE,4GW6YF;EACA,gBAAA;A9BwlGJ;AmBl+GM;EWiYJ;IXhYM,gBAAA;EnBq+GN;AACF;A8B3lGI;ET1ZA,yBlB4mByC;AH44F7C;A8BzlGE;EACE,W3B6LgC;E2B5LhC,c3B6LgC;E2B5LhC,kBAAA;EACA,e3B4LgC;E2B3LhC,yB3BhaO;E2BiaP,yBAAA;EpBzZA,mBAAA;AVq/GJ;A8BvlGE;EACE,W3ByLyC;E2BxLzC,Y3BwLyC;EkBpmBzC,yBlBoP0B;E2B0L1B,S3ByLyC;EO3lBzC,mBAAA;ESFE,4GWuaF;EACA,gBAAA;A9BwlGJ;AmB5/GM;EW4ZJ;IX3ZM,gBAAA;EnB+/GN;AACF;A8B3lGI;ETpbA,yBlB4mByC;AHs6F7C;A8BzlGE;EACE,W3BmKgC;E2BlKhC,c3BmKgC;E2BlKhC,kBAAA;EACA,e3BkKgC;E2BjKhC,yB3B1bO;E2B2bP,yBAAA;EpBnbA,mBAAA;AV+gHJ;A8BvlGE;EACE,W3B+JyC;E2B9JzC,Y3B8JyC;E2B7JzC,aAAA;EACA,oB3BrE0B;E2BsE1B,mB3BtE0B;EkBnY1B,yBlBoP0B;E2BuN1B,S3B4JyC;EO3lBzC,mBAAA;ESFE,4GWocF;EACA,gBAAA;A9BwlGJ;AmBzhHM;EWsbJ;IXrbM,gBAAA;EnB4hHN;AACF;A8B3lGI;ETjdA,yBlB4mByC;AHm8F7C;A8BzlGE;EACE,W3BsIgC;E2BrIhC,c3BsIgC;E2BrIhC,kBAAA;EACA,e3BqIgC;E2BpIhC,6BAAA;EACA,yBAAA;EACA,oBAAA;A9B2lGJ;A8BvlGE;EACE,yB3B9dO;EOQP,mBAAA;AVgjHJ;A8BtlGE;EACE,kBAAA;EACA,yB3BpeO;EOQP,mBAAA;AVqjHJ;A8BplGI;EACE,yB3BxeK;AH8jHX;A8BnlGI;EACE,eAAA;A9BqlGN;A8BllGI;EACE,yB3BhfK;AHokHX;A8BjlGI;EACE,eAAA;A9BmlGN;A8BhlGI;EACE,yB3BxfK;AH0kHX;;A8B7kGA;;;EXzfM,4GW4fJ;A9BglGF;AmBxkHM;EWqfN;;;IXpfQ,gBAAA;EnB6kHN;AACF;;A+B9lHA;EACE,aAAA;EACA,eAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;A/BimHF;;A+B9lHA;EACE,cAAA;EACA,oBAAA;A/BimHF;AKhmHE;E0BGE,qBAAA;A/BgmHJ;A+B5lHE;EACE,c5BXO;E4BYP,oBAAA;EACA,eAAA;A/B8lHJ;;A+BtlHA;EACE,gCAAA;A/BylHF;A+BvlHE;EACE,mBAAA;EACA,6BAAA;EACA,6BAAA;ErBbA,+BAAA;EACA,gCAAA;AVumHJ;AKnnHE;E0B6BI,kBAAA;EACA,qC5BipB8B;AHw8FpC;A+BtlHI;EACE,c5BrCK;E4BsCL,6BAAA;EACA,yBAAA;A/BwlHN;A+BplHE;;EAEE,c5B5CO;E4B6CP,sB5BpDO;E4BqDP,kC5BsoBgC;AHg9FpC;A+BnlHE;EAEE,gBAAA;ErBtCA,yBAAA;EACA,0BAAA;AV2nHJ;;A+B1kHE;EACE,gBAAA;EACA,SAAA;ErB7DA,sBAAA;AV2oHJ;A+B1kHE;;EAEE,W5B9EO;E4B+EP,yB5BoK0B;AHw6G9B;;A+BlkHE;;EAEE,cAAA;EACA,kBAAA;A/BqkHJ;;A+BhkHE;;EAEE,aAAA;EACA,YAAA;EACA,kBAAA;A/BmkHJ;;A+BzjHE;EACE,aAAA;A/B4jHJ;A+B1jHE;EACE,cAAA;A/B4jHJ;;AgCrqHA;EACE,kBAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;EACA,8BAAA;EACA,oBAAA;AhCwqHF;AgCpqHE;;;;;;EACE,aAAA;EACA,eAAA;EACA,mBAAA;EACA,8BAAA;AhC2qHJ;AgCvpHA;EACE,qBAAA;EACA,sB7BkqBkC;E6BjqBlC,yB7BiqBkC;E6BhqBlC,kB7BgFO;EC6CH,kBAAA;E4B3HJ,oBAAA;EACA,mBAAA;AhCypHF;AKnsHE;E2B6CE,qBAAA;AhCypHJ;;AgChpHA;EACE,aAAA;EACA,sBAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;AhCmpHF;AgCjpHE;EACE,gBAAA;EACA,eAAA;AhCmpHJ;AgChpHE;EACE,gBAAA;EACA,WAAA;AhCkpHJ;;AgCzoHA;EACE,qBAAA;EACA,mB7BylBkC;E6BxlBlC,sB7BwlBkC;AHojGpC;;AgChoHA;EACE,gBAAA;EACA,YAAA;EAGA,mBAAA;AhCioHF;;AgC7nHA;EACE,wBAAA;E5B8DI,kBAAA;E4B5DJ,cAAA;EACA,6BAAA;EACA,6BAAA;EtBxGE,sBAAA;AVyuHJ;AK3uHE;E2B8GE,qBAAA;AhCgoHJ;;AgC1nHA;EACE,qBAAA;EACA,YAAA;EACA,aAAA;EACA,sBAAA;EACA,WAAA;EACA,mCAAA;AhC6nHF;;AgC1nHA;EACE,gB7BglBkC;E6B/kBlC,gBAAA;AhC6nHF;;AcnsHI;EkBkFI;;;;;;IACE,gBAAA;IACA,eAAA;EhC0nHR;AACF;Ac5tHI;EkB6FA;IAoBI,qBAAA;IACA,2BAAA;EhC+mHN;EgC7mHM;IACE,mBAAA;EhC+mHR;EgC7mHQ;IACE,kBAAA;EhC+mHV;EgC5mHQ;IACE,qB7ByhBwB;I6BxhBxB,oB7BwhBwB;EHslGlC;EgCzmHM;;;;;;IACE,iBAAA;EhCgnHR;EgClmHM;IACE,iBAAA;EhComHR;EgCjmHM;IACE,wBAAA;IAGA,gBAAA;EhCimHR;EgC9lHM;IACE,aAAA;EhCgmHR;AACF;AcjvHI;EkBkFI;;;;;;IACE,gBAAA;IACA,eAAA;EhCuqHR;AACF;AczwHI;EkB6FA;IAoBI,qBAAA;IACA,2BAAA;EhC4pHN;EgC1pHM;IACE,mBAAA;EhC4pHR;EgC1pHQ;IACE,kBAAA;EhC4pHV;EgCzpHQ;IACE,qB7ByhBwB;I6BxhBxB,oB7BwhBwB;EHmoGlC;EgCtpHM;;;;;;IACE,iBAAA;EhC6pHR;EgC/oHM;IACE,iBAAA;EhCipHR;EgC9oHM;IACE,wBAAA;IAGA,gBAAA;EhC8oHR;EgC3oHM;IACE,aAAA;EhC6oHR;AACF;Ac9xHI;EkBkFI;;;;;;IACE,gBAAA;IACA,eAAA;EhCotHR;AACF;ActzHI;EkB6FA;IAoBI,qBAAA;IACA,2BAAA;EhCysHN;EgCvsHM;IACE,mBAAA;EhCysHR;EgCvsHQ;IACE,kBAAA;EhCysHV;EgCtsHQ;IACE,qB7ByhBwB;I6BxhBxB,oB7BwhBwB;EHgrGlC;EgCnsHM;;;;;;IACE,iBAAA;EhC0sHR;EgC5rHM;IACE,iBAAA;EhC8rHR;EgC3rHM;IACE,wBAAA;IAGA,gBAAA;EhC2rHR;EgCxrHM;IACE,aAAA;EhC0rHR;AACF;Ac30HI;EkBkFI;;;;;;IACE,gBAAA;IACA,eAAA;EhCiwHR;AACF;Acn2HI;EkB6FA;IAoBI,qBAAA;IACA,2BAAA;EhCsvHN;EgCpvHM;IACE,mBAAA;EhCsvHR;EgCpvHQ;IACE,kBAAA;EhCsvHV;EgCnvHQ;IACE,qB7ByhBwB;I6BxhBxB,oB7BwhBwB;EH6tGlC;EgChvHM;;;;;;IACE,iBAAA;EhCuvHR;EgCzuHM;IACE,iBAAA;EhC2uHR;EgCxuHM;IACE,wBAAA;IAGA,gBAAA;EhCwuHR;EgCruHM;IACE,aAAA;EhCuuHR;AACF;AgCxyHI;EAoBI,qBAAA;EACA,2BAAA;AhCuxHR;AgC1yHQ;;;;;;EACE,gBAAA;EACA,eAAA;AhCizHV;AgC9xHQ;EACE,mBAAA;AhCgyHV;AgC9xHU;EACE,kBAAA;AhCgyHZ;AgC7xHU;EACE,qB7ByhBwB;E6BxhBxB,oB7BwhBwB;AHuwGpC;AgC1xHQ;;;;;;EACE,iBAAA;AhCiyHV;AgCnxHQ;EACE,iBAAA;AhCqxHV;AgClxHQ;EACE,wBAAA;EAGA,gBAAA;AhCkxHV;AgC/wHQ;EACE,aAAA;AhCixHV;;AgCnwHE;EACE,yB7BigBgC;AHqwGpC;AK99HE;E2B2NI,yB7B8f8B;AHwwGpC;AgCjwHI;EACE,yB7Bsf8B;AH6wGpC;AKp+HE;E2BoOM,yB7Bof4B;AH+wGpC;AgChwHM;EACE,yB7Bkf4B;AHgxGpC;AgC9vHI;;;;EAIE,yB7Bye8B;AHuxGpC;AgC5vHE;EACE,yB7BkegC;E6BjehC,gC7BsegC;AHwxGpC;AgC3vHE;EACE,yDAAA;AhC6vHJ;AgC1vHE;EACE,yB7BydgC;AHmyGpC;AgC3vHI;EACE,yB7Byd8B;AHoyGpC;AK7/HE;E2BmQM,yB7Bsd4B;AHuyGpC;;AgCrvHE;EACE,W7BrRO;AH6gIX;AKpgIE;E2B+QI,W7BxRK;AHghIX;AgCnvHI;EACE,+B7B2b8B;AH0zGpC;AK1gIE;E2BwRM,gC7Byb4B;AH4zGpC;AgClvHM;EACE,gC7Bub4B;AH6zGpC;AgChvHI;;;;EAIE,W7B7SK;AH+hIX;AgC9uHE;EACE,+B7BuagC;E6BtahC,sC7B2agC;AHq0GpC;AgC7uHE;EACE,yDAAA;AhC+uHJ;AgC5uHE;EACE,+B7B8ZgC;AHg1GpC;AgC7uHI;EACE,W7B7TK;AH4iIX;AKniIE;E2BuTM,W7BhUG;AH+iIX;;AiCljIA;EACE,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,YAAA;EAEA,qBAAA;EACA,sB9BJS;E8BKT,2BAAA;EACA,sCAAA;EvBKE,sBAAA;AVgjIJ;AiCljIE;EACE,eAAA;EACA,cAAA;AjCojIJ;AiCjjIE;EACE,mBAAA;EACA,sBAAA;AjCmjIJ;AiCjjII;EACE,mBAAA;EvBCF,2CAAA;EACA,4CAAA;AVmjIJ;AiCjjII;EACE,sBAAA;EvBUF,+CAAA;EACA,8CAAA;AV0iIJ;AiC9iIE;;EAEE,aAAA;AjCgjIJ;;AiC5iIA;EAGE,cAAA;EAGA,eAAA;EACA,gB9BgxBkC;AH2xGpC;;AiCviIA;EACE,sB9B0wBkC;AHgyGpC;;AiCviIA;EACE,qBAAA;EACA,gBAAA;AjC0iIF;;AiCviIA;EACE,gBAAA;AjC0iIF;;AK/lIE;E4B0DE,qBAAA;AjCyiIJ;AiCtiIE;EACE,oB9ByvBgC;AH+yGpC;;AiChiIA;EACE,wBAAA;EACA,gBAAA;EAEA,qC9BkvBkC;E8BjvBlC,6CAAA;AjCkiIF;AiChiIE;EvBvEE,0DAAA;AV0mIJ;;AiC9hIA;EACE,wBAAA;EAEA,qC9BuuBkC;E8BtuBlC,0CAAA;AjCgiIF;AiC9hIE;EvBlFE,0DAAA;AVmnIJ;;AiCvhIA;EACE,uBAAA;EACA,uBAAA;EACA,sBAAA;EACA,gBAAA;AjC0hIF;;AiCvhIA;EACE,uBAAA;EACA,sBAAA;AjC0hIF;;AiCthIA;EACE,kBAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,gB9B6sBkC;EO5zBhC,kCAAA;AVyoIJ;;AiCthIA;;;EAGE,cAAA;EACA,WAAA;AjCyhIF;;AiCthIA;;EvBjHI,2CAAA;EACA,4CAAA;AV4oIJ;;AiCvhIA;;EvBxGI,+CAAA;EACA,8CAAA;AVooIJ;;AiCphIE;EACE,mB9BqrBgC;AHk2GpC;ActnII;EmB6FJ;IAMI,aAAA;IACA,mBAAA;IACA,mBAAA;IACA,kBAAA;EjCuhIF;EiCrhIE;IAEE,YAAA;IACA,kB9ByqB8B;I8BxqB9B,gBAAA;IACA,iB9BuqB8B;EH+2GlC;AACF;;AiC1gIE;EACE,mB9BypBgC;AHo3GpC;AcxoII;EmBuHJ;IAQI,aAAA;IACA,mBAAA;EjC6gIF;EiC1gIE;IAEE,YAAA;IACA,gBAAA;EjC2gIJ;EiCzgII;IACE,cAAA;IACA,cAAA;EjC2gIN;EiCtgIM;IvBzKJ,0BAAA;IACA,6BAAA;EVkrIF;EiCvgIQ;;IAGE,0BAAA;EjCwgIV;EiCtgIQ;;IAGE,6BAAA;EjCugIV;EiCngIM;IvB1KJ,yBAAA;IACA,4BAAA;EVgrIF;EiCpgIQ;;IAGE,yBAAA;EjCqgIV;EiCngIQ;;IAGE,4BAAA;EjCogIV;AACF;;AiCv/HE;EACE,sB9B8kBgC;AH46GpC;AclrII;EmBsLJ;IAMI,e9B2lBgC;I8B1lBhC,mB9B2lBgC;I8B1lBhC,UAAA;IACA,SAAA;EjC0/HF;EiCx/HE;IACE,qBAAA;IACA,WAAA;EjC0/HJ;AACF;;AiCj/HA;EACE,qBAAA;AjCo/HF;AiCl/HE;EACE,gBAAA;AjCo/HJ;AiCl/HI;EACE,gBAAA;EvBvOF,6BAAA;EACA,4BAAA;AV4tIJ;AiCl/HI;EvBzPA,yBAAA;EACA,0BAAA;AV8uIJ;AiCl/HI;EvBtQA,gBAAA;EuBwQE,mBAAA;AjCo/HN;;AkC9wIA;EACE,aAAA;EACA,eAAA;EACA,qBAAA;EACA,mB/BqiCkC;E+BniClC,gBAAA;EACA,yB/BES;EOSP,sBAAA;AVswIJ;;AkC3wIE;EACE,oB/ByhCgC;AHqvGpC;AkC5wII;EACE,WAAA;EACA,qB/BqhC8B;E+BphC9B,c/BNK;E+BOL,YAAA;AlC8wIN;AkCpwIE;EACE,0BAAA;AlCswIJ;AkCnwIE;EACE,qBAAA;AlCqwIJ;AkClwIE;EACE,c/B1BO;AH8xIX;;AmC3yIA;EACE,aAAA;E5BGA,eAAA;EACA,gBAAA;EGaE,sBAAA;AVgyIJ;;AmC5yIA;EACE,kBAAA;EACA,cAAA;EACA,uBAAA;EACA,iBAAA;EACA,iBhCoxBkC;EgCnxBlC,chCmKwC;EgCjKxC,sBhCPS;EgCQT,yBAAA;AnC8yIF;AmC5yIE;EACE,UAAA;EACA,chC8JsC;EgC7JtC,qBAAA;EACA,yBhCZO;EgCaP,qBhCZO;AH0zIX;AmC3yIE;EACE,UAAA;EACA,UhC4wBgC;EgC3wBhC,gDhC+W0B;AH87H9B;;AmCvyII;EACE,cAAA;EzBaF,+BAAA;EACA,kCAAA;AV8xIJ;AmCvyII;EzBNA,gCAAA;EACA,mCAAA;AVgzIJ;AmCtyIE;EACE,UAAA;EACA,WhCxCO;EgCyCP,yBhC0M0B;EgCzM1B,qBhCyM0B;AH+lI9B;AmCryIE;EACE,chCxCO;EgCyCP,oBAAA;EAEA,YAAA;EACA,sBhClDO;EgCmDP,qBhChDO;AHs1IX;;AoC71IE;EACE,uBAAA;EhCgLE,kBAAA;EgC9KF,gBjCmO0B;AH6nI9B;AoC31IM;E1BqCF,8BAAA;EACA,iCAAA;AVyzIJ;AoC11IM;E1BkBF,+BAAA;EACA,kCAAA;AV20IJ;;AoC32IE;EACE,uBAAA;EhCgLE,mBAAA;EgC9KF,gBjCoO0B;AH0oI9B;AoCz2IM;E1BqCF,8BAAA;EACA,iCAAA;AVu0IJ;AoCx2IM;E1BkBF,+BAAA;EACA,kCAAA;AVy1IJ;;AqCv3IA;EACE,qBAAA;EACA,qBAAA;EjC6JE,cAAA;EiC3JF,gBlCwR4B;EkCvR5B,cAAA;EACA,kBAAA;EACA,mBAAA;EACA,wBAAA;E3BKE,sBAAA;ESFE,qIkBDJ;ArC03IF;AmBr3IM;EkBfN;IlBgBQ,gBAAA;EnBw3IN;AACF;AK93IE;EgCGI,qBAAA;ArC83IN;;AqCz3IE;EACE,aAAA;ArC43IJ;;AqCv3IA;EACE,kBAAA;EACA,SAAA;ArC03IF;;AqCn3IA;EACE,oBlCi4BkC;EkCh4BlC,mBlCg4BkC;EOv5BhC,oBAAA;AV84IJ;;AqC92IE;ECjDA,WAAA;EACA,yBnC0Ea;AHy1If;AKr5IE;EiCVI,WAAA;EACA,yBAAA;AtCk6IN;AsC/5II;EAEE,UAAA;EACA,+CAAA;AtCg6IN;;AqC33IE;ECjDA,WAAA;EACA,yBnC0Ea;AHs2If;AKl6IE;EiCVI,WAAA;EACA,yBAAA;AtC+6IN;AsC56II;EAEE,UAAA;EACA,iDAAA;AtC66IN;;AqCx4IE;ECjDA,WAAA;EACA,yBnC0Ea;AHm3If;AK/6IE;EiCVI,WAAA;EACA,yBAAA;AtC47IN;AsCz7II;EAEE,UAAA;EACA,+CAAA;AtC07IN;;AqCr5IE;ECjDA,WAAA;EACA,yBnC0Ea;AHg4If;AK57IE;EiCVI,WAAA;EACA,yBAAA;AtCy8IN;AsCt8II;EAEE,UAAA;EACA,gDAAA;AtCu8IN;;AqCl6IE;ECjDA,cAAA;EACA,yBnC0Ea;AH64If;AKz8IE;EiCVI,cAAA;EACA,yBAAA;AtCs9IN;AsCn9II;EAEE,UAAA;EACA,+CAAA;AtCo9IN;;AqC/6IE;ECjDA,WAAA;EACA,yBnC0Ea;AH05If;AKt9IE;EiCVI,WAAA;EACA,yBAAA;AtCm+IN;AsCh+II;EAEE,UAAA;EACA,+CAAA;AtCi+IN;;AqC57IE;ECjDA,cAAA;EACA,yBnC0Ea;AHu6If;AKn+IE;EiCVI,cAAA;EACA,yBAAA;AtCg/IN;AsC7+II;EAEE,UAAA;EACA,iDAAA;AtC8+IN;;AqCz8IE;ECjDA,WAAA;EACA,yBnC0Ea;AHo7If;AKh/IE;EiCVI,WAAA;EACA,yBAAA;AtC6/IN;AsC1/II;EAEE,UAAA;EACA,8CAAA;AtC2/IN;;AuCxgJA;EACE,kBAAA;EACA,mBpCyzBkC;EoCvzBlC,yBpCKS;EOSP,qBAAA;AV6/IJ;Acn9II;EyB5DJ;IAQI,kBAAA;EvC2gJF;AACF;;AuCxgJA;EACE,gBAAA;EACA,eAAA;E7BIE,gBAAA;AVwgJJ;;AwCthJA;EACE,kBAAA;EACA,wBAAA;EACA,mBrCy9BkC;EqCx9BlC,6BAAA;E9BUE,sBAAA;AVghJJ;;AwCrhJA;EAEE,cAAA;AxCuhJF;;AwCnhJA;EACE,gBrC6Q4B;AHywI9B;;AwC9gJA;EACE,mBAAA;AxCihJF;AwC9gJE;EACE,kBAAA;EACA,MAAA;EACA,QAAA;EACA,UAAA;EACA,wBAAA;EACA,cAAA;AxCghJJ;;AwCtgJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxC2gJvE;AyCvjJE;EACE,yBAAA;AzCyjJJ;AyCtjJE;EACE,cAAA;AzCwjJJ;;AwClhJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxCuhJvE;AyCnkJE;EACE,yBAAA;AzCqkJJ;AyClkJE;EACE,cAAA;AzCokJJ;;AwC9hJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxCmiJvE;AyC/kJE;EACE,yBAAA;AzCilJJ;AyC9kJE;EACE,cAAA;AzCglJJ;;AwC1iJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxC+iJvE;AyC3lJE;EACE,yBAAA;AzC6lJJ;AyC1lJE;EACE,cAAA;AzC4lJJ;;AwCtjJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxC2jJvE;AyCvmJE;EACE,yBAAA;AzCymJJ;AyCtmJE;EACE,cAAA;AzCwmJJ;;AwClkJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxCukJvE;AyCnnJE;EACE,yBAAA;AzCqnJJ;AyClnJE;EACE,cAAA;AzConJJ;;AwC9kJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxCmlJvE;AyC/nJE;EACE,yBAAA;AzCioJJ;AyC9nJE;EACE,cAAA;AzCgoJJ;;AwC1lJE;EC/CA,cDgDqH;EnB3CnH,yBmB2CuB;EC9CzB,qBD8CqE;AxC+lJvE;AyC3oJE;EACE,yBAAA;AzC6oJJ;AyC1oJE;EACE,cAAA;AzC4oJJ;;A0CppJE;EACE;IAAO,2BAAA;E1CwpJT;E0CvpJE;IAAK,wBAAA;E1C0pJP;AACF;A0CvpJA;EACE,aAAA;EACA,YvCk+BkC;EuCj+BlC,gBAAA;EACA,cAAA;EtCwKI,kBAAA;EsCtKJ,yBvCLS;EOSP,sBAAA;AVspJJ;;A0CrpJA;EACE,aAAA;EACA,sBAAA;EACA,uBAAA;EACA,gBAAA;EACA,WvCjBS;EuCkBT,kBAAA;EACA,mBAAA;EACA,yBvCu9BkC;EgBl+B9B,2BuBYJ;A1CwpJF;AmBhqJM;EuBDN;IvBEQ,gBAAA;EnBmqJN;AACF;;A0C1pJA;ErBYE,qMAAA;EqBVA,0BAAA;A1C6pJF;;A0CzpJE;EACE,kDAAA;A1C4pJJ;A0CzpJM;EAJJ;IAKM,eAAA;E1C4pJN;AACF;;A2CvsJA;EACE,aAAA;EACA,uBAAA;A3C0sJF;;A2CvsJA;EACE,OAAA;A3C0sJF;;A4C5sJA;EACE,aAAA;EACA,sBAAA;EAGA,eAAA;EACA,gBAAA;ElCQE,sBAAA;AVssJJ;;A4CpsJA;EACE,WAAA;EACA,czCRS;EyCST,mBAAA;A5CusJF;AK9sJE;EuCWE,UAAA;EACA,czCdO;EyCeP,qBAAA;EACA,yBzCtBO;AH4tJX;A4CnsJE;EACE,czClBO;EyCmBP,yBzC1BO;AH+tJX;;A4C5rJA;EACE,kBAAA;EACA,cAAA;EACA,wBAAA;EAGA,sBzC3CS;EyC4CT,sCAAA;A5C6rJF;A4C3rJE;ElC1BE,+BAAA;EACA,gCAAA;AVwtJJ;A4C3rJE;ElChBE,mCAAA;EACA,kCAAA;AV8sJJ;A4C3rJE;EAEE,czClDO;EyCmDP,oBAAA;EACA,sBzC1DO;AHsvJX;A4CxrJE;EACE,UAAA;EACA,WzChEO;EyCiEP,yBzCkL0B;EyCjL1B,qBzCiL0B;AHygJ9B;A4CvrJE;EACE,mBAAA;A5CyrJJ;A4CvrJI;EACE,gBAAA;EACA,qBzC2JwB;AH8hJ9B;;A4C3qJI;EACE,mBAAA;A5C8qJN;A4C3qJQ;ElC1BJ,kCAAA;EAZA,0BAAA;AVqtJJ;A4C1qJQ;ElC3CJ,gCAAA;EAYA,4BAAA;AV6sJJ;A4CzqJQ;EACE,aAAA;A5C2qJV;A4CxqJQ;EACE,qBzC0HoB;EyCzHpB,oBAAA;A5C0qJV;A4CxqJU;EACE,iBAAA;EACA,sBzCqHkB;AHqjJ9B;;AcruJI;E8BmCA;IACE,mBAAA;E5CssJJ;E4CnsJM;IlC1BJ,kCAAA;IAZA,0BAAA;EV6uJF;E4ClsJM;IlC3CJ,gCAAA;IAYA,4BAAA;EVquJF;E4CjsJM;IACE,aAAA;E5CmsJR;E4ChsJM;IACE,qBzC0HoB;IyCzHpB,oBAAA;E5CksJR;E4ChsJQ;IACE,iBAAA;IACA,sBzCqHkB;EH6kJ5B;AACF;Ac9vJI;E8BmCA;IACE,mBAAA;E5C8tJJ;E4C3tJM;IlC1BJ,kCAAA;IAZA,0BAAA;EVqwJF;E4C1tJM;IlC3CJ,gCAAA;IAYA,4BAAA;EV6vJF;E4CztJM;IACE,aAAA;E5C2tJR;E4CxtJM;IACE,qBzC0HoB;IyCzHpB,oBAAA;E5C0tJR;E4CxtJQ;IACE,iBAAA;IACA,sBzCqHkB;EHqmJ5B;AACF;ActxJI;E8BmCA;IACE,mBAAA;E5CsvJJ;E4CnvJM;IlC1BJ,kCAAA;IAZA,0BAAA;EV6xJF;E4ClvJM;IlC3CJ,gCAAA;IAYA,4BAAA;EVqxJF;E4CjvJM;IACE,aAAA;E5CmvJR;E4ChvJM;IACE,qBzC0HoB;IyCzHpB,oBAAA;E5CkvJR;E4ChvJQ;IACE,iBAAA;IACA,sBzCqHkB;EH6nJ5B;AACF;Ac9yJI;E8BmCA;IACE,mBAAA;E5C8wJJ;E4C3wJM;IlC1BJ,kCAAA;IAZA,0BAAA;EVqzJF;E4C1wJM;IlC3CJ,gCAAA;IAYA,4BAAA;EV6yJF;E4CzwJM;IACE,aAAA;E5C2wJR;E4CxwJM;IACE,qBzC0HoB;IyCzHpB,oBAAA;E5C0wJR;E4CxwJQ;IACE,iBAAA;IACA,sBzCqHkB;EHqpJ5B;AACF;A4C7vJA;ElCnHI,gBAAA;AVm3JJ;A4C7vJE;EACE,qBAAA;A5C+vJJ;A4C7vJI;EACE,sBAAA;A5C+vJN;;A6Cx4JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5CwvJ3C;AKh4JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7C04JR;A6Cv4JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5CiwJ1E;;A6Ct5JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5CswJ3C;AK94JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7Cw5JR;A6Cr5JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5C+wJ1E;;A6Cp6JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5CoxJ3C;AK55JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7Cs6JR;A6Cn6JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5C6xJ1E;;A6Cl7JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5CkyJ3C;AK16JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7Co7JR;A6Cj7JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5C2yJ1E;;A6Ch8JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5CgzJ3C;AKx7JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7Ck8JR;A6C/7JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5CyzJ1E;;A6C98JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5C8zJ3C;AKt8JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7Cg9JR;A6C78JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5Cu0J1E;;A6C59JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5C40J3C;AKp9JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7C89JR;A6C39JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5Cq1J1E;;A6C1+JE;EACE,cDoJsE;ECnJtE,yBDmJuC;A5C01J3C;AKl+JE;EwCPM,cD+IkE;EC9IlE,yBAAA;A7C4+JR;A6Cz+JM;EACE,W1CPG;E0CQH,yBDyIkE;ECxIlE,qBDwIkE;A5Cm2J1E;;A8C3/JA;EACE,YAAA;E1CmLI,iBAAA;E0CjLJ,gB3C8R4B;E2C7R5B,cAAA;EACA,W3CYS;E2CXT,yB3CylCkC;E2CxlClC,YAAA;A9C8/JF;AKz/JE;EyCDE,W3CMO;E2CLP,qBAAA;A9C6/JJ;AKz/JE;EyCCI,aAAA;A9C2/JN;;A8Ch/JA;EACE,UAAA;EACA,6BAAA;EACA,SAAA;A9Cm/JF;;A8C7+JA;EACE,oBAAA;A9Cg/JF;;A+CthKA;EAGE,iB5C24BkC;E4C14BlC,gB5C04BkC;EC1tB9B,mBAAA;E2C7KJ,2C5C44BkC;E4C34BlC,4BAAA;EACA,oCAAA;EACA,gD5C64BkC;E4C54BlC,UAAA;ErCOE,sBAAA;AVghKJ;A+CphKE;EACE,sB5Cg4BgC;AHspIpC;A+CnhKE;EACE,UAAA;A/CqhKJ;A+ClhKE;EACE,cAAA;EACA,UAAA;A/CohKJ;A+CjhKE;EACE,aAAA;A/CmhKJ;;A+C/gKA;EACE,aAAA;EACA,mBAAA;EACA,wBAAA;EACA,c5CvBS;E4CwBT,2C5Cq3BkC;E4Cp3BlC,4BAAA;EACA,4CAAA;ErCZE,2CAAA;EACA,4CAAA;AV+hKJ;;A+ChhKA;EACE,gB5Cm2BkC;AHgrIpC;;AgDzjKA;EAEE,gBAAA;AhD2jKF;AgDzjKE;EACE,kBAAA;EACA,gBAAA;AhD2jKJ;;AgDtjKA;EACE,eAAA;EACA,MAAA;EACA,OAAA;EACA,a7C4pBkC;E6C3pBlC,aAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EAGA,UAAA;AhDujKF;;AgDhjKA;EACE,kBAAA;EACA,WAAA;EACA,c7Ci5BkC;E6C/4BlC,oBAAA;AhDkjKF;AgD/iKE;E7B3BI,mC6B4BF;EACA,8B7Cu6BgC;AH0oIpC;AmB1kKM;E6BuBJ;I7BtBM,gBAAA;EnB6kKN;AACF;AgDpjKE;EACE,e7Cq6BgC;AHipIpC;AgDljKE;EACE,sB7Ck6BgC;AHkpIpC;;AgDhjKA;EACE,aAAA;EACA,6BAAA;AhDmjKF;AgDjjKE;EACE,8BAAA;EACA,gBAAA;AhDmjKJ;AgDhjKE;;EAEE,cAAA;AhDkjKJ;AgD/iKE;EACE,gBAAA;AhDijKJ;;AgD7iKA;EACE,aAAA;EACA,mBAAA;EACA,6BAAA;AhDgjKF;AgD7iKE;EACE,cAAA;EACA,0BAAA;EACA,mBAAA;EACA,WAAA;AhD+iKJ;AgD3iKE;EACE,sBAAA;EACA,uBAAA;EACA,YAAA;AhD6iKJ;AgD3iKI;EACE,gBAAA;AhD6iKN;AgD1iKI;EACE,aAAA;AhD4iKN;;AgDtiKA;EACE,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,WAAA;EAGA,oBAAA;EACA,sB7C3GS;E6C4GT,4BAAA;EACA,oCAAA;EtClGE,qBAAA;EsCsGF,UAAA;AhDqiKF;;AgDjiKA;EACE,eAAA;EACA,MAAA;EACA,OAAA;EACA,a7CgjBkC;E6C/iBlC,YAAA;EACA,aAAA;EACA,sB7ClHS;AHspKX;AgDjiKE;EAAS,UAAA;AhDoiKX;AgDniKE;EAAS,Y7C+zByB;AHuuIpC;;AgDjiKA;EACE,aAAA;EACA,uBAAA;EACA,8BAAA;EACA,kB7C6zBkC;E6C5zBlC,gCAAA;EtCtHE,0CAAA;EACA,2CAAA;AV2pKJ;AgDniKE;EACE,kB7CwzBgC;E6CtzBhC,8BAAA;AhDoiKJ;;AgD/hKA;EACE,gBAAA;EACA,gB7CuI4B;AH25J9B;;AgD7hKA;EACE,kBAAA;EAGA,cAAA;EACA,a7C0wBkC;AHoxIpC;;AgD1hKA;EACE,aAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;EACA,gBAAA;EACA,6BAAA;EtCzIE,8CAAA;EACA,6CAAA;AVuqKJ;AgDzhKE;EACE,eAAA;AhD2hKJ;;AgDthKA;EACE,kBAAA;EACA,YAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;AhDyhKF;;AchqKI;EkC6IF;IACE,gB7CuwBgC;I6CtwBhC,oBAAA;EhDuhKF;EgDphKA;IACE,+BAAA;EhDshKF;EgDphKE;IACE,gCAAA;EhDshKJ;EgDlhKA;IACE,+BAAA;EhDohKF;EgDlhKE;IACE,4BAAA;IACA,mBAAA;EhDohKJ;EgD5gKA;IAAY,gB7C+uBsB;EHgyIlC;AACF;AcvrKI;EkC2KF;;IAEE,gB7CuuBgC;EHwyIlC;AACF;Ac7rKI;EkCkLF;IAAY,iB7CiuBsB;EH8yIlC;AACF;AiD7vKA;EACE,kBAAA;EACA,a9CgrBkC;E8C/qBlC,cAAA;EACA,S9C61BkC;E+Cj2BlC,qN/CoR4B;E+ClR5B,kBAAA;EACA,gB/C4R4B;E+C3R5B,gB/CgS4B;E+C/R5B,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,iBAAA;EACA,oBAAA;EACA,sBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;E9CqKI,mBAAA;E6CzKJ,qBAAA;EACA,UAAA;AjDywKF;AiDvwKE;EAAS,Y9Ci1ByB;AHy7IpC;AiDxwKE;EACE,kBAAA;EACA,cAAA;EACA,a9Ci1BgC;E8Ch1BhC,c9Ci1BgC;AHy7IpC;AiDxwKI;EACE,kBAAA;EACA,WAAA;EACA,yBAAA;EACA,mBAAA;AjD0wKN;;AiDrwKA;EACE,iBAAA;AjDwwKF;AiDtwKE;EACE,SAAA;AjDwwKJ;AiDtwKI;EACE,MAAA;EACA,6BAAA;EACA,sB9CvBK;AH+xKX;;AiDnwKA;EACE,iBAAA;AjDswKF;AiDpwKE;EACE,OAAA;EACA,a9CmzBgC;E8ClzBhC,c9CizBgC;AHq9IpC;AiDpwKI;EACE,QAAA;EACA,oCAAA;EACA,wB9CvCK;AH6yKX;;AiDjwKA;EACE,iBAAA;AjDowKF;AiDlwKE;EACE,MAAA;AjDowKJ;AiDlwKI;EACE,SAAA;EACA,6BAAA;EACA,yB9CrDK;AHyzKX;;AiD/vKA;EACE,iBAAA;AjDkwKF;AiDhwKE;EACE,QAAA;EACA,a9CqxBgC;E8CpxBhC,c9CmxBgC;AH++IpC;AiDhwKI;EACE,OAAA;EACA,oCAAA;EACA,uB9CrEK;AHu0KX;;AiD7uKA;EACE,gB9C+uBkC;E8C9uBlC,uBAAA;EACA,W9CvGS;E8CwGT,kBAAA;EACA,sB9C/FS;EOCP,sBAAA;AV+0KJ;;AmDj2KA;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,ahD8qBkC;EgD7qBlC,cAAA;EACA,gBhD+2BkC;E+Cp3BlC,qN/CoR4B;E+ClR5B,kBAAA;EACA,gB/C4R4B;E+C3R5B,gB/CgS4B;E+C/R5B,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,iBAAA;EACA,oBAAA;EACA,sBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;E9CqKI,mBAAA;E+CxKJ,qBAAA;EACA,sBhDNS;EgDOT,4BAAA;EACA,oCAAA;EzCGE,qBAAA;AV42KJ;AmD32KE;EACE,kBAAA;EACA,cAAA;EACA,WhD+2BgC;EgD92BhC,chD+2BgC;EgD92BhC,gBAAA;AnD62KJ;AmD32KI;EAEE,kBAAA;EACA,cAAA;EACA,WAAA;EACA,yBAAA;EACA,mBAAA;AnD42KN;;AmDv2KA;EACE,qBhDg2BkC;AH0gJpC;AmDx2KE;EACE,2BAAA;AnD02KJ;AmDx2KI;EACE,SAAA;EACA,6BAAA;EACA,qChD21B8B;AH+gJpC;AmDv2KI;EACE,WhD0LwB;EgDzLxB,6BAAA;EACA,sBhD7CK;AHs5KX;;AmDp2KA;EACE,mBhD40BkC;AH2hJpC;AmDr2KE;EACE,yBAAA;EACA,ahDw0BgC;EgDv0BhC,YhDs0BgC;EgDr0BhC,gBAAA;AnDu2KJ;AmDr2KI;EACE,OAAA;EACA,oCAAA;EACA,uChDo0B8B;AHmiJpC;AmDp2KI;EACE,ShDmKwB;EgDlKxB,oCAAA;EACA,wBhDpEK;AH06KX;;AmDj2KA;EACE,kBhDqzBkC;AH+iJpC;AmDl2KE;EACE,wBAAA;AnDo2KJ;AmDl2KI;EACE,MAAA;EACA,oCAAA;EACA,wChDgzB8B;AHojJpC;AmDj2KI;EACE,QhD+IwB;EgD9IxB,oCAAA;EACA,yBhDxFK;AH27KX;AmD91KE;EACE,kBAAA;EACA,MAAA;EACA,SAAA;EACA,cAAA;EACA,WhD4xBgC;EgD3xBhC,oBAAA;EACA,WAAA;EACA,gCAAA;AnDg2KJ;;AmD51KA;EACE,oBhDqxBkC;AH0kJpC;AmD71KE;EACE,0BAAA;EACA,ahDixBgC;EgDhxBhC,YhD+wBgC;EgD9wBhC,gBAAA;AnD+1KJ;AmD71KI;EACE,QAAA;EACA,oCAAA;EACA,sChD6wB8B;AHklJpC;AmD51KI;EACE,UhD4GwB;EgD3GxB,oCAAA;EACA,uBhD3HK;AHy9KX;;AmDx0KA;EACE,uBAAA;EACA,gBAAA;E/C0BI,eAAA;E+CvBJ,yBhD+tBkC;EgD9tBlC,gCAAA;EzCnIE,0CAAA;EACA,2CAAA;AV88KJ;AmDz0KE;EACE,aAAA;AnD20KJ;;AmDv0KA;EACE,uBAAA;EACA,chDxJS;AHk+KX;;AoDr+KA;EACE,kBAAA;ApDw+KF;;AoDr+KA;EACE,mBAAA;ApDw+KF;;AoDr+KA;EACE,kBAAA;EACA,WAAA;EACA,gBAAA;ApDw+KF;AqD//KE;EACE,cAAA;EACA,WAAA;EACA,WAAA;ArDigLJ;;AoDz+KA;EACE,kBAAA;EACA,aAAA;EACA,WAAA;EACA,WAAA;EACA,mBAAA;EACA,2BAAA;EjClBI,sCiCmBJ;ApD4+KF;AmB3/KM;EiCQN;IjCPQ,gBAAA;EnB8/KN;AACF;;AoD9+KA;;;EAGE,cAAA;ApDi/KF;;AoD9+KA;;EAEE,2BAAA;ApDi/KF;;AoD9+KA;;EAEE,4BAAA;ApDi/KF;;AoDx+KE;EACE,UAAA;EACA,4BAAA;EACA,eAAA;ApD2+KJ;AoDx+KE;;;EAGE,UAAA;EACA,UAAA;ApD0+KJ;AoDv+KE;;EAEE,UAAA;EACA,UAAA;EjC5DE,2BiC6DF;ApDy+KJ;AmBliLM;EiCqDJ;;IjCpDM,gBAAA;EnBsiLN;AACF;;AoDt+KA;;EAEE,kBAAA;EACA,MAAA;EACA,SAAA;EACA,UAAA;EAEA,aAAA;EACA,mBAAA;EACA,uBAAA;EACA,UjDs9BmC;EiDr9BnC,UAAA;EACA,WjD3FS;EiD4FT,kBAAA;EACA,gBAAA;EACA,SAAA;EACA,YjDi9BmC;EgBviC/B,8BiCuFJ;ApDw+KF;AmB3jLM;EiCkEN;;IjCjEQ,gBAAA;EnB+jLN;AACF;AKrkLE;;;E+C2FE,WjDpGO;EiDqGP,qBAAA;EACA,UAAA;EACA,YjD08BiC;AHqiJrC;;AoD5+KA;EACE,OAAA;ApD++KF;;AoD1+KA;EACE,QAAA;ApD6+KF;;AoDt+KA;;EAEE,qBAAA;EACA,WjDm8BmC;EiDl8BnC,YjDk8BmC;EiDj8BnC,mCAAA;ApDy+KF;;AoDv+KA;EACE,yDAAA;ApD0+KF;;AoDx+KA;EACE,yDAAA;ApD2+KF;;AoDl+KA;EACE,kBAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,WAAA;EACA,aAAA;EACA,uBAAA;EACA,eAAA;EAEA,iBjDy5BmC;EiDx5BnC,gBjDw5BmC;EiDv5BnC,gBAAA;ApDo+KF;AoDl+KE;EACE,uBAAA;EACA,cAAA;EACA,WjDu5BiC;EiDt5BjC,WjDu5BiC;EiDt5BjC,iBjDw5BiC;EiDv5BjC,gBjDu5BiC;EiDt5BjC,mBAAA;EACA,eAAA;EACA,sBjDnKO;EiDoKP,4BAAA;EAEA,kCAAA;EACA,qCAAA;EACA,YAAA;EjC/JE,6BiCgKF;ApDm+KJ;AmB/nLM;EiC6IJ;IjC5IM,gBAAA;EnBkoLN;AACF;AoDr+KE;EACE,UAAA;ApDu+KJ;;AoD99KA;EACE,kBAAA;EACA,UAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA;EACA,WjD9LS;EiD+LT,kBAAA;ApDi+KF;;AsDnqLA;EACE;IAAK,yBAAA;EtDuqLL;AACF;AsDrqLA;EACE,qBAAA;EACA,WnDskCwB;EmDrkCxB,YnDqkCwB;EmDpkCxB,wBnDskCwB;EmDrkCxB,iCAAA;EACA,+BAAA;EAEA,kBAAA;EACA,+CAAA;AtDsqLF;;AsDnqLA;EACE,WnDgkCwB;EmD/jCxB,YnD+jCwB;EmD9jCxB,mBnDgkCwB;AHsmJ1B;;AsD/pLA;EACE;IACE,mBAAA;EtDkqLF;EsDhqLA;IACE,UAAA;IACA,eAAA;EtDkqLF;AACF;AsD/pLA;EACE,qBAAA;EACA,WnDsiCwB;EmDriCxB,YnDqiCwB;EmDpiCxB,wBnDsiCwB;EmDriCxB,8BAAA;EAEA,kBAAA;EACA,UAAA;EACA,6CAAA;AtDgqLF;;AsD7pLA;EACE,WnDgiCwB;EmD/hCxB,YnD+hCwB;AHioJ1B;;AsD5pLE;EACE;;IAEE,wBAAA;EtD+pLJ;AACF;AuD3tLA;EAAqB,mCAAA;AvD8tLrB;;AuD7tLA;EAAqB,8BAAA;AvDiuLrB;;AuDhuLA;EAAqB,iCAAA;AvDouLrB;;AuDnuLA;EAAqB,iCAAA;AvDuuLrB;;AuDtuLA;EAAqB,sCAAA;AvD0uLrB;;AuDzuLA;EAAqB,mCAAA;AvD6uLrB;;AwD/uLE;EACE,oCAAA;AxDkvLJ;;AKxuLE;;;EmDLI,oCAAA;AxDmvLN;;AwDzvLE;EACE,oCAAA;AxD4vLJ;;AKlvLE;;;EmDLI,oCAAA;AxD6vLN;;AwDnwLE;EACE,oCAAA;AxDswLJ;;AK5vLE;;;EmDLI,oCAAA;AxDuwLN;;AwD7wLE;EACE,oCAAA;AxDgxLJ;;AKtwLE;;;EmDLI,oCAAA;AxDixLN;;AwDvxLE;EACE,oCAAA;AxD0xLJ;;AKhxLE;;;EmDLI,oCAAA;AxD2xLN;;AwDjyLE;EACE,oCAAA;AxDoyLJ;;AK1xLE;;;EmDLI,oCAAA;AxDqyLN;;AwD3yLE;EACE,oCAAA;AxD8yLJ;;AKpyLE;;;EmDLI,oCAAA;AxD+yLN;;AwDrzLE;EACE,oCAAA;AxDwzLJ;;AK9yLE;;;EmDLI,oCAAA;AxDyzLN;;AyDxzLA;EACE,iCAAA;AzD2zLF;;AyDxzLA;EACE,wCAAA;AzD2zLF;;A0Dt0LA;EAAkB,oCAAA;A1D00LlB;;A0Dz0LA;EAAkB,wCAAA;A1D60LlB;;A0D50LA;EAAkB,0CAAA;A1Dg1LlB;;A0D/0LA;EAAkB,2CAAA;A1Dm1LlB;;A0Dl1LA;EAAkB,yCAAA;A1Ds1LlB;;A0Dp1LA;EAAmB,oBAAA;A1Dw1LnB;;A0Dv1LA;EAAmB,wBAAA;A1D21LnB;;A0D11LA;EAAmB,0BAAA;A1D81LnB;;A0D71LA;EAAmB,2BAAA;A1Di2LnB;;A0Dh2LA;EAAmB,yBAAA;A1Do2LnB;;A0Dj2LE;EACE,gCAAA;A1Do2LJ;;A0Dr2LE;EACE,gCAAA;A1Dw2LJ;;A0Dz2LE;EACE,gCAAA;A1D42LJ;;A0D72LE;EACE,gCAAA;A1Dg3LJ;;A0Dj3LE;EACE,gCAAA;A1Do3LJ;;A0Dr3LE;EACE,gCAAA;A1Dw3LJ;;A0Dz3LE;EACE,gCAAA;A1D43LJ;;A0D73LE;EACE,gCAAA;A1Dg4LJ;;A0D53LA;EACE,6BAAA;A1D+3LF;;A0Dx3LA;EACE,gCAAA;A1D23LF;;A0Dx3LA;EACE,iCAAA;A1D23LF;;A0Dx3LA;EACE,0CAAA;EACA,2CAAA;A1D23LF;;A0Dx3LA;EACE,2CAAA;EACA,8CAAA;A1D23LF;;A0Dx3LA;EACE,8CAAA;EACA,6CAAA;A1D23LF;;A0Dx3LA;EACE,0CAAA;EACA,6CAAA;A1D23LF;;A0Dx3LA;EACE,gCAAA;A1D23LF;;A0Dx3LA;EACE,6BAAA;A1D23LF;;A0Dx3LA;EACE,+BAAA;A1D23LF;;A0Dx3LA;EACE,2BAAA;A1D23LF;;AqDn8LE;EACE,cAAA;EACA,WAAA;EACA,WAAA;ArDs8LJ;;A2D/7LM;EAAwB,wBAAA;A3Dm8L9B;;A2Dn8LM;EAAwB,0BAAA;A3Du8L9B;;A2Dv8LM;EAAwB,gCAAA;A3D28L9B;;A2D38LM;EAAwB,yBAAA;A3D+8L9B;;A2D/8LM;EAAwB,yBAAA;A3Dm9L9B;;A2Dn9LM;EAAwB,6BAAA;A3Du9L9B;;A2Dv9LM;EAAwB,8BAAA;A3D29L9B;;A2D39LM;EAAwB,wBAAA;A3D+9L9B;;A2D/9LM;EAAwB,+BAAA;A3Dm+L9B;;Acl7LI;E6CjDE;IAAwB,wBAAA;E3Dw+L5B;E2Dx+LI;IAAwB,0BAAA;E3D2+L5B;E2D3+LI;IAAwB,gCAAA;E3D8+L5B;E2D9+LI;IAAwB,yBAAA;E3Di/L5B;E2Dj/LI;IAAwB,yBAAA;E3Do/L5B;E2Dp/LI;IAAwB,6BAAA;E3Du/L5B;E2Dv/LI;IAAwB,8BAAA;E3D0/L5B;E2D1/LI;IAAwB,wBAAA;E3D6/L5B;E2D7/LI;IAAwB,+BAAA;E3DggM5B;AACF;Ach9LI;E6CjDE;IAAwB,wBAAA;E3DqgM5B;E2DrgMI;IAAwB,0BAAA;E3DwgM5B;E2DxgMI;IAAwB,gCAAA;E3D2gM5B;E2D3gMI;IAAwB,yBAAA;E3D8gM5B;E2D9gMI;IAAwB,yBAAA;E3DihM5B;E2DjhMI;IAAwB,6BAAA;E3DohM5B;E2DphMI;IAAwB,8BAAA;E3DuhM5B;E2DvhMI;IAAwB,wBAAA;E3D0hM5B;E2D1hMI;IAAwB,+BAAA;E3D6hM5B;AACF;Ac7+LI;E6CjDE;IAAwB,wBAAA;E3DkiM5B;E2DliMI;IAAwB,0BAAA;E3DqiM5B;E2DriMI;IAAwB,gCAAA;E3DwiM5B;E2DxiMI;IAAwB,yBAAA;E3D2iM5B;E2D3iMI;IAAwB,yBAAA;E3D8iM5B;E2D9iMI;IAAwB,6BAAA;E3DijM5B;E2DjjMI;IAAwB,8BAAA;E3DojM5B;E2DpjMI;IAAwB,wBAAA;E3DujM5B;E2DvjMI;IAAwB,+BAAA;E3D0jM5B;AACF;Ac1gMI;E6CjDE;IAAwB,wBAAA;E3D+jM5B;E2D/jMI;IAAwB,0BAAA;E3DkkM5B;E2DlkMI;IAAwB,gCAAA;E3DqkM5B;E2DrkMI;IAAwB,yBAAA;E3DwkM5B;E2DxkMI;IAAwB,yBAAA;E3D2kM5B;E2D3kMI;IAAwB,6BAAA;E3D8kM5B;E2D9kMI;IAAwB,8BAAA;E3DilM5B;E2DjlMI;IAAwB,wBAAA;E3DolM5B;E2DplMI;IAAwB,+BAAA;E3DulM5B;AACF;A2D9kMA;EAEI;IAAqB,wBAAA;E3DglMvB;E2DhlME;IAAqB,0BAAA;E3DmlMvB;E2DnlME;IAAqB,gCAAA;E3DslMvB;E2DtlME;IAAqB,yBAAA;E3DylMvB;E2DzlME;IAAqB,yBAAA;E3D4lMvB;E2D5lME;IAAqB,6BAAA;E3D+lMvB;E2D/lME;IAAqB,8BAAA;E3DkmMvB;E2DlmME;IAAqB,wBAAA;E3DqmMvB;E2DrmME;IAAqB,+BAAA;E3DwmMvB;AACF;A4D9nMA;EACE,kBAAA;EACA,cAAA;EACA,WAAA;EACA,UAAA;EACA,gBAAA;A5DgoMF;A4D9nME;EACE,cAAA;EACA,WAAA;A5DgoMJ;A4D7nME;;;;;EAKE,kBAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,SAAA;A5D+nMJ;;A4DtnMI;EACE,yBAAA;A5DynMN;;A4D1nMI;EACE,mBAAA;A5D6nMN;;A4D9nMI;EACE,gBAAA;A5DioMN;;A4DloMI;EACE,iBAAA;A5DqoMN;;A6D9pMI;EAAgC,8BAAA;A7DkqMpC;;A6DjqMI;EAAgC,iCAAA;A7DqqMpC;;A6DpqMI;EAAgC,sCAAA;A7DwqMpC;;A6DvqMI;EAAgC,yCAAA;A7D2qMpC;;A6DzqMI;EAA8B,0BAAA;A7D6qMlC;;A6D5qMI;EAA8B,4BAAA;A7DgrMlC;;A6D/qMI;EAA8B,kCAAA;A7DmrMlC;;A6DlrMI;EAA8B,yBAAA;A7DsrMlC;;A6DrrMI;EAA8B,uBAAA;A7DyrMlC;;A6DxrMI;EAA8B,uBAAA;A7D4rMlC;;A6D3rMI;EAA8B,yBAAA;A7D+rMlC;;A6D9rMI;EAA8B,yBAAA;A7DksMlC;;A6DhsMI;EAAoC,sCAAA;A7DosMxC;;A6DnsMI;EAAoC,oCAAA;A7DusMxC;;A6DtsMI;EAAoC,kCAAA;A7D0sMxC;;A6DzsMI;EAAoC,yCAAA;A7D6sMxC;;A6D5sMI;EAAoC,wCAAA;A7DgtMxC;;A6D9sMI;EAAiC,kCAAA;A7DktMrC;;A6DjtMI;EAAiC,gCAAA;A7DqtMrC;;A6DptMI;EAAiC,8BAAA;A7DwtMrC;;A6DvtMI;EAAiC,gCAAA;A7D2tMrC;;A6D1tMI;EAAiC,+BAAA;A7D8tMrC;;A6D5tMI;EAAkC,oCAAA;A7DguMtC;;A6D/tMI;EAAkC,kCAAA;A7DmuMtC;;A6DluMI;EAAkC,gCAAA;A7DsuMtC;;A6DruMI;EAAkC,uCAAA;A7DyuMtC;;A6DxuMI;EAAkC,sCAAA;A7D4uMtC;;A6D3uMI;EAAkC,iCAAA;A7D+uMtC;;A6D7uMI;EAAgC,2BAAA;A7DivMpC;;A6DhvMI;EAAgC,iCAAA;A7DovMpC;;A6DnvMI;EAAgC,+BAAA;A7DuvMpC;;A6DtvMI;EAAgC,6BAAA;A7D0vMpC;;A6DzvMI;EAAgC,+BAAA;A7D6vMpC;;A6D5vMI;EAAgC,8BAAA;A7DgwMpC;;AcpvMI;E+ClDA;IAAgC,8BAAA;E7D2yMlC;E6D1yME;IAAgC,iCAAA;E7D6yMlC;E6D5yME;IAAgC,sCAAA;E7D+yMlC;E6D9yME;IAAgC,yCAAA;E7DizMlC;E6D/yME;IAA8B,0BAAA;E7DkzMhC;E6DjzME;IAA8B,4BAAA;E7DozMhC;E6DnzME;IAA8B,kCAAA;E7DszMhC;E6DrzME;IAA8B,yBAAA;E7DwzMhC;E6DvzME;IAA8B,uBAAA;E7D0zMhC;E6DzzME;IAA8B,uBAAA;E7D4zMhC;E6D3zME;IAA8B,yBAAA;E7D8zMhC;E6D7zME;IAA8B,yBAAA;E7Dg0MhC;E6D9zME;IAAoC,sCAAA;E7Di0MtC;E6Dh0ME;IAAoC,oCAAA;E7Dm0MtC;E6Dl0ME;IAAoC,kCAAA;E7Dq0MtC;E6Dp0ME;IAAoC,yCAAA;E7Du0MtC;E6Dt0ME;IAAoC,wCAAA;E7Dy0MtC;E6Dv0ME;IAAiC,kCAAA;E7D00MnC;E6Dz0ME;IAAiC,gCAAA;E7D40MnC;E6D30ME;IAAiC,8BAAA;E7D80MnC;E6D70ME;IAAiC,gCAAA;E7Dg1MnC;E6D/0ME;IAAiC,+BAAA;E7Dk1MnC;E6Dh1ME;IAAkC,oCAAA;E7Dm1MpC;E6Dl1ME;IAAkC,kCAAA;E7Dq1MpC;E6Dp1ME;IAAkC,gCAAA;E7Du1MpC;E6Dt1ME;IAAkC,uCAAA;E7Dy1MpC;E6Dx1ME;IAAkC,sCAAA;E7D21MpC;E6D11ME;IAAkC,iCAAA;E7D61MpC;E6D31ME;IAAgC,2BAAA;E7D81MlC;E6D71ME;IAAgC,iCAAA;E7Dg2MlC;E6D/1ME;IAAgC,+BAAA;E7Dk2MlC;E6Dj2ME;IAAgC,6BAAA;E7Do2MlC;E6Dn2ME;IAAgC,+BAAA;E7Ds2MlC;E6Dr2ME;IAAgC,8BAAA;E7Dw2MlC;AACF;Ac71MI;E+ClDA;IAAgC,8BAAA;E7Dm5MlC;E6Dl5ME;IAAgC,iCAAA;E7Dq5MlC;E6Dp5ME;IAAgC,sCAAA;E7Du5MlC;E6Dt5ME;IAAgC,yCAAA;E7Dy5MlC;E6Dv5ME;IAA8B,0BAAA;E7D05MhC;E6Dz5ME;IAA8B,4BAAA;E7D45MhC;E6D35ME;IAA8B,kCAAA;E7D85MhC;E6D75ME;IAA8B,yBAAA;E7Dg6MhC;E6D/5ME;IAA8B,uBAAA;E7Dk6MhC;E6Dj6ME;IAA8B,uBAAA;E7Do6MhC;E6Dn6ME;IAA8B,yBAAA;E7Ds6MhC;E6Dr6ME;IAA8B,yBAAA;E7Dw6MhC;E6Dt6ME;IAAoC,sCAAA;E7Dy6MtC;E6Dx6ME;IAAoC,oCAAA;E7D26MtC;E6D16ME;IAAoC,kCAAA;E7D66MtC;E6D56ME;IAAoC,yCAAA;E7D+6MtC;E6D96ME;IAAoC,wCAAA;E7Di7MtC;E6D/6ME;IAAiC,kCAAA;E7Dk7MnC;E6Dj7ME;IAAiC,gCAAA;E7Do7MnC;E6Dn7ME;IAAiC,8BAAA;E7Ds7MnC;E6Dr7ME;IAAiC,gCAAA;E7Dw7MnC;E6Dv7ME;IAAiC,+BAAA;E7D07MnC;E6Dx7ME;IAAkC,oCAAA;E7D27MpC;E6D17ME;IAAkC,kCAAA;E7D67MpC;E6D57ME;IAAkC,gCAAA;E7D+7MpC;E6D97ME;IAAkC,uCAAA;E7Di8MpC;E6Dh8ME;IAAkC,sCAAA;E7Dm8MpC;E6Dl8ME;IAAkC,iCAAA;E7Dq8MpC;E6Dn8ME;IAAgC,2BAAA;E7Ds8MlC;E6Dr8ME;IAAgC,iCAAA;E7Dw8MlC;E6Dv8ME;IAAgC,+BAAA;E7D08MlC;E6Dz8ME;IAAgC,6BAAA;E7D48MlC;E6D38ME;IAAgC,+BAAA;E7D88MlC;E6D78ME;IAAgC,8BAAA;E7Dg9MlC;AACF;Acr8MI;E+ClDA;IAAgC,8BAAA;E7D2/MlC;E6D1/ME;IAAgC,iCAAA;E7D6/MlC;E6D5/ME;IAAgC,sCAAA;E7D+/MlC;E6D9/ME;IAAgC,yCAAA;E7DigNlC;E6D//ME;IAA8B,0BAAA;E7DkgNhC;E6DjgNE;IAA8B,4BAAA;E7DogNhC;E6DngNE;IAA8B,kCAAA;E7DsgNhC;E6DrgNE;IAA8B,yBAAA;E7DwgNhC;E6DvgNE;IAA8B,uBAAA;E7D0gNhC;E6DzgNE;IAA8B,uBAAA;E7D4gNhC;E6D3gNE;IAA8B,yBAAA;E7D8gNhC;E6D7gNE;IAA8B,yBAAA;E7DghNhC;E6D9gNE;IAAoC,sCAAA;E7DihNtC;E6DhhNE;IAAoC,oCAAA;E7DmhNtC;E6DlhNE;IAAoC,kCAAA;E7DqhNtC;E6DphNE;IAAoC,yCAAA;E7DuhNtC;E6DthNE;IAAoC,wCAAA;E7DyhNtC;E6DvhNE;IAAiC,kCAAA;E7D0hNnC;E6DzhNE;IAAiC,gCAAA;E7D4hNnC;E6D3hNE;IAAiC,8BAAA;E7D8hNnC;E6D7hNE;IAAiC,gCAAA;E7DgiNnC;E6D/hNE;IAAiC,+BAAA;E7DkiNnC;E6DhiNE;IAAkC,oCAAA;E7DmiNpC;E6DliNE;IAAkC,kCAAA;E7DqiNpC;E6DpiNE;IAAkC,gCAAA;E7DuiNpC;E6DtiNE;IAAkC,uCAAA;E7DyiNpC;E6DxiNE;IAAkC,sCAAA;E7D2iNpC;E6D1iNE;IAAkC,iCAAA;E7D6iNpC;E6D3iNE;IAAgC,2BAAA;E7D8iNlC;E6D7iNE;IAAgC,iCAAA;E7DgjNlC;E6D/iNE;IAAgC,+BAAA;E7DkjNlC;E6DjjNE;IAAgC,6BAAA;E7DojNlC;E6DnjNE;IAAgC,+BAAA;E7DsjNlC;E6DrjNE;IAAgC,8BAAA;E7DwjNlC;AACF;Ac7iNI;E+ClDA;IAAgC,8BAAA;E7DmmNlC;E6DlmNE;IAAgC,iCAAA;E7DqmNlC;E6DpmNE;IAAgC,sCAAA;E7DumNlC;E6DtmNE;IAAgC,yCAAA;E7DymNlC;E6DvmNE;IAA8B,0BAAA;E7D0mNhC;E6DzmNE;IAA8B,4BAAA;E7D4mNhC;E6D3mNE;IAA8B,kCAAA;E7D8mNhC;E6D7mNE;IAA8B,yBAAA;E7DgnNhC;E6D/mNE;IAA8B,uBAAA;E7DknNhC;E6DjnNE;IAA8B,uBAAA;E7DonNhC;E6DnnNE;IAA8B,yBAAA;E7DsnNhC;E6DrnNE;IAA8B,yBAAA;E7DwnNhC;E6DtnNE;IAAoC,sCAAA;E7DynNtC;E6DxnNE;IAAoC,oCAAA;E7D2nNtC;E6D1nNE;IAAoC,kCAAA;E7D6nNtC;E6D5nNE;IAAoC,yCAAA;E7D+nNtC;E6D9nNE;IAAoC,wCAAA;E7DioNtC;E6D/nNE;IAAiC,kCAAA;E7DkoNnC;E6DjoNE;IAAiC,gCAAA;E7DooNnC;E6DnoNE;IAAiC,8BAAA;E7DsoNnC;E6DroNE;IAAiC,gCAAA;E7DwoNnC;E6DvoNE;IAAiC,+BAAA;E7D0oNnC;E6DxoNE;IAAkC,oCAAA;E7D2oNpC;E6D1oNE;IAAkC,kCAAA;E7D6oNpC;E6D5oNE;IAAkC,gCAAA;E7D+oNpC;E6D9oNE;IAAkC,uCAAA;E7DipNpC;E6DhpNE;IAAkC,sCAAA;E7DmpNpC;E6DlpNE;IAAkC,iCAAA;E7DqpNpC;E6DnpNE;IAAgC,2BAAA;E7DspNlC;E6DrpNE;IAAgC,iCAAA;E7DwpNlC;E6DvpNE;IAAgC,+BAAA;E7D0pNlC;E6DzpNE;IAAgC,6BAAA;E7D4pNlC;E6D3pNE;IAAgC,+BAAA;E7D8pNlC;E6D7pNE;IAAgC,8BAAA;E7DgqNlC;AACF;A8D3sNI;EAAwB,sBAAA;A9D8sN5B;;A8D7sNI;EAAwB,uBAAA;A9DitN5B;;A8DhtNI;EAAwB,sBAAA;A9DotN5B;;AchqNI;EgDtDA;IAAwB,sBAAA;E9D2tN1B;E8D1tNE;IAAwB,uBAAA;E9D6tN1B;E8D5tNE;IAAwB,sBAAA;E9D+tN1B;AACF;Ac5qNI;EgDtDA;IAAwB,sBAAA;E9DsuN1B;E8DruNE;IAAwB,uBAAA;E9DwuN1B;E8DvuNE;IAAwB,sBAAA;E9D0uN1B;AACF;AcvrNI;EgDtDA;IAAwB,sBAAA;E9DivN1B;E8DhvNE;IAAwB,uBAAA;E9DmvN1B;E8DlvNE;IAAwB,sBAAA;E9DqvN1B;AACF;AclsNI;EgDtDA;IAAwB,sBAAA;E9D4vN1B;E8D3vNE;IAAwB,uBAAA;E9D8vN1B;E8D7vNE;IAAwB,sBAAA;E9DgwN1B;AACF;A+DtwNE;EAAyB,2BAAA;A/DywN3B;;A+DzwNE;EAAyB,4BAAA;A/D6wN3B;;A+D7wNE;EAAyB,4BAAA;A/DixN3B;;AgEjxNE;EAAsB,yBAAA;AhEqxNxB;;AgErxNE;EAAsB,2BAAA;AhEyxNxB;;AiExxNE;EAAyB,2BAAA;AjE4xN3B;;AiE5xNE;EAAyB,6BAAA;AjEgyN3B;;AiEhyNE;EAAyB,6BAAA;AjEoyN3B;;AiEpyNE;EAAyB,0BAAA;AjEwyN3B;;AiExyNE;EAAyB,2BAAA;AjE4yN3B;;AiEvyNA;EACE,eAAA;EACA,MAAA;EACA,QAAA;EACA,OAAA;EACA,a9DiqBkC;AHyoMpC;;AiEvyNA;EACE,eAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,a9DypBkC;AHipMpC;;AiEtyNE;EADF;IAEI,gBAAA;IACA,MAAA;IACA,a9DipBgC;EHypMlC;AACF;;AkEp0NA;ECEE,kBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,sBAAA;EACA,mBAAA;EACA,SAAA;AnEs0NF;;AmE5zNE;EAEE,gBAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;EACA,UAAA;EACA,mBAAA;AnE8zNJ;;AoE31NA;EAAa,8DAAA;ApE+1Nb;;AoE91NA;EAAU,wDAAA;ApEk2NV;;AoEj2NA;EAAa,uDAAA;ApEq2Nb;;AoEp2NA;EAAe,2BAAA;ApEw2Nf;;AqEv2NI;EAAuB,qBAAA;ArE22N3B;;AqE32NI;EAAuB,qBAAA;ArE+2N3B;;AqE/2NI;EAAuB,qBAAA;ArEm3N3B;;AqEn3NI;EAAuB,sBAAA;ArEu3N3B;;AqEv3NI;EAAuB,sBAAA;ArE23N3B;;AqE33NI;EAAuB,sBAAA;ArE+3N3B;;AqE/3NI;EAAuB,sBAAA;ArEm4N3B;;AqEn4NI;EAAuB,sBAAA;ArEu4N3B;;AqEv4NI;EAAuB,uBAAA;ArE24N3B;;AqE34NI;EAAuB,uBAAA;ArE+4N3B;;AqE34NA;EAAU,0BAAA;ArE+4NV;;AqE94NA;EAAU,2BAAA;ArEk5NV;;AqE94NA;EAAc,2BAAA;ArEk5Nd;;AqEj5NA;EAAc,4BAAA;ArEq5Nd;;AqEn5NA;EAAU,uBAAA;ArEu5NV;;AqEt5NA;EAAU,wBAAA;ArE05NV;;AsEn6NQ;EAAgC,oBAAA;AtEu6NxC;;AsEt6NQ;;EAEE,wBAAA;AtEy6NV;;AsEv6NQ;;EAEE,0BAAA;AtE06NV;;AsEx6NQ;;EAEE,2BAAA;AtE26NV;;AsEz6NQ;;EAEE,yBAAA;AtE46NV;;AsE37NQ;EAAgC,0BAAA;AtE+7NxC;;AsE97NQ;;EAEE,8BAAA;AtEi8NV;;AsE/7NQ;;EAEE,gCAAA;AtEk8NV;;AsEh8NQ;;EAEE,iCAAA;AtEm8NV;;AsEj8NQ;;EAEE,+BAAA;AtEo8NV;;AsEn9NQ;EAAgC,yBAAA;AtEu9NxC;;AsEt9NQ;;EAEE,6BAAA;AtEy9NV;;AsEv9NQ;;EAEE,+BAAA;AtE09NV;;AsEx9NQ;;EAEE,gCAAA;AtE29NV;;AsEz9NQ;;EAEE,8BAAA;AtE49NV;;AsE3+NQ;EAAgC,uBAAA;AtE++NxC;;AsE9+NQ;;EAEE,2BAAA;AtEi/NV;;AsE/+NQ;;EAEE,6BAAA;AtEk/NV;;AsEh/NQ;;EAEE,8BAAA;AtEm/NV;;AsEj/NQ;;EAEE,4BAAA;AtEo/NV;;AsEngOQ;EAAgC,yBAAA;AtEugOxC;;AsEtgOQ;;EAEE,6BAAA;AtEygOV;;AsEvgOQ;;EAEE,+BAAA;AtE0gOV;;AsExgOQ;;EAEE,gCAAA;AtE2gOV;;AsEzgOQ;;EAEE,8BAAA;AtE4gOV;;AsE3hOQ;EAAgC,uBAAA;AtE+hOxC;;AsE9hOQ;;EAEE,2BAAA;AtEiiOV;;AsE/hOQ;;EAEE,6BAAA;AtEkiOV;;AsEhiOQ;;EAEE,8BAAA;AtEmiOV;;AsEjiOQ;;EAEE,4BAAA;AtEoiOV;;AsEnjOQ;EAAgC,qBAAA;AtEujOxC;;AsEtjOQ;;EAEE,yBAAA;AtEyjOV;;AsEvjOQ;;EAEE,2BAAA;AtE0jOV;;AsExjOQ;;EAEE,4BAAA;AtE2jOV;;AsEzjOQ;;EAEE,0BAAA;AtE4jOV;;AsE3kOQ;EAAgC,2BAAA;AtE+kOxC;;AsE9kOQ;;EAEE,+BAAA;AtEilOV;;AsE/kOQ;;EAEE,iCAAA;AtEklOV;;AsEhlOQ;;EAEE,kCAAA;AtEmlOV;;AsEjlOQ;;EAEE,gCAAA;AtEolOV;;AsEnmOQ;EAAgC,0BAAA;AtEumOxC;;AsEtmOQ;;EAEE,8BAAA;AtEymOV;;AsEvmOQ;;EAEE,gCAAA;AtE0mOV;;AsExmOQ;;EAEE,iCAAA;AtE2mOV;;AsEzmOQ;;EAEE,+BAAA;AtE4mOV;;AsE3nOQ;EAAgC,wBAAA;AtE+nOxC;;AsE9nOQ;;EAEE,4BAAA;AtEioOV;;AsE/nOQ;;EAEE,8BAAA;AtEkoOV;;AsEhoOQ;;EAEE,+BAAA;AtEmoOV;;AsEjoOQ;;EAEE,6BAAA;AtEooOV;;AsEnpOQ;EAAgC,0BAAA;AtEupOxC;;AsEtpOQ;;EAEE,8BAAA;AtEypOV;;AsEvpOQ;;EAEE,gCAAA;AtE0pOV;;AsExpOQ;;EAEE,iCAAA;AtE2pOV;;AsEzpOQ;;EAEE,+BAAA;AtE4pOV;;AsE3qOQ;EAAgC,wBAAA;AtE+qOxC;;AsE9qOQ;;EAEE,4BAAA;AtEirOV;;AsE/qOQ;;EAEE,8BAAA;AtEkrOV;;AsEhrOQ;;EAEE,+BAAA;AtEmrOV;;AsEjrOQ;;EAEE,6BAAA;AtEorOV;;AsE5qOQ;EAAwB,2BAAA;AtEgrOhC;;AsE/qOQ;;EAEE,+BAAA;AtEkrOV;;AsEhrOQ;;EAEE,iCAAA;AtEmrOV;;AsEjrOQ;;EAEE,kCAAA;AtEorOV;;AsElrOQ;;EAEE,gCAAA;AtEqrOV;;AsEpsOQ;EAAwB,0BAAA;AtEwsOhC;;AsEvsOQ;;EAEE,8BAAA;AtE0sOV;;AsExsOQ;;EAEE,gCAAA;AtE2sOV;;AsEzsOQ;;EAEE,iCAAA;AtE4sOV;;AsE1sOQ;;EAEE,+BAAA;AtE6sOV;;AsE5tOQ;EAAwB,wBAAA;AtEguOhC;;AsE/tOQ;;EAEE,4BAAA;AtEkuOV;;AsEhuOQ;;EAEE,8BAAA;AtEmuOV;;AsEjuOQ;;EAEE,+BAAA;AtEouOV;;AsEluOQ;;EAEE,6BAAA;AtEquOV;;AsEpvOQ;EAAwB,0BAAA;AtEwvOhC;;AsEvvOQ;;EAEE,8BAAA;AtE0vOV;;AsExvOQ;;EAEE,gCAAA;AtE2vOV;;AsEzvOQ;;EAEE,iCAAA;AtE4vOV;;AsE1vOQ;;EAEE,+BAAA;AtE6vOV;;AsE5wOQ;EAAwB,wBAAA;AtEgxOhC;;AsE/wOQ;;EAEE,4BAAA;AtEkxOV;;AsEhxOQ;;EAEE,8BAAA;AtEmxOV;;AsEjxOQ;;EAEE,+BAAA;AtEoxOV;;AsElxOQ;;EAEE,6BAAA;AtEqxOV;;AsE/wOI;EAAmB,uBAAA;AtEmxOvB;;AsElxOI;;EAEE,2BAAA;AtEqxON;;AsEnxOI;;EAEE,6BAAA;AtEsxON;;AsEpxOI;;EAEE,8BAAA;AtEuxON;;AsErxOI;;EAEE,4BAAA;AtEwxON;;AcjyOI;EwDlDI;IAAgC,oBAAA;EtEw1OtC;EsEv1OM;;IAEE,wBAAA;EtEy1OR;EsEv1OM;;IAEE,0BAAA;EtEy1OR;EsEv1OM;;IAEE,2BAAA;EtEy1OR;EsEv1OM;;IAEE,yBAAA;EtEy1OR;EsEx2OM;IAAgC,0BAAA;EtE22OtC;EsE12OM;;IAEE,8BAAA;EtE42OR;EsE12OM;;IAEE,gCAAA;EtE42OR;EsE12OM;;IAEE,iCAAA;EtE42OR;EsE12OM;;IAEE,+BAAA;EtE42OR;EsE33OM;IAAgC,yBAAA;EtE83OtC;EsE73OM;;IAEE,6BAAA;EtE+3OR;EsE73OM;;IAEE,+BAAA;EtE+3OR;EsE73OM;;IAEE,gCAAA;EtE+3OR;EsE73OM;;IAEE,8BAAA;EtE+3OR;EsE94OM;IAAgC,uBAAA;EtEi5OtC;EsEh5OM;;IAEE,2BAAA;EtEk5OR;EsEh5OM;;IAEE,6BAAA;EtEk5OR;EsEh5OM;;IAEE,8BAAA;EtEk5OR;EsEh5OM;;IAEE,4BAAA;EtEk5OR;EsEj6OM;IAAgC,yBAAA;EtEo6OtC;EsEn6OM;;IAEE,6BAAA;EtEq6OR;EsEn6OM;;IAEE,+BAAA;EtEq6OR;EsEn6OM;;IAEE,gCAAA;EtEq6OR;EsEn6OM;;IAEE,8BAAA;EtEq6OR;EsEp7OM;IAAgC,uBAAA;EtEu7OtC;EsEt7OM;;IAEE,2BAAA;EtEw7OR;EsEt7OM;;IAEE,6BAAA;EtEw7OR;EsEt7OM;;IAEE,8BAAA;EtEw7OR;EsEt7OM;;IAEE,4BAAA;EtEw7OR;EsEv8OM;IAAgC,qBAAA;EtE08OtC;EsEz8OM;;IAEE,yBAAA;EtE28OR;EsEz8OM;;IAEE,2BAAA;EtE28OR;EsEz8OM;;IAEE,4BAAA;EtE28OR;EsEz8OM;;IAEE,0BAAA;EtE28OR;EsE19OM;IAAgC,2BAAA;EtE69OtC;EsE59OM;;IAEE,+BAAA;EtE89OR;EsE59OM;;IAEE,iCAAA;EtE89OR;EsE59OM;;IAEE,kCAAA;EtE89OR;EsE59OM;;IAEE,gCAAA;EtE89OR;EsE7+OM;IAAgC,0BAAA;EtEg/OtC;EsE/+OM;;IAEE,8BAAA;EtEi/OR;EsE/+OM;;IAEE,gCAAA;EtEi/OR;EsE/+OM;;IAEE,iCAAA;EtEi/OR;EsE/+OM;;IAEE,+BAAA;EtEi/OR;EsEhgPM;IAAgC,wBAAA;EtEmgPtC;EsElgPM;;IAEE,4BAAA;EtEogPR;EsElgPM;;IAEE,8BAAA;EtEogPR;EsElgPM;;IAEE,+BAAA;EtEogPR;EsElgPM;;IAEE,6BAAA;EtEogPR;EsEnhPM;IAAgC,0BAAA;EtEshPtC;EsErhPM;;IAEE,8BAAA;EtEuhPR;EsErhPM;;IAEE,gCAAA;EtEuhPR;EsErhPM;;IAEE,iCAAA;EtEuhPR;EsErhPM;;IAEE,+BAAA;EtEuhPR;EsEtiPM;IAAgC,wBAAA;EtEyiPtC;EsExiPM;;IAEE,4BAAA;EtE0iPR;EsExiPM;;IAEE,8BAAA;EtE0iPR;EsExiPM;;IAEE,+BAAA;EtE0iPR;EsExiPM;;IAEE,6BAAA;EtE0iPR;EsEliPM;IAAwB,2BAAA;EtEqiP9B;EsEpiPM;;IAEE,+BAAA;EtEsiPR;EsEpiPM;;IAEE,iCAAA;EtEsiPR;EsEpiPM;;IAEE,kCAAA;EtEsiPR;EsEpiPM;;IAEE,gCAAA;EtEsiPR;EsErjPM;IAAwB,0BAAA;EtEwjP9B;EsEvjPM;;IAEE,8BAAA;EtEyjPR;EsEvjPM;;IAEE,gCAAA;EtEyjPR;EsEvjPM;;IAEE,iCAAA;EtEyjPR;EsEvjPM;;IAEE,+BAAA;EtEyjPR;EsExkPM;IAAwB,wBAAA;EtE2kP9B;EsE1kPM;;IAEE,4BAAA;EtE4kPR;EsE1kPM;;IAEE,8BAAA;EtE4kPR;EsE1kPM;;IAEE,+BAAA;EtE4kPR;EsE1kPM;;IAEE,6BAAA;EtE4kPR;EsE3lPM;IAAwB,0BAAA;EtE8lP9B;EsE7lPM;;IAEE,8BAAA;EtE+lPR;EsE7lPM;;IAEE,gCAAA;EtE+lPR;EsE7lPM;;IAEE,iCAAA;EtE+lPR;EsE7lPM;;IAEE,+BAAA;EtE+lPR;EsE9mPM;IAAwB,wBAAA;EtEinP9B;EsEhnPM;;IAEE,4BAAA;EtEknPR;EsEhnPM;;IAEE,8BAAA;EtEknPR;EsEhnPM;;IAEE,+BAAA;EtEknPR;EsEhnPM;;IAEE,6BAAA;EtEknPR;EsE5mPE;IAAmB,uBAAA;EtE+mPrB;EsE9mPE;;IAEE,2BAAA;EtEgnPJ;EsE9mPE;;IAEE,6BAAA;EtEgnPJ;EsE9mPE;;IAEE,8BAAA;EtEgnPJ;EsE9mPE;;IAEE,4BAAA;EtEgnPJ;AACF;Ac1nPI;EwDlDI;IAAgC,oBAAA;EtEgrPtC;EsE/qPM;;IAEE,wBAAA;EtEirPR;EsE/qPM;;IAEE,0BAAA;EtEirPR;EsE/qPM;;IAEE,2BAAA;EtEirPR;EsE/qPM;;IAEE,yBAAA;EtEirPR;EsEhsPM;IAAgC,0BAAA;EtEmsPtC;EsElsPM;;IAEE,8BAAA;EtEosPR;EsElsPM;;IAEE,gCAAA;EtEosPR;EsElsPM;;IAEE,iCAAA;EtEosPR;EsElsPM;;IAEE,+BAAA;EtEosPR;EsEntPM;IAAgC,yBAAA;EtEstPtC;EsErtPM;;IAEE,6BAAA;EtEutPR;EsErtPM;;IAEE,+BAAA;EtEutPR;EsErtPM;;IAEE,gCAAA;EtEutPR;EsErtPM;;IAEE,8BAAA;EtEutPR;EsEtuPM;IAAgC,uBAAA;EtEyuPtC;EsExuPM;;IAEE,2BAAA;EtE0uPR;EsExuPM;;IAEE,6BAAA;EtE0uPR;EsExuPM;;IAEE,8BAAA;EtE0uPR;EsExuPM;;IAEE,4BAAA;EtE0uPR;EsEzvPM;IAAgC,yBAAA;EtE4vPtC;EsE3vPM;;IAEE,6BAAA;EtE6vPR;EsE3vPM;;IAEE,+BAAA;EtE6vPR;EsE3vPM;;IAEE,gCAAA;EtE6vPR;EsE3vPM;;IAEE,8BAAA;EtE6vPR;EsE5wPM;IAAgC,uBAAA;EtE+wPtC;EsE9wPM;;IAEE,2BAAA;EtEgxPR;EsE9wPM;;IAEE,6BAAA;EtEgxPR;EsE9wPM;;IAEE,8BAAA;EtEgxPR;EsE9wPM;;IAEE,4BAAA;EtEgxPR;EsE/xPM;IAAgC,qBAAA;EtEkyPtC;EsEjyPM;;IAEE,yBAAA;EtEmyPR;EsEjyPM;;IAEE,2BAAA;EtEmyPR;EsEjyPM;;IAEE,4BAAA;EtEmyPR;EsEjyPM;;IAEE,0BAAA;EtEmyPR;EsElzPM;IAAgC,2BAAA;EtEqzPtC;EsEpzPM;;IAEE,+BAAA;EtEszPR;EsEpzPM;;IAEE,iCAAA;EtEszPR;EsEpzPM;;IAEE,kCAAA;EtEszPR;EsEpzPM;;IAEE,gCAAA;EtEszPR;EsEr0PM;IAAgC,0BAAA;EtEw0PtC;EsEv0PM;;IAEE,8BAAA;EtEy0PR;EsEv0PM;;IAEE,gCAAA;EtEy0PR;EsEv0PM;;IAEE,iCAAA;EtEy0PR;EsEv0PM;;IAEE,+BAAA;EtEy0PR;EsEx1PM;IAAgC,wBAAA;EtE21PtC;EsE11PM;;IAEE,4BAAA;EtE41PR;EsE11PM;;IAEE,8BAAA;EtE41PR;EsE11PM;;IAEE,+BAAA;EtE41PR;EsE11PM;;IAEE,6BAAA;EtE41PR;EsE32PM;IAAgC,0BAAA;EtE82PtC;EsE72PM;;IAEE,8BAAA;EtE+2PR;EsE72PM;;IAEE,gCAAA;EtE+2PR;EsE72PM;;IAEE,iCAAA;EtE+2PR;EsE72PM;;IAEE,+BAAA;EtE+2PR;EsE93PM;IAAgC,wBAAA;EtEi4PtC;EsEh4PM;;IAEE,4BAAA;EtEk4PR;EsEh4PM;;IAEE,8BAAA;EtEk4PR;EsEh4PM;;IAEE,+BAAA;EtEk4PR;EsEh4PM;;IAEE,6BAAA;EtEk4PR;EsE13PM;IAAwB,2BAAA;EtE63P9B;EsE53PM;;IAEE,+BAAA;EtE83PR;EsE53PM;;IAEE,iCAAA;EtE83PR;EsE53PM;;IAEE,kCAAA;EtE83PR;EsE53PM;;IAEE,gCAAA;EtE83PR;EsE74PM;IAAwB,0BAAA;EtEg5P9B;EsE/4PM;;IAEE,8BAAA;EtEi5PR;EsE/4PM;;IAEE,gCAAA;EtEi5PR;EsE/4PM;;IAEE,iCAAA;EtEi5PR;EsE/4PM;;IAEE,+BAAA;EtEi5PR;EsEh6PM;IAAwB,wBAAA;EtEm6P9B;EsEl6PM;;IAEE,4BAAA;EtEo6PR;EsEl6PM;;IAEE,8BAAA;EtEo6PR;EsEl6PM;;IAEE,+BAAA;EtEo6PR;EsEl6PM;;IAEE,6BAAA;EtEo6PR;EsEn7PM;IAAwB,0BAAA;EtEs7P9B;EsEr7PM;;IAEE,8BAAA;EtEu7PR;EsEr7PM;;IAEE,gCAAA;EtEu7PR;EsEr7PM;;IAEE,iCAAA;EtEu7PR;EsEr7PM;;IAEE,+BAAA;EtEu7PR;EsEt8PM;IAAwB,wBAAA;EtEy8P9B;EsEx8PM;;IAEE,4BAAA;EtE08PR;EsEx8PM;;IAEE,8BAAA;EtE08PR;EsEx8PM;;IAEE,+BAAA;EtE08PR;EsEx8PM;;IAEE,6BAAA;EtE08PR;EsEp8PE;IAAmB,uBAAA;EtEu8PrB;EsEt8PE;;IAEE,2BAAA;EtEw8PJ;EsEt8PE;;IAEE,6BAAA;EtEw8PJ;EsEt8PE;;IAEE,8BAAA;EtEw8PJ;EsEt8PE;;IAEE,4BAAA;EtEw8PJ;AACF;Acl9PI;EwDlDI;IAAgC,oBAAA;EtEwgQtC;EsEvgQM;;IAEE,wBAAA;EtEygQR;EsEvgQM;;IAEE,0BAAA;EtEygQR;EsEvgQM;;IAEE,2BAAA;EtEygQR;EsEvgQM;;IAEE,yBAAA;EtEygQR;EsExhQM;IAAgC,0BAAA;EtE2hQtC;EsE1hQM;;IAEE,8BAAA;EtE4hQR;EsE1hQM;;IAEE,gCAAA;EtE4hQR;EsE1hQM;;IAEE,iCAAA;EtE4hQR;EsE1hQM;;IAEE,+BAAA;EtE4hQR;EsE3iQM;IAAgC,yBAAA;EtE8iQtC;EsE7iQM;;IAEE,6BAAA;EtE+iQR;EsE7iQM;;IAEE,+BAAA;EtE+iQR;EsE7iQM;;IAEE,gCAAA;EtE+iQR;EsE7iQM;;IAEE,8BAAA;EtE+iQR;EsE9jQM;IAAgC,uBAAA;EtEikQtC;EsEhkQM;;IAEE,2BAAA;EtEkkQR;EsEhkQM;;IAEE,6BAAA;EtEkkQR;EsEhkQM;;IAEE,8BAAA;EtEkkQR;EsEhkQM;;IAEE,4BAAA;EtEkkQR;EsEjlQM;IAAgC,yBAAA;EtEolQtC;EsEnlQM;;IAEE,6BAAA;EtEqlQR;EsEnlQM;;IAEE,+BAAA;EtEqlQR;EsEnlQM;;IAEE,gCAAA;EtEqlQR;EsEnlQM;;IAEE,8BAAA;EtEqlQR;EsEpmQM;IAAgC,uBAAA;EtEumQtC;EsEtmQM;;IAEE,2BAAA;EtEwmQR;EsEtmQM;;IAEE,6BAAA;EtEwmQR;EsEtmQM;;IAEE,8BAAA;EtEwmQR;EsEtmQM;;IAEE,4BAAA;EtEwmQR;EsEvnQM;IAAgC,qBAAA;EtE0nQtC;EsEznQM;;IAEE,yBAAA;EtE2nQR;EsEznQM;;IAEE,2BAAA;EtE2nQR;EsEznQM;;IAEE,4BAAA;EtE2nQR;EsEznQM;;IAEE,0BAAA;EtE2nQR;EsE1oQM;IAAgC,2BAAA;EtE6oQtC;EsE5oQM;;IAEE,+BAAA;EtE8oQR;EsE5oQM;;IAEE,iCAAA;EtE8oQR;EsE5oQM;;IAEE,kCAAA;EtE8oQR;EsE5oQM;;IAEE,gCAAA;EtE8oQR;EsE7pQM;IAAgC,0BAAA;EtEgqQtC;EsE/pQM;;IAEE,8BAAA;EtEiqQR;EsE/pQM;;IAEE,gCAAA;EtEiqQR;EsE/pQM;;IAEE,iCAAA;EtEiqQR;EsE/pQM;;IAEE,+BAAA;EtEiqQR;EsEhrQM;IAAgC,wBAAA;EtEmrQtC;EsElrQM;;IAEE,4BAAA;EtEorQR;EsElrQM;;IAEE,8BAAA;EtEorQR;EsElrQM;;IAEE,+BAAA;EtEorQR;EsElrQM;;IAEE,6BAAA;EtEorQR;EsEnsQM;IAAgC,0BAAA;EtEssQtC;EsErsQM;;IAEE,8BAAA;EtEusQR;EsErsQM;;IAEE,gCAAA;EtEusQR;EsErsQM;;IAEE,iCAAA;EtEusQR;EsErsQM;;IAEE,+BAAA;EtEusQR;EsEttQM;IAAgC,wBAAA;EtEytQtC;EsExtQM;;IAEE,4BAAA;EtE0tQR;EsExtQM;;IAEE,8BAAA;EtE0tQR;EsExtQM;;IAEE,+BAAA;EtE0tQR;EsExtQM;;IAEE,6BAAA;EtE0tQR;EsEltQM;IAAwB,2BAAA;EtEqtQ9B;EsEptQM;;IAEE,+BAAA;EtEstQR;EsEptQM;;IAEE,iCAAA;EtEstQR;EsEptQM;;IAEE,kCAAA;EtEstQR;EsEptQM;;IAEE,gCAAA;EtEstQR;EsEruQM;IAAwB,0BAAA;EtEwuQ9B;EsEvuQM;;IAEE,8BAAA;EtEyuQR;EsEvuQM;;IAEE,gCAAA;EtEyuQR;EsEvuQM;;IAEE,iCAAA;EtEyuQR;EsEvuQM;;IAEE,+BAAA;EtEyuQR;EsExvQM;IAAwB,wBAAA;EtE2vQ9B;EsE1vQM;;IAEE,4BAAA;EtE4vQR;EsE1vQM;;IAEE,8BAAA;EtE4vQR;EsE1vQM;;IAEE,+BAAA;EtE4vQR;EsE1vQM;;IAEE,6BAAA;EtE4vQR;EsE3wQM;IAAwB,0BAAA;EtE8wQ9B;EsE7wQM;;IAEE,8BAAA;EtE+wQR;EsE7wQM;;IAEE,gCAAA;EtE+wQR;EsE7wQM;;IAEE,iCAAA;EtE+wQR;EsE7wQM;;IAEE,+BAAA;EtE+wQR;EsE9xQM;IAAwB,wBAAA;EtEiyQ9B;EsEhyQM;;IAEE,4BAAA;EtEkyQR;EsEhyQM;;IAEE,8BAAA;EtEkyQR;EsEhyQM;;IAEE,+BAAA;EtEkyQR;EsEhyQM;;IAEE,6BAAA;EtEkyQR;EsE5xQE;IAAmB,uBAAA;EtE+xQrB;EsE9xQE;;IAEE,2BAAA;EtEgyQJ;EsE9xQE;;IAEE,6BAAA;EtEgyQJ;EsE9xQE;;IAEE,8BAAA;EtEgyQJ;EsE9xQE;;IAEE,4BAAA;EtEgyQJ;AACF;Ac1yQI;EwDlDI;IAAgC,oBAAA;EtEg2QtC;EsE/1QM;;IAEE,wBAAA;EtEi2QR;EsE/1QM;;IAEE,0BAAA;EtEi2QR;EsE/1QM;;IAEE,2BAAA;EtEi2QR;EsE/1QM;;IAEE,yBAAA;EtEi2QR;EsEh3QM;IAAgC,0BAAA;EtEm3QtC;EsEl3QM;;IAEE,8BAAA;EtEo3QR;EsEl3QM;;IAEE,gCAAA;EtEo3QR;EsEl3QM;;IAEE,iCAAA;EtEo3QR;EsEl3QM;;IAEE,+BAAA;EtEo3QR;EsEn4QM;IAAgC,yBAAA;EtEs4QtC;EsEr4QM;;IAEE,6BAAA;EtEu4QR;EsEr4QM;;IAEE,+BAAA;EtEu4QR;EsEr4QM;;IAEE,gCAAA;EtEu4QR;EsEr4QM;;IAEE,8BAAA;EtEu4QR;EsEt5QM;IAAgC,uBAAA;EtEy5QtC;EsEx5QM;;IAEE,2BAAA;EtE05QR;EsEx5QM;;IAEE,6BAAA;EtE05QR;EsEx5QM;;IAEE,8BAAA;EtE05QR;EsEx5QM;;IAEE,4BAAA;EtE05QR;EsEz6QM;IAAgC,yBAAA;EtE46QtC;EsE36QM;;IAEE,6BAAA;EtE66QR;EsE36QM;;IAEE,+BAAA;EtE66QR;EsE36QM;;IAEE,gCAAA;EtE66QR;EsE36QM;;IAEE,8BAAA;EtE66QR;EsE57QM;IAAgC,uBAAA;EtE+7QtC;EsE97QM;;IAEE,2BAAA;EtEg8QR;EsE97QM;;IAEE,6BAAA;EtEg8QR;EsE97QM;;IAEE,8BAAA;EtEg8QR;EsE97QM;;IAEE,4BAAA;EtEg8QR;EsE/8QM;IAAgC,qBAAA;EtEk9QtC;EsEj9QM;;IAEE,yBAAA;EtEm9QR;EsEj9QM;;IAEE,2BAAA;EtEm9QR;EsEj9QM;;IAEE,4BAAA;EtEm9QR;EsEj9QM;;IAEE,0BAAA;EtEm9QR;EsEl+QM;IAAgC,2BAAA;EtEq+QtC;EsEp+QM;;IAEE,+BAAA;EtEs+QR;EsEp+QM;;IAEE,iCAAA;EtEs+QR;EsEp+QM;;IAEE,kCAAA;EtEs+QR;EsEp+QM;;IAEE,gCAAA;EtEs+QR;EsEr/QM;IAAgC,0BAAA;EtEw/QtC;EsEv/QM;;IAEE,8BAAA;EtEy/QR;EsEv/QM;;IAEE,gCAAA;EtEy/QR;EsEv/QM;;IAEE,iCAAA;EtEy/QR;EsEv/QM;;IAEE,+BAAA;EtEy/QR;EsExgRM;IAAgC,wBAAA;EtE2gRtC;EsE1gRM;;IAEE,4BAAA;EtE4gRR;EsE1gRM;;IAEE,8BAAA;EtE4gRR;EsE1gRM;;IAEE,+BAAA;EtE4gRR;EsE1gRM;;IAEE,6BAAA;EtE4gRR;EsE3hRM;IAAgC,0BAAA;EtE8hRtC;EsE7hRM;;IAEE,8BAAA;EtE+hRR;EsE7hRM;;IAEE,gCAAA;EtE+hRR;EsE7hRM;;IAEE,iCAAA;EtE+hRR;EsE7hRM;;IAEE,+BAAA;EtE+hRR;EsE9iRM;IAAgC,wBAAA;EtEijRtC;EsEhjRM;;IAEE,4BAAA;EtEkjRR;EsEhjRM;;IAEE,8BAAA;EtEkjRR;EsEhjRM;;IAEE,+BAAA;EtEkjRR;EsEhjRM;;IAEE,6BAAA;EtEkjRR;EsE1iRM;IAAwB,2BAAA;EtE6iR9B;EsE5iRM;;IAEE,+BAAA;EtE8iRR;EsE5iRM;;IAEE,iCAAA;EtE8iRR;EsE5iRM;;IAEE,kCAAA;EtE8iRR;EsE5iRM;;IAEE,gCAAA;EtE8iRR;EsE7jRM;IAAwB,0BAAA;EtEgkR9B;EsE/jRM;;IAEE,8BAAA;EtEikRR;EsE/jRM;;IAEE,gCAAA;EtEikRR;EsE/jRM;;IAEE,iCAAA;EtEikRR;EsE/jRM;;IAEE,+BAAA;EtEikRR;EsEhlRM;IAAwB,wBAAA;EtEmlR9B;EsEllRM;;IAEE,4BAAA;EtEolRR;EsEllRM;;IAEE,8BAAA;EtEolRR;EsEllRM;;IAEE,+BAAA;EtEolRR;EsEllRM;;IAEE,6BAAA;EtEolRR;EsEnmRM;IAAwB,0BAAA;EtEsmR9B;EsErmRM;;IAEE,8BAAA;EtEumRR;EsErmRM;;IAEE,gCAAA;EtEumRR;EsErmRM;;IAEE,iCAAA;EtEumRR;EsErmRM;;IAEE,+BAAA;EtEumRR;EsEtnRM;IAAwB,wBAAA;EtEynR9B;EsExnRM;;IAEE,4BAAA;EtE0nRR;EsExnRM;;IAEE,8BAAA;EtE0nRR;EsExnRM;;IAEE,+BAAA;EtE0nRR;EsExnRM;;IAEE,6BAAA;EtE0nRR;EsEpnRE;IAAmB,uBAAA;EtEunRrB;EsEtnRE;;IAEE,2BAAA;EtEwnRJ;EsEtnRE;;IAEE,6BAAA;EtEwnRJ;EsEtnRE;;IAEE,8BAAA;EtEwnRJ;EsEtnRE;;IAEE,4BAAA;EtEwnRJ;AACF;AuEzrRE;EACE,kBAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;EAEA,oBAAA;EACA,WAAA;EAEA,kCAAA;AvEyrRJ;;AwEnsRA;EAAkB,4GAAA;AxEusRlB;;AwEnsRA;EAAiB,8BAAA;AxEusRjB;;AwEtsRA;EAAiB,8BAAA;AxE0sRjB;;AwEzsRA;EAAiB,8BAAA;AxE6sRjB;;AwE5sRA;ECTE,gBAAA;EACA,uBAAA;EACA,mBAAA;AzEytRF;;AwE1sRI;EAAwB,2BAAA;AxE8sR5B;;AwE7sRI;EAAwB,4BAAA;AxEitR5B;;AwEhtRI;EAAwB,6BAAA;AxEotR5B;;Ac/qRI;E0DvCA;IAAwB,2BAAA;ExE2tR1B;EwE1tRE;IAAwB,4BAAA;ExE6tR1B;EwE5tRE;IAAwB,6BAAA;ExE+tR1B;AACF;Ac3rRI;E0DvCA;IAAwB,2BAAA;ExEsuR1B;EwEruRE;IAAwB,4BAAA;ExEwuR1B;EwEvuRE;IAAwB,6BAAA;ExE0uR1B;AACF;ActsRI;E0DvCA;IAAwB,2BAAA;ExEivR1B;EwEhvRE;IAAwB,4BAAA;ExEmvR1B;EwElvRE;IAAwB,6BAAA;ExEqvR1B;AACF;AcjtRI;E0DvCA;IAAwB,2BAAA;ExE4vR1B;EwE3vRE;IAAwB,4BAAA;ExE8vR1B;EwE7vRE;IAAwB,6BAAA;ExEgwR1B;AACF;AwE3vRA;EAAmB,oCAAA;AxE8vRnB;;AwE7vRA;EAAmB,oCAAA;AxEiwRnB;;AwEhwRA;EAAmB,qCAAA;AxEowRnB;;AwEhwRA;EAAuB,2BAAA;AxEowRvB;;AwEnwRA;EAAuB,+BAAA;AxEuwRvB;;AwEtwRA;EAAuB,2BAAA;AxE0wRvB;;AwEzwRA;EAAuB,2BAAA;AxE6wRvB;;AwE5wRA;EAAuB,8BAAA;AxEgxRvB;;AwE/wRA;EAAuB,6BAAA;AxEmxRvB;;AwE/wRA;EAAc,sBAAA;AxEmxRd;;A0E1zRE;EACE,yBAAA;A1E6zRJ;;AKnzRE;EqELM,yBAAA;A1E4zRR;;A0El0RE;EACE,yBAAA;A1Eq0RJ;;AK3zRE;EqELM,yBAAA;A1Eo0RR;;A0E10RE;EACE,yBAAA;A1E60RJ;;AKn0RE;EqELM,yBAAA;A1E40RR;;A0El1RE;EACE,yBAAA;A1Eq1RJ;;AK30RE;EqELM,yBAAA;A1Eo1RR;;A0E11RE;EACE,yBAAA;A1E61RJ;;AKn1RE;EqELM,yBAAA;A1E41RR;;A0El2RE;EACE,yBAAA;A1Eq2RJ;;AK31RE;EqELM,yBAAA;A1Eo2RR;;A0E12RE;EACE,yBAAA;A1E62RJ;;AKn2RE;EqELM,yBAAA;A1E42RR;;A0El3RE;EACE,yBAAA;A1Eq3RJ;;AK32RE;EqELM,yBAAA;A1Eo3RR;;AwE70RA;EAAa,yBAAA;AxEi1Rb;;AwEh1RA;EAAc,yBAAA;AxEo1Rd;;AwEl1RA;EAAiB,oCAAA;AxEs1RjB;;AwEr1RA;EAAiB,0CAAA;AxEy1RjB;;AwEr1RA;EGvDE,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,6BAAA;EACA,SAAA;A3Eg5RF;;AwEz1RA;EAAwB,gCAAA;AxE61RxB;;AwE31RA;EACE,iCAAA;EACA,gCAAA;AxE81RF;;AwEz1RA;EAAc,yBAAA;AxE61Rd;;A4E95RA;EACE,8BAAA;A5Ei6RF;;A4E95RA;EACE,6BAAA;A5Ei6RF;;A6Ej6RE;EACE;;;IAKE,4BAAA;IAEA,2BAAA;E7Ei6RJ;E6E75RI;IACE,0BAAA;E7E+5RN;E6Et5RE;IACE,6BAAA;E7Ew5RJ;E6E14RE;IACE,gCAAA;E7E44RJ;E6E14RE;;IAEE,yBAAA;IACA,wBAAA;E7E44RJ;E6Ez4RE;;IAEE,wBAAA;E7E24RJ;E6Ex4RE;;;IAGE,UAAA;IACA,SAAA;E7E04RJ;E6Ev4RE;;IAEE,uBAAA;E7Ey4RJ;E6Ej4RE;IACE,Q1E2iC8B;EHw1PlC;E6Ej4RE;IACE,2BAAA;E7Em4RJ;E6Ej4RE;IACE,2BAAA;E7Em4RJ;E6E/3RE;IACE,aAAA;E7Ei4RJ;E6E/3RE;IACE,sBAAA;E7Ei4RJ;E6E93RE;IACE,oCAAA;E7Eg4RJ;E6E93RI;;IAEE,iCAAA;E7Eg4RN;E6E33RI;;IAEE,oCAAA;E7E63RN;E6Ez3RE;IACE,cAAA;E7E23RJ;E6Ez3RI;;;;IAIE,qB1E9GG;EHy+RT;E6Ev3RE;IACE,cAAA;IACA,qB1EpHK;EH6+RT;AACF","sourcesContent":["/*!\n * Bootstrap v4.6.2 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`