From 19932bf3ad04625e657102ae4988ea5abd51db05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 07:52:41 +1000 Subject: [PATCH 01/36] Bump @antfu/utils and unconfig in /scripts/sponsors (#2696) Bumps [@antfu/utils](https://github.com/antfu/utils) and [unconfig](https://github.com/antfu/unconfig). These dependencies needed to be updated together. Updates `@antfu/utils` from 0.5.2 to 0.7.4 - [Release notes](https://github.com/antfu/utils/releases) - [Commits](https://github.com/antfu/utils/compare/v0.5.2...v0.7.4) Updates `unconfig` from 0.3.7 to 0.3.9 - [Release notes](https://github.com/antfu/unconfig/releases) - [Commits](https://github.com/antfu/unconfig/compare/v0.3.7...v0.3.9) --- updated-dependencies: - dependency-name: "@antfu/utils" dependency-type: indirect - dependency-name: unconfig dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- scripts/sponsors/package-lock.json | 36 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/scripts/sponsors/package-lock.json b/scripts/sponsors/package-lock.json index 30997a31a..cb6cc8b9e 100644 --- a/scripts/sponsors/package-lock.json +++ b/scripts/sponsors/package-lock.json @@ -13,9 +13,12 @@ } }, "node_modules/@antfu/utils": { - "version": "0.5.2", - "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.5.2.tgz", - "integrity": "sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.4.tgz", + "integrity": "sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, "node_modules/ajv": { "version": "6.12.6", @@ -419,9 +422,9 @@ } }, "node_modules/defu": { - "version": "6.1.1", - "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.1.tgz", - "integrity": "sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -951,9 +954,9 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jiti": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.16.0.tgz", - "integrity": "sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", "bin": { "jiti": "bin/jiti.js" } @@ -1765,13 +1768,16 @@ "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==" }, "node_modules/unconfig": { - "version": "0.3.7", - "resolved": "https://registry.npmmirror.com/unconfig/-/unconfig-0.3.7.tgz", - "integrity": "sha512-1589b7oGa8ILBYpta7TndM5mLHLzHUqBfhszeZxuUBrjO/RoQ52VGVWsS3w0C0GLNxO9RPmqkf6BmIvBApaRdA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.9.tgz", + "integrity": "sha512-8yhetFd48M641mxrkWA+C/lZU4N0rCOdlo3dFsyFPnBHBjMJfjT/3eAZBRT2RxCRqeBMAKBVgikejdS6yeBjMw==", "dependencies": { - "@antfu/utils": "^0.5.2", - "defu": "^6.1.0", - "jiti": "^1.16.0" + "@antfu/utils": "^0.7.2", + "defu": "^6.1.2", + "jiti": "^1.18.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/undici": { From 644dc653a99c958dfbb36483b1a37efcfdb95461 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 17:18:59 +1000 Subject: [PATCH 02/36] chore: update sponsors.svg (#2698) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index 38e8760ba..d4d167616 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -63,47 +63,43 @@ text { Buying Coffee - + - + - + - + - + - + - + - + - - - - - + - + Helpers From 4814e65da2a3583643fa8c253e70aaa12dbd0e5d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 17:20:10 +1000 Subject: [PATCH 03/36] docs: sync translations (#2685) Co-authored-by: leaanthony --- .../current/reference/cli.mdx | 66 ++++++++++--------- .../changelog.mdx | 10 ++- .../current/guides/troubleshooting.mdx | 6 +- .../current/reference/cli.mdx | 66 ++++++++++--------- .../version-v2.5.0.json | 16 ++--- .../changelog.mdx | 10 ++- .../current/reference/cli.mdx | 56 ++++++++-------- .../changelog.mdx | 10 ++- .../current/reference/cli.mdx | 64 +++++++++--------- .../changelog.mdx | 10 ++- .../current/reference/cli.mdx | 56 ++++++++-------- .../changelog.mdx | 10 ++- .../current/reference/cli.mdx | 62 +++++++++-------- .../changelog.mdx | 14 +++- 14 files changed, 264 insertions(+), 192 deletions(-) diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/fr/docusaurus-plugin-content-docs/current/reference/cli.mdx index 9e5a18fc5..ab4cb5531 100644 --- a/website/i18n/fr/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -51,27 +51,32 @@ Si vous n'êtes pas sûr d'un modèle, inspectez les fichiers `package.json` et | Option | Description | Par défaut | |:-------------------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Construit pour les [plates-formes](../reference/cli.mdx#platforms) données (séparées par des virgules) par exemple. `windows/arm64`. Notez que si vous ne donnez pas l'architecture, `runtime.GOARCH` est utilisé. | platform = le contenu de la variable d'environnement `GOOS` si elle existe, autrement `runtime.GOOS`.
arch = le contenu de la variable d'environnement `GOARCH` si elle existe, autrement `runtime.GOARCH`. | | -clean | Nettoie le répertoire `build/bin` | | | -compiler "compiler" | Utiliser un autre compilateur pour compiler, par exemple go1.15beta1 | go | +| -debug | Conserve les informations de débogage dans l'application. Permet l'utilisation des outils de développement dans la fenêtre de l'application | | +| -dryrun | Prints the build command without executing it | | +| -f | Forcer la compilation de l'application | | +| -garbleargs | Arguments à passer à garble | `-literals -tiny -seed=random` | | -ldflags "flags" | Options supplémentaires à passer au compilateur | | +| -m | Skip mod tidy before compile | | | -nopackage | Ne pas empaqueter l'application | | +| -nocolour | Disable colour in output | | +| -nosyncgomod | Ne pas synchroniser go.mod avec la version Wails | | +| -nsis | Generate NSIS installer for Windows | | | -o filename | Nom du fichier de sortie | | -| -s | Ignorer la construction du frontend | false | -| -f | Forcer la compilation de l'application | false | +| -obfuscated | Cacher le code de l'application en utilisant [garble](https://github.com/burrowers/garble) | | +| -platform | Construit pour les [plates-formes](../reference/cli.mdx#platforms) données (séparées par des virgules) par exemple. `windows/arm64`. Notez que si vous ne donnez pas l'architecture, `runtime.GOARCH` est utilisé. | platform = le contenu de la variable d'environnement `GOOS` si elle existe, autrement `runtime.GOOS`.
arch = le contenu de la variable d'environnement `GOARCH` si elle existe, autrement `runtime.GOARCH`. | +| -race | Construire avec le détecteur Go race | | +| -s | Ignorer la construction du frontend | | +| -skipbindings | Skip bindings generation | | | -tags "extra tags" | Options de compilation à passer au compilateur Go. Doivent être entre guillemets. Séparés par un espace ou une virgule (pas les deux) | | +| -trimpath | Supprimer tous les chemins vers les fichiers système de l'exécutable final. | | +| -u | Met à jour le `go.mod de votre projet` pour utiliser la même version de Wails que le CLI | | | -upx | Compresser le binaire final en utilisant "upx" | | | -upxflags | Options à passer à upx | | | -v int | Niveau de verbosité (0 - silencieux, 1 - par défaut, 2 - verbeux) | 1 | | -webview2 | Stratégie d'installation WebView2 : download,embed,browser,error | download | -| -u | Met à jour le `go.mod de votre projet` pour utiliser la même version de Wails que le CLI | | -| -debug | Conserve les informations de débogage dans l'application. Permet l'utilisation des outils de développement dans la fenêtre de l'application | false | -| -trimpath | Supprimer tous les chemins vers les fichiers système de l'exécutable final. | false | -| -race | Construire avec le détecteur Go race | false | | -windowsconsole | Garder la fenêtre de la console lors de la construction d'une version pour Windows | | -| -obfuscate | Cacher le code de l'application en utilisant [garble](https://github.com/burrowers/garble) | false | -| -garbleargs | Arguments à passer à garble | `-literals -tiny -seed=random` | -| -nosyncgomod | Ne pas synchroniser go.mod avec la version Wails | false | Pour une description détaillée des options `webview2` , veuillez vous référer au Guide de [Windows](../guides/windows.mdx). @@ -159,37 +164,36 @@ Your system is ready for Wails development! - Un observateur est démarré et déclenchera une reconstruction de votre application de développement s'il détecte des changements dans vos fichiers go - Un serveur web est lancé sur `http://localhost:34115` qui sert votre application (et pas seulement le frontend) sur http. Cela vous permet d'utiliser les extensions de développement de votre navigateur favori - Tous les assets de l'application sont chargés à partir du disque. Si elles sont modifiées, l'application se rechargera automatiquement (pas de recompilation). Tous les navigateurs connectés rechargeront également -- Un module JS est généré qui fournit les éléments suivants : - - Les méthodes Javascript permettant d'appeler vos méthodes Go avec JSDoc autogénérée, vous fournissant des indications sur les méthodes - - Les versions TypeScript de vos structures Go, qui peuvent être construites et transmises à vos méthodes go -- Un second module JS est généré qui fournit une déclaration des méthodes et structures pour l'exécutable -- Sur macOS, il regroupera l'application dans un fichier `.app` et l'exécutera. Il utilisera un `build/darwin/Info.dev.plist` pour le développement. +- A JS module is generated that provides the following: + - JavaScript wrappers of your Go methods with autogenerated JSDoc, providing code hinting + - TypeScript versions of your Go structs, that can be constructed and passed to your go methods +- A second JS module is generated that provides a wrapper + TS declaration for the runtime +- On macOS, it will bundle the application into a `.app` file and run it. It will use a `build/darwin/Info.dev.plist` for development. | Option | Description | Par défaut | |:------------------------------------ |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:------------------------ | +| -appargs "args" | Arguments passés à l'application en style shell | | | -assetdir "./chemin/vers/les/assets" | Sert les assets depuis le répertoire donné au lieu d'utiliser le fichier FS fourni | Valeur dans `wails.json` | | -browser | Ouvre un navigateur à `http://localhost:34115` au démarrage | | | -compiler "compiler" | Utiliser un autre compilateur pour compiler, par exemple go1.15beta1 | go | -| -e | Extensions pour déclencher les rebuilds (séparés par des virgules) | go | -| -reloaddirs | Répertoires supplémentaires pour déclencher les recharges (séparés par des virgules) | Valeur dans `wails.json` | -| -ldflags "flags" | Options supplémentaires à passer au compilateur | | -| -tags "extra tags" | Options de construction à passer au compilateur (séparées par des guillemets et des espaces) | | -| -loglevel "loglevel" | Niveau de log à utiliser - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Désactiver le rechargement automatique lorsque les actifs changent | | -| -nocolour | Désactiver la couleur dans le terminal | false | -| -nogen | Désactiver la génération du module | | -| -v | Niveau de verbosité (0 - silencieux, 1 - par défaut, 2 - verbeux) | 1 | -| -wailsjsdir | Le répertoire où stocker les modules JS Wails générés | Valeur dans `wails.json` | | -debounce | Le temps d'attente pour le rechargement après qu'une modification d'actif est détectée | 100 (millisecondes) | | -devserver "host:port" | L'adresse à laquelle lier le serveur de développement wails | "localhost:34115" | +| -extensions | Extensions pour déclencher les rebuilds (séparés par des virgules) | go | +| -forcebuild | Force build of application | | | -frontenddevserverurl "url" | Utiliser l'url du serveur de développement tiers pour servir les actifs, EG Vite | "" | -| -appargs "args" | Arguments passés à l'application en style shell | | -| -save | Sauvegarde les options `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` dans `wails.json` pour quelles deviennent les informations par défaut pour les prochaines utilisations. | | -| -race | Construire avec le détecteur Go race | false | -| -s | Ignorer la construction du frontend | false | +| -ldflags "flags" | Options supplémentaires à passer au compilateur | | +| -loglevel "loglevel" | Niveau de log à utiliser - Trace, Debug, Info, Warning, Error | Debug | +| -nocolour | Désactiver la couleur dans le terminal | false | +| -noreload | Désactiver le rechargement automatique lorsque les actifs changent | | | -nosyncgomod | Ne pas synchroniser go.mod avec la version Wails | false | - - +| -race | Construire avec le détecteur Go race | false | +| -reloaddirs | Répertoires supplémentaires pour déclencher les recharges (séparés par des virgules) | Valeur dans `wails.json` | +| -s | Ignorer la construction du frontend | false | +| -save | Sauvegarde les options `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` dans `wails.json` pour quelles deviennent les informations par défaut pour les prochaines utilisations. | | +| -skipbindings | Skip bindings generation | | +| -tags "extra tags" | Options de construction à passer au compilateur (séparées par des guillemets et des espaces) | | +| -v | Niveau de verbosité (0 - silencieux, 1 - par défaut, 2 - verbeux) | 1 | +| -wailsjsdir | Le répertoire où stocker les modules JS Wails générés | Valeur dans `wails.json` | Exemple: diff --git a/website/i18n/fr/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/fr/docusaurus-plugin-content-pages/changelog.mdx index c635063ff..e2073d6f1 100644 --- a/website/i18n/fr/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/fr/docusaurus-plugin-content-pages/changelog.mdx @@ -13,7 +13,15 @@ Le format est basé sur [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] -## [v2.5.1] - 2023-05-16 +### Corrections + +- Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) + +### Changements + +- Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) + +## v2.5.1 - 2023-05-16 ### Modifications importantes diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx index 235f8cb5f..458e636fa 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx @@ -47,11 +47,11 @@ var assets embed.FS アプリケーションの`info.plist`が無効である可能性があります。 `build/.app/Contents/info.plist`ファイルを更新し、データが有効かどうかを確認します。たとえば、バイナリ名が正しいかどうかを確認してください。 変更を反映するには、ファイルを`build/darwin`ディレクトリにコピーします。 -## My application is not displaying the correct icon in Windows Explorer +## Windowsのエクスプローラにアプリケーションアイコンが正しく表示されません -If your application is not displaying the correct icon, try deleting the hidden `IconCache.db` file located in the `C:\Users\<your username>\AppData\Local` directory. This will force Windows to rebuild the icon cache. +アプリケーションアイコンが正しく表示されない場合は、`C:\Users\<あなたのユーザ名>\AppData\Local`ディレクトリ内にある、`IconCache.db`という隠しファイルを削除してみてください。 これにより、Windowsのアイコンキャッシュが強制的に再作成されます。 -Source: https://github.com/wailsapp/wails/issues/2360#issuecomment-1556070036 +出典: https://github.com/wailsapp/wails/issues/2360#issuecomment-1556070036 ## 可変長引数を持つバックエンドメソッドをフロントエンドから呼び出せません diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx index 9c7a29fd4..5c3f77286 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -51,27 +51,32 @@ WailsではGitHubでホストされているリモートテンプレートをサ | フラグ | 説明 | デフォルト | |:-------------------- |:-------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | 指定された[プラットフォーム](../reference/cli.mdx#platforms)(カンマ区切り) 向けにビルドする。例: `windows/arm64`。 アーキテクチャを指定しない場合は、`runtime.GOARCH`の値が使用されます。 | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | | -clean | `build/bin`ディレクトリをクリーンする | | | -compiler "compiler" | 違うGoコンパイラを使用する。例: go1.15beta1 | go | +| -debug | アプリケーションのデバッグ情報を保持する。 これにより、アプリケーションウィンドウで開発者ツールを使用することを許可できます。 | | +| -dryrun | 実際には実行せずにbuildコマンドの結果を表示する | | +| -f | アプリケーションを強制的にビルド | | +| -garbleargs | garbleへ渡す引数 | `-literals -tiny -seed=random` | | -ldflags "flags" | コンパイラに渡す追加のldflags | | +| -m | コンパイル前のmod tidyの実行をスキップする | | | -nopackage | アプリケーションをパッケージ化しない | | +| -nocolour | 出力文字に色をつけない | | +| -nosyncgomod | go.modとWailsのバージョンを同期させない | | +| -nsis | Windows向けのNSISインストーラを生成する | | | -o filename | 出力ファイル名 | | -| -s | フロントエンドのビルドをスキップ | false | -| -f | アプリケーションを強制的にビルド | false | +| -obfuscated | [garble](https://github.com/burrowers/garble)を使用してアプリケーションを難読化する | | +| -platform | 指定された[プラットフォーム](../reference/cli.mdx#platforms)(カンマ区切り) 向けにビルドする。例: `windows/arm64`。 アーキテクチャを指定しない場合は、`runtime.GOARCH`の値が使用されます。 | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | +| -race | Goのrace detectorを使用してビルドする | | +| -s | フロントエンドのビルドをスキップ | | +| -skipbindings | バインディングの生成をスキップする | | | -tags "extra tags" | Goコンパイラに渡すビルドタグ。 値は引用符で囲んでください。 また、スペースまたはカンマで区切ってください(両方は使用しないでください)。 | | +| -trimpath | 実行可能ファイルから、すべてのファイルシステムパスを削除する | | +| -u | プロジェクトの`go.mod`を更新し、CLIと同じバージョンのWailsを使用する | | | -upx | "upx"を使用して最終的にバイナリを圧縮する | | | -upxflags | upxに渡すフラグ | | | -v int | 詳細度レベル (0 - サイレント, 1 - デフォルト, 2 - 詳細) | 1 | | -webview2 | WebView2インストーラーのストラテジ: download,embed,browser,error | download | -| -u | プロジェクトの`go.mod`を更新し、CLIと同じバージョンのWailsを使用する | | -| -debug | アプリケーションのデバッグ情報を保持する。 これにより、アプリケーションウィンドウで開発者ツールを使用することを許可できます。 | false | -| -trimpath | 実行可能ファイルから、すべてのファイルシステムパスを削除する | false | -| -race | Goのrace detectorを使用してビルドする | false | | -windowsconsole | Windiws向けビルドでコンソールウィンドウを維持する | | -| -obfuscate | [garble](https://github.com/burrowers/garble)を使用してアプリケーションを難読化する | false | -| -garbleargs | garbleへ渡す引数 | `-literals -tiny -seed=random` | -| -nosyncgomod | go.modとWailsのバージョンを同期させない | false | `webview2`フラグの詳細については、[Windows](../guides/windows.mdx)ガイドをご覧ください。 @@ -159,37 +164,36 @@ Your system is ready for Wails development! - ウォッチャーが起動し、Goファイルの変更を検出した際には、アプリがリビルドされます - `http://localhost:34115`でWebサーバが起動し、HTTP経由でアプリケーション(フロントエンドだけではありません)が提供されます。 これにより、任意のブラウザ拡張機能を使用することができます - すべてのアプリケーションアセットはディスクから読み込まれます。 アセットが変更された場合、アプリケーションは自動的に、リビルドではなくリロードされます。 接続されているすべてのブラウザもリロードされます -- 以下を提供するJSモジュールが生成されます: - - コードヒントを提供してくれるJSDocが自動付与された、GoメソッドのJavaScriptラッパー - - インスタンス生成したりGoメソッドに渡すことのできる、Go構造体のTypeScriptバージョン -- ランタイム用のラッパーおよびTypeScript型定義を含むJSモジュールも生成されます -- MacOSでは、アプリケーションを`.app`ファイルにバンドルして実行されます。 開発向けに、`build/darwin/Info.dev.plist`が使用されます。 +- 以下のものを含むJSモジュールが生成されます: + - GoメソッドのJavaScriptラッパー (コードヒントに有用なJSDocも自動付与されています) + - Goの構造体のTypeScriptバージョン (構造体のインスタンスを生成したり、Goメソッドの引数として渡したりすることができます) +- 別のJSモジュールとして、ランタイムのラッパーおよびTS定義も生成されます +- macOSの場合、アプリケーションは`.app`ファイルにバンドルされて実行されます。 これには、開発用の`build/darwin/Info.dev.plist`を使用します。 | フラグ | 説明 | デフォルト | |:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------- |:--------------------- | +| -appargs "args" | シェル形式でアプリケーションに渡される引数 | | | -assetdir "./path/to/assets" | 通常のアセットFSを使用する代わりに、指定されたディレクトリからアセットを提供する | `wails.json`で指定されている値 | | -browser | 起動時にブラウザで`http://localhost:34115`を開く | | | -compiler "compiler" | 違うGoコンパイラを使用する。例: go1.15beta1 | go | -| -e | リビルドをトリガーする拡張子 (カンマ区切り) | go | -| -reloaddirs | リロードをトリガーする追加ディレクトリ (カンマ区切り) | `wails.json`で指定されている値 | -| -ldflags "flags" | コンパイラに渡す追加のldflags | | -| -tags "extra tags" | コンパイラへ渡すビルドタグ (引用符およびスペース区切り) | | -| -loglevel "loglevel" | 使用するログレベル - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | アセットが変更されたときの自動リロードを無効にする | | -| -nocolour | CLIのカラー出力を無効にする | false | -| -nogen | モジュールの生成を無効にする | | -| -v | 詳細度レベル (0 - サイレント, 1 - デフォルト, 2 - 詳細) | 1 | -| -wailsjsdir | 生成されたWailsのJSモジュールを格納するディレクトリ | `wails.json`で指定されている値 | | -debounce | アセットの変更が検出されたあと、リロードするまでの時間 | 100 (ミリ秒) | | -devserver "host:port" | Wails開発サーバをバインドするアドレス | "localhost:34115" | +| -extensions | リビルドをトリガーする拡張子 (カンマ区切り) | go | +| -forcebuild | アプリケーションを強制的にビルドする | | | -frontenddevserverurl "url" | アセットを提供するサードパーティ製の開発サーバ(例: Vite) を使用する | "" | -| -appargs "args" | シェル形式でアプリケーションに渡される引数 | | -| -save | 指定された`assetdir`、`reloaddirs`、`wailsjsdir`、`debounce`、`devserver`、`frontenddevserverurl`フラグの値を、`wails.json`へ保存し、次回以降のデフォルト値にする | | -| -race | Goのrace detectorを使用してビルドする | false | -| -s | フロントエンドのビルドをスキップ | false | +| -ldflags "flags" | コンパイラに渡す追加のldflags | | +| -loglevel "loglevel" | 使用するログレベル - Trace, Debug, Info, Warning, Error | Debug | +| -nocolour | CLIのカラー出力を無効にする | false | +| -noreload | アセットが変更されたときの自動リロードを無効にする | | | -nosyncgomod | go.modとWailsのバージョンを同期させない | false | - - +| -race | Goのrace detectorを使用してビルドする | false | +| -reloaddirs | リロードをトリガーする追加ディレクトリ (カンマ区切り) | `wails.json`で指定されている値 | +| -s | フロントエンドのビルドをスキップ | false | +| -save | 指定された`assetdir`、`reloaddirs`、`wailsjsdir`、`debounce`、`devserver`、`frontenddevserverurl`フラグの値を、`wails.json`へ保存し、次回以降のデフォルト値にする | | +| -skipbindings | バインディングの生成をスキップする | | +| -tags "extra tags" | コンパイラへ渡すビルドタグ (引用符およびスペース区切り) | | +| -v | 詳細度レベル (0 - サイレント, 1 - デフォルト, 2 - 詳細) | 1 | +| -wailsjsdir | 生成されたWailsのJSモジュールを格納するディレクトリ | `wails.json`で指定されている値 | 例: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.5.0.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.5.0.json index c7fb70c83..f7250a99a 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.5.0.json +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.5.0.json @@ -4,35 +4,35 @@ "description": "The label for version v2.5.0" }, "sidebar.docs.category.Getting Started": { - "message": "Getting Started", + "message": "はじめよう", "description": "The label for category Getting Started in sidebar docs" }, "sidebar.docs.category.Reference": { - "message": "Reference", + "message": "リファレンス", "description": "The label for category Reference in sidebar docs" }, "sidebar.docs.category.Runtime": { - "message": "Runtime", + "message": "ランタイム", "description": "The label for category Runtime in sidebar docs" }, "sidebar.docs.category.Community": { - "message": "Community", + "message": "コミュニティ", "description": "The label for category Community in sidebar docs" }, "sidebar.docs.category.Showcase": { - "message": "Showcase", + "message": "事例紹介", "description": "The label for category Showcase in sidebar docs" }, "sidebar.docs.category.Guides": { - "message": "Guides", + "message": "ガイド", "description": "The label for category Guides in sidebar docs" }, "sidebar.docs.category.Tutorials": { - "message": "Tutorials", + "message": "チュートリアル", "description": "The label for category Tutorials in sidebar docs" }, "sidebar.docs.link.Contributing": { - "message": "Contributing", + "message": "コントリビューション", "description": "The label for link Contributing in sidebar docs, linking to /community-guide#ways-of-contributing" } } diff --git a/website/i18n/ja/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/ja/docusaurus-plugin-content-pages/changelog.mdx index 866a230e0..e8963ce54 100644 --- a/website/i18n/ja/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-pages/changelog.mdx @@ -13,7 +13,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [v2.5.1] - 2023-05-16 +### Fixed + +- Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) + +### Changed + +- Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) + +## v2.5.1 - 2023-05-16 ### Breaking Changes diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx index 71d51b616..10e021f5a 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -51,27 +51,32 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for | Flag | Description | Default | |:-------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | | -clean | Cleans the `build/bin` directory | | | -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | +| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | | +| -dryrun | Prints the build command without executing it | | +| -f | Force build application | | +| -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | | -ldflags "flags" | Additional ldflags to pass to the compiler | | +| -m | Skip mod tidy before compile | | | -nopackage | Do not package application | | +| -nocolour | Disable colour in output | | +| -nosyncgomod | Do not sync go.mod with the Wails version | | +| -nsis | Generate NSIS installer for Windows | | | -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | +| -obfuscated | Obfuscate the application using [garble](https://github.com/burrowers/garble) | | +| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | +| -race | Build with Go's race detector | | +| -s | Skip building the frontend | | +| -skipbindings | Skip bindings generation | | | -tags "extra tags" | Build tags to pass to Go compiler. Must be quoted. Space or comma (but not both) separated | | +| -trimpath | Remove all file system paths from the resulting executable. | | +| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | | -upx | Compress final binary using "upx" | | | -upxflags | Flags to pass to upx | | | -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | | -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | | -windowsconsole | Keep the console window for Windows builds | | -| -obfuscate | Obfuscate the application using [garble](https://github.com/burrowers/garble) | false | -| -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | -| -nosyncgomod | Do not sync go.mod with the Wails version | false | For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. @@ -167,29 +172,28 @@ Your system is ready for Wails development! | Flag | Description | Default | |:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | +| -appargs "args" | Arguments passed to the application in shell style | | | -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | | -browser | Opens a browser to `http://localhost:34115` on startup | | | -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nocolour | Turn off colour cli output | false | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | | -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | | -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | +| -extensions | Extensions to trigger rebuilds (comma separated) | go | +| -forcebuild | Force build of application | | | -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | +| -ldflags "flags" | Additional ldflags to pass to the compiler | | +| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | +| -nocolour | Turn off colour cli output | false | +| -noreload | Disable automatic reload when assets change | | | -nosyncgomod | Do not sync go.mod with the Wails version | false | - - +| -race | Build with Go's race detector | false | +| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | +| -s | Skip building the frontend | false | +| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | +| -skipbindings | Skip bindings generation | | +| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | +| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | +| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | Example: diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/changelog.mdx index a9e705068..0bc23b162 100644 --- a/website/i18n/ko/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-pages/changelog.mdx @@ -13,7 +13,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [v2.5.1] - 2023-05-16 +### Fixed + +- Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) + +### Changed + +- Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) + +## v2.5.1 - 2023-05-16 ### Breaking Changes diff --git a/website/i18n/pt/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/pt/docusaurus-plugin-content-docs/current/reference/cli.mdx index 7e9fb535d..f1fe9aeb6 100644 --- a/website/i18n/pt/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/pt/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -51,27 +51,32 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for | Flag | Descrição | Padrão | |:-------------------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Compila para as plataformas [(delimitadas por vírgula)](../reference/cli.mdx#platforms) por exemplo. `windows/arm64`. Note, se você não der arquitetura, `runtime.GOARCH` é usado. | platform = `variável de ambiente GOOS` se determinado `runtime.GOOS`.
arch = `GOARCH` variável de envrionment se for dado `runtime.GOARCH`. | | -clean | Limpa o diretório `compilação/bin` | | | -compiler "compiler" | Use um compilador de ida diferente para realizar build, por exemplo, go1.15beta1 | go | +| -debug | Mantém as informações de depuração no aplicativo. Permite o uso das ferramentas devtools na janela do aplicativo | | +| -dryrun | Prints the build command without executing it | | +| -f | Forçar compilação de aplicação | | +| -garbleargs | Argumentos para passar para o garble | `-literals -tiny -seed=random` | | -ldflags "flags" | Ldflags adicionais para passar para o compilador | | +| -m | Skip mod tidy before compile | | | -nopackage | Não empacotar aplicação | | +| -nocolour | Disable colour in output | | +| -nosyncgomod | Do not sync go.mod with the Wails version | | +| -nsis | Generate NSIS installer for Windows | | | -o nome de arquivo | Nome do Arquivo de Saída | | -| -s | Pular build do frontend | false | -| -f | Forçar compilação de aplicação | false | +| -obfuscated | Ofuscar a aplicação usando [garble](https://github.com/burrowers/garble) | | +| -platform | Compila para as plataformas [(delimitadas por vírgula)](../reference/cli.mdx#platforms) por exemplo. `windows/arm64`. Note, se você não der arquitetura, `runtime.GOARCH` é usado. | platform = `variável de ambiente GOOS` se determinado `runtime.GOOS`.
arch = `GOARCH` variável de envrionment se for dado `runtime.GOARCH`. | +| -race | Realiza build com o Go race detector | | +| -s | Pular build do frontend | | +| -skipbindings | Skip bindings generation | | | -tags "extra tags" | Compilar tags para passar para o compilador Go. Deve ser citado. Separados por espaço ou vírgula (mas não ambos) | | +| -trimpath | Remove todos os caminhos do sistema de arquivo do executável resultante. | | +| -u | Atualiza o `go.mod` do seu projeto para usar a mesma versão de Wails que o CLI | | | -upx | Comprimir binário final usando "upx" | | | -upxflags | Flags para passar para o upx | | | -v int | Nível de verbosidade(0 - silencioso, 1 - padrão, 2 - verbose) | 1 | | -webview2 | Estratégia de instalação WebView2: download,embed,browser,error | baixar | -| -u | Atualiza o `go.mod` do seu projeto para usar a mesma versão de Wails que o CLI | | -| -debug | Mantém as informações de depuração no aplicativo. Permite o uso das ferramentas devtools na janela do aplicativo | false | -| -trimpath | Remove todos os caminhos do sistema de arquivo do executável resultante. | false | -| -race | Realiza build com o Go race detector | false | | -windowsconsole | Manter a janela de console para builds do Windows | | -| -obfuscate | Ofuscar a aplicação usando [garble](https://github.com/burrowers/garble) | false | -| -garbleargs | Argumentos para passar para o garble | `-literals -tiny -seed=random` | -| -nosyncgomod | Do not sync go.mod with the Wails version | false | Para uma descrição detalhada do sinalizador `webview2`, consulte o guia [Windows](../guides/windows.mdx). @@ -159,37 +164,36 @@ Your system is ready for Wails development! - Um observador é iniciado e acionará uma reconstrução do seu aplicativo de desenvolvimento se ele detectar alterações em seus arquivos go - Um servidor web foi iniciado em `http://localhost:34115` que serve sua aplicação (não apenas frontend) sobre http. Isso permite que você use suas extensões de desenvolvimento de navegador favoritas - Todos os conteúdos do aplicativo são carregados do disco. Se forem alterados, o aplicativo irá recarregar automaticamente (não reconstruir). Todos os navegadores conectados também recarregarão -- Um módulo JS é gerado que fornece o seguinte: +- A JS module is generated that provides the following: - JavaScript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - Versões do TypeScript de suas structs Go, que podem ser construídas e passadas para os métodos da sua ida -- Um segundo módulo JS é gerado que fornece uma declaração wrapper + TS para o tempo de execução -- No macOS, ele irá empacotar a aplicação em um arquivo `.app` e executá-lo. Será usado um `build/darwin/Info.dev.plist` para desenvolvimento. + - TypeScript versions of your Go structs, that can be constructed and passed to your go methods +- A second JS module is generated that provides a wrapper + TS declaration for the runtime +- On macOS, it will bundle the application into a `.app` file and run it. It will use a `build/darwin/Info.dev.plist` for development. | Flag | Descrição | Padrão | |:--------------------------------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | +| -appargs "args" | Argumentos passados para o aplicativo no estilo shell | | | -assetdir "./caminho/para/midias" | Serve os arquivos a partir do diretório fornecido em vez de usar os arquivos FS fornecidos | Valor em `wails.json` | | -browser | Abre um navegador para `http://localhost:34115` na inicialização | | | -compiler "compiler" | Use um compilador de ida diferente para realizar build, por exemplo, go1.15beta1 | go | -| -e | Extensões para acionar reconstruções (separadas por vírgula) | go | -| -reloaddirs | Diretórios adicionais para acionar recarregamentos (separados por vírgula) | Valor em `wails.json` | -| -ldflags "flags" | Ldflags adicionais para passar para o compilador | | -| -tags "extra tags" | Compilar tags para passar para o compilador (citado e espaço separado) | | -| -loglevel "loglevel" | Nível de log a ser usado - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Desativar a recarga automática quando os arquivos forem alterados | | -| -nocolour | Desativar saída da colorida da cli | false | -| -nogen | Desativar módulo de geração | | -| -v | Nível de verbosidade(0 - silencioso, 1 - padrão, 2 - verbose) | 1 | -| -wailsjsdir | O diretório para gerar os módulos gerados do Wails JS | Valor em `wails.json` | | -debounce | O tempo de esperar por recarregar depois que uma alteração de ativo for detectada | 100 (milliseconds) | | -devserver "host:port" | O endereço para vincular o servidor de desenvolvimento de wails a | "localhost:34115" | +| -extensions | Extensões para acionar reconstruções (separadas por vírgula) | go | +| -forcebuild | Force build of application | | | -frontenddevserverurl "url" | Usar URL do servidor de desenvolvimento de terceiros para servir midias, Vite EG | "" | -| -appargs "args" | Argumentos passados para o aplicativo no estilo shell | | -| -save | Salva o `assetdir`, `reloaddirs`,`wailsjsdir`,`debounce`,`devserver` e `frontenddevserverurl` passado, flag em `wails.json` para realizar chamadas subsequentes. | | -| -race | Realiza build com o Go race detector | false | -| -s | Pular build do frontend | false | +| -ldflags "flags" | Ldflags adicionais para passar para o compilador | | +| -loglevel "loglevel" | Nível de log a ser usado - Trace, Debug, Info, Warning, Error | Debug | +| -nocolour | Desativar saída da colorida da cli | false | +| -noreload | Desativar a recarga automática quando os arquivos forem alterados | | | -nosyncgomod | Do not sync go.mod with the Wails version | false | - - +| -race | Realiza build com o Go race detector | false | +| -reloaddirs | Diretórios adicionais para acionar recarregamentos (separados por vírgula) | Valor em `wails.json` | +| -s | Pular build do frontend | false | +| -save | Salva o `assetdir`, `reloaddirs`,`wailsjsdir`,`debounce`,`devserver` e `frontenddevserverurl` passado, flag em `wails.json` para realizar chamadas subsequentes. | | +| -skipbindings | Skip bindings generation | | +| -tags "extra tags" | Compilar tags para passar para o compilador (citado e espaço separado) | | +| -v | Nível de verbosidade(0 - silencioso, 1 - padrão, 2 - verbose) | 1 | +| -wailsjsdir | O diretório para gerar os módulos gerados do Wails JS | Valor em `wails.json` | Exemplo: diff --git a/website/i18n/pt/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/pt/docusaurus-plugin-content-pages/changelog.mdx index 03c8f676f..c12395f44 100644 --- a/website/i18n/pt/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/pt/docusaurus-plugin-content-pages/changelog.mdx @@ -13,7 +13,15 @@ O formato é baseado em [Manter um Log de Alterações](https://keepachangelog.c ## [Unreleased] -## [v2.5.1] - 2023-05-16 +### Corrigido + +- Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) + +### Alterado + +- Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) + +## v2.5.1 - 2023-05-16 ### Grandes Alterações diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx index 71d51b616..10e021f5a 100644 --- a/website/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -51,27 +51,32 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for | Flag | Description | Default | |:-------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | | -clean | Cleans the `build/bin` directory | | | -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | +| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | | +| -dryrun | Prints the build command without executing it | | +| -f | Force build application | | +| -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | | -ldflags "flags" | Additional ldflags to pass to the compiler | | +| -m | Skip mod tidy before compile | | | -nopackage | Do not package application | | +| -nocolour | Disable colour in output | | +| -nosyncgomod | Do not sync go.mod with the Wails version | | +| -nsis | Generate NSIS installer for Windows | | | -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | +| -obfuscated | Obfuscate the application using [garble](https://github.com/burrowers/garble) | | +| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | +| -race | Build with Go's race detector | | +| -s | Skip building the frontend | | +| -skipbindings | Skip bindings generation | | | -tags "extra tags" | Build tags to pass to Go compiler. Must be quoted. Space or comma (but not both) separated | | +| -trimpath | Remove all file system paths from the resulting executable. | | +| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | | -upx | Compress final binary using "upx" | | | -upxflags | Flags to pass to upx | | | -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | | -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | | -windowsconsole | Keep the console window for Windows builds | | -| -obfuscate | Obfuscate the application using [garble](https://github.com/burrowers/garble) | false | -| -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | -| -nosyncgomod | Do not sync go.mod with the Wails version | false | For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. @@ -167,29 +172,28 @@ Your system is ready for Wails development! | Flag | Description | Default | |:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | +| -appargs "args" | Arguments passed to the application in shell style | | | -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | | -browser | Opens a browser to `http://localhost:34115` on startup | | | -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nocolour | Turn off colour cli output | false | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | | -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | | -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | +| -extensions | Extensions to trigger rebuilds (comma separated) | go | +| -forcebuild | Force build of application | | | -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | +| -ldflags "flags" | Additional ldflags to pass to the compiler | | +| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | +| -nocolour | Turn off colour cli output | false | +| -noreload | Disable automatic reload when assets change | | | -nosyncgomod | Do not sync go.mod with the Wails version | false | - - +| -race | Build with Go's race detector | false | +| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | +| -s | Skip building the frontend | false | +| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | +| -skipbindings | Skip bindings generation | | +| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | +| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | +| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | Example: diff --git a/website/i18n/ru/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/ru/docusaurus-plugin-content-pages/changelog.mdx index 866a230e0..e8963ce54 100644 --- a/website/i18n/ru/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/ru/docusaurus-plugin-content-pages/changelog.mdx @@ -13,7 +13,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [v2.5.1] - 2023-05-16 +### Fixed + +- Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) + +### Changed + +- Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) + +## v2.5.1 - 2023-05-16 ### Breaking Changes diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx index b46f13cf1..d6d3720a1 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -51,27 +51,32 @@ Wails CLI 有许多用于管理项目的命令。 所有命令都以此方式运 | 标志 | 描述 | 默认 | |:--------------- |:------------------------------------------------------------------------------------------------------------- |:---------------------------------------------------------------------------------------------------------- | -| -platform | 为指定的 [平台](../reference/cli#平台)(逗号分割)构建,例如: `windows/arm64`。 `windows/arm64`。 注意,如果不给出架构,则使用 `runtime.GOARCH`。 | 如果给定环境变量 platform = `GOOS` 否则等于 `runtime.GOOS`。
如果给定环境变量 arch = `GOARCH` 否则等于 `runtime.GOARCH`. | | -clean | 清理 `build/bin` 目录 | | | -compiler "编译器" | 使用不同的 go 编译器来构建,例如 go1.15beta1 | go | +| -debug | 在应用程序中保留调试信息。 允许在应用程序窗口中使用 devtools | | +| -dryrun | 打印构建命令但不执行它 | | +| -f | 强制构建应用 | | +| -garbleargs | 传递给 garble 的参数 | `-literals -tiny -seed=random` | | -ldflags "标志" | 传递给编译器的额外 ldflags | | +| -m | 编译前跳过 mod tidy | | | -nopackage | 不打包应用程序 | | +| -nocolour | 在输出中禁用颜色 | | +| -nosyncgomod | 不同步 go.mod 中的 Wails 版本 | | +| -nsis | 为 Windows 生成 NSIS 安装程序 | | | -o 文件名 | 输出文件名 | | -| -s | 跳过前端构建 | false | -| -f | 强制构建应用 | false | +| -obfuscated | 使用 [garble](https://github.com/burrowers/garble) 混淆应用程序 | | +| -platform | 为指定的 [平台](../reference/cli#平台)(逗号分割)构建,例如: `windows/arm64`。 `windows/arm64`。 注意,如果不给出架构,则使用 `runtime.GOARCH`。 | 如果给定环境变量 platform = `GOOS` 否则等于 `runtime.GOOS`。
如果给定环境变量 arch = `GOARCH` 否则等于 `runtime.GOARCH`. | +| -race | 使用 Go 的竞态检测器构建 | | +| -s | 跳过前端构建 | | +| -skipbindings | 跳过 bindings 生成 | | | -tags "额外标签" | 构建标签以传递给 Go 编译器。 必须引用。 空格或逗号(但不能同时使用)分隔 | | +| -trimpath | 从生成的可执行文件中删除所有文件系统路径。 | | +| -u | 更新项目的 `go.mod` 以使用与 CLI 相同版本的 Wails | | | -upx | 使用 “upx” 压缩最终二进制文件 | | | -upxflags | 传递给 upx 的标志 | | | -v int | 详细级别 (0 - silent, 1 - default, 2 - verbose) | 1 | | -webview2 | WebView2 安装策略:download,embed,browser,error. | download | -| -u | 更新项目的 `go.mod` 以使用与 CLI 相同版本的 Wails | | -| -debug | 在应用程序中保留调试信息。 允许在应用程序窗口中使用 devtools | false | -| -trimpath | 从生成的可执行文件中删除所有文件系统路径。 | false | -| -race | 使用 Go 的竞态检测器构建 | false | | -windowsconsole | 保留Windows构建控制台窗口 | | -| -obfuscate | 使用 [garble](https://github.com/burrowers/garble) 混淆应用程序 | false | -| -garbleargs | 传递给 garble 的参数 | `-literals -tiny -seed=random` | -| -nosyncgomod | 不同步 go.mod 中的 Wails 版本 | false | 有关 `webview2` 标志的详细描述,请参阅 [Windows 系统指南](../guides/windows)。 @@ -161,35 +166,34 @@ Your system is ready for Wails development! - 所有应用程序资源都从磁盘加载。 如果它们被更改,应用程序将自动重新加载(而不是重新构建)。 所有连接的浏览器也将重新加载 - 生成的 JS 模块提供以下内容: - 带有自动生成的 JSDoc 的 Go 方法的 JavaScript 包装器,提供代码提示 - - 您的 Go 结构体的 TypeScript 版本,可以构造并传递给您的 Go 方法 -- 生成的第二个 JS 模块,为运行时提供包装器 + TS 声明 -- 在 macOS 上,它会将应用程序打包到一个 `.app` 文件并运行它。 开发模式它将使用 `build/darwin/Info.dev.plist` 。 + - 您的 Go 结构的 TypeScript 版本,可以构建并传递给您的 go 方法 +- 生成第二个 JS 模块,为运行时提供包装器 + TS 声明 +- 在 macOS 上,它将应用程序捆绑到一个 `.app` 文件中并运行它。 开发模式将使用 `build/darwin/Info.dev.plist` 。 | 标志 | 描述 | 默认 | |:---------------------------- |:-------------------------------------------------------------------------------------------------------------------------------- |:----------------- | +| -appargs "参数" | 以 shell 样式传递给应用程序的参数 | | | -assetdir "./path/to/assets" | 从给定目录提供资产,而不是使用提供的资产 FS | `wails.json` 中的值 | | -browser | 在启动时打开浏览器到 `http://localhost:34115` | | | -compiler "编译器" | 使用不同的 go 编译器来构建,例如 go1.15beta1 | go | -| -e | 触发重新构建的扩展(逗号分隔) | go | -| -reloaddirs | 触发重新加载的附加目录(逗号分隔) | `wails.json` 中的值 | -| -ldflags "标志" | 传递给编译器的额外 ldflags | | -| -tags "额外标签" | 传递给编译器的构建标签(引号和空格分隔) | | -| -loglevel "日志级别" | 要使用的日志级别 - Trace, Debug, Info, Warning, Error | Debug(调试) | -| -noreload | 资产更改时禁用自动重新加载 | | -| -nocolour | 关闭彩色命令行输出 | false | -| -nogen | 禁用生成模块 | | -| -v | 详细级别 (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | 生成生成的Wails JS模块的目录 | `wails.json` 中的值 | | -debounce | 检测到资产更改后等待重新加载的时间 | 100 (毫秒) | | -devserver "host:port" | 将 wails 开发服务器绑定到的地址 | "localhost:34115" | +| -extensions | 触发重新构建的扩展(逗号分隔) | go | +| -forcebuild | 强制构建应用程序 | | | -frontenddevserverurl "url" | 使用 3rd 方开发服务器 url 提供资产,例如:Vite | "" | -| -appargs "参数" | 以 shell 样式传递给应用程序的参数 | | -| -save | 将指定的 `assetdir`、 `reloaddirs`、 `wailsjsdir`、 `debounce` 、 `devserver` 和 `frontenddevserverurl` 标志的值保存到 `wails.json` 以成为后续调用的默认值。 | | -| -race | 使用 Go 的竞态检测器构建 | false | -| -s | 跳过前端构建 | false | +| -ldflags "标志" | 传递给编译器的额外 ldflags | | +| -loglevel "日志级别" | 要使用的日志级别 - Trace, Debug, Info, Warning, Error | Debug(调试) | +| -nocolour | 关闭彩色命令行输出 | false | +| -noreload | 资产更改时禁用自动重新加载 | | | -nosyncgomod | 不同步 go.mod 中的 Wails 版本 | false | - - +| -race | 使用 Go 的竞态检测器构建 | false | +| -reloaddirs | 触发重新加载的附加目录(逗号分隔) | `wails.json` 中的值 | +| -s | 跳过前端构建 | false | +| -save | 将指定的 `assetdir`、 `reloaddirs`、 `wailsjsdir`、 `debounce` 、 `devserver` 和 `frontenddevserverurl` 标志的值保存到 `wails.json` 以成为后续调用的默认值。 | | +| -skipbindings | 跳过 bindings 生成 | | +| -tags "额外标签" | 传递给编译器的构建标签(引号和空格分隔) | | +| -v | 详细级别 (0 - silent, 1 - standard, 2 - verbose) | 1 | +| -wailsjsdir | 生成生成的Wails JS模块的目录 | `wails.json` 中的值 | 示例: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx index 8cf68556a..bb874869d 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx @@ -13,7 +13,15 @@ ## [即将发布] -## [v2.5.1] - 2023-05-16 +### 修复 + +- 当 Linux GTK 密钥为空时避免应用程序崩溃。 由 @aminya 在这个 [PR](https://github.com/wailsapp/wails/pull/2672) 中修复。 + +### 变更 + +- 更改了 `doctor` 命令的样式。 由 @MarvinJWendt 在 [PR](https://github.com/wailsapp/wails/pull/2660) 中更改。 + +## v2.5.1 - 2023-05-16 ### 重大变更 @@ -87,8 +95,8 @@ ### 修复 - Fixed failing build hooks when `build/bin` was missing. @Lyimmi 在 [PR](https://github.com/wailsapp/wails/pull/2273) 中修复 -- Fixed fullscreen mode for frameless window on Windows to fully cover the taskbar when changing into fullscreen from maximised state. @stffabi 在 [PR](https://github.com/wailsapp/wails/pull/2279) 中修复 -- Fixed set window background colour on Windows when setting the colour via runtime. @stffabi 在 [PR](https://github.com/wailsapp/wails/pull/2279) 中修复 +- Fixed fullscreen mode for frameless window on Windows to fully cover the taskbar when changing into fullscreen from maximised state. Fixed by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2279) +- Fixed set window background colour on Windows when setting the colour via runtime. Fixed by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2279) - Fixed the showing of a white border around a fullscreen window when `DisableWindowIcon` is active on Windows. Fixed by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2299) - Fixed the sometimes lagging drag experience with `--wails-draggable` on Windows. Fixed by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2302) - Fixed applying the default arch to platform flag in wails cli. If only a `GOOS` has been supplied as platform flag e.g. `wails build --platform windows` the current architecture wasn't applied and the build failed. Fixed by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2309) From 6d857bf61ad8e4835b84ab58e37407a2da1dfe03 Mon Sep 17 00:00:00 2001 From: 5aaee9 <7685264+5aaee9@users.noreply.github.com> Date: Sat, 3 Jun 2023 15:26:24 -0600 Subject: [PATCH 04/36] windows/nsis: add hidpi support for nsis installer (#2694) * feat(windows/nsis): add hidpi support for nsis installer * website: add changelog --- v2/examples/customlayout/build/windows/installer/project.nsi | 3 +++ v2/pkg/buildassets/build/windows/installer/project.nsi | 3 +++ website/src/pages/changelog.mdx | 1 + 3 files changed, 7 insertions(+) diff --git a/v2/examples/customlayout/build/windows/installer/project.nsi b/v2/examples/customlayout/build/windows/installer/project.nsi index 3b1588e0c..2ccc0f3f3 100644 --- a/v2/examples/customlayout/build/windows/installer/project.nsi +++ b/v2/examples/customlayout/build/windows/installer/project.nsi @@ -45,6 +45,9 @@ VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" +# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware +ManifestDPIAware true + !include "MUI.nsh" !define MUI_ICON "..\icon.ico" diff --git a/v2/pkg/buildassets/build/windows/installer/project.nsi b/v2/pkg/buildassets/build/windows/installer/project.nsi index 7b2148bc8..13cc4f023 100644 --- a/v2/pkg/buildassets/build/windows/installer/project.nsi +++ b/v2/pkg/buildassets/build/windows/installer/project.nsi @@ -45,6 +45,9 @@ VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" +# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware +ManifestDPIAware true + !include "MUI.nsh" !define MUI_ICON "..\icon.ico" diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 32a282031..0ed111b6f 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) +- Enable HiDPI option by default in windows nsis installer by @5aaee9 in [PR](https://github.com/wailsapp/wails/pull/2694) ## v2.5.1 - 2023-05-16 From 28a2b4fbd9b6424d1048f08449e9001fbc8716ae Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 9 Jun 2023 10:15:21 +1000 Subject: [PATCH 05/36] [v2] Update go mod dependency versions --- v2/go.mod | 42 +++++++++++++++++----------------- v2/go.sum | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 21 deletions(-) diff --git a/v2/go.mod b/v2/go.mod index a323c32d1..c40a121f9 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -13,33 +13,33 @@ require ( github.com/go-git/go-git/v5 v5.3.0 github.com/go-ole/go-ole v1.2.6 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 - github.com/google/uuid v1.1.2 + github.com/google/uuid v1.3.0 github.com/jackmordaunt/icns v1.0.0 github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e - github.com/labstack/echo/v4 v4.9.0 - github.com/labstack/gommon v0.3.1 + github.com/labstack/echo/v4 v4.10.2 + github.com/labstack/gommon v0.4.0 github.com/leaanthony/clir v1.3.0 github.com/leaanthony/debme v1.2.1 - github.com/leaanthony/go-ansi-parser v1.0.1 + github.com/leaanthony/go-ansi-parser v1.6.0 github.com/leaanthony/gosod v1.0.3 - github.com/leaanthony/slicer v1.5.0 + github.com/leaanthony/slicer v1.6.0 github.com/leaanthony/winicon v1.0.0 github.com/matryer/is v1.4.0 - github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 github.com/pkg/errors v0.9.1 github.com/pterm/pterm v0.12.49 github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 - github.com/samber/lo v1.27.1 - github.com/stretchr/testify v1.8.0 + github.com/samber/lo v1.38.1 + github.com/stretchr/testify v1.8.1 github.com/tc-hib/winres v0.1.5 github.com/tidwall/sjson v1.1.7 - github.com/tkrajina/go-reflector v0.5.5 + github.com/tkrajina/go-reflector v0.5.6 github.com/wailsapp/mimetype v1.4.1 github.com/wzshiming/ctc v1.2.3 - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 - golang.org/x/net v0.7.0 - golang.org/x/sys v0.5.0 - golang.org/x/tools v0.1.12 + golang.org/x/mod v0.8.0 + golang.org/x/net v0.10.0 + golang.org/x/sys v0.8.0 + golang.org/x/tools v0.6.0 ) require ( @@ -63,8 +63,8 @@ require ( github.com/kr/pretty v0.3.0 // indirect github.com/lithammer/fuzzysearch v1.1.5 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-colorable v0.1.11 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/microcosm-cc/bluemonday v1.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -73,23 +73,23 @@ require ( github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/tidwall/gjson v1.9.3 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.1 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/yuin/goldmark v1.4.13 // indirect github.com/yuin/goldmark-emoji v1.0.1 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/image v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/term v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/v2/go.sum b/v2/go.sum index 1eb919839..415b4e42d 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -28,6 +28,11 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52 v1.2.2 h1:NT7wkhEhPTcKnBCdPi9djmyy9L3JOL4+3SsfJyqptCo= +github.com/aymanbagabas/go-osc52 v1.2.2/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= @@ -36,6 +41,8 @@ github.com/bitfield/script v0.19.0 h1:W24f+FQuPab9gXcW8bhcbo5qO8AtrXyu3XOnR4zhHN github.com/bitfield/script v0.19.0/go.mod h1:ana6F8YOSZ3ImT8SauIzuYSqXgFVkSUJ6kgja+WMmIY= github.com/charmbracelet/glamour v0.5.0 h1:wu15ykPdB7X6chxugG/NNfDUbyyrCLV9XBalj5wdu3g= github.com/charmbracelet/glamour v0.5.0/go.mod h1:9ZRtG19AUIzcTm7FGLGbq3D5WKQ5UyZBbQsMQN0XIqc= +github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= +github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -44,6 +51,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= +github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -69,10 +78,13 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.2 h1:uLnfXcaFjlrDnQDT+NCBcfhrXqYTx/rcCa6xn01Y8yI= @@ -105,8 +117,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY= github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= +github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= +github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= github.com/leaanthony/clir v1.3.0 h1:L9nPDWrmc/qU9UWZZvRaFajWYuO0np9V5p+5gxyYno0= github.com/leaanthony/clir v1.3.0/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= @@ -114,10 +130,14 @@ github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oO github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4= github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM= +github.com/leaanthony/go-ansi-parser v1.6.0 h1:T8TuMhFB6TUMIUm0oRrSbgJudTFw9csT3ZK09w0t4Pg= +github.com/leaanthony/go-ansi-parser v1.6.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ= github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4= github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY= github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= +github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= +github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= github.com/leaanthony/winicon v1.0.0 h1:ZNt5U5dY71oEoKZ97UVwJRT4e+5xo5o/ieKuHuk8NqQ= github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU= github.com/lithammer/fuzzysearch v1.1.5 h1:Ag7aKU08wp0R9QCfF4GoGST9HbmAIeLP7xwMrOBEp1c= @@ -128,21 +148,34 @@ github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.17 h1:Z1a//hgsQ4yjC+8zEkV8IWySkXnsxmdSY642CTFQb5Y= github.com/microcosm-cc/bluemonday v1.0.17/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= +github.com/microcosm-cc/bluemonday v1.0.24 h1:NGQoPtwGVcbGkKfvyYk1yRqknzBuoMiUrO6R7uFTPlw= +github.com/microcosm-cc/bluemonday v1.0.24/go.mod h1:ArQySAMps0790cHSkdPEJ7bGkF2VePWH773hsJNSHf8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.9.0 h1:wnbOaGz+LUR3jNT0zOzinPnyDaCZUQRZj9GxK8eRVl8= github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw= +github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= +github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= +github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -150,6 +183,8 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 h1:acNfDZXmm28D2Yg/c3ALnZStzNaZMSagpbr96vY6Zjc= github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -167,12 +202,16 @@ github.com/pterm/pterm v0.12.49/go.mod h1:D4OBoWNqAfXkm5QLTjIgjNiMXPHemLJHnIreGU github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= github.com/samber/lo v1.27.1 h1:sTXwkRiIFIQG+G0HeAvOEnGjqWeWtI9cg5/n51KrxPg= github.com/samber/lo v1.27.1/go.mod h1:it33p9UtPMS7z72fP4gw/EIfQB2eI8ke7GR2wc6+Rhg= +github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= +github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -180,6 +219,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -187,6 +227,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tc-hib/winres v0.1.5 h1:2dA5yfjdoEA3UyRaOC92HNMt3jap66pLzoW4MjpC/0M= github.com/tc-hib/winres v0.1.5/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A= github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= @@ -203,10 +244,14 @@ github.com/tidwall/sjson v1.1.7 h1:sgVPwu/yygHJ2m1pJDLgGM/h+1F5odx5Q9ljG3imRm8= github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs= github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ= github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= +github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE= +github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= github.com/wzshiming/ctc v1.2.3 h1:q+hW3IQNsjIlOFBTGZZZeIXTElFM4grF4spW/errh/c= @@ -221,6 +266,9 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= +github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -229,22 +277,31 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -271,24 +328,35 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 3dbe6e96c13f4d2245a9e8a6858d62b68a209f60 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:40:39 +1000 Subject: [PATCH 06/36] chore: update sponsors.svg (#2701) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index d4d167616..4953896df 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -21,7 +21,7 @@ text {
Covering Costs Nick - + Marcus @@ -35,32 +35,28 @@ text { Matt Holt Buying Breakfast - tc-hib - + tc-hib + - Liam - + Liam + - Tai Groot - + Tai Groot + - Michael - + Michael + - Bironou - + Bironou + - Arden - - - - beproac... - + Arden + Buying Coffee From 41edd78953f069d1599f8516ca660703b539e878 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 10 Jun 2023 17:01:01 +1000 Subject: [PATCH 07/36] Update format-markdown-files.yml --- .github/workflows/format-markdown-files.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/format-markdown-files.yml b/.github/workflows/format-markdown-files.yml index d30546428..a8f7de9c1 100644 --- a/.github/workflows/format-markdown-files.yml +++ b/.github/workflows/format-markdown-files.yml @@ -1,9 +1,5 @@ name: Format Markdown Files -on: - workflow_dispatch: - push: - branches: [master] jobs: format_markdown_files: From f2ab205415eb8aecf4d2f913e7600fad40819540 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 10 Jun 2023 17:04:31 +1000 Subject: [PATCH 08/36] [chore] Use webview2 package (#2687) * [v2 windows] Use external webview2 package * Update CHANGELOG --- v2/go.mod | 2 + v2/go.sum | 2 + .../frontend/desktop/windows/frontend.go | 2 +- .../desktop/windows/go-webview2/LICENSE | 22 - .../desktop/windows/go-webview2/README.md | 27 - .../windows/go-webview2/internal/w32/w32.go | 157 ------ .../go-webview2/pkg/combridge/bridge.go | 239 --------- .../go-webview2/pkg/combridge/iunknown.go | 56 -- .../pkg/combridge/iunknown_impl.go | 74 --- .../go-webview2/pkg/combridge/syscall.go | 39 -- .../go-webview2/pkg/combridge/vtables.go | 147 ----- .../pkg/edge/COREWEBVIEW2_COLOR.go | 10 - .../COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go | 11 - .../pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go | 12 - .../edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go | 11 - .../edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go | 12 - .../edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go | 49 -- .../edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go | 25 - ...eWebView2AcceleratorKeyPressedEventArgs.go | 79 --- ...bView2AcceleratorKeyPressedEventHandler.go | 53 -- .../pkg/edge/ICoreWebView2Controller.go | 160 ------ .../pkg/edge/ICoreWebView2Controller2.go | 75 --- ...eCoreWebView2ControllerCompletedHandler.go | 53 -- ...reWebView2HttpHeadersCollectionIterator.go | 78 --- .../edge/ICoreWebView2HttpRequestHeaders.go | 101 ---- ...oreWebView2NavigationCompletedEventArgs.go | 18 - ...WebView2NavigationCompletedEventHandler.go | 53 -- .../ICoreWebView2ProcessFailedEventArgs.go | 41 -- .../ICoreWebView2ProcessFailedEventHandler.go | 53 -- .../pkg/edge/ICoreWebView2Settings.go | 271 ---------- .../edge/ICoreWebView2WebResourceRequest.go | 102 ---- ...reWebView2WebResourceRequestedEventArgs.go | 52 -- ...ebView2WebResourceRequestedEventHandler.go | 50 -- .../edge/ICoreWebView2WebResourceResponse.go | 28 - .../go-webview2/pkg/edge/ICoreWebView2_2.go | 18 - .../go-webview2/pkg/edge/ICoreWebView2_3.go | 62 --- .../pkg/edge/ICoreWebViewSettings.go | 397 -------------- .../windows/go-webview2/pkg/edge/IStream.go | 54 -- .../windows/go-webview2/pkg/edge/chromium.go | 419 --------------- .../go-webview2/pkg/edge/chromium_386.go | 23 - .../go-webview2/pkg/edge/chromium_amd64.go | 20 - .../go-webview2/pkg/edge/chromium_arm64.go | 23 - .../go-webview2/pkg/edge/corewebview2.go | 503 ------------------ .../go-webview2/pkg/edge/create_env_go.go | 29 - .../go-webview2/pkg/edge/create_env_native.go | 41 -- .../windows/go-webview2/pkg/edge/guid.go | 225 -------- .../windows/go-webview2/webviewloader/LICENSE | 16 - .../go-webview2/webviewloader/README.md | 19 - .../webviewloader/arm64/WebView2Loader.dll | Bin 124328 -> 0 bytes .../go-webview2/webviewloader/env_create.go | 176 ------ .../webviewloader/env_create_completed.go | 42 -- .../webviewloader/env_create_options.go | 276 ---------- .../go-webview2/webviewloader/find_dll.go | 74 --- .../webviewloader/find_dll_installed.go | 94 ---- .../webviewloader/native_module.go | 173 ------ .../webviewloader/native_module_386.go | 8 - .../webviewloader/native_module_amd64.go | 8 - .../webviewloader/native_module_arm64.go | 8 - .../go-webview2/webviewloader/syscall.go | 143 ----- .../go-webview2/webviewloader/version.go | 147 ----- .../webviewloader/x64/WebView2Loader.dll | Bin 137640 -> 0 bytes .../webviewloader/x86/WebView2Loader.dll | Bin 107416 -> 0 bytes .../frontend/desktop/windows/window.go | 3 +- v2/internal/system/system_windows.go | 2 +- v2/internal/wv2installer/wv2installer.go | 2 +- website/src/pages/changelog.mdx | 1 + 66 files changed, 9 insertions(+), 5161 deletions(-) delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/LICENSE delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/README.md delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/arm64/WebView2Loader.dll delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/env_create.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/env_create_completed.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/env_create_options.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x64/WebView2Loader.dll delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x86/WebView2Loader.dll diff --git a/v2/go.mod b/v2/go.mod index c40a121f9..5d45d171f 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -35,6 +35,7 @@ require ( github.com/tidwall/sjson v1.1.7 github.com/tkrajina/go-reflector v0.5.6 github.com/wailsapp/mimetype v1.4.1 + github.com/wailsapp/go-webview2 v1.0.1 github.com/wzshiming/ctc v1.2.3 golang.org/x/mod v0.8.0 golang.org/x/net v0.10.0 @@ -59,6 +60,7 @@ require ( github.com/gorilla/css v1.0.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect github.com/kr/pretty v0.3.0 // indirect github.com/lithammer/fuzzysearch v1.1.5 // indirect diff --git a/v2/go.sum b/v2/go.sum index 415b4e42d..0a3125661 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -250,6 +250,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wailsapp/go-webview2 v1.0.1 h1:dEJIeEApW/MhO2tTMISZBFZPuW7kwrFA1NtgFB1z1II= +github.com/wailsapp/go-webview2 v1.0.1/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index 82289e054..c4186eda6 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -21,9 +21,9 @@ import ( "time" "github.com/bep/debounce" + "github.com/wailsapp/go-webview2/pkg/edge" "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/frontend" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge" "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/win32" "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc" "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc/w32" diff --git a/v2/internal/frontend/desktop/windows/go-webview2/LICENSE b/v2/internal/frontend/desktop/windows/go-webview2/LICENSE deleted file mode 100644 index ef2a0f485..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2020 John Chadwick -Some portions Copyright (c) 2017 Serge Zaitsev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/v2/internal/frontend/desktop/windows/go-webview2/README.md b/v2/internal/frontend/desktop/windows/go-webview2/README.md deleted file mode 100644 index 7379b3025..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# go-webview2 - -This is a proof of concept for embedding Webview2 into Go without CGo. It is based -on [webview/webview](https://github.com/webview/webview) and provides a compatible API. - -## Notice - -Because this version doesn't currently have an EdgeHTML fallback, it will not work unless you have a Webview2 runtime -installed. In addition, it requires the Webview2Loader DLL in order to function. Adding an EdgeHTML fallback should be -technically possible but will likely require much worse hacks since the API is not strictly COM to my knowledge. - -## Demo - -For now, you'll need to install the Webview2 runtime, as it does not ship with Windows. - -[WebView2 runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) - -After that, you should be able to run go-webview2 directly: - -``` -go run go-webview2/cmd/demo -``` - -This will use go-winloader to load an embedded copy of WebView2Loader.dll. - -If this does not work, please try running from a directory that has an appropriate copy of `WebView2Loader.dll` for your -GOARCH. If _that_ worked, *please* file a bug so we can figure out what's wrong with go-winloader :) \ No newline at end of file diff --git a/v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go b/v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go deleted file mode 100644 index 2b564173f..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go +++ /dev/null @@ -1,157 +0,0 @@ -//go:build windows - -package w32 - -import ( - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - ole32 = windows.NewLazySystemDLL("ole32") - Ole32CoInitializeEx = ole32.NewProc("CoInitializeEx") - - kernel32 = windows.NewLazySystemDLL("kernel32") - Kernel32GetCurrentThreadID = kernel32.NewProc("GetCurrentThreadId") - - shlwapi = windows.NewLazySystemDLL("shlwapi") - shlwapiSHCreateMemStream = shlwapi.NewProc("SHCreateMemStream") - - user32 = windows.NewLazySystemDLL("user32") - User32LoadImageW = user32.NewProc("LoadImageW") - User32GetSystemMetrics = user32.NewProc("GetSystemMetrics") - User32RegisterClassExW = user32.NewProc("RegisterClassExW") - User32CreateWindowExW = user32.NewProc("CreateWindowExW") - User32DestroyWindow = user32.NewProc("DestroyWindow") - User32ShowWindow = user32.NewProc("ShowWindow") - User32UpdateWindow = user32.NewProc("UpdateWindow") - User32SetFocus = user32.NewProc("SetFocus") - User32GetMessageW = user32.NewProc("GetMessageW") - User32TranslateMessage = user32.NewProc("TranslateMessage") - User32DispatchMessageW = user32.NewProc("DispatchMessageW") - User32DefWindowProcW = user32.NewProc("DefWindowProcW") - User32GetClientRect = user32.NewProc("GetClientRect") - User32PostQuitMessage = user32.NewProc("PostQuitMessage") - User32SetWindowTextW = user32.NewProc("SetWindowTextW") - User32PostThreadMessageW = user32.NewProc("PostThreadMessageW") - User32GetWindowLongPtrW = user32.NewProc("GetWindowLongPtrW") - User32SetWindowLongPtrW = user32.NewProc("SetWindowLongPtrW") - User32AdjustWindowRect = user32.NewProc("AdjustWindowRect") - User32SetWindowPos = user32.NewProc("SetWindowPos") -) - -const ( - SystemMetricsCxIcon = 11 - SystemMetricsCyIcon = 12 -) - -const ( - SWShow = 5 -) - -const ( - SWPNoZOrder = 0x0004 - SWPNoActivate = 0x0010 - SWPNoMove = 0x0002 - SWPFrameChanged = 0x0020 -) - -const ( - WMDestroy = 0x0002 - WMMove = 0x0003 - WMSize = 0x0005 - WMClose = 0x0010 - WMQuit = 0x0012 - WMGetMinMaxInfo = 0x0024 - WMNCLButtonDown = 0x00A1 - WMMoving = 0x0216 - WMApp = 0x8000 -) - -const ( - GWLStyle = -16 -) - -const ( - WSOverlapped = 0x00000000 - WSMaximizeBox = 0x00020000 - WSThickFrame = 0x00040000 - WSCaption = 0x00C00000 - WSSysMenu = 0x00080000 - WSMinimizeBox = 0x00020000 - WSOverlappedWindow = (WSOverlapped | WSCaption | WSSysMenu | WSThickFrame | WSMinimizeBox | WSMaximizeBox) -) - -type WndClassExW struct { - CbSize uint32 - Style uint32 - LpfnWndProc uintptr - CnClsExtra int32 - CbWndExtra int32 - HInstance windows.Handle - HIcon windows.Handle - HCursor windows.Handle - HbrBackground windows.Handle - LpszMenuName *uint16 - LpszClassName *uint16 - HIconSm windows.Handle -} - -type Rect struct { - Left int32 - Top int32 - Right int32 - Bottom int32 -} - -type MinMaxInfo struct { - PtReserved Point - PtMaxSize Point - PtMaxPosition Point - PtMinTrackSize Point - PtMaxTrackSize Point -} - -type Point struct { - X, Y int32 -} - -type Msg struct { - Hwnd syscall.Handle - Message uint32 - WParam uintptr - LParam uintptr - Time uint32 - Pt Point - LPrivate uint32 -} - -func Utf16PtrToString(p *uint16) string { - if p == nil { - return "" - } - // Find NUL terminator. - end := unsafe.Pointer(p) - n := 0 - for *(*uint16)(end) != 0 { - end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p)) - n++ - } - s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n] - return string(utf16.Decode(s)) -} - -func SHCreateMemStream(data []byte) (uintptr, error) { - ret, _, err := shlwapiSHCreateMemStream.Call( - uintptr(unsafe.Pointer(&data[0])), - uintptr(len(data)), - ) - if ret == 0 { - return 0, err - } - - return ret, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go deleted file mode 100644 index ccf04243f..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go +++ /dev/null @@ -1,239 +0,0 @@ -//go:build windows - -package combridge - -import ( - "fmt" - "runtime" - "sync" - "sync/atomic" -) - -var ( - comIfcePointersL sync.RWMutex - comIfcePointers = map[uintptr]*comObject{} // Map from ComInterfacePointer to the Go ComObject -) - -// Resolve the GoInterface of the specified ComInterfacePointer -func Resolve[T IUnknown](ifceP uintptr) T { - comIfcePointersL.RLock() - comObj := comIfcePointers[ifceP] - comIfcePointersL.RUnlock() - - var n T - if comObj != nil { - t := comObj.resolve(ifceP) - if t != nil { - n = t.(T) - } - } - - return n -} - -// New returns a new ComObject which implements the specified Com Interface, com calls will be redirected -// to the specified go interface. -func New[T IUnknown](obj T) *ComObject[T] { - cObj := new( - ifceDef[T]{obj}, - ) - return newComObject[T](cObj) -} - -// New2 returns a new ComObject which implements the two specified Com Interfaces, com calls will be redirected -// to those interfaces accordingly. -// This is needed if a ComObject should implement two interfaces that are not descendants of each other, -// then you get multiple inheritance. -func New2[T IUnknown, T2 IUnknown](obj T, obj2 T2) *ComObject[T] { - cObj := new( - ifceDef[T]{obj}, - ifceDef[T2]{obj2}, - ) - return newComObject[T](cObj) -} - -// new returns a new ComObject which implements multiple specified Com Interfaces, com calls will be redirected -// to the specified go interfaces accordingly. -// This is needed if a ComObject should implement multiple interfaces that are not descendants of each other, -// then you get multiple inheritance. -func new(impls ...ifceImpl) *comObject { - impls = append([]ifceImpl{ifceDef[IUnknown]{}}, impls...) - - cObj := &comObject{ - refCount: 1, - ifces: map[string]int{}, - ifcesImpl: make([]comInterfaceDesc, len(impls)), - } - - for i, ifceDef := range impls { - vtable, err := ifceDef.ifce() - if err != nil { - panic(err) - } - - needsImplement := false - for table := vtable; table != nil; table = table.Parent { - guid := table.ComGUID - if i, found := cObj.ifces[guid]; found { - // This Interface is already implemented - if guid == iUnknownGUID { - // IUnknown is a special interface and never has an user specific implementation - } else if cObj.ifcesImpl[i].impl != ifceDef.impl() { - panic(fmt.Sprintf("Interface '%s' is already implemented by another object", table.Name)) - } - - break - } - - needsImplement = true - cObj.ifces[guid] = i - } - - if !needsImplement { - continue - } - - ifceP, ifcePSlice := allocUintptrObject(1) - ifcePSlice[0] = vtable.ComVTable - cObj.ifcesImpl[i] = comInterfaceDesc{ifceP, ifceDef.impl()} - } - - comIfcePointersL.Lock() - for _, ifceImpl := range cObj.ifcesImpl { - comIfcePointers[ifceImpl.ref] = cObj - } - comIfcePointersL.Unlock() - - return cObj -} - -func newComObject[T IUnknown](comObj *comObject) *ComObject[T] { - c := &ComObject[T]{obj: comObj} - // Make sure to async release since release needs locks and might block the finalizer goroutine for a longer period - runtime.SetFinalizer(c, func(obj *ComObject[T]) { obj.close(true) }) - return c -} - -// ComObject describes an exported go instance to be used as a ComObject which implements -// the specified Interface. -type ComObject[T IUnknown] struct { - obj *comObject - closed int32 -} - -// Ref returns the native uintptr that points to the ComObject that is an interface pointer to T. -// This can be used in native calls. If the object has been closed this function will panic. -func (o *ComObject[T]) Ref() uintptr { - if atomic.LoadInt32(&o.closed) != 0 { - panic("ComObject has been released") - } - return o.obj.queryInterface(guidOf[T](), false) -} - -// Close releases the native com object from the go side. It will only be destroyed if the ref counter -// reaches zero. -// After closing `Ref()` will panic. -func (o *ComObject[T]) Close() error { - o.close(false) - return nil -} - -// close releases the native com object from the go side. It will only be destroyed if the ref counter -// reaches zero. -// After closing `Ref()` will panic. -func (o *ComObject[T]) close(asyncRelease bool) { - if atomic.CompareAndSwapInt32(&o.closed, 0, 1) { - runtime.SetFinalizer(o, nil) - if asyncRelease { - go o.obj.release() - } else { - o.obj.release() - } - } -} - -type comInterfaceDesc struct { - ref uintptr // The native Com InterfacePointer - impl any // The golang target object -} - -type comObject struct { - l sync.Mutex - - refCount int32 - ifces map[string]int // Map of ComInterfaceGUID to Interface Slots - ifcesImpl []comInterfaceDesc // Slots with InterfaceDescriptors -} - -func (c *comObject) queryInterface(ifceGUID string, withAddRef bool) uintptr { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on released com object") - } - - i, found := c.ifces[ifceGUID] - if !found { - return 0 - } - - if withAddRef { - c.refCount++ - } - return c.ifcesImpl[i].ref -} - -func (c *comObject) resolve(ifceP uintptr) any { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on destroyed com object") - } - - for _, ifce := range c.ifcesImpl { - if ifce.ref != ifceP { - continue - } - - return ifce.impl - } - return nil -} - -func (c *comObject) addRef() int32 { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on destroyed com object") - } - - c.refCount++ - return c.refCount -} - -func (c *comObject) release() int32 { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on destroyed com object") - } - - if c.refCount--; c.refCount == 0 { - comIfcePointersL.Lock() - for _, ref := range c.ifcesImpl { - delete(comIfcePointers, ref.ref) - } - comIfcePointersL.Unlock() - - for _, impl := range c.ifcesImpl { - ref := impl.ref - if ref == 0 { - continue - } - - globalFree(ref) - } - } - - return c.refCount -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go deleted file mode 100644 index 90d7247fe..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go +++ /dev/null @@ -1,56 +0,0 @@ -//go:build windows - -package combridge - -import ( - "golang.org/x/sys/windows" -) - -const iUnknownGUID = "{00000000-0000-0000-C000-000000000046}" - -func init() { - registerVTableInternal[IUnknown, IUnknown]( - iUnknownGUID, - true, - iUnknownQueryInterface, - iUnknownAddRef, - iUnknownRelease, - ) -} - -type IUnknown interface{} - -func iUnknownQueryInterface(this uintptr, refiid *windows.GUID, ppvObject *uintptr) uintptr { - if refiid == nil || ppvObject == nil { - return uintptr(windows.E_INVALIDARG) - } - - comIfcePointersL.RLock() - obj := comIfcePointers[this] - comIfcePointersL.RUnlock() - - ref := obj.queryInterface(refiid.String(), true) - if ref != 0 { - *ppvObject = ref - return windows.NO_ERROR - } - - *ppvObject = 0 - return uintptr(windows.E_NOINTERFACE) -} - -func iUnknownAddRef(this uintptr) uintptr { - comIfcePointersL.RLock() - obj := comIfcePointers[this] - comIfcePointersL.RUnlock() - - return uintptr(obj.addRef()) -} - -func iUnknownRelease(this uintptr) uintptr { - comIfcePointersL.RLock() - obj := comIfcePointers[this] - comIfcePointersL.RUnlock() - - return uintptr(obj.release()) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go deleted file mode 100644 index 4c748d461..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go +++ /dev/null @@ -1,74 +0,0 @@ -//go:build windows - -package combridge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -// IUnknownFromPointer cast a generic pointer into a IUnknownImpl pointer -func IUnknownFromPointer(ref unsafe.Pointer) *IUnknownImpl { - return (*IUnknownImpl)(ref) -} - -// IUnknownFromPointer cast native pointer into a IUnknownImpl pointer -func IUnknownFromUintptr(ref uintptr) *IUnknownImpl { - return IUnknownFromPointer(unsafe.Pointer(ref)) -} - -type IUnknownVtbl struct { - queryInterface uintptr - addRef uintptr - release uintptr -} - -func (i *IUnknownVtbl) QueryInterface(this unsafe.Pointer, refiid *windows.GUID, ppvObject **IUnknownImpl) error { - r, _, _ := syscall.SyscallN( - i.queryInterface, - uintptr(this), - uintptr(unsafe.Pointer(refiid)), - uintptr(unsafe.Pointer(ppvObject)), - ) - - if r != uintptr(windows.S_OK) { - return syscall.Errno(r) - } - - return nil -} - -func (i *IUnknownVtbl) AddRef(this unsafe.Pointer) uint32 { - r, _, _ := syscall.SyscallN( - i.addRef, - uintptr(this), - ) - return uint32(r) -} - -func (i *IUnknownVtbl) Release(this unsafe.Pointer) uint32 { - r, _, _ := syscall.SyscallN( - i.release, - uintptr(this), - ) - - return uint32(r) -} - -type IUnknownImpl struct { - vtbl *IUnknownVtbl -} - -func (i *IUnknownImpl) QueryInterface(refiid *windows.GUID, ppvObject **IUnknownImpl) error { - return i.vtbl.QueryInterface(unsafe.Pointer(i), refiid, ppvObject) -} - -func (i *IUnknownImpl) AddRef() uint32 { - return i.vtbl.AddRef(unsafe.Pointer(i)) -} - -func (i *IUnknownImpl) Release() uint32 { - return i.vtbl.Release(unsafe.Pointer(i)) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go deleted file mode 100644 index 17b7f500e..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go +++ /dev/null @@ -1,39 +0,0 @@ -//go:build windows - -package combridge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGlobalAlloc = modkernel32.NewProc("GlobalAlloc") - procGlobalFree = modkernel32.NewProc("GlobalFree") - - uintptrSize = unsafe.Sizeof(uintptr(0)) -) - -func allocUintptrObject(size int) (uintptr, []uintptr) { - v := globalAlloc(uintptr(size) * uintptrSize) - slice := unsafe.Slice((*uintptr)(unsafe.Pointer(v)), size) - return v, slice -} - -func globalAlloc(dwBytes uintptr) uintptr { - ret, _, _ := procGlobalAlloc.Call(uintptr(0), dwBytes) - if ret == 0 { - panic("globalAlloc failed") - } - - return ret -} - -func globalFree(data uintptr) { - ret, _, _ := procGlobalFree.Call(data) - if ret != 0 { - panic("globalFree failed") - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go deleted file mode 100644 index b099a7848..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go +++ /dev/null @@ -1,147 +0,0 @@ -//go:build windows - -package combridge - -import ( - "fmt" - "reflect" - "sync" - - "golang.org/x/sys/windows" -) - -var ( - vTablesL sync.Mutex - vTables = make(map[string]*vTable) -) - -// RegisterVTable registers the vtable trampoline methods for the specified ComInterface -// TBase is the base interface of T, and must be another ComInterface which roots in IUnknown or IUnknown itself. -// The first paramter of the fn is always the uintptr of the ComObject and the GoObject can be resolved with Resolve(). -// After having resolved the GoObject the call must be redirected to the GoObject. -// Typically a trampoline FN looks like this. -// -// func _ICoreWebView2NavigationCompletedEventHandlerInvoke(this uintptr, sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr { -// return combridge.Resolve[_ICoreWebView2NavigationCompletedEventHandler](this).NavigationCompleted(sender, args) -// } -// -// The order of registration must be in the correct order as specified in the IDL of the interface. -func RegisterVTable[TParent, T IUnknown](guid string, fns ...interface{}) { - registerVTableInternal[TParent, T](guid, false, fns...) -} - -type vTable struct { - Parent *vTable - - Name string - ComGUID string - ComVTable uintptr - ComProcs []uintptr -} - -func registerVTableInternal[TParent, T IUnknown](guid string, isInternal bool, fns ...interface{}) { - vTablesL.Lock() - defer vTablesL.Unlock() - - t, tName := typeInterfaceToString[T]() - tParent, tParentName := typeInterfaceToString[TParent]() - if !t.Implements(tParent) { - panic(fmt.Errorf("RegisterVTable '%s': '%s' must implement '%s'", tName, tName, tParentName)) - } - - if !isInternal { - if t == reflect.TypeOf((*IUnknown)(nil)).Elem() { - panic(fmt.Errorf("RegisterVTable '%s' IUnknown can't be registered", tName)) - } - - if t == tParent { - panic(fmt.Errorf("RegisterVTable '%s': T and TParent can't be the same type", tName)) - } - } - - var parent *vTable - var parentProcs []uintptr - var parentProcsCount int - if t != tParent { - parent = vTables[tParentName] - if parent == nil { - panic(fmt.Errorf("RegisterVTable '%s': Parent VTable '%s' not registered", tName, tParentName)) - } - - parentProcs = parent.ComProcs - parentProcsCount = len(parentProcs) - } - - comGuid, err := windows.GUIDFromString(guid) - if err != nil { - panic(fmt.Errorf("RegisterVTable '%s': invalid guid: %s", tName, err)) - } - - vTable := &vTable{ - Parent: parent, - Name: tName, - ComGUID: comGuid.String(), - } - vTable.ComVTable, vTable.ComProcs = allocUintptrObject(parentProcsCount + len(fns)) - - for i, proc := range parentProcs { - vTable.ComProcs[i] = proc - } - - for i, fn := range fns { - vTable.ComProcs[parentProcsCount+i] = windows.NewCallback(fn) - } - - vTables[tName] = vTable -} - -func typeInterfaceToString[T any]() (reflect.Type, string) { - t := reflect.TypeOf((*T)(nil)) - if t.Kind() != reflect.Pointer { - panic("must be a (*yourInterfaceType)(nil)") - } - t = t.Elem() - return t, t.PkgPath() + "/" + t.Name() -} - -func typeInterfaceToStringOnly[T any]() string { - _, nane := typeInterfaceToString[T]() - return nane -} - -func guidOf[T any]() string { - vtable := vTableOf[T]() - if vtable == nil { - return "" - } - return vtable.ComGUID -} - -func vTableOf[T any]() *vTable { - name := typeInterfaceToStringOnly[T]() - vTablesL.Lock() - defer vTablesL.Unlock() - - return vTables[name] -} - -type ifceImpl interface { - impl() any - ifce() (*vTable, error) -} - -type ifceDef[T any] struct { - objImpl any -} - -func (i ifceDef[T]) impl() any { - return i.objImpl -} - -func (i ifceDef[T]) ifce() (*vTable, error) { - vtable := vTableOf[T]() - if vtable == nil { - return nil, fmt.Errorf("Unable to find vTable for %s", typeInterfaceToStringOnly[T]()) - } - return vtable, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go deleted file mode 100644 index 429ecef24..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_COLOR struct { - A uint8 - R uint8 - G uint8 - B uint8 -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go deleted file mode 100644 index ed106ed44..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND uint32 - -const ( - COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND_DENY = iota - COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND_ALLOW - COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND_DENY_CORS -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go deleted file mode 100644 index 607147535..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_KEY_EVENT_KIND uint32 - -const ( - COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN = 0 - COREWEBVIEW2_KEY_EVENT_KIND_KEY_UP = 1 - COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN = 2 - COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_UP = 3 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go deleted file mode 100644 index c1679cc37..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_MOVE_FOCUS_REASON uint32 - -const ( - COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC = 0 - COREWEBVIEW2_MOVE_FOCUS_REASON_NEXT = 1 - COREWEBVIEW2_MOVE_FOCUS_REASON_PREVIOUS = 2 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go deleted file mode 100644 index dd8834255..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_PHYSICAL_KEY_STATUS struct { - RepeatCount uint32 - ScanCode uint32 - IsExtendedKey bool - IsMenuKeyDown bool - WasKeyDown bool - IsKeyReleased bool -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go deleted file mode 100644 index a7e9aa339..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go +++ /dev/null @@ -1,49 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_PROCESS_FAILED_KIND uint32 - -const ( - // Indicates that the browser process ended unexpectedly. The WebView - // automatically moves to the Closed state. The app has to recreate a new - // WebView to recover from this failure. - COREWEBVIEW2_PROCESS_FAILED_KIND_BROWSER_PROCESS_EXITED = 0 - - // Indicates that the main frame's render process ended unexpectedly. A new - // render process is created automatically and navigated to an error page. - // You can use the `Reload` method to try to reload the page that failed. - COREWEBVIEW2_PROCESS_FAILED_KIND_RENDER_PROCESS_EXITED = 1 - - // Indicates that the main frame's render process is unresponsive. - // - // Note that this does not seem to work right now. - // Does not fire for simple long running script case, the only related test - // SitePerProcessBrowserTest::NoCommitTimeoutForInvisibleWebContents is - // disabled. - COREWEBVIEW2_PROCESS_FAILED_KIND_RENDER_PROCESS_UNRESPONSIVE = 2 - - // Indicates that a frame-only render process ended unexpectedly. The process - // exit does not affect the top-level document, only a subset of the - // subframes within it. The content in these frames is replaced with an error - // page in the frame. - COREWEBVIEW2_PROCESS_FAILED_KIND_FRAME_RENDER_PROCESS_EXITED = 3 - - // Indicates that a utility process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_UTILITY_PROCESS_EXITED = 4 - - // Indicates that a sandbox helper process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_SANDBOX_HELPER_PROCESS_EXITED = 5 - - // Indicates that the GPU process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_GPU_PROCESS_EXITED = 6 - - // Indicates that a PPAPI plugin process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_PPAPI_PLUGIN_PROCESS_EXITED = 7 - - // Indicates that a PPAPI plugin broker process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_PPAPI_BROKER_PROCESS_EXITED = 8 - - // Indicates that a process of unspecified kind ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_UNKNOWN_PROCESS_EXITED = 9 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go deleted file mode 100644 index 2e9261d0e..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go +++ /dev/null @@ -1,25 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_WEB_RESOURCE_CONTEXT uint32 - -const ( - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL = 0 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_DOCUMENT = 1 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_STYLESHEET = 2 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_IMAGE = 3 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_MEDIA = 4 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_FONT = 5 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_SCRIPT = 6 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST = 7 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_FETCH = 8 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_TEXT_TRACK = 9 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_EVENT_SOURCE = 10 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_WEBSOCKET = 11 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_MANIFEST = 12 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_SIGNED_EXCHANGE = 13 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_PING = 14 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_CSP_VIOLATION_REPORT = 15 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_OTHER = 16 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go deleted file mode 100644 index 2a3a9c823..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go +++ /dev/null @@ -1,79 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2AcceleratorKeyPressedEventArgsVtbl struct { - _IUnknownVtbl - GetKeyEventKind ComProc - GetVirtualKey ComProc - GetKeyEventLParam ComProc - GetPhysicalKeyStatus ComProc - GetHandled ComProc - PutHandled ComProc -} - -type ICoreWebView2AcceleratorKeyPressedEventArgs struct { - vtbl *_ICoreWebView2AcceleratorKeyPressedEventArgsVtbl -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetKeyEventKind() (COREWEBVIEW2_KEY_EVENT_KIND, error) { - var err error - var keyEventKind COREWEBVIEW2_KEY_EVENT_KIND - _, _, err = i.vtbl.GetKeyEventKind.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&keyEventKind)), - ) - if err != windows.ERROR_SUCCESS { - return 0, err - } - return keyEventKind, nil -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetVirtualKey() (uint, error) { - var err error - var virtualKey uint - _, _, err = i.vtbl.GetVirtualKey.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&virtualKey)), - ) - if err != windows.ERROR_SUCCESS { - return 0, err - } - return virtualKey, nil -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetPhysicalKeyStatus() (COREWEBVIEW2_PHYSICAL_KEY_STATUS, error) { - var err error - var physicalKeyStatus COREWEBVIEW2_PHYSICAL_KEY_STATUS - _, _, err = i.vtbl.GetPhysicalKeyStatus.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&physicalKeyStatus)), - ) - if err != windows.ERROR_SUCCESS { - return COREWEBVIEW2_PHYSICAL_KEY_STATUS{}, err - } - return physicalKeyStatus, nil -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) PutHandled(handled bool) error { - var err error - - _, _, err = i.vtbl.PutHandled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(handled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go deleted file mode 100644 index 2c276560b..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type ICoreWebView2AcceleratorKeyPressedEventHandler struct { - vtbl *_ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl - impl _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownQueryInterface(this *ICoreWebView2AcceleratorKeyPressedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownAddRef(this *ICoreWebView2AcceleratorKeyPressedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownRelease(this *ICoreWebView2AcceleratorKeyPressedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2AcceleratorKeyPressedEventHandlerInvoke(this *ICoreWebView2AcceleratorKeyPressedEventHandler, sender *ICoreWebView2Controller, args *ICoreWebView2AcceleratorKeyPressedEventArgs) uintptr { - return this.impl.AcceleratorKeyPressed(sender, args) -} - -type _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl interface { - _IUnknownImpl - AcceleratorKeyPressed(sender *ICoreWebView2Controller, args *ICoreWebView2AcceleratorKeyPressedEventArgs) uintptr -} - -var _ICoreWebView2AcceleratorKeyPressedEventHandlerFn = _ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerInvoke), -} - -func newICoreWebView2AcceleratorKeyPressedEventHandler(impl _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl) *ICoreWebView2AcceleratorKeyPressedEventHandler { - return &ICoreWebView2AcceleratorKeyPressedEventHandler{ - vtbl: &_ICoreWebView2AcceleratorKeyPressedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go deleted file mode 100644 index c95a00ade..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go +++ /dev/null @@ -1,160 +0,0 @@ -//go:build windows - -package edge - -import ( - "math" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "golang.org/x/sys/windows" -) - -type _ICoreWebView2ControllerVtbl struct { - _IUnknownVtbl - GetIsVisible ComProc - PutIsVisible ComProc - GetBounds ComProc - PutBounds ComProc - GetZoomFactor ComProc - PutZoomFactor ComProc - AddZoomFactorChanged ComProc - RemoveZoomFactorChanged ComProc - SetBoundsAndZoomFactor ComProc - MoveFocus ComProc - AddMoveFocusRequested ComProc - RemoveMoveFocusRequested ComProc - AddGotFocus ComProc - RemoveGotFocus ComProc - AddLostFocus ComProc - RemoveLostFocus ComProc - AddAcceleratorKeyPressed ComProc - RemoveAcceleratorKeyPressed ComProc - GetParentWindow ComProc - PutParentWindow ComProc - NotifyParentWindowPositionChanged ComProc - Close ComProc - GetCoreWebView2 ComProc -} - -type ICoreWebView2Controller struct { - vtbl *_ICoreWebView2ControllerVtbl -} - -func (i *ICoreWebView2Controller) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2Controller) GetBounds() (*w32.Rect, error) { - var err error - var bounds w32.Rect - _, _, err = i.vtbl.GetBounds.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&bounds)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return &bounds, nil -} - -func (i *ICoreWebView2Controller) PutBounds(bounds w32.Rect) error { - var err error - - _, _, err = i.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&bounds)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) MoveFocus(reason COREWEBVIEW2_MOVE_FOCUS_REASON) error { - var err error - - _, _, err = i.vtbl.MoveFocus.Call( - uintptr(unsafe.Pointer(i)), - uintptr(reason), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) AddAcceleratorKeyPressed(eventHandler *ICoreWebView2AcceleratorKeyPressedEventHandler, token *_EventRegistrationToken) error { - var err error - _, _, err = i.vtbl.AddAcceleratorKeyPressed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(eventHandler)), - uintptr(unsafe.Pointer(&token)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) PutIsVisible(isVisible bool) error { - var err error - - _, _, err = i.vtbl.PutIsVisible.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isVisible)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) GetICoreWebView2Controller2() *ICoreWebView2Controller2 { - - var result *ICoreWebView2Controller2 - - iidICoreWebView2Controller2 := NewGUID("{c979903e-d4ca-4228-92eb-47ee3fa96eab}") - i.vtbl.QueryInterface.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(iidICoreWebView2Controller2)), - uintptr(unsafe.Pointer(&result))) - - return result -} - -func (i *ICoreWebView2Controller) NotifyParentWindowPositionChanged() error { - var err error - _, _, err = i.vtbl.NotifyParentWindowPositionChanged.Call( - uintptr(unsafe.Pointer(i)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) PutZoomFactor(zoomFactor float64) error { - var err error - _, _, err = i.vtbl.PutZoomFactor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(math.Float64bits(zoomFactor)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) GetZoomFactor() (float64, error) { - var err error - var zoomFactorUint64 uint64 - _, _, err = i.vtbl.GetZoomFactor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&zoomFactorUint64)), - ) - if err != windows.ERROR_SUCCESS { - return 0.0, err - } - return math.Float64frombits(zoomFactorUint64), nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go deleted file mode 100644 index eff315a91..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go +++ /dev/null @@ -1,75 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2Controller2Vtbl struct { - _IUnknownVtbl - GetIsVisible ComProc - PutIsVisible ComProc - GetBounds ComProc - PutBounds ComProc - GetZoomFactor ComProc - PutZoomFactor ComProc - AddZoomFactorChanged ComProc - RemoveZoomFactorChanged ComProc - SetBoundsAndZoomFactor ComProc - MoveFocus ComProc - AddMoveFocusRequested ComProc - RemoveMoveFocusRequested ComProc - AddGotFocus ComProc - RemoveGotFocus ComProc - AddLostFocus ComProc - RemoveLostFocus ComProc - AddAcceleratorKeyPressed ComProc - RemoveAcceleratorKeyPressed ComProc - GetParentWindow ComProc - PutParentWindow ComProc - NotifyParentWindowPositionChanged ComProc - Close ComProc - GetCoreWebView2 ComProc - GetDefaultBackgroundColor ComProc - PutDefaultBackgroundColor ComProc -} - -type ICoreWebView2Controller2 struct { - vtbl *_ICoreWebView2Controller2Vtbl -} - -func (i *ICoreWebView2Controller2) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2Controller2) GetDefaultBackgroundColor() (*COREWEBVIEW2_COLOR, error) { - var err error - var backgroundColor *COREWEBVIEW2_COLOR - _, _, err = i.vtbl.GetDefaultBackgroundColor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&backgroundColor)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return backgroundColor, nil -} - -func (i *ICoreWebView2Controller2) PutDefaultBackgroundColor(backgroundColor COREWEBVIEW2_COLOR) error { - var err error - - // Cast to a uint32 as that's what the call is expecting - col := *(*uint32)(unsafe.Pointer(&backgroundColor)) - - _, _, err = i.vtbl.PutDefaultBackgroundColor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(col), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go deleted file mode 100644 index c0e4d13b7..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2CreateCoreWebView2ControllerCompletedHandler struct { - vtbl *_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl - impl _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl -} - -func (i *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownQueryInterface(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownAddRef(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownRelease(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerInvoke(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler, errorCode uintptr, createdController *ICoreWebView2Controller) uintptr { - return this.impl.CreateCoreWebView2ControllerCompleted(errorCode, createdController) -} - -type _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl interface { - _IUnknownImpl - CreateCoreWebView2ControllerCompleted(errorCode uintptr, createdController *ICoreWebView2Controller) uintptr -} - -var _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerFn = _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerInvoke), -} - -func newICoreWebView2CreateCoreWebView2ControllerCompletedHandler(impl _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl) *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler { - return &iCoreWebView2CreateCoreWebView2ControllerCompletedHandler{ - vtbl: &_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go deleted file mode 100644 index 0c9eacb46..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go +++ /dev/null @@ -1,78 +0,0 @@ -//go:build windows - -package edge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2HttpHeadersCollectionIteratorVtbl struct { - _IUnknownVtbl - GetCurrentHeader ComProc - GetHasCurrentHeader ComProc - MoveNext ComProc -} - -type ICoreWebView2HttpHeadersCollectionIterator struct { - vtbl *_ICoreWebView2HttpHeadersCollectionIteratorVtbl -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) HasCurrentHeader() (bool, error) { - var hasHeader int32 - res, _, err := i.vtbl.GetHasCurrentHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&hasHeader)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - if windows.Handle(res) != windows.S_OK { - return false, syscall.Errno(res) - } - return hasHeader != 0, nil -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) GetCurrentHeader() (string, string, error) { - // Create *uint16 to hold result - var _name *uint16 - var _value *uint16 - res, _, err := i.vtbl.GetCurrentHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&_name)), - uintptr(unsafe.Pointer(&_value)), - ) - if err != windows.ERROR_SUCCESS { - return "", "", err - } - if windows.Handle(res) != windows.S_OK { - return "", "", syscall.Errno(res) - } - // Get result and cleanup - name := windows.UTF16PtrToString(_name) - windows.CoTaskMemFree(unsafe.Pointer(_name)) - value := windows.UTF16PtrToString(_value) - windows.CoTaskMemFree(unsafe.Pointer(_value)) - return name, value, nil -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) MoveNext() (bool, error) { - var next int32 - res, _, err := i.vtbl.MoveNext.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&next)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - if windows.Handle(res) != windows.S_OK { - return false, syscall.Errno(res) - } - return next != 0, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go deleted file mode 100644 index 5a147b299..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go +++ /dev/null @@ -1,101 +0,0 @@ -//go:build windows - -package edge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -const ( - ERROR_ELEMENT_NOT_FOUND syscall.Errno = 0x80070490 -) - -type _ICoreWebView2HttpRequestHeadersVtbl struct { - _IUnknownVtbl - GetHeader ComProc - GetHeaders ComProc - Contains ComProc - SetHeader ComProc - RemoveHeader ComProc - GetIterator ComProc -} - -type ICoreWebView2HttpRequestHeaders struct { - vtbl *_ICoreWebView2HttpRequestHeadersVtbl -} - -func (i *ICoreWebView2HttpRequestHeaders) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} - -// GetHeader returns the value of the specified header. If the header is not found -// ERROR_ELEMENT_NOT_FOUND is returned as error. -func (i *ICoreWebView2HttpRequestHeaders) GetHeader(name string) (string, error) { - _name, err := windows.UTF16PtrFromString(name) - if err != nil { - return "", nil - } - - var _value *uint16 - res, _, err := i.vtbl.GetHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_name)), - uintptr(unsafe.Pointer(&_value)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } - if windows.Handle(res) != windows.S_OK { - return "", syscall.Errno(res) - } - - value := windows.UTF16PtrToString(_value) - windows.CoTaskMemFree(unsafe.Pointer(_value)) - return value, nil -} - -// SetHeader sets the specified header to the value. -func (i *ICoreWebView2HttpRequestHeaders) SetHeader(name, value string) error { - _name, err := windows.UTF16PtrFromString(name) - if err != nil { - return nil - } - - _value, err := windows.UTF16PtrFromString(value) - if err != nil { - return nil - } - - res, _, err := i.vtbl.SetHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_name)), - uintptr(unsafe.Pointer(_value)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - if windows.Handle(res) != windows.S_OK { - return syscall.Errno(res) - } - return nil -} - -// GetIterator returns an iterator over the collection of request headers. Make sure to call -// Release on the returned Object after finished using it. -func (i *ICoreWebView2HttpRequestHeaders) GetIterator() (*ICoreWebView2HttpHeadersCollectionIterator, error) { - var headers *ICoreWebView2HttpHeadersCollectionIterator - res, _, err := i.vtbl.GetIterator.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&headers)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - if windows.Handle(res) != windows.S_OK { - return nil, syscall.Errno(res) - } - return headers, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go deleted file mode 100644 index c3998e0a2..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go +++ /dev/null @@ -1,18 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2NavigationCompletedEventArgsVtbl struct { - _IUnknownVtbl - GetIsSuccess ComProc - GetWebErrorStatus ComProc - GetNavigationId ComProc -} - -type ICoreWebView2NavigationCompletedEventArgs struct { - vtbl *_ICoreWebView2NavigationCompletedEventArgsVtbl -} - -func (i *ICoreWebView2NavigationCompletedEventArgs) AddRef() uintptr { - return i.AddRef() -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go deleted file mode 100644 index 456da5074..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2NavigationCompletedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type ICoreWebView2NavigationCompletedEventHandler struct { - vtbl *_ICoreWebView2NavigationCompletedEventHandlerVtbl - impl _ICoreWebView2NavigationCompletedEventHandlerImpl -} - -func (i *ICoreWebView2NavigationCompletedEventHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2NavigationCompletedEventHandlerIUnknownQueryInterface(this *ICoreWebView2NavigationCompletedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2NavigationCompletedEventHandlerIUnknownAddRef(this *ICoreWebView2NavigationCompletedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2NavigationCompletedEventHandlerIUnknownRelease(this *ICoreWebView2NavigationCompletedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2NavigationCompletedEventHandlerInvoke(this *ICoreWebView2NavigationCompletedEventHandler, sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr { - return this.impl.NavigationCompleted(sender, args) -} - -type _ICoreWebView2NavigationCompletedEventHandlerImpl interface { - _IUnknownImpl - NavigationCompleted(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr -} - -var _ICoreWebView2NavigationCompletedEventHandlerFn = _ICoreWebView2NavigationCompletedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerInvoke), -} - -func newICoreWebView2NavigationCompletedEventHandler(impl _ICoreWebView2NavigationCompletedEventHandlerImpl) *ICoreWebView2NavigationCompletedEventHandler { - return &ICoreWebView2NavigationCompletedEventHandler{ - vtbl: &_ICoreWebView2NavigationCompletedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go deleted file mode 100644 index b6d3cda1b..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build windows - -package edge - -import ( - "fmt" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2ProcessFailedEventArgsVtbl struct { - _IUnknownVtbl - GetProcessFailedKind ComProc -} - -type ICoreWebView2ProcessFailedEventArgs struct { - vtbl *_ICoreWebView2ProcessFailedEventArgsVtbl -} - -func (i *ICoreWebView2ProcessFailedEventArgs) GetProcessFailedKind() (COREWEBVIEW2_PROCESS_FAILED_KIND, error) { - kind := COREWEBVIEW2_PROCESS_FAILED_KIND(0xffffffff) - hr, _, err := i.vtbl.GetProcessFailedKind.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&kind)), - ) - - if windows.Handle(hr) != windows.S_OK { - return 0, syscall.Errno(hr) - } - - if kind == 0xffffffff { - if err == nil { - err = fmt.Errorf("unknown error") - } - return 0, err - } - - return kind, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go deleted file mode 100644 index fc8c7369c..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2ProcessFailedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type ICoreWebView2ProcessFailedEventHandler struct { - vtbl *_ICoreWebView2ProcessFailedEventHandlerVtbl - impl _ICoreWebView2ProcessFailedEventHandlerImpl -} - -func (i *ICoreWebView2ProcessFailedEventHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2ProcessFailedEventHandlerIUnknownQueryInterface(this *ICoreWebView2ProcessFailedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2ProcessFailedEventHandlerIUnknownAddRef(this *ICoreWebView2ProcessFailedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2ProcessFailedEventHandlerIUnknownRelease(this *ICoreWebView2ProcessFailedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2ProcessFailedEventHandlerInvoke(this *ICoreWebView2ProcessFailedEventHandler, sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) uintptr { - return this.impl.ProcessFailed(sender, args) -} - -type _ICoreWebView2ProcessFailedEventHandlerImpl interface { - _IUnknownImpl - ProcessFailed(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) uintptr -} - -var _ICoreWebView2ProcessFailedEventHandlerFn = _ICoreWebView2ProcessFailedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2ProcessFailedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2ProcessFailedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2ProcessFailedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2ProcessFailedEventHandlerInvoke), -} - -func newICoreWebView2ProcessFailedEventHandler(impl _ICoreWebView2ProcessFailedEventHandlerImpl) *ICoreWebView2ProcessFailedEventHandler { - return &ICoreWebView2ProcessFailedEventHandler{ - vtbl: &_ICoreWebView2ProcessFailedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go deleted file mode 100644 index a4ba613d2..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go +++ /dev/null @@ -1,271 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2SettingsVtbl struct { - _IUnknownVtbl - GetIsScriptEnabled ComProc - PutIsScriptEnabled ComProc - GetIsWebMessageEnabled ComProc - PutIsWebMessageEnabled ComProc - GetAreDefaultScriptDialogsEnabled ComProc - PutAreDefaultScriptDialogsEnabled ComProc - GetIsStatusBarEnabled ComProc - PutIsStatusBarEnabled ComProc - GetAreDevToolsEnabled ComProc - PutAreDevToolsEnabled ComProc - GetAreDefaultContextMenusEnabled ComProc - PutAreDefaultContextMenusEnabled ComProc - GetAreHostObjectsAllowed ComProc - PutAreHostObjectsAllowed ComProc - GetIsZoomControlEnabled ComProc - PutIsZoomControlEnabled ComProc - GetIsBuiltInErrorPageEnabled ComProc - PutIsBuiltInErrorPageEnabled ComProc -} - -type ICoreWebView2Settings struct { - vtbl *_ICoreWebView2SettingsVtbl -} - -func (i *ICoreWebView2Settings) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2Settings) GetIsScriptEnabled() (bool, error) { - var err error - var isScriptEnabled bool - _, _, err = i.vtbl.GetIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isScriptEnabled, nil -} - -func (i *ICoreWebView2Settings) PutIsScriptEnabled(isScriptEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsWebMessageEnabled() (bool, error) { - var err error - var isWebMessageEnabled bool - _, _, err = i.vtbl.GetIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isWebMessageEnabled, nil -} - -func (i *ICoreWebView2Settings) PutIsWebMessageEnabled(isWebMessageEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreDefaultScriptDialogsEnabled() (bool, error) { - var err error - var areDefaultScriptDialogsEnabled bool - _, _, err = i.vtbl.GetAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDefaultScriptDialogsEnabled, nil -} - -func (i *ICoreWebView2Settings) PutAreDefaultScriptDialogsEnabled(areDefaultScriptDialogsEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsStatusBarEnabled() (bool, error) { - var err error - var isStatusBarEnabled bool - _, _, err = i.vtbl.GetIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isStatusBarEnabled, nil -} - -func (i *ICoreWebView2Settings) PutIsStatusBarEnabled(isStatusBarEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreDevToolsEnabled() (bool, error) { - var err error - var areDevToolsEnabled bool - _, _, err = i.vtbl.GetAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDevToolsEnabled, nil -} - -func (i *ICoreWebView2Settings) PutAreDevToolsEnabled(areDevToolsEnabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreDefaultContextMenusEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebView2Settings) PutAreDefaultContextMenusEnabled(enabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreHostObjectsAllowed() (bool, error) { - var err error - var allowed bool - _, _, err = i.vtbl.GetAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&allowed)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return allowed, nil -} - -func (i *ICoreWebView2Settings) PutAreHostObjectsAllowed(allowed bool) error { - var err error - - _, _, err = i.vtbl.PutAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(allowed)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsZoomControlEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebView2Settings) PutIsZoomControlEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsBuiltInErrorPageEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebView2Settings) PutIsBuiltInErrorPageEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go deleted file mode 100644 index fe7f2cfa2..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go +++ /dev/null @@ -1,102 +0,0 @@ -//go:build windows - -package edge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2WebResourceRequestVtbl struct { - _IUnknownVtbl - GetUri ComProc - PutUri ComProc - GetMethod ComProc - PutMethod ComProc - GetContent ComProc - PutContent ComProc - GetHeaders ComProc -} - -type ICoreWebView2WebResourceRequest struct { - vtbl *_ICoreWebView2WebResourceRequestVtbl -} - -func (i *ICoreWebView2WebResourceRequest) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2WebResourceRequest) GetMethod() (string, error) { - // Create *uint16 to hold result - var _method *uint16 - res, _, err := i.vtbl.GetMethod.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&_method)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } - if windows.Handle(res) != windows.S_OK { - return "", syscall.Errno(res) - } - // Get result and cleanup - uri := windows.UTF16PtrToString(_method) - windows.CoTaskMemFree(unsafe.Pointer(_method)) - return uri, nil -} - -func (i *ICoreWebView2WebResourceRequest) GetUri() (string, error) { - var err error - // Create *uint16 to hold result - var _uri *uint16 - _, _, err = i.vtbl.GetUri.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&_uri)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } // Get result and cleanup - uri := windows.UTF16PtrToString(_uri) - windows.CoTaskMemFree(unsafe.Pointer(_uri)) - return uri, nil -} - -// GetContent returns the body of the request. Returns nil if there's no body. Make sure to call -// Release on the returned IStream after finished using it. -func (i *ICoreWebView2WebResourceRequest) GetContent() (*IStream, error) { - var stream *IStream - res, _, err := i.vtbl.GetContent.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&stream)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - if windows.Handle(res) != windows.S_OK { - return nil, syscall.Errno(res) - } - return stream, nil -} - -// GetHeaders returns the mutable HTTP request headers. Make sure to call -// Release on the returned Object after finished using it. -func (i *ICoreWebView2WebResourceRequest) GetHeaders() (*ICoreWebView2HttpRequestHeaders, error) { - var headers *ICoreWebView2HttpRequestHeaders - res, _, err := i.vtbl.GetHeaders.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&headers)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - if windows.Handle(res) != windows.S_OK { - return nil, syscall.Errno(res) - } - return headers, nil -} - -func (i *ICoreWebView2WebResourceRequest) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go deleted file mode 100644 index 614594e87..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go +++ /dev/null @@ -1,52 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2WebResourceRequestedEventArgsVtbl struct { - _IUnknownVtbl - GetRequest ComProc - GetResponse ComProc - PutResponse ComProc - GetDeferral ComProc - GetResourceContext ComProc -} - -type ICoreWebView2WebResourceRequestedEventArgs struct { - vtbl *_ICoreWebView2WebResourceRequestedEventArgsVtbl -} - -func (i *ICoreWebView2WebResourceRequestedEventArgs) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2WebResourceRequestedEventArgs) PutResponse(response *ICoreWebView2WebResourceResponse) error { - var err error - - _, _, err = i.vtbl.PutResponse.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(response)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2WebResourceRequestedEventArgs) GetRequest() (*ICoreWebView2WebResourceRequest, error) { - var err error - var request *ICoreWebView2WebResourceRequest - _, _, err = i.vtbl.GetRequest.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&request)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return request, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go deleted file mode 100644 index d0860c3be..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go +++ /dev/null @@ -1,50 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2WebResourceRequestedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2WebResourceRequestedEventHandler struct { - vtbl *_ICoreWebView2WebResourceRequestedEventHandlerVtbl - impl _ICoreWebView2WebResourceRequestedEventHandlerImpl -} - -func _ICoreWebView2WebResourceRequestedEventHandlerIUnknownQueryInterface(this *iCoreWebView2WebResourceRequestedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2WebResourceRequestedEventHandlerIUnknownAddRef(this *iCoreWebView2WebResourceRequestedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2WebResourceRequestedEventHandlerIUnknownRelease(this *iCoreWebView2WebResourceRequestedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2WebResourceRequestedEventHandlerInvoke(this *iCoreWebView2WebResourceRequestedEventHandler, sender *ICoreWebView2, args *ICoreWebView2WebResourceRequestedEventArgs) uintptr { - return this.impl.WebResourceRequested(sender, args) -} - -type _ICoreWebView2WebResourceRequestedEventHandlerImpl interface { - _IUnknownImpl - WebResourceRequested(sender *ICoreWebView2, args *ICoreWebView2WebResourceRequestedEventArgs) uintptr -} - -var _ICoreWebView2WebResourceRequestedEventHandlerFn = _ICoreWebView2WebResourceRequestedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerInvoke), -} - -func newICoreWebView2WebResourceRequestedEventHandler(impl _ICoreWebView2WebResourceRequestedEventHandlerImpl) *iCoreWebView2WebResourceRequestedEventHandler { - return &iCoreWebView2WebResourceRequestedEventHandler{ - vtbl: &_ICoreWebView2WebResourceRequestedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go deleted file mode 100644 index dd02e6089..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go +++ /dev/null @@ -1,28 +0,0 @@ -//go:build windows - -package edge - -import "unsafe" - -type _ICoreWebView2WebResourceResponseVtbl struct { - _IUnknownVtbl - GetContent ComProc - PutContent ComProc - GetHeaders ComProc - GetStatusCode ComProc - PutStatusCode ComProc - GetReasonPhrase ComProc - PutReasonPhrase ComProc -} - -type ICoreWebView2WebResourceResponse struct { - vtbl *_ICoreWebView2WebResourceResponseVtbl -} - -func (i *ICoreWebView2WebResourceResponse) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2WebResourceResponse) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go deleted file mode 100644 index 85a4f71fa..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go +++ /dev/null @@ -1,18 +0,0 @@ -//go:build windows - -package edge - -type iCoreWebView2_2Vtbl struct { - iCoreWebView2Vtbl - AddWebResourceResponseReceived ComProc - RemoveWebResourceResponseReceived ComProc - NavigateWithWebResourceRequest ComProc - AddDomContentLoaded ComProc - RemoveDomContentLoaded ComProc - GetCookieManager ComProc - GetEnvironment ComProc -} - -type ICoreWebView2_2 struct { - vtbl *iCoreWebView2_2Vtbl -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go deleted file mode 100644 index 58424bd6a..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go +++ /dev/null @@ -1,62 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type iCoreWebView2_3Vtbl struct { - iCoreWebView2_2Vtbl - TrySuspend ComProc - Resume ComProc - GetIsSuspended ComProc - SetVirtualHostNameToFolderMapping ComProc - ClearVirtualHostNameToFolderMapping ComProc -} - -type ICoreWebView2_3 struct { - vtbl *iCoreWebView2_3Vtbl -} - -func (i *ICoreWebView2_3) SetVirtualHostNameToFolderMapping(hostName, folderPath string, accessKind COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND) error { - _hostName, err := windows.UTF16PtrFromString(hostName) - if err != nil { - return err - } - - _folderPath, err := windows.UTF16PtrFromString(folderPath) - if err != nil { - return err - } - - _, _, err = i.vtbl.SetVirtualHostNameToFolderMapping.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_hostName)), - uintptr(unsafe.Pointer(_folderPath)), - uintptr(accessKind), - ) - if err != windows.ERROR_SUCCESS { - return err - } - - return nil -} - -func (i *ICoreWebView2) GetICoreWebView2_3() *ICoreWebView2_3 { - var result *ICoreWebView2_3 - - iidICoreWebView2_3 := NewGUID("{A0D6DF20-3B92-416D-AA0C-437A9C727857}") - _, _, _ = i.vtbl.QueryInterface.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(iidICoreWebView2_3)), - uintptr(unsafe.Pointer(&result))) - - return result -} - -func (e *Chromium) GetICoreWebView2_3() *ICoreWebView2_3 { - return e.webview.GetICoreWebView2_3() -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go deleted file mode 100644 index 6c6b16d74..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go +++ /dev/null @@ -1,397 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -// ICoreWebviewSettings is the merged settings class - -type _ICoreWebViewSettingsVtbl struct { - _IUnknownVtbl - GetIsScriptEnabled ComProc - PutIsScriptEnabled ComProc - GetIsWebMessageEnabled ComProc - PutIsWebMessageEnabled ComProc - GetAreDefaultScriptDialogsEnabled ComProc - PutAreDefaultScriptDialogsEnabled ComProc - GetIsStatusBarEnabled ComProc - PutIsStatusBarEnabled ComProc - GetAreDevToolsEnabled ComProc - PutAreDevToolsEnabled ComProc - GetAreDefaultContextMenusEnabled ComProc - PutAreDefaultContextMenusEnabled ComProc - GetAreHostObjectsAllowed ComProc - PutAreHostObjectsAllowed ComProc - GetIsZoomControlEnabled ComProc - PutIsZoomControlEnabled ComProc - GetIsBuiltInErrorPageEnabled ComProc - PutIsBuiltInErrorPageEnabled ComProc - GetUserAgent ComProc // ICoreWebView2Settings2: SDK 1.0.864.35 - PutUserAgent ComProc - GetAreBrowserAcceleratorKeysEnabled ComProc // ICoreWebView2Settings3: SDK 1.0.864.35 - PutAreBrowserAcceleratorKeysEnabled ComProc - GetIsPasswordAutosaveEnabled ComProc // ICoreWebView2Settings4: SDK 1.0.902.49 - PutIsPasswordAutosaveEnabled ComProc - GetIsGeneralAutofillEnabled ComProc - PutIsGeneralAutofillEnabled ComProc - GetIsPinchZoomEnabled ComProc // ICoreWebView2Settings5: SDK 1.0.902.49 - PutIsPinchZoomEnabled ComProc - GetIsSwipeNavigationEnabled ComProc // ICoreWebView2Settings6: SDK 1.0.992.28 - PutIsSwipeNavigationEnabled ComProc -} - -type ICoreWebViewSettings struct { - vtbl *_ICoreWebViewSettingsVtbl -} - -func (i *ICoreWebViewSettings) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebViewSettings) GetIsScriptEnabled() (bool, error) { - var err error - var isScriptEnabled bool - _, _, err = i.vtbl.GetIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isScriptEnabled, nil -} - -func (i *ICoreWebViewSettings) PutIsScriptEnabled(isScriptEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsWebMessageEnabled() (bool, error) { - var err error - var isWebMessageEnabled bool - _, _, err = i.vtbl.GetIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isWebMessageEnabled, nil -} - -func (i *ICoreWebViewSettings) PutIsWebMessageEnabled(isWebMessageEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreDefaultScriptDialogsEnabled() (bool, error) { - var err error - var areDefaultScriptDialogsEnabled bool - _, _, err = i.vtbl.GetAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDefaultScriptDialogsEnabled, nil -} - -func (i *ICoreWebViewSettings) PutAreDefaultScriptDialogsEnabled(areDefaultScriptDialogsEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsStatusBarEnabled() (bool, error) { - var err error - var isStatusBarEnabled bool - _, _, err = i.vtbl.GetIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isStatusBarEnabled, nil -} - -func (i *ICoreWebViewSettings) PutIsStatusBarEnabled(isStatusBarEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreDevToolsEnabled() (bool, error) { - var err error - var areDevToolsEnabled bool - _, _, err = i.vtbl.GetAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDevToolsEnabled, nil -} - -func (i *ICoreWebViewSettings) PutAreDevToolsEnabled(areDevToolsEnabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreDefaultContextMenusEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutAreDefaultContextMenusEnabled(enabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreHostObjectsAllowed() (bool, error) { - var err error - var allowed bool - _, _, err = i.vtbl.GetAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&allowed)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return allowed, nil -} - -func (i *ICoreWebViewSettings) PutAreHostObjectsAllowed(allowed bool) error { - var err error - - _, _, err = i.vtbl.PutAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(allowed)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsZoomControlEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsZoomControlEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsBuiltInErrorPageEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsBuiltInErrorPageEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetUserAgent() (string, error) { - var err error - // Create *uint16 to hold result - var _userAgent *uint16 - _, _, err = i.vtbl.GetUserAgent.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_userAgent)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } // Get result and cleanup - userAgent := windows.UTF16PtrToString(_userAgent) - windows.CoTaskMemFree(unsafe.Pointer(_userAgent)) - return userAgent, nil -} - -func (i *ICoreWebViewSettings) PutUserAgent(userAgent string) error { - var err error - // Convert string 'userAgent' to *uint16 - _userAgent, err := windows.UTF16PtrFromString(userAgent) - if err != nil { - return err - } - - _, _, err = i.vtbl.PutUserAgent.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_userAgent)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreBrowserAcceleratorKeysEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetAreBrowserAcceleratorKeysEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutAreBrowserAcceleratorKeysEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutAreBrowserAcceleratorKeysEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsPinchZoomEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsPinchZoomEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsPinchZoomEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsPinchZoomEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsSwipeNavigationEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsSwipeNavigationEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsSwipeNavigationEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsSwipeNavigationEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go deleted file mode 100644 index 9e29ca4f0..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go +++ /dev/null @@ -1,54 +0,0 @@ -//go:build windows - -package edge - -import ( - "io" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _IStreamVtbl struct { - _IUnknownVtbl - Read ComProc - Write ComProc -} - -type IStream struct { - vtbl *_IStreamVtbl -} - -func (i *IStream) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} - -func (i *IStream) Read(p []byte) (int, error) { - bufLen := len(p) - if bufLen == 0 { - return 0, nil - } - - var n int - res, _, err := i.vtbl.Read.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&p[0])), - uintptr(bufLen), - uintptr(unsafe.Pointer(&n)), - ) - if err != windows.ERROR_SUCCESS { - return 0, err - } - - switch windows.Handle(res) { - case windows.S_OK: - // The buffer has been completely filled - return n, nil - case windows.S_FALSE: - // The buffer has been filled with less than len data and the stream is EOF - return n, io.EOF - default: - return 0, syscall.Errno(res) - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go deleted file mode 100644 index 376891bb1..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go +++ /dev/null @@ -1,419 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "errors" - "log" - "os" - "path/filepath" - "strings" - "sync/atomic" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "golang.org/x/sys/windows" -) - -type Rect = w32.Rect - -type Chromium struct { - hwnd uintptr - controller *ICoreWebView2Controller - webview *ICoreWebView2 - inited uintptr - envCompleted *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler - controllerCompleted *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler - webMessageReceived *iCoreWebView2WebMessageReceivedEventHandler - permissionRequested *iCoreWebView2PermissionRequestedEventHandler - webResourceRequested *iCoreWebView2WebResourceRequestedEventHandler - acceleratorKeyPressed *ICoreWebView2AcceleratorKeyPressedEventHandler - navigationCompleted *ICoreWebView2NavigationCompletedEventHandler - processFailed *ICoreWebView2ProcessFailedEventHandler - - environment *ICoreWebView2Environment - - padding Rect - - // Settings - Debug bool - DataPath string - BrowserPath string - AdditionalBrowserArgs []string - - // permissions - permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState - globalPermission *CoreWebView2PermissionState - - // Callbacks - MessageCallback func(string) - WebResourceRequestedCallback func(request *ICoreWebView2WebResourceRequest, args *ICoreWebView2WebResourceRequestedEventArgs) - NavigationCompletedCallback func(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) - ProcessFailedCallback func(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) - AcceleratorKeyCallback func(uint) bool -} - -func NewChromium() *Chromium { - e := &Chromium{} - /* - All these handlers are passed to native code through syscalls with 'uintptr(unsafe.Pointer(handler))' and we know - that a pointer to those will be kept in the native code. Furthermore these handlers als contain pointer to other Go - structs like the vtable. - This violates the unsafe.Pointer rule '(4) Conversion of a Pointer to a uintptr when calling syscall.Syscall.' because - theres no guarantee that Go doesn't move these objects. - AFAIK currently the Go runtime doesn't move HEAP objects, so we should be safe with these handlers. But they don't - guarantee it, because in the future Go might use a compacting GC. - There's a proposal to add a runtime.Pin function, to prevent moving pinned objects, which would allow to easily fix - this issue by just pinning the handlers. The https://go-review.googlesource.com/c/go/+/367296/ should land in Go 1.19. - */ - e.envCompleted = newICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler(e) - e.controllerCompleted = newICoreWebView2CreateCoreWebView2ControllerCompletedHandler(e) - e.webMessageReceived = newICoreWebView2WebMessageReceivedEventHandler(e) - e.permissionRequested = newICoreWebView2PermissionRequestedEventHandler(e) - e.webResourceRequested = newICoreWebView2WebResourceRequestedEventHandler(e) - e.acceleratorKeyPressed = newICoreWebView2AcceleratorKeyPressedEventHandler(e) - e.navigationCompleted = newICoreWebView2NavigationCompletedEventHandler(e) - e.processFailed = newICoreWebView2ProcessFailedEventHandler(e) - e.permissions = make(map[CoreWebView2PermissionKind]CoreWebView2PermissionState) - - return e -} - -func (e *Chromium) Embed(hwnd uintptr) bool { - e.hwnd = hwnd - - dataPath := e.DataPath - if dataPath == "" { - currentExePath := make([]uint16, windows.MAX_PATH) - _, err := windows.GetModuleFileName(windows.Handle(0), ¤tExePath[0], windows.MAX_PATH) - if err != nil { - // What to do here? - return false - } - currentExeName := filepath.Base(windows.UTF16ToString(currentExePath)) - dataPath = filepath.Join(os.Getenv("AppData"), currentExeName) - } - - if e.BrowserPath != "" { - if _, err := os.Stat(e.BrowserPath); errors.Is(err, os.ErrNotExist) { - log.Printf("Browser path %s does not exist", e.BrowserPath) - return false - } - } - - browserArgs := strings.Join(e.AdditionalBrowserArgs, " ") - if err := createCoreWebView2EnvironmentWithOptions(e.BrowserPath, dataPath, e.envCompleted, browserArgs); err != nil { - log.Printf("Error calling Webview2Loader: %v", err) - return false - } - - var msg w32.Msg - for { - if atomic.LoadUintptr(&e.inited) != 0 { - break - } - r, _, _ := w32.User32GetMessageW.Call( - uintptr(unsafe.Pointer(&msg)), - 0, - 0, - 0, - ) - if r == 0 { - break - } - w32.User32TranslateMessage.Call(uintptr(unsafe.Pointer(&msg))) - w32.User32DispatchMessageW.Call(uintptr(unsafe.Pointer(&msg))) - } - e.Init("window.external={invoke:s=>window.chrome.webview.postMessage(s)}") - return true -} - -func (e *Chromium) SetPadding(padding Rect) { - if e.padding.Top == padding.Top && e.padding.Bottom == padding.Bottom && - e.padding.Left == padding.Left && e.padding.Right == padding.Right { - - return - } - - e.padding = padding - e.Resize() -} - -func (e *Chromium) Resize() { - if e.hwnd == 0 { - return - } - - var bounds w32.Rect - w32.User32GetClientRect.Call(e.hwnd, uintptr(unsafe.Pointer(&bounds))) - - bounds.Top += e.padding.Top - bounds.Bottom -= e.padding.Bottom - bounds.Left += e.padding.Left - bounds.Right -= e.padding.Right - - e.SetSize(bounds) -} - -func (e *Chromium) Navigate(url string) { - e.webview.vtbl.Navigate.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(url))), - ) -} - -func (e *Chromium) Init(script string) { - e.webview.vtbl.AddScriptToExecuteOnDocumentCreated.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(script))), - 0, - ) -} - -func (e *Chromium) Eval(script string) { - - _script, err := windows.UTF16PtrFromString(script) - if err != nil { - log.Fatal(err) - } - - e.webview.vtbl.ExecuteScript.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(_script)), - 0, - ) -} - -func (e *Chromium) Show() error { - return e.controller.PutIsVisible(true) -} - -func (e *Chromium) Hide() error { - return e.controller.PutIsVisible(false) -} - -func (e *Chromium) QueryInterface(_, _ uintptr) uintptr { - return 0 -} - -func (e *Chromium) AddRef() uintptr { - return 1 -} - -func (e *Chromium) Release() uintptr { - return 1 -} - -func (e *Chromium) EnvironmentCompleted(res uintptr, env *ICoreWebView2Environment) uintptr { - if int32(res) < 0 { - log.Fatalf("Creating environment failed with %08x: %s", res, syscall.Errno(res)) - } - env.vtbl.AddRef.Call(uintptr(unsafe.Pointer(env))) - e.environment = env - - env.vtbl.CreateCoreWebView2Controller.Call( - uintptr(unsafe.Pointer(env)), - e.hwnd, - uintptr(unsafe.Pointer(e.controllerCompleted)), - ) - return 0 -} - -func (e *Chromium) CreateCoreWebView2ControllerCompleted(res uintptr, controller *ICoreWebView2Controller) uintptr { - if int32(res) < 0 { - log.Fatalf("Creating controller failed with %08x: %s", res, syscall.Errno(res)) - } - controller.vtbl.AddRef.Call(uintptr(unsafe.Pointer(controller))) - e.controller = controller - - var token _EventRegistrationToken - controller.vtbl.GetCoreWebView2.Call( - uintptr(unsafe.Pointer(controller)), - uintptr(unsafe.Pointer(&e.webview)), - ) - e.webview.vtbl.AddRef.Call( - uintptr(unsafe.Pointer(e.webview)), - ) - e.webview.vtbl.AddWebMessageReceived.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.webMessageReceived)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddPermissionRequested.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.permissionRequested)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddWebResourceRequested.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.webResourceRequested)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddNavigationCompleted.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.navigationCompleted)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddProcessFailed.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.processFailed)), - uintptr(unsafe.Pointer(&token)), - ) - - e.controller.AddAcceleratorKeyPressed(e.acceleratorKeyPressed, &token) - - atomic.StoreUintptr(&e.inited, 1) - - return 0 -} - -func (e *Chromium) MessageReceived(sender *ICoreWebView2, args *iCoreWebView2WebMessageReceivedEventArgs) uintptr { - var message *uint16 - args.vtbl.TryGetWebMessageAsString.Call( - uintptr(unsafe.Pointer(args)), - uintptr(unsafe.Pointer(&message)), - ) - if e.MessageCallback != nil { - e.MessageCallback(w32.Utf16PtrToString(message)) - } - sender.vtbl.PostWebMessageAsString.Call( - uintptr(unsafe.Pointer(sender)), - uintptr(unsafe.Pointer(message)), - ) - windows.CoTaskMemFree(unsafe.Pointer(message)) - return 0 -} - -func (e *Chromium) SetPermission(kind CoreWebView2PermissionKind, state CoreWebView2PermissionState) { - e.permissions[kind] = state -} - -func (e *Chromium) SetGlobalPermission(state CoreWebView2PermissionState) { - e.globalPermission = &state -} - -func (e *Chromium) PermissionRequested(_ *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr { - var kind CoreWebView2PermissionKind - args.vtbl.GetPermissionKind.Call( - uintptr(unsafe.Pointer(args)), - uintptr(kind), - ) - var result CoreWebView2PermissionState - if e.globalPermission != nil { - result = *e.globalPermission - } else { - var ok bool - result, ok = e.permissions[kind] - if !ok { - result = CoreWebView2PermissionStateDefault - } - } - args.vtbl.PutState.Call( - uintptr(unsafe.Pointer(args)), - uintptr(result), - ) - return 0 -} - -func (e *Chromium) WebResourceRequested(sender *ICoreWebView2, args *ICoreWebView2WebResourceRequestedEventArgs) uintptr { - req, err := args.GetRequest() - if err != nil { - log.Fatal(err) - } - defer req.Release() - - if e.WebResourceRequestedCallback != nil { - e.WebResourceRequestedCallback(req, args) - } - return 0 -} - -func (e *Chromium) AddWebResourceRequestedFilter(filter string, ctx COREWEBVIEW2_WEB_RESOURCE_CONTEXT) { - err := e.webview.AddWebResourceRequestedFilter(filter, ctx) - if err != nil { - log.Fatal(err) - } -} - -func (e *Chromium) Environment() *ICoreWebView2Environment { - return e.environment -} - -// AcceleratorKeyPressed is called when an accelerator key is pressed. -// If the AcceleratorKeyCallback method has been set, it will defer handling of the keypress -// to the callback. That callback returns a bool indicating if the event was handled. -func (e *Chromium) AcceleratorKeyPressed(sender *ICoreWebView2Controller, args *ICoreWebView2AcceleratorKeyPressedEventArgs) uintptr { - if e.AcceleratorKeyCallback == nil { - return 0 - } - eventKind, _ := args.GetKeyEventKind() - if eventKind == COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN || - eventKind == COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN { - virtualKey, _ := args.GetVirtualKey() - status, _ := args.GetPhysicalKeyStatus() - if !status.WasKeyDown { - args.PutHandled(e.AcceleratorKeyCallback(virtualKey)) - return 0 - } - } - args.PutHandled(false) - return 0 -} - -func (e *Chromium) GetSettings() (*ICoreWebViewSettings, error) { - return e.webview.GetSettings() -} - -func (e *Chromium) GetController() *ICoreWebView2Controller { - return e.controller -} - -func boolToInt(input bool) int { - if input { - return 1 - } - return 0 -} - -func (e *Chromium) NavigationCompleted(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr { - if e.NavigationCompletedCallback != nil { - e.NavigationCompletedCallback(sender, args) - } - return 0 -} - -func (e *Chromium) ProcessFailed(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) uintptr { - if e.ProcessFailedCallback != nil { - e.ProcessFailedCallback(sender, args) - } - return 0 -} - -func (e *Chromium) NotifyParentWindowPositionChanged() error { - //It looks like the wndproc function is called before the controller initialization is complete. - //Because of this the controller is nil - if e.controller == nil { - return nil - } - return e.controller.NotifyParentWindowPositionChanged() -} - -func (e *Chromium) Focus() { - err := e.controller.MoveFocus(COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC) - if err != nil { - log.Fatal(err) - } -} - -func (e *Chromium) PutZoomFactor(zoomFactor float64) { - err := e.controller.PutZoomFactor(zoomFactor) - if err != nil { - log.Fatal(err) - } -} - -func (e *Chromium) OpenDevToolsWindow() { - e.webview.OpenDevToolsWindow() -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go deleted file mode 100644 index 00f6f42fb..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "unsafe" -) - -func (e *Chromium) SetSize(bounds w32.Rect) { - if e.controller == nil { - return - } - - e.controller.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(e.controller)), - uintptr(bounds.Left), - uintptr(bounds.Top), - uintptr(bounds.Right), - uintptr(bounds.Bottom), - ) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go deleted file mode 100644 index 858b93f17..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go +++ /dev/null @@ -1,20 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "unsafe" -) - -func (e *Chromium) SetSize(bounds w32.Rect) { - if e.controller == nil { - return - } - - e.controller.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(e.controller)), - uintptr(unsafe.Pointer(&bounds)), - ) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go deleted file mode 100644 index b237792e4..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" -) - -func (e *Chromium) SetSize(bounds w32.Rect) { - if e.controller == nil { - return - } - - words := (*[2]uintptr)(unsafe.Pointer(&bounds)) - e.controller.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(e.controller)), - words[0], - words[1], - ) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go deleted file mode 100644 index 6f1afbd87..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go +++ /dev/null @@ -1,503 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "fmt" - "log" - "runtime" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - - "golang.org/x/sys/windows" -) - -func init() { - runtime.LockOSThread() - - r, _, _ := w32.Ole32CoInitializeEx.Call(0, 2) - if int(r) < 0 { - log.Printf("Warning: CoInitializeEx call failed: E=%08x", r) - } -} - -type _EventRegistrationToken struct { - value int64 -} - -type CoreWebView2PermissionKind uint32 - -const ( - CoreWebView2PermissionKindUnknownPermission CoreWebView2PermissionKind = iota - CoreWebView2PermissionKindMicrophone - CoreWebView2PermissionKindCamera - CoreWebView2PermissionKindGeolocation - CoreWebView2PermissionKindNotifications - CoreWebView2PermissionKindOtherSensors - CoreWebView2PermissionKindClipboardRead -) - -type CoreWebView2PermissionState uint32 - -const ( - CoreWebView2PermissionStateDefault CoreWebView2PermissionState = iota - CoreWebView2PermissionStateAllow - CoreWebView2PermissionStateDeny -) - -// ComProc stores a COM procedure. -type ComProc uintptr - -// NewComProc creates a new COM proc from a Go function. -func NewComProc(fn interface{}) ComProc { - return ComProc(windows.NewCallback(fn)) -} - -// Call calls a COM procedure. -// -//go:uintptrescapes -func (p ComProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { - // The magic uintptrescapes comment is needed to prevent moving uintptr(unsafe.Pointer(p)) so calls to .Call() also - // satisfy the unsafe.Pointer rule "(4) Conversion of a Pointer to a uintptr when calling syscall.Syscall." - // Otherwise it might be that pointers get moved, especially pointer onto the Go stack which might grow dynamically. - // See https://pkg.go.dev/unsafe#Pointer and https://github.com/golang/go/issues/34474 - switch len(a) { - case 0: - return syscall.Syscall(uintptr(p), 0, 0, 0, 0) - case 1: - return syscall.Syscall(uintptr(p), 1, a[0], 0, 0) - case 2: - return syscall.Syscall(uintptr(p), 2, a[0], a[1], 0) - case 3: - return syscall.Syscall(uintptr(p), 3, a[0], a[1], a[2]) - case 4: - return syscall.Syscall6(uintptr(p), 4, a[0], a[1], a[2], a[3], 0, 0) - case 5: - return syscall.Syscall6(uintptr(p), 5, a[0], a[1], a[2], a[3], a[4], 0) - case 6: - return syscall.Syscall6(uintptr(p), 6, a[0], a[1], a[2], a[3], a[4], a[5]) - case 7: - return syscall.Syscall9(uintptr(p), 7, a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) - case 8: - return syscall.Syscall9(uintptr(p), 8, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) - case 9: - return syscall.Syscall9(uintptr(p), 9, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) - case 10: - return syscall.Syscall12(uintptr(p), 10, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) - case 11: - return syscall.Syscall12(uintptr(p), 11, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) - case 12: - return syscall.Syscall12(uintptr(p), 12, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) - case 13: - return syscall.Syscall15(uintptr(p), 13, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) - case 14: - return syscall.Syscall15(uintptr(p), 14, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) - case 15: - return syscall.Syscall15(uintptr(p), 15, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) - default: - panic("too many arguments") - } -} - -// IUnknown - -type _IUnknownVtbl struct { - QueryInterface ComProc - AddRef ComProc - Release ComProc -} - -func (i *_IUnknownVtbl) CallRelease(this unsafe.Pointer) error { - _, _, err := i.Release.Call( - uintptr(this), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -type _IUnknownImpl interface { - QueryInterface(refiid, object uintptr) uintptr - AddRef() uintptr - Release() uintptr -} - -// ICoreWebView2 - -type iCoreWebView2Vtbl struct { - _IUnknownVtbl - GetSettings ComProc - GetSource ComProc - Navigate ComProc - NavigateToString ComProc - AddNavigationStarting ComProc - RemoveNavigationStarting ComProc - AddContentLoading ComProc - RemoveContentLoading ComProc - AddSourceChanged ComProc - RemoveSourceChanged ComProc - AddHistoryChanged ComProc - RemoveHistoryChanged ComProc - AddNavigationCompleted ComProc - RemoveNavigationCompleted ComProc - AddFrameNavigationStarting ComProc - RemoveFrameNavigationStarting ComProc - AddFrameNavigationCompleted ComProc - RemoveFrameNavigationCompleted ComProc - AddScriptDialogOpening ComProc - RemoveScriptDialogOpening ComProc - AddPermissionRequested ComProc - RemovePermissionRequested ComProc - AddProcessFailed ComProc - RemoveProcessFailed ComProc - AddScriptToExecuteOnDocumentCreated ComProc - RemoveScriptToExecuteOnDocumentCreated ComProc - ExecuteScript ComProc - CapturePreview ComProc - Reload ComProc - PostWebMessageAsJSON ComProc - PostWebMessageAsString ComProc - AddWebMessageReceived ComProc - RemoveWebMessageReceived ComProc - CallDevToolsProtocolMethod ComProc - GetBrowserProcessID ComProc - GetCanGoBack ComProc - GetCanGoForward ComProc - GoBack ComProc - GoForward ComProc - GetDevToolsProtocolEventReceiver ComProc - Stop ComProc - AddNewWindowRequested ComProc - RemoveNewWindowRequested ComProc - AddDocumentTitleChanged ComProc - RemoveDocumentTitleChanged ComProc - GetDocumentTitle ComProc - AddHostObjectToScript ComProc - RemoveHostObjectFromScript ComProc - OpenDevToolsWindow ComProc - AddContainsFullScreenElementChanged ComProc - RemoveContainsFullScreenElementChanged ComProc - GetContainsFullScreenElement ComProc - AddWebResourceRequested ComProc - RemoveWebResourceRequested ComProc - AddWebResourceRequestedFilter ComProc - RemoveWebResourceRequestedFilter ComProc - AddWindowCloseRequested ComProc - RemoveWindowCloseRequested ComProc -} - -type ICoreWebView2 struct { - vtbl *iCoreWebView2Vtbl -} - -func (i *ICoreWebView2) GetSettings() (*ICoreWebViewSettings, error) { - var err error - var settings *ICoreWebViewSettings - _, _, err = i.vtbl.GetSettings.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&settings)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return settings, nil -} - -// ICoreWebView2Environment - -type iCoreWebView2EnvironmentVtbl struct { - _IUnknownVtbl - CreateCoreWebView2Controller ComProc - CreateWebResourceResponse ComProc - GetBrowserVersionString ComProc - AddNewBrowserVersionAvailable ComProc - RemoveNewBrowserVersionAvailable ComProc -} - -type ICoreWebView2Environment struct { - vtbl *iCoreWebView2EnvironmentVtbl -} - -// CreateWebResourceResponse creates a new ICoreWebView2WebResourceResponse, it must be released after finishing using it. -func (e *ICoreWebView2Environment) CreateWebResourceResponse(content []byte, statusCode int, reasonPhrase string, headers string) (*ICoreWebView2WebResourceResponse, error) { - var err error - var stream uintptr - - if len(content) > 0 { - // Create stream for response - stream, err = w32.SHCreateMemStream(content) - if err != nil { - return nil, err - } - - // Release the IStream after we are finished, CreateWebResourceResponse Call will increase the reference - // count on IStream and therefore it won't be freed until the reference count of the response is 0. - defer (*IStream)(unsafe.Pointer(stream)).Release() - } - - // Convert string 'uri' to *uint16 - _reason, err := windows.UTF16PtrFromString(reasonPhrase) - if err != nil { - return nil, err - } - // Convert string 'uri' to *uint16 - _headers, err := windows.UTF16PtrFromString(headers) - if err != nil { - return nil, err - } - var response *ICoreWebView2WebResourceResponse - hr, _, err := e.vtbl.CreateWebResourceResponse.Call( - uintptr(unsafe.Pointer(e)), - stream, - uintptr(statusCode), - uintptr(unsafe.Pointer(_reason)), - uintptr(unsafe.Pointer(_headers)), - uintptr(unsafe.Pointer(&response)), - ) - if windows.Handle(hr) != windows.S_OK { - return nil, syscall.Errno(hr) - } - - if response == nil { - if err == nil { - err = fmt.Errorf("unknown error") - } - return nil, err - } - return response, nil - -} - -// ICoreWebView2WebMessageReceivedEventArgs - -type iCoreWebView2WebMessageReceivedEventArgsVtbl struct { - _IUnknownVtbl - GetSource ComProc - GetWebMessageAsJSON ComProc - TryGetWebMessageAsString ComProc -} - -type iCoreWebView2WebMessageReceivedEventArgs struct { - vtbl *iCoreWebView2WebMessageReceivedEventArgsVtbl -} - -// ICoreWebView2PermissionRequestedEventArgs - -type iCoreWebView2PermissionRequestedEventArgsVtbl struct { - _IUnknownVtbl - GetURI ComProc - GetPermissionKind ComProc - GetIsUserInitiated ComProc - GetState ComProc - PutState ComProc - GetDeferral ComProc -} - -type iCoreWebView2PermissionRequestedEventArgs struct { - vtbl *iCoreWebView2PermissionRequestedEventArgsVtbl -} - -// ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler - -type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerImpl interface { - _IUnknownImpl - EnvironmentCompleted(res uintptr, env *ICoreWebView2Environment) uintptr -} - -type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler struct { - vtbl *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl - impl iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerImpl -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownQueryInterface(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownAddRef(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownRelease(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerInvoke(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, res uintptr, env *ICoreWebView2Environment) uintptr { - return this.impl.EnvironmentCompleted(res, env) -} - -var iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerFn = iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerInvoke), -} - -func newICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler(impl iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerImpl) *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler { - return &iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler{ - vtbl: &iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerFn, - impl: impl, - } -} - -// ICoreWebView2WebMessageReceivedEventHandler - -type iCoreWebView2WebMessageReceivedEventHandlerImpl interface { - _IUnknownImpl - MessageReceived(sender *ICoreWebView2, args *iCoreWebView2WebMessageReceivedEventArgs) uintptr -} - -type iCoreWebView2WebMessageReceivedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2WebMessageReceivedEventHandler struct { - vtbl *iCoreWebView2WebMessageReceivedEventHandlerVtbl - impl iCoreWebView2WebMessageReceivedEventHandlerImpl -} - -func _ICoreWebView2WebMessageReceivedEventHandlerIUnknownQueryInterface(this *iCoreWebView2WebMessageReceivedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2WebMessageReceivedEventHandlerIUnknownAddRef(this *iCoreWebView2WebMessageReceivedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2WebMessageReceivedEventHandlerIUnknownRelease(this *iCoreWebView2WebMessageReceivedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2WebMessageReceivedEventHandlerInvoke(this *iCoreWebView2WebMessageReceivedEventHandler, sender *ICoreWebView2, args *iCoreWebView2WebMessageReceivedEventArgs) uintptr { - return this.impl.MessageReceived(sender, args) -} - -var iCoreWebView2WebMessageReceivedEventHandlerFn = iCoreWebView2WebMessageReceivedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerInvoke), -} - -func newICoreWebView2WebMessageReceivedEventHandler(impl iCoreWebView2WebMessageReceivedEventHandlerImpl) *iCoreWebView2WebMessageReceivedEventHandler { - return &iCoreWebView2WebMessageReceivedEventHandler{ - vtbl: &iCoreWebView2WebMessageReceivedEventHandlerFn, - impl: impl, - } -} - -// ICoreWebView2PermissionRequestedEventHandler - -type iCoreWebView2PermissionRequestedEventHandlerImpl interface { - _IUnknownImpl - PermissionRequested(sender *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr -} - -type iCoreWebView2PermissionRequestedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2PermissionRequestedEventHandler struct { - vtbl *iCoreWebView2PermissionRequestedEventHandlerVtbl - impl iCoreWebView2PermissionRequestedEventHandlerImpl -} - -func _ICoreWebView2PermissionRequestedEventHandlerIUnknownQueryInterface(this *iCoreWebView2PermissionRequestedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2PermissionRequestedEventHandlerIUnknownAddRef(this *iCoreWebView2PermissionRequestedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2PermissionRequestedEventHandlerIUnknownRelease(this *iCoreWebView2PermissionRequestedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2PermissionRequestedEventHandlerInvoke(this *iCoreWebView2PermissionRequestedEventHandler, sender *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr { - return this.impl.PermissionRequested(sender, args) -} - -var iCoreWebView2PermissionRequestedEventHandlerFn = iCoreWebView2PermissionRequestedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerInvoke), -} - -func newICoreWebView2PermissionRequestedEventHandler(impl iCoreWebView2PermissionRequestedEventHandlerImpl) *iCoreWebView2PermissionRequestedEventHandler { - return &iCoreWebView2PermissionRequestedEventHandler{ - vtbl: &iCoreWebView2PermissionRequestedEventHandlerFn, - impl: impl, - } -} - -func (i *ICoreWebView2) AddWebResourceRequestedFilter(uri string, resourceContext COREWEBVIEW2_WEB_RESOURCE_CONTEXT) error { - var err error - // Convert string 'uri' to *uint16 - _uri, err := windows.UTF16PtrFromString(uri) - if err != nil { - return err - } - _, _, err = i.vtbl.AddWebResourceRequestedFilter.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_uri)), - uintptr(resourceContext), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} -func (i *ICoreWebView2) AddNavigationCompleted(eventHandler *ICoreWebView2NavigationCompletedEventHandler, token *_EventRegistrationToken) error { - var err error - _, _, err = i.vtbl.AddNavigationCompleted.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(eventHandler)), - uintptr(unsafe.Pointer(&token)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2) AddProcessFailed(eventHandler *ICoreWebView2ProcessFailedEventHandler, token *_EventRegistrationToken) error { - var err error - _, _, err = i.vtbl.AddProcessFailed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(eventHandler)), - uintptr(unsafe.Pointer(&token)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2) OpenDevToolsWindow() error { - var err error - _, _, err = i.vtbl.OpenDevToolsWindow.Call( - uintptr(unsafe.Pointer(i)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go deleted file mode 100644 index a3b7374ca..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go +++ /dev/null @@ -1,29 +0,0 @@ -//go:build windows && !native_webview2loader - -package edge - -import ( - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" -) - -func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, additionalBrowserArgs string) error { - e := &environmentCreatedHandler{environmentCompletedHandle} - return webviewloader.CreateCoreWebView2EnvironmentWithOptions( - e, - webviewloader.WithBrowserExecutableFolder(browserExecutableFolder), - webviewloader.WithUserDataFolder(userDataFolder), - webviewloader.WithAdditionalBrowserArguments(additionalBrowserArgs), - ) -} - -type environmentCreatedHandler struct { - originalHandler *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler -} - -func (r *environmentCreatedHandler) EnvironmentCompleted(errorCode webviewloader.HRESULT, createdEnvironment *webviewloader.ICoreWebView2Environment) webviewloader.HRESULT { - env := (*ICoreWebView2Environment)(unsafe.Pointer(createdEnvironment)) - res := r.originalHandler.impl.EnvironmentCompleted(uintptr(errorCode), env) - return webviewloader.HRESULT(res) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go deleted file mode 100644 index 9b4f02bfd..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build windows && native_webview2loader - -package edge - -import ( - "fmt" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" - - "golang.org/x/sys/windows" -) - -func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, additionalBrowserArgs string) error { - browserPathPtr, err := windows.UTF16PtrFromString(browserExecutableFolder) - if err != nil { - return fmt.Errorf("Error calling UTF16PtrFromString for %s: %v", browserExecutableFolder, err) - } - - userPathPtr, err := windows.UTF16PtrFromString(userDataFolder) - if err != nil { - return fmt.Errorf("Error calling UTF16PtrFromString for %s: %v", userDataFolder, err) - } - - hr, err := webviewloader.CreateCoreWebView2EnvironmentWithOptions( - browserPathPtr, - userPathPtr, - uintptr(unsafe.Pointer(environmentCompletedHandle)), - additionalBrowserArgs, - ) - - if hr != 0 { - if err == nil || err == windows.ERROR_SUCCESS { - err = syscall.Errno(hr) - } - return err - } - - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go deleted file mode 100644 index 007e60586..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go +++ /dev/null @@ -1,225 +0,0 @@ -//go:build windows - -package edge - -// This code has been adapted from: https://github.com/go-ole/go-ole - -/* - -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -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 hextable = "0123456789ABCDEF" -const emptyGUID = "{00000000-0000-0000-0000-000000000000}" - -// GUID is Windows API specific GUID type. -// -// This exists to match Windows GUID type for direct passing for COM. -// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx. -type GUID struct { - Data1 uint32 - Data2 uint16 - Data3 uint16 - Data4 [8]byte -} - -// NewGUID converts the given string into a globally unique identifier that is -// compliant with the Windows API. -// -// The supplied string may be in any of these formats: -// -// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -// -// The conversion of the supplied string is not case-sensitive. -func NewGUID(guid string) *GUID { - d := []byte(guid) - var d1, d2, d3, d4a, d4b []byte - - switch len(d) { - case 38: - if d[0] != '{' || d[37] != '}' { - return nil - } - d = d[1:37] - fallthrough - case 36: - if d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' { - return nil - } - d1 = d[0:8] - d2 = d[9:13] - d3 = d[14:18] - d4a = d[19:23] - d4b = d[24:36] - case 32: - d1 = d[0:8] - d2 = d[8:12] - d3 = d[12:16] - d4a = d[16:20] - d4b = d[20:32] - default: - return nil - } - - var g GUID - var ok1, ok2, ok3, ok4 bool - g.Data1, ok1 = decodeHexUint32(d1) - g.Data2, ok2 = decodeHexUint16(d2) - g.Data3, ok3 = decodeHexUint16(d3) - g.Data4, ok4 = decodeHexByte64(d4a, d4b) - if ok1 && ok2 && ok3 && ok4 { - return &g - } - return nil -} - -func decodeHexUint32(src []byte) (value uint32, ok bool) { - var b1, b2, b3, b4 byte - var ok1, ok2, ok3, ok4 bool - b1, ok1 = decodeHexByte(src[0], src[1]) - b2, ok2 = decodeHexByte(src[2], src[3]) - b3, ok3 = decodeHexByte(src[4], src[5]) - b4, ok4 = decodeHexByte(src[6], src[7]) - value = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4) - ok = ok1 && ok2 && ok3 && ok4 - return -} - -func decodeHexUint16(src []byte) (value uint16, ok bool) { - var b1, b2 byte - var ok1, ok2 bool - b1, ok1 = decodeHexByte(src[0], src[1]) - b2, ok2 = decodeHexByte(src[2], src[3]) - value = (uint16(b1) << 8) | uint16(b2) - ok = ok1 && ok2 - return -} - -func decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) { - var ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool - value[0], ok1 = decodeHexByte(s1[0], s1[1]) - value[1], ok2 = decodeHexByte(s1[2], s1[3]) - value[2], ok3 = decodeHexByte(s2[0], s2[1]) - value[3], ok4 = decodeHexByte(s2[2], s2[3]) - value[4], ok5 = decodeHexByte(s2[4], s2[5]) - value[5], ok6 = decodeHexByte(s2[6], s2[7]) - value[6], ok7 = decodeHexByte(s2[8], s2[9]) - value[7], ok8 = decodeHexByte(s2[10], s2[11]) - ok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 - return -} - -func decodeHexByte(c1, c2 byte) (value byte, ok bool) { - var n1, n2 byte - var ok1, ok2 bool - n1, ok1 = decodeHexChar(c1) - n2, ok2 = decodeHexChar(c2) - value = (n1 << 4) | n2 - ok = ok1 && ok2 - return -} - -func decodeHexChar(c byte) (byte, bool) { - switch { - case '0' <= c && c <= '9': - return c - '0', true - case 'a' <= c && c <= 'f': - return c - 'a' + 10, true - case 'A' <= c && c <= 'F': - return c - 'A' + 10, true - } - - return 0, false -} - -// String converts the GUID to string form. It will adhere to this pattern: -// -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -// -// If the GUID is nil, the string representation of an empty GUID is returned: -// -// {00000000-0000-0000-0000-000000000000} -func (guid *GUID) String() string { - if guid == nil { - return emptyGUID - } - - var c [38]byte - c[0] = '{' - putUint32Hex(c[1:9], guid.Data1) - c[9] = '-' - putUint16Hex(c[10:14], guid.Data2) - c[14] = '-' - putUint16Hex(c[15:19], guid.Data3) - c[19] = '-' - putByteHex(c[20:24], guid.Data4[0:2]) - c[24] = '-' - putByteHex(c[25:37], guid.Data4[2:8]) - c[37] = '}' - return string(c[:]) -} - -func putUint32Hex(b []byte, v uint32) { - b[0] = hextable[byte(v>>24)>>4] - b[1] = hextable[byte(v>>24)&0x0f] - b[2] = hextable[byte(v>>16)>>4] - b[3] = hextable[byte(v>>16)&0x0f] - b[4] = hextable[byte(v>>8)>>4] - b[5] = hextable[byte(v>>8)&0x0f] - b[6] = hextable[byte(v)>>4] - b[7] = hextable[byte(v)&0x0f] -} - -func putUint16Hex(b []byte, v uint16) { - b[0] = hextable[byte(v>>8)>>4] - b[1] = hextable[byte(v>>8)&0x0f] - b[2] = hextable[byte(v)>>4] - b[3] = hextable[byte(v)&0x0f] -} - -func putByteHex(dst, src []byte) { - for i := 0; i < len(src); i++ { - dst[i*2] = hextable[src[i]>>4] - dst[i*2+1] = hextable[src[i]&0x0f] - } -} - -// IsEqualGUID compares two GUID. -// -// Not constant time comparison. -func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool { - return guid1.Data1 == guid2.Data1 && - guid1.Data2 == guid2.Data2 && - guid1.Data3 == guid2.Data3 && - guid1.Data4[0] == guid2.Data4[0] && - guid1.Data4[1] == guid2.Data4[1] && - guid1.Data4[2] == guid2.Data4[2] && - guid1.Data4[3] == guid2.Data4[3] && - guid1.Data4[4] == guid2.Data4[4] && - guid1.Data4[5] == guid2.Data4[5] && - guid1.Data4[6] == guid2.Data4[6] && - guid1.Data4[7] == guid2.Data4[7] -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE deleted file mode 100644 index af1894c87..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License (ISC) - -Copyright (c) 2020 John Chadwick -Copyright (c) 2022 Wails Project Developers - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md deleted file mode 100644 index f3e020ec4..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Webviewloader - -Webviewloader is a port of [OpenWebView2Loader](https://github.com/jchv/OpenWebView2Loader) to Go. - -It is intended to be feature-complete with the original WebView2Loader distributed with -the WebView2 NuGet package, but some features are intentionally not implemented. - -## Status - -- [x] CompareBrowserVersions -- [x] CreateCoreWebView2Environment -- [x] CreateCoreWebView2EnvironmentWithOptions -- [x] GetAvailableCoreWebView2BrowserVersionString - -## Not implemented features - -- Registry Overrides of Parameters -- Env Variable Overrides of Parameters -- Does not incorporate `GetCurrentPackageInfo` to search for an installed runtime diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/arm64/WebView2Loader.dll b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/arm64/WebView2Loader.dll deleted file mode 100644 index cd1c694b845a66c30fef09ca675ae539107477d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124328 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 [!NOTE]\n\> A merge of the different values of the same switch is not attempted, -// except for disabled and enabled features. The features specified by -// `--enable-features` and `--disable-features` are merged with simple -// logic.\n\> * The features is the union of the specified features -// and built-in features. If a feature is disabled, it is removed from the -// enabled features list. -// -// If you specify command-line switches and use the -// `additionalBrowserArguments` parameter, the `--edge-webview-switches` -// value takes precedence and is processed last. If a switch fails to -// parse, the switch is ignored. The default state for the operation is -// to run the browser process with no extra flags. -// -// [ChromiumDevelopersHowTosRunWithFlags]: https://www.chromium.org/developers/how-tos/run-chromium-with-flags "Run Chromium with flags | The Chromium Projects" -func WithAdditionalBrowserArguments(args string) option { - return func(wvep *environmentOptions) { - wvep.additionalBrowserArguments = args - } -} - -// WithLanguage sets the default display language for WebView. -// -// It applies to browser UI such as -// context menu and dialogs. It also applies to the `accept-languages` HTTP -// header that WebView sends to websites. It is in the format of -// -// `language[-country]` where `language` is the 2-letter code from -// [ISO 639][ISO639LanguageCodesHtml] -// and `country` is the -// 2-letter code from -// [ISO 3166][ISOStandard72482Html]. -// -// [ISO639LanguageCodesHtml]: https://www.iso.org/iso-639-language-codes.html "ISO 639 | ISO" -// [ISOStandard72482Html]: https://www.iso.org/standard/72482.html "ISO 3166-1:2020 | ISO" -func WithLanguage(lang string) option { - return func(wvep *environmentOptions) { - wvep.language = lang - } -} - -// WithTargetCompatibleBrowserVersion secifies the version of the WebView2 Runtime binaries required to be -// compatible with your app. -// -// This defaults to the WebView2 Runtime version -// that corresponds with the version of the SDK the app is using. The -// format of this value is the same as the format of the -// `BrowserVersionString` property and other `BrowserVersion` values. Only -// the version part of the `BrowserVersion` value is respected. The channel -// suffix, if it exists, is ignored. The version of the WebView2 Runtime -// binaries actually used may be different from the specified -// `TargetCompatibleBrowserVersion`. The binaries are only guaranteed to be -// compatible. Verify the actual version on the `BrowserVersionString` -// property on the `ICoreWebView2Environment`. -func WithTargetCompatibleBrowserVersion(version string) option { - return func(wvep *environmentOptions) { - wvep.targetCompatibleBrowserVersion = version - } -} - -// WithAllowSingleSignOnUsingOSPrimaryAccount is used to enable -// single sign on with Azure Active Directory (AAD) and personal Microsoft -// Account (MSA) resources inside WebView. All AAD accounts, connected to -// Windows and shared for all apps, are supported. For MSA, SSO is only enabled -// for the account associated for Windows account login, if any. -// Default is disabled. Universal Windows Platform apps must also declare -// `enterpriseCloudSSO` -// [Restricted capabilities][WindowsUwpPackagingAppCapabilityDeclarationsRestrictedCapabilities] -// for the single sign on (SSO) to work. -// -// [WindowsUwpPackagingAppCapabilityDeclarationsRestrictedCapabilities]: /windows/uwp/packaging/app-capability-declarations\#restricted-capabilities "Restricted capabilities - App capability declarations | Microsoft Docs" -func WithAllowSingleSignOnUsingOSPrimaryAccount(allow bool) option { - return func(wvep *environmentOptions) { - wvep.allowSingleSignOnUsingOSPrimaryAccount = allow - } -} - -// WithExclusiveUserDataFolderAccess specifies that the WebView environment -// obtains exclusive access to the user data folder. -// -// If the user data folder is already being used by another WebView environment with a -// different value for `ExclusiveUserDataFolderAccess` property, the creation of a WebView2Controller -// using the environment object will fail with `HRESULT_FROM_WIN32(ERROR_INVALID_STATE)`. -// When set as TRUE, no other WebView can be created from other processes using WebView2Environment -// objects with the same UserDataFolder. This prevents other processes from creating WebViews -// which share the same browser process instance, since sharing is performed among -// WebViews that have the same UserDataFolder. When another process tries to create a -// WebView2Controller from an WebView2Environment object created with the same user data folder, -// it will fail with `HRESULT_FROM_WIN32(ERROR_INVALID_STATE)`. -func WithExclusiveUserDataFolderAccess(exclusive bool) option { - return func(wvep *environmentOptions) { - wvep.exclusiveUserDataFolderAccess = exclusive - } -} - -type option func(*environmentOptions) - -var _ iCoreWebView2EnvironmentOptions = &environmentOptions{} -var _ iCoreWebView2EnvironmentOptions2 = &environmentOptions{} - -type environmentOptions struct { - browserExecutableFolder string - userDataFolder string - preferCanary bool - - additionalBrowserArguments string - language string - targetCompatibleBrowserVersion string - allowSingleSignOnUsingOSPrimaryAccount bool - exclusiveUserDataFolderAccess bool -} - -func (o *environmentOptions) AdditionalBrowserArguments() string { - return o.additionalBrowserArguments -} - -func (o *environmentOptions) Language() string { - return o.language -} - -func (o *environmentOptions) TargetCompatibleBrowserVersion() string { - v := o.targetCompatibleBrowserVersion - if v == "" { - v = kMinimumCompatibleVersion - } - return v -} - -func (o *environmentOptions) AllowSingleSignOnUsingOSPrimaryAccount() bool { - return o.allowSingleSignOnUsingOSPrimaryAccount -} - -func (o *environmentOptions) ExclusiveUserDataFolderAccess() bool { - return o.exclusiveUserDataFolderAccess -} - -type iCoreWebView2EnvironmentOptions interface { - combridge.IUnknown - - AdditionalBrowserArguments() string - Language() string - TargetCompatibleBrowserVersion() string - AllowSingleSignOnUsingOSPrimaryAccount() bool -} - -type iCoreWebView2EnvironmentOptions2 interface { - combridge.IUnknown - - ExclusiveUserDataFolderAccess() bool -} - -func init() { - combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2EnvironmentOptions]( - "{2fde08a8-1e9a-4766-8c05-95a9ceb9d1c5}", - _iCoreWebView2EnvironmentOptionsAdditionalBrowserArguments, - _iCoreWebView2EnvironmentOptionsNOP, - _iCoreWebView2EnvironmentOptionsLanguage, - _iCoreWebView2EnvironmentOptionsNOP, - _iCoreWebView2EnvironmentTargetCompatibleBrowserVersion, - _iCoreWebView2EnvironmentOptionsNOP, - _iCoreWebView2EnvironmentOptionsAllowSingleSignOnUsingOSPrimaryAccount, - _iCoreWebView2EnvironmentOptionsNOP, - ) - - combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2EnvironmentOptions2]( - "{ff85c98a-1ba7-4a6b-90c8-2b752c89e9e2}", - _iCoreWebView2EnvironmentOptions2ExclusiveUserDataFolderAccess, - _iCoreWebView2EnvironmentOptionsNOP, - ) -} -func _iCoreWebView2EnvironmentOptionsNOP(this uintptr) uintptr { - return uintptr(windows.S_FALSE) -} - -func _iCoreWebView2EnvironmentOptionsAdditionalBrowserArguments(this uintptr, value **uint16) uintptr { - v := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).AdditionalBrowserArguments() - *value = stringToOleString(v) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentOptionsLanguage(this uintptr, value **uint16) uintptr { - args := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).Language() - *value = stringToOleString(args) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentTargetCompatibleBrowserVersion(this uintptr, value **uint16) uintptr { - args := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).TargetCompatibleBrowserVersion() - *value = stringToOleString(args) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentOptionsAllowSingleSignOnUsingOSPrimaryAccount(this uintptr, value *int32) uintptr { - v := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).AllowSingleSignOnUsingOSPrimaryAccount() - *value = boolToInt(v) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentOptions2ExclusiveUserDataFolderAccess(this uintptr, value *int32) uintptr { - v := combridge.Resolve[iCoreWebView2EnvironmentOptions2](this).ExclusiveUserDataFolderAccess() - *value = boolToInt(v) - return uintptr(windows.S_OK) -} - -func stringToOleString(v string) *uint16 { - wstr := utf16.Encode([]rune(v + "\x00")) - lwstr := len(wstr) - ptr := (*uint16)(coTaskMemAlloc(2 * lwstr)) - - copy(unsafe.Slice(ptr, lwstr), wstr) - - return ptr -} - -func boolToInt(v bool) int32 { - if v { - return 1 - } - return 0 -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go deleted file mode 100644 index da9472ff1..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go +++ /dev/null @@ -1,74 +0,0 @@ -//go:build windows - -package webviewloader - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "runtime" - - "golang.org/x/sys/windows/registry" -) - -var ( - errNoClientDLLFound = errors.New("no webview2 found") -) - -func findEmbeddedBrowserVersion(filename string) (string, error) { - block, err := getFileVersionInfo(filename) - if err != nil { - return "", err - } - - info, err := verQueryValueString(block, "\\StringFileInfo\\040904B0\\ProductVersion") - if err != nil { - return "", err - } - - return info, nil -} - -func findEmbeddedClientDll(embeddedEdgeSubFolder string) (outClientPath string, err error) { - if !filepath.IsAbs(embeddedEdgeSubFolder) { - exe, err := os.Executable() - if err != nil { - return "", err - } - - embeddedEdgeSubFolder = filepath.Join(filepath.Dir(exe), embeddedEdgeSubFolder) - } - - return findClientDllInFolder(embeddedEdgeSubFolder) -} - -func findClientDllInFolder(folder string) (string, error) { - arch := "" - switch runtime.GOARCH { - case "arm64": - arch = "arm64" - case "amd64": - arch = "x64" - case "386": - arch = "x86" - default: - return "", fmt.Errorf("Unsupported architecture") - } - - dllPath := filepath.Join(folder, "EBWebView", arch, "EmbeddedBrowserWebView.dll") - if _, err := os.Stat(dllPath); err != nil { - return "", mapFindErr(err) - } - return dllPath, nil -} - -func mapFindErr(err error) error { - if errors.Is(err, registry.ErrNotExist) { - return errNoClientDLLFound - } - if errors.Is(err, os.ErrNotExist) { - return errNoClientDLLFound - } - return err -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go deleted file mode 100644 index 7ee171b2a..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go +++ /dev/null @@ -1,94 +0,0 @@ -//go:build windows && !native_webview2loader - -package webviewloader - -import ( - "path/filepath" - - "golang.org/x/sys/windows/registry" -) - -const ( - kNumChannels = 4 - kInstallKeyPath = "Software\\Microsoft\\EdgeUpdate\\ClientState\\" - kMinimumCompatibleVersion = "86.0.616.0" -) - -var ( - kChannelName = [kNumChannels]string{ - "", "beta", "dev", "canary", // "internal" - } - - kChannelUuid = [kNumChannels]string{ - "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}", - "{2CD8A007-E189-409D-A2C8-9AF4EF3C72AA}", - "{0D50BFEC-CD6A-4F9A-964C-C7416E3ACB10}", - "{65C35B14-6C1D-4122-AC46-7148CC9D6497}", - //"{BE59E8FD-089A-411B-A3B0-051D9E417818}", - } - - minimumCompatibleVersion, _ = parseVersion(kMinimumCompatibleVersion) -) - -func findInstalledClientDll(preferCanary bool) (clientPath string, version *version, err error) { - for i := 0; i < kNumChannels; i++ { - channel := i - if preferCanary { - channel = (kNumChannels - 1) - i - } - - key := kInstallKeyPath + kChannelUuid[channel] - for _, checkSystem := range []bool{true, false} { - clientPath, version, err := findInstalledClientDllForChannel(key, checkSystem) - if err == errNoClientDLLFound { - continue - } - if err != nil { - return "", nil, err - } - - version.channel = kChannelName[channel] - return clientPath, version, nil - } - } - return "", nil, errNoClientDLLFound -} - -func findInstalledClientDllForChannel(subKey string, system bool) (clientPath string, clientVersion *version, err error) { - key := registry.LOCAL_MACHINE - if !system { - key = registry.CURRENT_USER - } - - regKey, err := registry.OpenKey(key, subKey, registry.READ|registry.WOW64_32KEY) - if err != nil { - return "", nil, mapFindErr(err) - } - defer regKey.Close() - - embeddedEdgeSubFolder, _, err := regKey.GetStringValue("EBWebView") - if err != nil { - return "", nil, mapFindErr(err) - } - - if embeddedEdgeSubFolder == "" { - return "", nil, errNoClientDLLFound - } - - versionString := filepath.Base(embeddedEdgeSubFolder) - version, err := parseVersion(versionString) - if err != nil { - return "", nil, errNoClientDLLFound - } - - if version.compare(minimumCompatibleVersion) < 0 { - return "", nil, errNoClientDLLFound - } - - dllPath, err := findEmbeddedClientDll(embeddedEdgeSubFolder) - if err != nil { - return "", nil, mapFindErr(err) - } - - return dllPath, &version, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go deleted file mode 100644 index 3e02fe985..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go +++ /dev/null @@ -1,173 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import ( - "errors" - "fmt" - "os" - "sync" - "unsafe" - - "github.com/jchv/go-winloader" - - "golang.org/x/sys/windows" -) - -func init() { - preventEnvAndRegistryOverrides(nil, nil, "") -} - -var ( - memOnce sync.Once - memModule winloader.Module - memCreate winloader.Proc - memCompareBrowserVersions winloader.Proc - memGetAvailableCoreWebView2BrowserVersionString winloader.Proc - memErr error -) - -const ( - // https://referencesource.microsoft.com/#system.web/Util/hresults.cs,20 - E_FILENOTFOUND = 0x80070002 -) - -// CompareBrowserVersions will compare the 2 given versions and return: -// -// Less than zero: v1 < v2 -// zero: v1 == v2 -// Greater than zero: v1 > v2 -func CompareBrowserVersions(v1 string, v2 string) (int, error) { - _v1, err := windows.UTF16PtrFromString(v1) - if err != nil { - return 0, err - } - _v2, err := windows.UTF16PtrFromString(v2) - if err != nil { - return 0, err - } - - err = loadFromMemory() - if err != nil { - return 0, err - } - - var result int32 - _, _, err = memCompareBrowserVersions.Call( - uint64(uintptr(unsafe.Pointer(_v1))), - uint64(uintptr(unsafe.Pointer(_v2))), - uint64(uintptr(unsafe.Pointer(&result)))) - - if err != windows.ERROR_SUCCESS { - return 0, err - } - return int(result), nil -} - -// GetAvailableCoreWebView2BrowserVersionString returns version of the webview2 runtime. -// If path is empty, it will try to find installed webview2 is the system. -// If there is no version installed, a blank string is returned. -func GetAvailableCoreWebView2BrowserVersionString(path string) (string, error) { - if path != "" { - // The default implementation fails if CGO and a fixed browser path is used. It's caused by the go-winloader - // which loads the native DLL from memory. - // Use the new GoWebView2Loader in this case, in the future we will make GoWebView2Loader - // feature-complete and remove the use of the native DLL and go-winloader. - version, err := goGetAvailableCoreWebView2BrowserVersionString(path) - if errors.Is(err, errNoClientDLLFound) { - // WebView2 is not found - return "", nil - } else if err != nil { - return "", err - } - - return version, nil - } - - err := loadFromMemory() - if err != nil { - return "", err - } - - var browserPath *uint16 = nil - if path != "" { - browserPath, err = windows.UTF16PtrFromString(path) - if err != nil { - return "", fmt.Errorf("error calling UTF16PtrFromString for %s: %v", path, err) - } - } - - preventEnvAndRegistryOverrides(browserPath, nil, "") - var result *uint16 - res, _, err := memGetAvailableCoreWebView2BrowserVersionString.Call( - uint64(uintptr(unsafe.Pointer(browserPath))), - uint64(uintptr(unsafe.Pointer(&result)))) - - if res != 0 { - if res == E_FILENOTFOUND { - // WebView2 is not installed - return "", nil - } - - return "", fmt.Errorf("Unable to call GetAvailableCoreWebView2BrowserVersionString (%x): %w", res, err) - } - - version := windows.UTF16PtrToString(result) - windows.CoTaskMemFree(unsafe.Pointer(result)) - return version, nil -} - -// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and -// call the CreateCoreWebView2EnvironmentWithOptions routine. -func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentCompletedHandle uintptr, additionalBrowserArgs string) (uintptr, error) { - err := loadFromMemory() - if err != nil { - return 0, err - } - - preventEnvAndRegistryOverrides(browserExecutableFolder, userDataFolder, additionalBrowserArgs) - res, _, _ := memCreate.Call( - uint64(uintptr(unsafe.Pointer(browserExecutableFolder))), - uint64(uintptr(unsafe.Pointer(userDataFolder))), - 0, - uint64(environmentCompletedHandle), - ) - return uintptr(res), nil -} - -func loadFromMemory() error { - var err error - // DLL is not available natively. Try loading embedded copy. - memOnce.Do(func() { - memModule, memErr = winloader.LoadFromMemory(WebView2Loader) - if memErr != nil { - err = fmt.Errorf("Unable to load WebView2Loader.dll from memory: %w", memErr) - return - } - memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions") - memCompareBrowserVersions = memModule.Proc("CompareBrowserVersions") - memGetAvailableCoreWebView2BrowserVersionString = memModule.Proc("GetAvailableCoreWebView2BrowserVersionString") - }) - return err -} - -func preventEnvAndRegistryOverrides(browserFolder, userDataFolder *uint16, additionalBrowserArgs string) { - // Setting these env variables to empty string also prevents registry overrides because webview2loader - // checks for existence and not for empty value - os.Setenv("WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER", "") - - // Set these overrides to the values or empty to prevent registry and external env overrides - os.Setenv("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", additionalBrowserArgs) - os.Setenv("WEBVIEW2_RELEASE_CHANNEL_PREFERENCE", "0") - os.Setenv("WEBVIEW2_BROWSER_EXECUTABLE_FOLDER", windows.UTF16PtrToString(browserFolder)) - os.Setenv("WEBVIEW2_USER_DATA_FOLDER", windows.UTF16PtrToString(userDataFolder)) -} - -func goGetAvailableCoreWebView2BrowserVersionString(browserExecutableFolder string) (string, error) { - clientPath, err := findEmbeddedClientDll(browserExecutableFolder) - if err != nil { - return "", err - } - - return findEmbeddedBrowserVersion(clientPath) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go deleted file mode 100644 index e4ff44ff3..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import _ "embed" - -//go:embed x86/WebView2Loader.dll -var WebView2Loader []byte diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go deleted file mode 100644 index 27423ae8a..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import _ "embed" - -//go:embed x64/WebView2Loader.dll -var WebView2Loader []byte diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go deleted file mode 100644 index bba6a88cb..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import _ "embed" - -//go:embed arm64/WebView2Loader.dll -var WebView2Loader []byte diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go deleted file mode 100644 index 24d0856a5..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go +++ /dev/null @@ -1,143 +0,0 @@ -//go:build windows - -package webviewloader - -import ( - "fmt" - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGlobalAlloc = modkernel32.NewProc("GlobalAlloc") - procGlobalFree = modkernel32.NewProc("GlobalFree") - - modversion = windows.NewLazySystemDLL("version.dll") - procGetFileVersionInfoSize = modversion.NewProc("GetFileVersionInfoSizeW") - procGetFileVersionInfo = modversion.NewProc("GetFileVersionInfoW") - procVerQueryValue = modversion.NewProc("VerQueryValueW") - - modole32 = windows.NewLazySystemDLL("ole32.dll") - procCoTaskMemAlloc = modole32.NewProc("CoTaskMemAlloc") -) - -func getFileVersionInfo(path string) ([]byte, error) { - lptstrFilename, err := syscall.UTF16PtrFromString(path) - if err != nil { - return nil, err - } - - size, _, err := procGetFileVersionInfoSize.Call( - uintptr(unsafe.Pointer(lptstrFilename)), - 0, - ) - - err = maskErrorSuccess(err) - if size == 0 && err == nil { - err = fmt.Errorf("GetFileVersionInfoSize failed") - } - - if err != nil { - return nil, err - } - - data := make([]byte, size) - ret, _, err := procGetFileVersionInfo.Call( - uintptr(unsafe.Pointer(lptstrFilename)), - 0, - uintptr(size), - uintptr(unsafe.Pointer(&data[0])), - ) - - err = maskErrorSuccess(err) - if ret == 0 && err == nil { - err = fmt.Errorf("GetFileVersionInfo failed") - } - - if err != nil { - return nil, err - } - return data, nil -} - -func verQueryValueString(block []byte, subBlock string) (string, error) { - // Allocate memory from native side to make sure the block doesn't get moved - // because we get a pointer into that memory block from the native verQueryValue - // call back. - pBlock := globalAlloc(0, uint32(len(block))) - defer globalFree(unsafe.Pointer(pBlock)) - - // Copy the memory region into native side memory - copy(unsafe.Slice((*byte)(pBlock), len(block)), block) - - lpSubBlock, err := syscall.UTF16PtrFromString(subBlock) - if err != nil { - return "", err - } - - var lplpBuffer unsafe.Pointer - var puLen uint - ret, _, err := procVerQueryValue.Call( - uintptr(pBlock), - uintptr(unsafe.Pointer(lpSubBlock)), - uintptr(unsafe.Pointer(&lplpBuffer)), - uintptr(unsafe.Pointer(&puLen)), - ) - - err = maskErrorSuccess(err) - if ret == 0 && err == nil { - err = fmt.Errorf("VerQueryValue failed") - } - - if err != nil { - return "", err - } - - if puLen <= 1 { - return "", nil - } - puLen -= 1 // Remove Null-Terminator - - wchar := unsafe.Slice((*uint16)(lplpBuffer), puLen) - return string(utf16.Decode(wchar)), nil -} - -func globalAlloc(uFlags uint, dwBytes uint32) unsafe.Pointer { - ret, _, _ := procGlobalAlloc.Call( - uintptr(uFlags), - uintptr(dwBytes)) - - if ret == 0 { - panic("globalAlloc failed") - } - - return unsafe.Pointer(ret) -} - -func globalFree(data unsafe.Pointer) { - ret, _, _ := procGlobalFree.Call(uintptr(data)) - if ret != 0 { - panic("globalFree failed") - } -} - -func maskErrorSuccess(err error) error { - if err == windows.ERROR_SUCCESS { - return nil - } - return err -} - -func coTaskMemAlloc(size int) unsafe.Pointer { - ret, _, _ := procCoTaskMemAlloc.Call( - uintptr(size)) - - if ret == 0 { - panic("coTaskMemAlloc failed") - } - return unsafe.Pointer(ret) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go deleted file mode 100644 index cf278d950..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go +++ /dev/null @@ -1,147 +0,0 @@ -//go:build windows && !native_webview2loader - -package webviewloader - -import ( - "errors" - "fmt" - "strconv" - "strings" -) - -// CompareBrowserVersions will compare the 2 given versions and return: -// -// -1 = v1 < v2 -// 0 = v1 == v2 -// 1 = v1 > v2 -func CompareBrowserVersions(v1 string, v2 string) (int, error) { - v, err := parseVersion(v1) - if err != nil { - return 0, fmt.Errorf("v1 invalid: %w", err) - } - - w, err := parseVersion(v2) - if err != nil { - return 0, fmt.Errorf("v2 invalid: %w", err) - } - - return v.compare(w), nil -} - -// GetAvailableCoreWebView2BrowserVersionString get the browser version info including channel name -// if it is the WebView2 Runtime. -// Channel names are Beta, Dev, and Canary. -func GetAvailableCoreWebView2BrowserVersionString(browserExecutableFolder string) (string, error) { - if browserExecutableFolder != "" { - clientPath, err := findEmbeddedClientDll(browserExecutableFolder) - if errors.Is(err, errNoClientDLLFound) { - // WebView2 is not found - return "", nil - } else if err != nil { - return "", err - } - - return findEmbeddedBrowserVersion(clientPath) - } - - _, version, err := findInstalledClientDll(false) - if errors.Is(err, errNoClientDLLFound) { - return "", nil - } else if err != nil { - return "", err - } - - return version.String(), nil -} - -type version struct { - major int - minor int - patch int - build int - - channel string -} - -func (v version) String() string { - vv := fmt.Sprintf("%d.%d.%d.%d", v.major, v.minor, v.patch, v.build) - if v.channel != "" { - vv += " " + v.channel - } - - return vv -} - -func (v version) compare(o version) int { - if c := compareInt(v.major, o.major); c != 0 { - return c - } - if c := compareInt(v.minor, o.minor); c != 0 { - return c - } - if c := compareInt(v.patch, o.patch); c != 0 { - return c - } - return compareInt(v.build, o.build) -} - -func parseVersion(v string) (version, error) { - var p version - - // Split away channel information... - if i := strings.Index(v, " "); i > 0 { - p.channel = v[i+1:] - v = v[:i] - } - - vv := strings.Split(v, ".") - if len(vv) > 4 { - return p, fmt.Errorf("too many version parts") - } - - var err error - vv, p.major, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad major version: %w", err) - } - - vv, p.minor, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad minor version: %w", err) - } - - vv, p.patch, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad patch version: %w", err) - } - - _, p.build, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad build version: %w", err) - } - - return p, nil -} - -func parseInt(v []string) ([]string, int, error) { - if len(v) == 0 { - return nil, 0, nil - } - - p, err := strconv.ParseInt(v[0], 10, 32) - if err != nil { - return nil, 0, err - } - return v[1:], int(p), nil -} - -func compareInt(v1, v2 int) int { - if v1 == v2 { - return 0 - } - if v1 < v2 { - return -1 - } else { - return +1 - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x64/WebView2Loader.dll b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x64/WebView2Loader.dll deleted file mode 100644 index ab15cffb45a9d3b243b35dbdda9252cae7dd183e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137640 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.Z?_t#Y)^6H*_u3=Qpjey{kj>u=`zx?AOD>u9Z1a zxXc-ClmQ2;6sg&5pzFSY4axNC4T)DQCSE;Xh!?K{pNaaqs>Q4GBk_7aCSGT&#!}ju zYVkVxk$4@8iC25oI7&NOEnbl-c<4oauT+ay^GD+KLQK34R>1^@a~IX(b-+KKzMi{N zyq-NNUQho{yq?O!@J4-4TrFOY=ey}^->u@cr*krWHGCpob?yv&HSRz^r;5;a3Zb*1 z98#&rsD|6s_!l8p&bxMhQv`lPSlKexb*OD#OE)gggv^P#)I|tj->u4vd@Dty(pz&5 z7B~^J(2VJ+>0rfN#L$L%l~?JiIfVOLL=5SehaTn#L%0|hm(y56}h zDO~iQxE-MAKh=v*7duDcTdlB4sRP^LAU3cT zH|H2ia>zl+e#|~zfMZ7bBoXPRNY|m4T18}D1+lj&d z*o-;m+D+I>5Ww4JEC}FU5gQRLe%Xu#0jv_SCIS4&j0FMQAYx4d_>LJ10>~1vL;y9l z7&HvNa9A!DgMU9_F!5hDhFC1No6bWs#57K6VKF&O+d5hDhFR$}m{ zb{|A+eDGbn_u~VY|6dL}vdas-zO*gaV;uCJs2K}~y8C4yZkIlWqOAQNun+2fyBRUkI#)v>DqxMoqvINH_X3I` zgFB8&*p+lTFd=8+X_Zs!q1^-C)>PVU!v{g#c0nAB{LR(0t0p@_m+`j|tmsS1!v2|6 zo_WcsrW80H!?O;%Rrxqyb_nZS5^`9TkSjvaUxmZVe=5MCl5CW%AWYjJ#e(@TUHJJU z%i`i8h0}sU|1+dp6J;b6kN5LGqoA5f5eDsua(@aOvWk5Lh;b$hqjUE%+r@Ja`B#&GQylz$7p)g3YT%;c1aLkpS-E@(pvggx>a za?H+;f=uYJat~L}p*f`Pi&X$_^??`6_Y!u%D*+A_D>pz<5dK~_#anmjzECTj_PCa2 zpXr=5lbT(W(aIl#VUc`RFkZtQOhOu#G^Sq^d7ov9ATmJt5sp>jOb4t1^o?TVYlVYl zqYoEux6$FkYCOM=Z_;USe$X1F^MjOScZ0m4rHhc9w95CrD<;{I zYv)W>i|}LzitoDY{+2Yh!fi)WIw2;Q9oqt(`j`Tg^xp2QY4ewdq*8t#8jca74bH9^ zux(%m$vglKy$Y?9OrK)9uISQDM|hawf?wc@yj9W9WBeR?SHUNt0}wV^5ib1`!K1*5 z>DH#)rtX3(ny-GB>54WHfw)`WF4L{=YPB{ZDcRT}%fbL~4Qp50iJGL=zLGc#RL)-) zLn3@O$u=8zB)UPk4Cee}m%(&(dnPVf;5E>FaezcCf^A^fXAgVKWO{U#lZn3$-DXQY z=NgTjwAy5+Y40~bljY+oUD{78j$y+YRv-8$V=K`&&=}e2g&EIw1baPLi5NARMy{XN zV@yq3=@ivYHz)0UR zdzCyV?;*RZ;RpE4Q!-tRPa*(I1f6o@R-)Xa&hC0je8`EjhXApJ#^ZR>SxSti^uVWgPtdeN8dH|Gw4hu?wVD7df6JQRf8 zS$%q9Ze^P-0LyZ&;nh~cdKM-iY-J|fDI;fFwv2qrwuXxwb+{b&!9HspY)5hu9MYA0 z*m}FC4`-5c!pj|dr`(jGOl`mshrJb+o7P&C@z4UWD8doHE|}+%gv%fx(doN+eJMCM z)@OCdQ(@%mlW?%D&uWoV`y>%<#hyf8AqqjtnXQ2km>UG!+1~~dJclyywIh4+Sdhx1 z3Wuw~f&lY78c!*XybM?PbD)yZJ#O%2Pr^lQw$F(YYttG!9?l|H`e{wQu+hM$4-ImS zn8mwbZ^JPkm?0c6n-^tJ6=ZE8+WsZp+W7EFhrdL>u`k6UFCjMWY9O_q(gjD_mIhzi z0N;m$QW#NnSDIZ3(80zMDhCIg$^S<%#biAn(DT-3D6_DPy%Pf$Ft()$*u3`)Wx=-h zN)w2ljx0AKi>EKe9+K{IJ=wZkt0XB#;)Av7FpvvFls=IzUb&Rn@N2M@NA3(oguP9# zqX2F-gsy&*RBLA!_2lrwPTRM{9WF2c!^n$$ky8F`l2N$e4hIfr;GrxC!)9%4$>3{6 z+vxg_tr_LK7Slz~NTe+`+bvQ`k&zg7hK57C6YYPYN5*C2iV1io+%g73q-&BrY)AB`Er8N`M!kZe|_ zTul`z*@;RfCMp>duS6L`;2Y?6G`?Jb&y?@wc?3E?6PuEJK7w$UDAlSn`Kw?mr1xS= zsJ1unM%TA

diff --git a/v2/pkg/templates/generate/assets/vue/frontend/index.tmpl.html b/v2/pkg/templates/generate/assets/vue/frontend/index.tmpl.html index b3d4289c3..d45b7a8c4 100644 --- a/v2/pkg/templates/generate/assets/vue/frontend/index.tmpl.html +++ b/v2/pkg/templates/generate/assets/vue/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} -
diff --git a/v2/pkg/templates/templates/lit-ts/frontend/index.tmpl.html b/v2/pkg/templates/templates/lit-ts/frontend/index.tmpl.html index 4944992b5..febcb76cb 100644 --- a/v2/pkg/templates/templates/lit-ts/frontend/index.tmpl.html +++ b/v2/pkg/templates/templates/lit-ts/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} - diff --git a/v2/pkg/templates/templates/lit-ts/frontend/src/my-element.ts b/v2/pkg/templates/templates/lit-ts/frontend/src/my-element.ts index 27fd71e45..af4e9ce20 100644 --- a/v2/pkg/templates/templates/lit-ts/frontend/src/my-element.ts +++ b/v2/pkg/templates/templates/lit-ts/frontend/src/my-element.ts @@ -2,6 +2,7 @@ import {css, html, LitElement} from 'lit' import logo from './assets/images/logo-universal.png' import {Greet} from "../wailsjs/go/main/App"; import {customElement, property} from 'lit/decorators.js' +import './style.css'; /** * An example element. diff --git a/v2/pkg/templates/templates/lit/frontend/index.tmpl.html b/v2/pkg/templates/templates/lit/frontend/index.tmpl.html index e2db01c7d..fbe3eb240 100644 --- a/v2/pkg/templates/templates/lit/frontend/index.tmpl.html +++ b/v2/pkg/templates/templates/lit/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} - diff --git a/v2/pkg/templates/templates/lit/frontend/src/my-element.js b/v2/pkg/templates/templates/lit/frontend/src/my-element.js index ed65e2225..017632c09 100644 --- a/v2/pkg/templates/templates/lit/frontend/src/my-element.js +++ b/v2/pkg/templates/templates/lit/frontend/src/my-element.js @@ -1,6 +1,7 @@ import {css, html, LitElement} from 'lit' import logo from './assets/images/logo-universal.png' import {Greet} from "../wailsjs/go/main/App"; +import './style.css'; /** * An example element. diff --git a/v2/pkg/templates/templates/plain/frontend/src/main.js b/v2/pkg/templates/templates/plain/frontend/src/main.js index 3346d59ff..e4945441d 100644 --- a/v2/pkg/templates/templates/plain/frontend/src/main.js +++ b/v2/pkg/templates/templates/plain/frontend/src/main.js @@ -1,6 +1,7 @@ // Get input + focus let nameElement = document.getElementById("name"); nameElement.focus(); +import './main.css'; // Setup the greet function window.greet = function () { diff --git a/v2/pkg/templates/templates/svelte-ts/frontend/index.tmpl.html b/v2/pkg/templates/templates/svelte-ts/frontend/index.tmpl.html index e88b655ef..3dd212f2d 100644 --- a/v2/pkg/templates/templates/svelte-ts/frontend/index.tmpl.html +++ b/v2/pkg/templates/templates/svelte-ts/frontend/index.tmpl.html @@ -3,7 +3,6 @@ - {{.ProjectName}} diff --git a/v2/pkg/templates/templates/vue-ts/frontend/index.tmpl.html b/v2/pkg/templates/templates/vue-ts/frontend/index.tmpl.html index 5c0949b5e..cc259435b 100644 --- a/v2/pkg/templates/templates/vue-ts/frontend/index.tmpl.html +++ b/v2/pkg/templates/templates/vue-ts/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} -
diff --git a/v2/pkg/templates/templates/vue-ts/frontend/src/main.ts b/v2/pkg/templates/templates/vue-ts/frontend/src/main.ts index e57db5948..f9754fe19 100644 --- a/v2/pkg/templates/templates/vue-ts/frontend/src/main.ts +++ b/v2/pkg/templates/templates/vue-ts/frontend/src/main.ts @@ -1,4 +1,5 @@ import {createApp} from 'vue' import App from './App.vue' +import './style.css'; createApp(App).mount('#app') diff --git a/v2/pkg/templates/templates/vue/frontend/index.tmpl.html b/v2/pkg/templates/templates/vue/frontend/index.tmpl.html index b3d4289c3..d45b7a8c4 100644 --- a/v2/pkg/templates/templates/vue/frontend/index.tmpl.html +++ b/v2/pkg/templates/templates/vue/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} -
diff --git a/v2/pkg/templates/templates/vue/frontend/src/main.js b/v2/pkg/templates/templates/vue/frontend/src/main.js index e57db5948..f9754fe19 100644 --- a/v2/pkg/templates/templates/vue/frontend/src/main.js +++ b/v2/pkg/templates/templates/vue/frontend/src/main.js @@ -1,4 +1,5 @@ import {createApp} from 'vue' import App from './App.vue' +import './style.css'; createApp(App).mount('#app') From 22cfcbd5a1a4a28d68151241b5365b393f911ccf Mon Sep 17 00:00:00 2001 From: Ethan Reesor Date: Thu, 13 Jul 2023 05:40:22 -0500 Subject: [PATCH 21/36] Override error formatting (#2717) --- v2/internal/app/app_dev.go | 2 +- v2/internal/app/app_production.go | 2 +- v2/internal/frontend/dispatcher/calls.go | 12 +++++++++--- v2/internal/frontend/dispatcher/dispatcher.go | 5 ++++- v2/pkg/options/options.go | 5 +++++ website/docs/reference/options.mdx | 9 +++++++++ website/src/pages/changelog.mdx | 1 + 7 files changed, 30 insertions(+), 6 deletions(-) diff --git a/v2/internal/app/app_dev.go b/v2/internal/app/app_dev.go index 7cdc627f1..2e04f448b 100644 --- a/v2/internal/app/app_dev.go +++ b/v2/internal/app/app_dev.go @@ -213,7 +213,7 @@ func CreateApp(appoptions *options.App) (*App, error) { eventHandler := runtime.NewEvents(myLogger) ctx = context.WithValue(ctx, "events", eventHandler) - messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler) + messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler, appoptions.ErrorFormatter) // Create the frontends and register to event handler desktopFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher) diff --git a/v2/internal/app/app_production.go b/v2/internal/app/app_production.go index 2dfad6015..5b847260c 100644 --- a/v2/internal/app/app_production.go +++ b/v2/internal/app/app_production.go @@ -82,7 +82,7 @@ func CreateApp(appoptions *options.App) (*App, error) { ctx = context.WithValue(ctx, "buildtype", "production") } - messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler) + messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler, appoptions.ErrorFormatter) appFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher) eventHandler.AddFrontend(appFrontend) diff --git a/v2/internal/frontend/dispatcher/calls.go b/v2/internal/frontend/dispatcher/calls.go index ef19c6030..491d17fe2 100644 --- a/v2/internal/frontend/dispatcher/calls.go +++ b/v2/internal/frontend/dispatcher/calls.go @@ -3,8 +3,9 @@ package dispatcher import ( "encoding/json" "fmt" - "github.com/wailsapp/wails/v2/internal/frontend" "strings" + + "github.com/wailsapp/wails/v2/internal/frontend" ) type callMessage struct { @@ -49,7 +50,12 @@ func (d *Dispatcher) processCallMessage(message string, sender frontend.Frontend CallbackID: payload.CallbackID, } if err != nil { - callbackMessage.Err = err.Error() + // Use the error formatter if one was provided + if d.errfmt != nil { + callbackMessage.Err = d.errfmt(err) + } else { + callbackMessage.Err = err.Error() + } } else { callbackMessage.Result = result } @@ -66,7 +72,7 @@ func (d *Dispatcher) processCallMessage(message string, sender frontend.Frontend // CallbackMessage defines a message that contains the result of a call type CallbackMessage struct { Result interface{} `json:"result"` - Err string `json:"error"` + Err any `json:"error"` CallbackID string `json:"callbackid"` } diff --git a/v2/internal/frontend/dispatcher/dispatcher.go b/v2/internal/frontend/dispatcher/dispatcher.go index 44a8886e5..56092d370 100644 --- a/v2/internal/frontend/dispatcher/dispatcher.go +++ b/v2/internal/frontend/dispatcher/dispatcher.go @@ -7,6 +7,7 @@ import ( "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/frontend" "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/pkg/options" ) type Dispatcher struct { @@ -15,15 +16,17 @@ type Dispatcher struct { events frontend.Events bindingsDB *binding.DB ctx context.Context + errfmt options.ErrorFormatter } -func NewDispatcher(ctx context.Context, log *logger.Logger, bindings *binding.Bindings, events frontend.Events) *Dispatcher { +func NewDispatcher(ctx context.Context, log *logger.Logger, bindings *binding.Bindings, events frontend.Events, errfmt options.ErrorFormatter) *Dispatcher { return &Dispatcher{ log: log, bindings: bindings, events: events, bindingsDB: bindings.DB(), ctx: ctx, + errfmt: errfmt, } } diff --git a/v2/pkg/options/options.go b/v2/pkg/options/options.go index 1562a7dff..2fbcbc8b8 100644 --- a/v2/pkg/options/options.go +++ b/v2/pkg/options/options.go @@ -64,6 +64,9 @@ type App struct { Bind []interface{} WindowStartState WindowStartState + // ErrorFormatter overrides the formatting of errors returned by backend methods + ErrorFormatter ErrorFormatter + // CSS property to test for draggable elements. Default "--wails-draggable" CSSDragProperty string @@ -90,6 +93,8 @@ type App struct { Debug Debug } +type ErrorFormatter func(error) any + type RGBA struct { R uint8 `json:"r"` G uint8 `json:"g"` diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index 62ffffe1e..5eb5f0972 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -58,6 +58,7 @@ func main() { Bind: []interface{}{ app, }, + ErrorFormatter: func(err error) any { return err.Error() }, Windows: &windows.Options{ WebviewIsTransparent: false, WindowIsTranslucent: false, @@ -477,6 +478,14 @@ A slice of struct instances defining methods that need to be bound to the fronte Name: Bind
Type: `[]interface{}` +### ErrorFormatter + +A function that determines how errors are formatted when returned by a JS-to-Go +method call. The returned value will be marshalled as JSON. + +Name: ErrorFormatter
+Type: `func (error) any` + ### Windows This defines [Windows specific options](#windows). diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index f82f2fd53..632b8c69b 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `-devtools` production build flag. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2725) - Added `EnableDefaultContextMenu` option to allow enabling the browser's default context-menu in production . Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2733) - Added smart functionality for the default context-menu in production with CSS styles to control it. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2748) +- Added custom error formatting to allow passing structured errors back to the frontend. ### Changed From 150dac9eade0614f270b455214dba20721cbf0cb Mon Sep 17 00:00:00 2001 From: guangwu Date: Thu, 13 Jul 2023 21:13:47 +0800 Subject: [PATCH 22/36] chore: slice replace loop (#2757) Signed-off-by: guoguangwu --- v2/internal/shell/shell.go | 4 +--- v2/pkg/menu/keys/keys.go | 4 +--- v2/pkg/menu/menu.go | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/v2/internal/shell/shell.go b/v2/internal/shell/shell.go index e16b96ca4..badea2b39 100644 --- a/v2/internal/shell/shell.go +++ b/v2/internal/shell/shell.go @@ -47,9 +47,7 @@ func (c *Command) Stderr() string { } func (c *Command) AddArgs(args []string) { - for _, arg := range args { - c.args = append(c.args, arg) - } + c.args = append(c.args, args...) } // CreateCommand returns a *Cmd struct that when run, will run the given command + args in the given directory diff --git a/v2/pkg/menu/keys/keys.go b/v2/pkg/menu/keys/keys.go index 73bc9414f..fa8027a33 100644 --- a/v2/pkg/menu/keys/keys.go +++ b/v2/pkg/menu/keys/keys.go @@ -99,8 +99,6 @@ func Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier) Key: key, Modifiers: []Modifier{modifier1, modifier2}, } - for _, extra := range rest { - result.Modifiers = append(result.Modifiers, extra) - } + result.Modifiers = append(result.Modifiers, rest...) return result } diff --git a/v2/pkg/menu/menu.go b/v2/pkg/menu/menu.go index 0c3ddb618..819939bbf 100644 --- a/v2/pkg/menu/menu.go +++ b/v2/pkg/menu/menu.go @@ -17,9 +17,7 @@ func (m *Menu) Append(item *MenuItem) { // Merge will append the items in the given menu // into this menu func (m *Menu) Merge(menu *Menu) { - for _, item := range menu.Items { - m.Items = append(m.Items, item) - } + m.Items = append(m.Items, menu.Items...) } // AddText adds a TextMenu item to the menu From e0a92712fe94f74025f10bfb99c7e8f92483376b Mon Sep 17 00:00:00 2001 From: figuerom16 <112363116+figuerom16@users.noreply.github.com> Date: Sat, 15 Jul 2023 06:52:33 -0700 Subject: [PATCH 23/36] SvelteKit Guide: Manual installation, Bash installation, Usage Notes. (#2771) * Create SvelteKit.mdx * Rename SvelteKit.mdx to sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update sveltekit.mdx * Update changelog.mdx --- website/docs/guides/sveltekit.mdx | 133 ++++++++++++++++++++++++++++++ website/src/pages/changelog.mdx | 1 + 2 files changed, 134 insertions(+) create mode 100644 website/docs/guides/sveltekit.mdx diff --git a/website/docs/guides/sveltekit.mdx b/website/docs/guides/sveltekit.mdx new file mode 100644 index 000000000..6be409492 --- /dev/null +++ b/website/docs/guides/sveltekit.mdx @@ -0,0 +1,133 @@ +# SvelteKit + +This guide will go into: +1. Miminal Installation Steps - The steps needed to get a minimum Wails setup working for SvelteKit. +2. Install Script - Bash script for accomplishing the Minimal Installation Steps with optional Wails branding. +3. Important Notes - Issues that can be encountered when using SvelteKit + Wails and fixes. + +## 1. Minimal Installation Steps + +##### Install Wails for Svelte. +- `wails init -n myapp -t svelte` + +##### Delete the svelte frontend. +- Navigate into your newly created myapp folder. +- Delete the folder named "frontend" + +##### While in the Wails project root. Use your favorite package manager and install SvelteKit as the new frontend. Follow the prompts. +- `npm create svelte@latest frontend` + +##### Modify wails.json. +- Add `"wailsjsdir": "./frontend/src/lib",` Do note that this is where your Go and runtime functions will appear. +- Change your package manager frontend here if not using npm. + +##### Modify main.go. +- The first comment `//go:embed all:frontend/dist` needs to be changed to `//go:embed all:frontend/build` + +##### Install/remove dependencies using your favorite package manager. +- Navigate into your "frontend" folder. +- `npm i` +- `npm uninstall @sveltejs/adapter-auto` +- `npm i -D @sveltejs/adapter-static` + +##### Change adapter in svelte.config.js +- First line of file change `import adapter from '@sveltejs/adapter-auto';` to `import adapter from '@sveltejs/adapter-static';` + +##### Put SvelteKit into SPA mode with prerendering. +- Create a file under myapp/frontend/src/routes/ named +layout.ts/+layout.js. +- Add two lines into the newly created file `export const prerender = true` and `export const ssr = false` + +##### Test installation. +- Navigate back into the Wails project root (one directory up). +- run `wails dev` +- If the application doesn't run please check through the previous steps. + +## 2. Install Script + +##### This Bash Script does the steps listed above. Make sure to read over the script and understand what the script is doing on your computer. + +- Create a file sveltekit-wails.sh +- Copy the below code into the new file then save it. +- Make it executable with `chmod +x sveltekit-wails.sh` +- Brand is an optional param below that adds back in the wails branding. Leave third param blank to not insert the Wails branding. +- Example usage: `./sveltekit-wails.sh pnpm newapp brand` + +##### sveltekit-wails.sh: +``` +manager=$1 +project=$2 +brand=$3 +wails init -n $project -t svelte +cd $project +sed -i "s|npm|$manager|g" wails.json +sed -i 's|"auto",|"auto",\n "wailsjsdir": "./frontend/src/lib",|' wails.json +sed -i "s|all:frontend/dist|all:frontend/build|" main.go +if [[ -n $brand ]]; then + mv frontend/src/App.svelte +page.svelte + sed -i "s|'./assets|'\$lib/assets|" +page.svelte + sed -i "s|'../wails|'\$lib/wails|" +page.svelte + mv frontend/src/assets . +fi +rm -r frontend +$manager create svelte@latest frontend +if [[ -n $brand ]]; then + mv +page.svelte frontend/src/routes/+page.svelte + mkdir frontend/src/lib + mv assets frontend/src/lib/ +fi +cd frontend +$manager i +$manager uninstall @sveltejs/adapter-auto +$manager i -D @sveltejs/adapter-static +echo -e "export const prerender = true\nexport const ssr = false" > src/routes/+layout.ts +sed -i "s|-auto';|-static';|" svelte.config.js +cd .. +wails dev +``` + +## 3. Important Notes + +##### Server files will cause build failures. +- +layout.server.ts, +page.server.ts, +server.ts or any file with "server" in the name will fail to build as all routes are prerendered. + +##### The Wails runtime unloads with full page navigations! +- Anything that causes full page navigations: `window.location.href = '//'` or Context menu reload when using wails dev. What this means is that you can end up losing the ability to call any runtime breaking the app. There are two ways to work around this. +- Use `import { goto } from '$app/navigation'` then call `goto('//')` in your +page.svelte. This will prevent a full page navigation. +- If full page navigation can't be prevented the Wails runtime can be added to all pages by adding the below into the of myapp/frontend/src/app.html +``` + +... + + + +... + +``` +See https://wails.io/docs/guides/frontend for more information. + +##### Inital data can be loaded and refreshed from +page.ts/+page.js to +page.svelte. +- +page.ts/+page.js works well with load() https://kit.svelte.dev/docs/load#page-data +- invalidateAll() in +page.svelte will call load() from +page.ts/+page.js https://kit.svelte.dev/docs/load#rerunning-load-functions-manual-invalidation. + +##### Error Handling +- Expected errors using Throw error works in +page.ts/+page.js with a +error.svelte page. https://kit.svelte.dev/docs/errors#expected-errors +- Unexpected errors will cause the application to become unusable. Only recovery option (known so far) from unexpected errors is to reload the app. To do this create a file myapp/frontend/src/hooks.client.ts then add the below code to the file. +``` +import { WindowReloadApp } from '$lib/wailsjs/runtime/runtime' +export async function handleError() { + WindowReloadApp() +} +``` + +##### Using Forms and handling functions +- The simplest way is to call a function from the form is the standard, bind:value your variables and prevent submission `
` +- The more advanced way is to use:enhance (progressive enhancement) which will allow for convenient access to formData, formElement, submitter. The important note is to always cancel() the form which prevents server side behavior. https://kit.svelte.dev/docs/form-actions#progressive-enhancement Example: +``` + { + cancel() + console.log(Object.fromEntries(formData)) + console.log(formElement) + console.log(submitter) + handle() +}}> +``` diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 632b8c69b..a1b7b4e79 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `EnableDefaultContextMenu` option to allow enabling the browser's default context-menu in production . Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2733) - Added smart functionality for the default context-menu in production with CSS styles to control it. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2748) - Added custom error formatting to allow passing structured errors back to the frontend. +- Added sveltekit.mdx guide. Added by @figuerom16 in [PR](https://github.com/wailsapp/wails/pull/2771) ### Changed From 1e76b0b52e5b04180e795c198686f6e1526b0249 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 18 Jul 2023 21:47:26 +1000 Subject: [PATCH 24/36] Remove markdown formatter --- .github/workflows/format-markdown-files.yml | 33 --------------------- 1 file changed, 33 deletions(-) delete mode 100644 .github/workflows/format-markdown-files.yml diff --git a/.github/workflows/format-markdown-files.yml b/.github/workflows/format-markdown-files.yml deleted file mode 100644 index a8f7de9c1..000000000 --- a/.github/workflows/format-markdown-files.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Format Markdown Files - - -jobs: - format_markdown_files: - runs-on: ubuntu-latest - if: github.repository == 'wailsapp/wails' - steps: - - uses: actions/checkout@v3 - - - name: Setup Nodejs - uses: actions/setup-node@v2 - with: - node-version: 18.x - - - name: Install Task - uses: arduino/setup-task@v1 - with: - version: 3.x - repo-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Format All Markdown Files - run: task format-all-md - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 - with: - commit-message: "docs: format document" - title: "docs: format document" - body: "- [x] Format all Markdown(x) documents" - branch: chore/format-markdown-files - delete-branch: true - draft: false From 7f402bf0c42fe87669ae0faf96407a308f768bdb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 23:04:16 +1000 Subject: [PATCH 25/36] chore: update sponsors.svg (#2778) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index 1a20e9c23..12c6eb82f 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -90,42 +90,46 @@ text { Helpers - + - + - + - + - + - + - + - + - + - + + + + + From 48b35aaafe79a748ed2e888af8b80fac8353f62f Mon Sep 17 00:00:00 2001 From: "Aranggi J. Toar" Date: Mon, 24 Jul 2023 16:53:24 +0700 Subject: [PATCH 26/36] chore: update npm and docker package names for dnf package manager (#2790) * chore: update package names for dnf package manager * chore: update changelog --- v2/internal/system/packagemanager/dnf.go | 2 ++ website/src/pages/changelog.mdx | 1 + 2 files changed, 3 insertions(+) diff --git a/v2/internal/system/packagemanager/dnf.go b/v2/internal/system/packagemanager/dnf.go index d9eaf8062..fec676f11 100644 --- a/v2/internal/system/packagemanager/dnf.go +++ b/v2/internal/system/packagemanager/dnf.go @@ -44,6 +44,7 @@ func (y *Dnf) Packages() packagemap { }, "npm": []*Package{ {Name: "npm", SystemPackage: true}, + {Name: "nodejs-npm", SystemPackage: true}, }, "upx": []*Package{ {Name: "upx", SystemPackage: true, Optional: true}, @@ -57,6 +58,7 @@ func (y *Dnf) Packages() packagemap { "fedora": "Follow the guide: https://docs.docker.com/engine/install/fedora/", }, }, + {Name: "moby-engine", SystemPackage: true, Optional: true}, }, } } diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index a1b7b4e79..6ffd1d64c 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added correct NodeJS and Docker package names for DNF package manager of Fedora 38. Added by @aranggitoar in [PR](https://github.com/wailsapp/wails/pull/2790) - Added `-devtools` production build flag. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2725) - Added `EnableDefaultContextMenu` option to allow enabling the browser's default context-menu in production . Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2733) - Added smart functionality for the default context-menu in production with CSS styles to control it. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2748) From 84d2576e061477269e334a751e0d79831e471162 Mon Sep 17 00:00:00 2001 From: Li Yang <384113872@qq.com> Date: Wed, 26 Jul 2023 18:32:43 +0800 Subject: [PATCH 27/36] Update README.zh-Hans.md (#2791) Fixed a link error --- README.zh-Hans.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-Hans.md b/README.zh-Hans.md index 69d456e78..5afce335f 100644 --- a/README.zh-Hans.md +++ b/README.zh-Hans.md @@ -87,7 +87,7 @@ ## 快速入门 -使用说明在 [官网](https://wails.io/docs/gettingstarted/installation)。 +使用说明在 [官网](https://wails.io/zh-Hans/docs/gettingstarted/installation/)。 ## 赞助商 From fe479876c5f83fa0e34ea042577ba0d4a5158958 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 08:15:00 +1000 Subject: [PATCH 28/36] chore: update sponsors.svg (#2794) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index 12c6eb82f..039fdef72 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -90,46 +90,42 @@ text { Helpers - + - + - - - - - + - + - + - + - + - + - + - + From a96d51be026bfed552cff0ea81bde0f757a9dd55 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 29 Jul 2023 12:04:41 +1000 Subject: [PATCH 29/36] Update project-config.mdx --- website/docs/reference/project-config.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/project-config.mdx b/website/docs/reference/project-config.mdx index 5c7d578b7..8e763502b 100644 --- a/website/docs/reference/project-config.mdx +++ b/website/docs/reference/project-config.mdx @@ -6,7 +6,7 @@ sidebar_position: 5 The project config resides in the `wails.json` file in the project directory. The structure of the config is: -```json +```json5 { // Project config version "version": "", From 027edad51b0ceaa2aa1e9aa25ab78253f420e19e Mon Sep 17 00:00:00 2001 From: Andreas Christou Date: Tue, 1 Aug 2023 23:58:05 +0100 Subject: [PATCH 30/36] Create-React-App documentation updates (#2805) * Add documentation for running a create-react-app project in watch mode * Fix build warning --- .../docs/guides/application-development.mdx | 29 +++++++++++++++++-- website/docs/guides/sveltekit.mdx | 2 +- .../guides/application-development.mdx | 29 +++++++++++++++++-- .../guides/application-development.mdx | 29 +++++++++++++++++-- 4 files changed, 82 insertions(+), 7 deletions(-) diff --git a/website/docs/guides/application-development.mdx b/website/docs/guides/application-development.mdx index f8074d150..9d04fe917 100644 --- a/website/docs/guides/application-development.mdx +++ b/website/docs/guides/application-development.mdx @@ -219,8 +219,33 @@ be saved to your project config and become the default. Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). -For [create-react-app](https://create-react-app.dev/), it's possible to use -[this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. + +### Create React App + +The process for a Create-React-App project is slightly more complicated. In order to support live frontend reloading the following configuration +needs to be added to your `wails.json`: + +```json + "frontend:dev:watcher": "yarn start", + "frontend:dev:serverUrl": "http://localhost:3000", +``` + +The `frontend:dev:watcher` command will start the Create-React-App development server (hosted on port `3000` typically). The `frontend:dev:serverUrl` command then +instructs Wails to serve assets from the development server when loading the frontend rather than from the build folder. In addition to the above, the +`index.html` needs to be updated with the following: + +```html + + + + + +``` + +This is required as the watcher command that rebuilds the frontend prevents Wails from injecting the required scripts. This circumvents that issue by ensuring +the scripts are always injected. With this configuration, `wails dev` can be run which will appropriately build the frontend and backend with hot-reloading enabled. +Additionally, when accessing the application from a browser the React developer tools can now be used on a non-minified version of the application for straightforward +debugging. Finally, for faster builds, `wails dev -s` can be run to skip the default building of the frontend by Wails as this is an unnecessary step. ## Go Module diff --git a/website/docs/guides/sveltekit.mdx b/website/docs/guides/sveltekit.mdx index 6be409492..3f82eb813 100644 --- a/website/docs/guides/sveltekit.mdx +++ b/website/docs/guides/sveltekit.mdx @@ -93,7 +93,7 @@ wails dev ##### The Wails runtime unloads with full page navigations! - Anything that causes full page navigations: `window.location.href = '//'` or Context menu reload when using wails dev. What this means is that you can end up losing the ability to call any runtime breaking the app. There are two ways to work around this. - Use `import { goto } from '$app/navigation'` then call `goto('//')` in your +page.svelte. This will prevent a full page navigation. -- If full page navigation can't be prevented the Wails runtime can be added to all pages by adding the below into the of myapp/frontend/src/app.html +- If full page navigation can't be prevented the Wails runtime can be added to all pages by adding the below into the `` of myapp/frontend/src/app.html ``` ... diff --git a/website/versioned_docs/version-v2.4.0/guides/application-development.mdx b/website/versioned_docs/version-v2.4.0/guides/application-development.mdx index f8074d150..9d04fe917 100644 --- a/website/versioned_docs/version-v2.4.0/guides/application-development.mdx +++ b/website/versioned_docs/version-v2.4.0/guides/application-development.mdx @@ -219,8 +219,33 @@ be saved to your project config and become the default. Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). -For [create-react-app](https://create-react-app.dev/), it's possible to use -[this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. + +### Create React App + +The process for a Create-React-App project is slightly more complicated. In order to support live frontend reloading the following configuration +needs to be added to your `wails.json`: + +```json + "frontend:dev:watcher": "yarn start", + "frontend:dev:serverUrl": "http://localhost:3000", +``` + +The `frontend:dev:watcher` command will start the Create-React-App development server (hosted on port `3000` typically). The `frontend:dev:serverUrl` command then +instructs Wails to serve assets from the development server when loading the frontend rather than from the build folder. In addition to the above, the +`index.html` needs to be updated with the following: + +```html + + + + + +``` + +This is required as the watcher command that rebuilds the frontend prevents Wails from injecting the required scripts. This circumvents that issue by ensuring +the scripts are always injected. With this configuration, `wails dev` can be run which will appropriately build the frontend and backend with hot-reloading enabled. +Additionally, when accessing the application from a browser the React developer tools can now be used on a non-minified version of the application for straightforward +debugging. Finally, for faster builds, `wails dev -s` can be run to skip the default building of the frontend by Wails as this is an unnecessary step. ## Go Module diff --git a/website/versioned_docs/version-v2.5.0/guides/application-development.mdx b/website/versioned_docs/version-v2.5.0/guides/application-development.mdx index f8074d150..9d04fe917 100644 --- a/website/versioned_docs/version-v2.5.0/guides/application-development.mdx +++ b/website/versioned_docs/version-v2.5.0/guides/application-development.mdx @@ -219,8 +219,33 @@ be saved to your project config and become the default. Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). -For [create-react-app](https://create-react-app.dev/), it's possible to use -[this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. + +### Create React App + +The process for a Create-React-App project is slightly more complicated. In order to support live frontend reloading the following configuration +needs to be added to your `wails.json`: + +```json + "frontend:dev:watcher": "yarn start", + "frontend:dev:serverUrl": "http://localhost:3000", +``` + +The `frontend:dev:watcher` command will start the Create-React-App development server (hosted on port `3000` typically). The `frontend:dev:serverUrl` command then +instructs Wails to serve assets from the development server when loading the frontend rather than from the build folder. In addition to the above, the +`index.html` needs to be updated with the following: + +```html + + + + + +``` + +This is required as the watcher command that rebuilds the frontend prevents Wails from injecting the required scripts. This circumvents that issue by ensuring +the scripts are always injected. With this configuration, `wails dev` can be run which will appropriately build the frontend and backend with hot-reloading enabled. +Additionally, when accessing the application from a browser the React developer tools can now be used on a non-minified version of the application for straightforward +debugging. Finally, for faster builds, `wails dev -s` can be run to skip the default building of the frontend by Wails as this is an unnecessary step. ## Go Module From 2859143b2f9966dd3fb2096744feed95dc78c195 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 3 Aug 2023 08:35:34 +1000 Subject: [PATCH 31/36] Add Screen docs --- website/docs/reference/runtime/screen.mdx | 35 +++++++++++++++++++ .../reference/runtime/screen.mdx | 35 +++++++++++++++++++ .../reference/runtime/screen.mdx | 35 +++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 website/docs/reference/runtime/screen.mdx create mode 100644 website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx create mode 100644 website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx diff --git a/website/docs/reference/runtime/screen.mdx b/website/docs/reference/runtime/screen.mdx new file mode 100644 index 000000000..d2ccabcfe --- /dev/null +++ b/website/docs/reference/runtime/screen.mdx @@ -0,0 +1,35 @@ +--- +sidebar_position: 9 +--- + +# Screen + +These methods provide information about the currently connected screens. + +### ScreenGetAll + +Returns a list of currently connected screens. + +Go: `ScreenGetAll(ctx context.Context) []screen`
+JS: `ScreenGetAll()` + + +#### Screen + +```go +type Screen struct { + IsCurrent bool + IsPrimary bool + Width int + Height int +} +``` + +```ts +interface Screen { + isCurrent: boolean; + isPrimary: boolean; + width : number + height : number +} +``` diff --git a/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx b/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx new file mode 100644 index 000000000..d2ccabcfe --- /dev/null +++ b/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx @@ -0,0 +1,35 @@ +--- +sidebar_position: 9 +--- + +# Screen + +These methods provide information about the currently connected screens. + +### ScreenGetAll + +Returns a list of currently connected screens. + +Go: `ScreenGetAll(ctx context.Context) []screen`
+JS: `ScreenGetAll()` + + +#### Screen + +```go +type Screen struct { + IsCurrent bool + IsPrimary bool + Width int + Height int +} +``` + +```ts +interface Screen { + isCurrent: boolean; + isPrimary: boolean; + width : number + height : number +} +``` diff --git a/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx b/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx new file mode 100644 index 000000000..d2ccabcfe --- /dev/null +++ b/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx @@ -0,0 +1,35 @@ +--- +sidebar_position: 9 +--- + +# Screen + +These methods provide information about the currently connected screens. + +### ScreenGetAll + +Returns a list of currently connected screens. + +Go: `ScreenGetAll(ctx context.Context) []screen`
+JS: `ScreenGetAll()` + + +#### Screen + +```go +type Screen struct { + IsCurrent bool + IsPrimary bool + Width int + Height int +} +``` + +```ts +interface Screen { + isCurrent: boolean; + isPrimary: boolean; + width : number + height : number +} +``` From 083e6b03f30225d1c3c313230ffe54c87ed66f2c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 4 Aug 2023 08:18:34 +1000 Subject: [PATCH 32/36] Update Screen docs --- website/docs/reference/runtime/screen.mdx | 2 ++ .../versioned_docs/version-v2.4.0/reference/runtime/screen.mdx | 2 ++ .../versioned_docs/version-v2.5.0/reference/runtime/screen.mdx | 2 ++ 3 files changed, 6 insertions(+) diff --git a/website/docs/reference/runtime/screen.mdx b/website/docs/reference/runtime/screen.mdx index d2ccabcfe..f0feee9eb 100644 --- a/website/docs/reference/runtime/screen.mdx +++ b/website/docs/reference/runtime/screen.mdx @@ -16,6 +16,7 @@ JS: `ScreenGetAll()` #### Screen +Go struct: ```go type Screen struct { IsCurrent bool @@ -25,6 +26,7 @@ type Screen struct { } ``` +Typescript interface: ```ts interface Screen { isCurrent: boolean; diff --git a/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx b/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx index d2ccabcfe..f0feee9eb 100644 --- a/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx +++ b/website/versioned_docs/version-v2.4.0/reference/runtime/screen.mdx @@ -16,6 +16,7 @@ JS: `ScreenGetAll()` #### Screen +Go struct: ```go type Screen struct { IsCurrent bool @@ -25,6 +26,7 @@ type Screen struct { } ``` +Typescript interface: ```ts interface Screen { isCurrent: boolean; diff --git a/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx b/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx index d2ccabcfe..f0feee9eb 100644 --- a/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx +++ b/website/versioned_docs/version-v2.5.0/reference/runtime/screen.mdx @@ -16,6 +16,7 @@ JS: `ScreenGetAll()` #### Screen +Go struct: ```go type Screen struct { IsCurrent bool @@ -25,6 +26,7 @@ type Screen struct { } ``` +Typescript interface: ```ts interface Screen { isCurrent: boolean; From b48579892b612e47ead6d1c56cfba8dd90aee786 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 5 Aug 2023 17:45:08 +1000 Subject: [PATCH 33/36] [docs] Add mac flash troubleshooting guide --- website/docs/guides/troubleshooting.mdx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/website/docs/guides/troubleshooting.mdx b/website/docs/guides/troubleshooting.mdx index 494e62bfd..bd965a799 100644 --- a/website/docs/guides/troubleshooting.mdx +++ b/website/docs/guides/troubleshooting.mdx @@ -185,3 +185,20 @@ If this does happen, simply delete `frontend/node_modules` and `frontend/package ## Build process stuck on "Generating bindings" Bindings generation process runs your application in a special mode. If application, intentionally or unintentionally, contains an endless loop (i.e. not exiting after `wails.Run()` finished), this can lead to build process stuck on the stage of bindings generation. Please make sure your code exits properly. + +## Mac application flashes white at startup + +This is due to the default background of the webview being white. If you want to use the window background colour instead, +you can make the webview background transparent using the following config: + +```go + err := wails.Run(&options.App{ + Title: "macflash", + Width: 1024, + Height: 768, + // Other settings + Mac: &mac.Options{ + WebviewIsTransparent: true, + }, + }) +``` \ No newline at end of file From e72e4aa179c9cf8b24ec487faff181ea6c546395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Z=C3=A1mb=C3=B3=2C=20Levente?= Date: Wed, 9 Aug 2023 23:48:09 +0200 Subject: [PATCH 34/36] add new programName option to linux options (#2817) * add new programName option to linux options * modify changelog * free program name string --- v2/internal/frontend/desktop/linux/frontend.go | 6 ++++++ v2/pkg/options/linux/linux.go | 9 +++++++++ website/docs/reference/options.mdx | 14 +++++++++++++- website/src/pages/changelog.mdx | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/v2/internal/frontend/desktop/linux/frontend.go b/v2/internal/frontend/desktop/linux/frontend.go index 14c202d82..2f6f286fa 100644 --- a/v2/internal/frontend/desktop/linux/frontend.go +++ b/v2/internal/frontend/desktop/linux/frontend.go @@ -190,6 +190,12 @@ func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger. C.install_signal_handlers() + if appoptions.Linux != nil && appoptions.Linux.ProgramName != "" { + prgname := C.CString(appoptions.Linux.ProgramName) + C.g_set_prgname(prgname) + C.free(unsafe.Pointer(prgname)) + } + return result } diff --git a/v2/pkg/options/linux/linux.go b/v2/pkg/options/linux/linux.go index 3726297c4..062119cb7 100644 --- a/v2/pkg/options/linux/linux.go +++ b/v2/pkg/options/linux/linux.go @@ -29,6 +29,15 @@ type Options struct { // - WebviewGpuPolicyOnDemand // - WebviewGpuPolicyNever WebviewGpuPolicy WebviewGpuPolicy + + // ProgramName is used to set the program's name for the window manager via GTK's g_set_prgname(). + //This name should not be localized. [see the docs] + // + //When a .desktop file is created this value helps with window grouping and desktop icons when the .desktop file's Name + //property differs form the executable's filename. + // + //[see the docs]: https://docs.gtk.org/glib/func.set_prgname.html + ProgramName string } type Messages struct { diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index 5eb5f0972..af772c8bd 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -105,7 +105,8 @@ func main() { Linux: &linux.Options{ Icon: icon, WindowIsTranslucent: false, - WebviewGpuPolicy: linux.WebviewGpuPolicyAlways, + WebviewGpuPolicy: linux.WebviewGpuPolicyAlways, + ProgramName: "wails" }, Debug: options.Debug{ OpenInspectorOnStartup: false, @@ -898,6 +899,17 @@ Default: `WebviewGpuPolicyAlways` | WebviewGpuPolicyOnDemand | Hardware acceleration is enabled/disabled as request by web contents| | WebviewGpuPolicyNever | Hardware acceleration is always disabled | +#### ProgramName + +This option is used to set the program's name for the window manager via GTK's g_set_prgname(). +This name should not be localized, [see the docs](https://docs.gtk.org/glib/func.set_prgname.html). + +When a .desktop file is created this value helps with window grouping and desktop icons when the .desktop file's `Name` +property differs form the executable's filename. + +Name: ProgramName
+Type: string
+ ### Debug This defines [Debug specific options](#Debug) that apply to debug builds. diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 6ffd1d64c..8b215c912 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added smart functionality for the default context-menu in production with CSS styles to control it. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2748) - Added custom error formatting to allow passing structured errors back to the frontend. - Added sveltekit.mdx guide. Added by @figuerom16 in [PR](https://github.com/wailsapp/wails/pull/2771) +- Added ProgramName option to [linux.Options](/docs/reference/options#linux). Added by @lyimmi in [PR](https://github.com/wailsapp/wails/pull/2817) ### Changed From 7b098fd5227f2c87e8b1b46834448b777496252c Mon Sep 17 00:00:00 2001 From: Kin NG <59541661+k1nho@users.noreply.github.com> Date: Wed, 9 Aug 2023 17:52:29 -0400 Subject: [PATCH 35/36] Docs: add spanish readme translation (#2812) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * spanish readme translation add spanish to readme remove line * change Spanish to Español * Add links to README.es.md to the other language translations --- README.es.md | 167 ++++++++++++++++++++++++++++++++++++++++++++++ README.ja.md | 3 +- README.ko.md | 3 +- README.md | 3 +- README.zh-Hans.md | 3 +- 5 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 README.es.md diff --git a/README.es.md b/README.es.md new file mode 100644 index 000000000..47c932285 --- /dev/null +++ b/README.es.md @@ -0,0 +1,167 @@ +

+
+

+ +

+ Construye aplicaciones de escritorio usando Go y tecnologías web. +
+
+ + GitHub + + + + + + Go Reference + + + CodeFactor + + + + + + Awesome + + + Discord + +
+ + Build + + + GitHub tag (latest SemVer pre-release) + +

+ +
+ + + +[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · +[한국어](README.ko.md) · [Español](README.es.md) + + + +
+ +## Tabla de Contenidos + +- [Tabla de Contenidos](#tabla-de-contenidos) +- [Introducción](#introducción) +- [Funcionalidades](#funcionalidades) + - [Plan de Trabajo](#plan-de-trabajo) +- [Empezando](#empezando) +- [Patrocinadores](#patrocinadores) +- [Preguntas Frecuentes](#preguntas-frecuentes) +- [Estrellas a lo Largo del Tiempo](#estrellas-a-lo-largo-del-tiempo) +- [Colaboradores](#colaboradores) +- [Licencia](#licencia) +- [Inspiración](#inspiración) + +## Introducción + +El método tradicional para proveer una interfaz web en programas hechos con Go +es a través del servidor web incorporado. Wails ofrece un enfoque diferente al +permitir combinar el código hecho en Go con un frontend web en un solo archivo +binario. Las herramientas que proporcionamos facilitan este trabajo para ti, al +crear, compilar y empaquetar tu proyecto. ¡Lo único que debes hacer es ponerte +creativo! + +## Funcionalidades + +- Utiliza Go estándar para el backend +- Utiliza cualquier tecnología frontend con la que ya estés familiarizado para + construir tu interfaz de usuario +- Crea rápidamente interfaces de usuario enriquecidas para tus programas en Go + utilizando plantillas predefinidas +- Invoca fácilmente métodos de Go desde Javascript +- Definiciones de Typescript generadas automáticamente para tus structs y + métodos de Go +- Diálogos y menús nativos +- Soporte nativo de modo oscuro / claro +- Soporte de translucidez y efectos de ventana esmerilada +- Sistema de eventos unificado entre Go y Javascript +- Herramienta CLI potente para generar y construir tus proyectos rápidamente +- Multiplataforma +- Usa motores de renderizado nativos - ¡_sin navegador integrado_! + +### Plan de Trabajo + +El plan de trabajo se puede encontrar +[aqui](https://github.com/wailsapp/wails/discussions/1484). Por favor, +consúltalo antes de abrir una solicitud de mejora. + +## Empezando + +Las instrucciones de instalacion se encuentran en nuestra +[pagina web oficial](https://wails.io/docs/gettingstarted/installation). + +## Patrocinadores + +Este Proyecto cuenta con el apoyo de estas amables personas/ compañías: + + +

+ +

+ +## Preguntas Frecuentes + +- ¿Es esta una alternativa a Electron? + + Depende de tus requisitos. Está diseñado para facilitar a los programadores de + Go la creación de aplicaciones de escritorio livianas o agregar una interfaz + gráfica a sus aplicaciones existentes. Wails ofrece elementos nativos como + menús y diálogos, por lo que podría considerarse una alternativa liviana a + Electron. + +- ¿A quien esta dirigido este proyecto? + + El proyecto esta dirigido a programadores de Go que desean integrar una + interfaz HMTL/JS/CSS en sus aplicaciones, sin tener que recurrir a la creación + de un servidor y abrir el navegador para visualizarla. + +- ¿Cual es el significado del nombre? + + Cuando vi WebView, pensé: "Lo que realmente quiero es una herramienta para + construir una aplicación WebView, algo similar a lo que Rails es para Ruby". + Así que inicialmente fue un juego de palabras (WebView en Rails). Además, por + casualidad, también es homófono del nombre en inglés del + [país](https://en.wikipedia.org/wiki/Wales) del que provengo. Así que se quedó + con ese nombre. + +## Estrellas a lo Largo del Tiempo + +[![Star History Chart](https://api.star-history.com/svg?repos=wailsapp/wails&type=Date)](https://star-history.com/#wailsapp/wails&Date) + +## Colaboradores + +¡La lista de colaboradores se está volviendo demasiado grande para el archivo +readme! Todas las personas increíbles que han contribuido a este proyecto tienen +su propia página [aqui](https://wails.io/credits#contributors). + +## Licencia + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large) + +## Inspiración + +Este proyecto fue construido mientras se escuchaban estos álbumes: + +- [Manic Street Preachers - Resistance Is Futile](https://open.spotify.com/album/1R2rsEUqXjIvAbzM0yHrxA) +- [Manic Street Preachers - This Is My Truth, Tell Me Yours](https://open.spotify.com/album/4VzCL9kjhgGQeKCiojK1YN) +- [The Midnight - Endless Summer](https://open.spotify.com/album/4Krg8zvprquh7TVn9OxZn8) +- [Gary Newman - Savage (Songs from a Broken World)](https://open.spotify.com/album/3kMfsD07Q32HRWKRrpcexr) +- [Steve Vai - Passion & Warfare](https://open.spotify.com/album/0oL0OhrE2rYVns4IGj8h2m) +- [Ben Howard - Every Kingdom](https://open.spotify.com/album/1nJsbWm3Yy2DW1KIc1OKle) +- [Ben Howard - Noonday Dream](https://open.spotify.com/album/6astw05cTiXEc2OvyByaPs) +- [Adwaith - Melyn](https://open.spotify.com/album/2vBE40Rp60tl7rNqIZjaXM) +- [Gwidaith Hen Fran - Cedors Hen Wrach](https://open.spotify.com/album/3v2hrfNGINPLuDP0YDTOjm) +- [Metallica - Metallica](https://open.spotify.com/album/2Kh43m04B1UkVcpcRa1Zug) +- [Bloc Party - Silent Alarm](https://open.spotify.com/album/6SsIdN05HQg2GwYLfXuzLB) +- [Maxthor - Another World](https://open.spotify.com/album/3tklE2Fgw1hCIUstIwPBJF) +- [Alun Tan Lan - Y Distawrwydd](https://open.spotify.com/album/0c32OywcLpdJCWWMC6vB8v) + [Alun Tan Lan - Y Distawrwydd](https://open.spotify.com/album/0c32OywcLpdJCWWMC6vB8v) diff --git a/README.ja.md b/README.ja.md index f308fd754..85fbc48f4 100644 --- a/README.ja.md +++ b/README.ja.md @@ -42,7 +42,8 @@ -[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · [한국어](README.ko.md) +[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · +[한국어](README.ko.md) · [Español](README.es.md) diff --git a/README.ko.md b/README.ko.md index 441b77f66..a87fa3264 100644 --- a/README.ko.md +++ b/README.ko.md @@ -42,7 +42,8 @@ -[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · [한국어](README.ko.md) +[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · +[한국어](README.ko.md) · [Español](README.es.md) diff --git a/README.md b/README.md index 5910be650..dfb84a014 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ -[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · [한국어](README.ko.md) +[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · +[한국어](README.ko.md) · [Español](README.es.md) diff --git a/README.zh-Hans.md b/README.zh-Hans.md index 5afce335f..de306f8a5 100644 --- a/README.zh-Hans.md +++ b/README.zh-Hans.md @@ -42,7 +42,8 @@ -[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · [한국어](README.ko.md) +[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) · +[한국어](README.ko.md) · [Español](README.es.md) From 7fae22b50ceaa4750663f2289957dee0a1f5bdb9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 12 Aug 2023 13:07:09 +1000 Subject: [PATCH 36/36] chore: update sponsors.svg (#2819) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 44 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index 039fdef72..871168456 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -35,59 +35,59 @@ text { Matt Holt Buying Breakfast - tc-hib - - - - Liam - + tc-hib + - Tai Groot - + Tai Groot + - Michael - + Michael + - Bironou - + Bironou + - Arden - + Arden + Buying Coffee - + - + - + - + + + + + - + - + - + - + Helpers

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%0DC^z2wad3A^i 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 WdhP?WPUTgd^3Mus({knJ(EkT%P(z*o diff --git a/v2/internal/frontend/desktop/windows/window.go b/v2/internal/frontend/desktop/windows/window.go index 43ec57c72..a513e875a 100644 --- a/v2/internal/frontend/desktop/windows/window.go +++ b/v2/internal/frontend/desktop/windows/window.go @@ -3,11 +3,10 @@ package windows import ( + "github.com/wailsapp/go-webview2/pkg/edge" "sync" "unsafe" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/win32" "github.com/wailsapp/wails/v2/internal/system/operatingsystem" diff --git a/v2/internal/system/system_windows.go b/v2/internal/system/system_windows.go index 1ef076cd8..40b8f0340 100644 --- a/v2/internal/system/system_windows.go +++ b/v2/internal/system/system_windows.go @@ -4,7 +4,7 @@ package system import ( - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" + "github.com/wailsapp/go-webview2/webviewloader" "github.com/wailsapp/wails/v2/internal/system/operatingsystem" "github.com/wailsapp/wails/v2/internal/system/packagemanager" ) diff --git a/v2/internal/wv2installer/wv2installer.go b/v2/internal/wv2installer/wv2installer.go index ce754cee7..c89ad196f 100644 --- a/v2/internal/wv2installer/wv2installer.go +++ b/v2/internal/wv2installer/wv2installer.go @@ -5,7 +5,7 @@ package wv2installer import ( "fmt" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" + "github.com/wailsapp/go-webview2/webviewloader" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/windows" ) diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 0ed111b6f..921521e85 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Now uses new `go-webview2` module. Added by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/2687). - Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) - Enable HiDPI option by default in windows nsis installer by @5aaee9 in [PR](https://github.com/wailsapp/wails/pull/2694) From 31a5c906739bd077c1d3c9536bf03f2956a6e70d Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 13 Jun 2023 20:27:57 +1000 Subject: [PATCH 09/36] Update bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 180057d45..84b7cb6dc 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: | - ***Please note: No new bug reports are being accepted for Wails v1*** + ***Please note: No bug reports are currently being accepted for Wails v3*** Before submitting this issue, please do the following: - Do a web search for your error. This usually leads to a much better understanding of the issue. - Prove that the error is indeed a Wails bug and not an application bug, with a specific set of steps to reproduce. @@ -84,4 +84,4 @@ body: description: Add any other context about the problem here. placeholder: Add any other context about the problem here. validations: - required: false \ No newline at end of file + required: false From fa851f29c53c81733407178f3a55d0129cfd51c3 Mon Sep 17 00:00:00 2001 From: Mohamed Gharib Date: Sun, 18 Jun 2023 23:45:01 +0300 Subject: [PATCH 10/36] [v2] Add -devtools production build flag (#2725) * [v2] Add devtools production build flag * Update changelog * Fix changelog spacing --------- Co-authored-by: Lea Anthony --- v2/cmd/wails/build.go | 2 ++ v2/cmd/wails/flags/build.go | 1 + v2/cmd/wails/flags/dev.go | 1 + v2/internal/app/app.go | 4 ++++ v2/internal/app/app_dev.go | 5 ++++- v2/internal/app/app_devtools.go | 7 +++++++ v2/internal/app/app_devtools_not.go | 7 +++++++ v2/internal/app/app_production.go | 3 +++ v2/internal/frontend/desktop/darwin/Application.h | 2 +- v2/internal/frontend/desktop/darwin/Application.m | 4 ++-- v2/internal/frontend/desktop/darwin/WailsContext.h | 2 +- v2/internal/frontend/desktop/darwin/WailsContext.m | 2 +- v2/internal/frontend/desktop/darwin/frontend.go | 9 ++++++++- v2/internal/frontend/desktop/darwin/main.m | 4 ++-- v2/internal/frontend/desktop/darwin/window.go | 8 ++++---- v2/internal/frontend/desktop/linux/frontend.go | 9 ++++++++- v2/internal/frontend/desktop/linux/window.go | 8 +++++--- v2/internal/frontend/desktop/windows/frontend.go | 10 ++++++++-- v2/pkg/commands/build/base.go | 5 +++++ v2/pkg/commands/build/build.go | 1 + website/docs/reference/cli.mdx | 3 ++- website/docs/tutorials/helloworld.mdx | 1 + website/src/pages/changelog.mdx | 4 ++++ 23 files changed, 82 insertions(+), 20 deletions(-) create mode 100644 v2/internal/app/app_devtools.go create mode 100644 v2/internal/app/app_devtools_not.go diff --git a/v2/cmd/wails/build.go b/v2/cmd/wails/build.go index 5d284e9a2..1c6b791ec 100644 --- a/v2/cmd/wails/build.go +++ b/v2/cmd/wails/build.go @@ -57,6 +57,7 @@ func buildApplication(f *flags.Build) error { OutputFile: f.OutputFilename, CleanBinDirectory: f.Clean, Mode: f.GetBuildMode(), + Devtools: f.Debug || f.Devtools, Pack: !f.NoPackage, LDFlags: f.LdFlags, Compiler: f.Compiler, @@ -82,6 +83,7 @@ func buildApplication(f *flags.Build) error { {"Compiler", f.GetCompilerPath()}, {"Skip Bindings", bool2Str(f.SkipBindings)}, {"Build Mode", f.GetBuildModeAsString()}, + {"Devtools", bool2Str(buildOptions.Devtools)}, {"Frontend Directory", projectOptions.GetFrontendDir()}, {"Obfuscated", bool2Str(f.Obfuscated)}, } diff --git a/v2/cmd/wails/flags/build.go b/v2/cmd/wails/flags/build.go index d36ceef6a..974d9c3ad 100644 --- a/v2/cmd/wails/flags/build.go +++ b/v2/cmd/wails/flags/build.go @@ -35,6 +35,7 @@ type Build struct { ForceBuild bool `name:"f" description:"Force build of application"` UpdateWailsVersionGoMod bool `name:"u" description:"Updates go.mod to use the same Wails version as the CLI"` Debug bool `description:"Builds the application in debug mode"` + Devtools bool `description:"Enable Devtools in productions, Already enabled in debug mode (-debug)"` NSIS bool `description:"Generate NSIS installer for Windows"` TrimPath bool `description:"Remove all file system paths from the resulting executable"` WindowsConsole bool `description:"Keep the console when building for Windows"` diff --git a/v2/cmd/wails/flags/dev.go b/v2/cmd/wails/flags/dev.go index 885e0cead..6d4f02f95 100644 --- a/v2/cmd/wails/flags/dev.go +++ b/v2/cmd/wails/flags/dev.go @@ -120,6 +120,7 @@ func (d *Dev) GenerateBuildOptions() *build.Options { result := &build.Options{ OutputType: "dev", Mode: build.Dev, + Devtools: true, Arch: runtime.GOARCH, Pack: true, Platform: runtime.GOOS, diff --git a/v2/internal/app/app.go b/v2/internal/app/app.go index f2821aaba..226b5a0be 100644 --- a/v2/internal/app/app.go +++ b/v2/internal/app/app.go @@ -2,6 +2,7 @@ package app import ( "context" + "github.com/wailsapp/wails/v2/internal/frontend" "github.com/wailsapp/wails/v2/internal/logger" "github.com/wailsapp/wails/v2/internal/menumanager" @@ -20,6 +21,9 @@ type App struct { // Indicates if the app is in debug mode debug bool + // Indicates if the devtools is enabled + devtools bool + // OnStartup/OnShutdown startupCallback func(ctx context.Context) shutdownCallback func(ctx context.Context) diff --git a/v2/internal/app/app_dev.go b/v2/internal/app/app_dev.go index 38aada698..7cdc627f1 100644 --- a/v2/internal/app/app_dev.go +++ b/v2/internal/app/app_dev.go @@ -42,7 +42,9 @@ func (a *App) Run() error { func CreateApp(appoptions *options.App) (*App, error) { var err error - ctx := context.WithValue(context.Background(), "debug", true) + ctx := context.Background() + ctx = context.WithValue(ctx, "debug", true) + ctx = context.WithValue(ctx, "devtools", true) // Set up logger myLogger := logger.New(appoptions.Logger) @@ -228,6 +230,7 @@ func CreateApp(appoptions *options.App) (*App, error) { startupCallback: appoptions.OnStartup, shutdownCallback: appoptions.OnShutdown, debug: true, + devtools: true, } result.options = appoptions diff --git a/v2/internal/app/app_devtools.go b/v2/internal/app/app_devtools.go new file mode 100644 index 000000000..e28a1e080 --- /dev/null +++ b/v2/internal/app/app_devtools.go @@ -0,0 +1,7 @@ +//go:build devtools + +package app + +func IsDevtoolsEnabled() bool { + return true +} diff --git a/v2/internal/app/app_devtools_not.go b/v2/internal/app/app_devtools_not.go new file mode 100644 index 000000000..a2cfd4e5d --- /dev/null +++ b/v2/internal/app/app_devtools_not.go @@ -0,0 +1,7 @@ +//go:build !devtools + +package app + +func IsDevtoolsEnabled() bool { + return false +} diff --git a/v2/internal/app/app_production.go b/v2/internal/app/app_production.go index afb67bdb3..2dfad6015 100644 --- a/v2/internal/app/app_production.go +++ b/v2/internal/app/app_production.go @@ -34,7 +34,9 @@ func CreateApp(appoptions *options.App) (*App, error) { options.MergeDefaults(appoptions) debug := IsDebug() + devtools := IsDevtoolsEnabled() ctx = context.WithValue(ctx, "debug", debug) + ctx = context.WithValue(ctx, "devtools", devtools) // Set up logger myLogger := logger.New(appoptions.Logger) @@ -93,6 +95,7 @@ func CreateApp(appoptions *options.App) (*App, error) { startupCallback: appoptions.OnStartup, shutdownCallback: appoptions.OnShutdown, debug: debug, + devtools: devtools, options: appoptions, } diff --git a/v2/internal/frontend/desktop/darwin/Application.h b/v2/internal/frontend/desktop/darwin/Application.h index e418168e6..5e6aa0657 100644 --- a/v2/internal/frontend/desktop/darwin/Application.h +++ b/v2/internal/frontend/desktop/darwin/Application.h @@ -17,7 +17,7 @@ #define WindowStartsMinimised 2 #define WindowStartsFullscreen 3 -WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled); +WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int devtools, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled); void Run(void*, const char* url); void SetTitle(void* ctx, const char *title); diff --git a/v2/internal/frontend/desktop/darwin/Application.m b/v2/internal/frontend/desktop/darwin/Application.m index ab951714d..f79b0b8f2 100644 --- a/v2/internal/frontend/desktop/darwin/Application.m +++ b/v2/internal/frontend/desktop/darwin/Application.m @@ -13,13 +13,13 @@ #import "WailsMenu.h" #import "WailsMenuItem.h" -WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled) { +WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int devtools, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled) { [NSApplication sharedApplication]; WailsContext *result = [WailsContext new]; - result.debug = debug; + result.devtools = devtools; if ( windowStartState == WindowStartsFullscreen ) { fullscreen = 1; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.h b/v2/internal/frontend/desktop/darwin/WailsContext.h index 1e48b2182..f39514d9f 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.h +++ b/v2/internal/frontend/desktop/darwin/WailsContext.h @@ -44,7 +44,7 @@ @property bool alwaysOnTop; -@property bool debug; +@property bool devtools; @property (retain) WKUserContentController* userContentController; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.m b/v2/internal/frontend/desktop/darwin/WailsContext.m index 29fa99317..fffbe25c5 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.m +++ b/v2/internal/frontend/desktop/darwin/WailsContext.m @@ -225,7 +225,7 @@ typedef void (^schemeTaskCaller)(id); [userContentController addScriptMessageHandler:self name:@"external"]; config.userContentController = userContentController; self.userContentController = userContentController; - if (self.debug) { + if (self.devtools) { [config.preferences setValue:@YES forKey:@"developerExtrasEnabled"]; } else { // Disable default context menus diff --git a/v2/internal/frontend/desktop/darwin/frontend.go b/v2/internal/frontend/desktop/darwin/frontend.go index b714a2c3b..c0dd27029 100644 --- a/v2/internal/frontend/desktop/darwin/frontend.go +++ b/v2/internal/frontend/desktop/darwin/frontend.go @@ -47,6 +47,7 @@ type Frontend struct { frontendOptions *options.App logger *logger.Logger debug bool + devtools bool // Assets assets *assetserver.AssetServer @@ -151,12 +152,18 @@ func (f *Frontend) WindowSetDarkTheme() { func (f *Frontend) Run(ctx context.Context) error { f.ctx = ctx + var _debug = ctx.Value("debug") + var _devtools = ctx.Value("devtools") + if _debug != nil { f.debug = _debug.(bool) } + if _devtools != nil { + f.devtools = _devtools.(bool) + } - mainWindow := NewWindow(f.frontendOptions, f.debug) + mainWindow := NewWindow(f.frontendOptions, f.debug, f.devtools) f.mainWindow = mainWindow f.mainWindow.Center() diff --git a/v2/internal/frontend/desktop/darwin/main.m b/v2/internal/frontend/desktop/darwin/main.m index d2f39bccb..48f4f66ad 100644 --- a/v2/internal/frontend/desktop/darwin/main.m +++ b/v2/internal/frontend/desktop/darwin/main.m @@ -215,10 +215,10 @@ int main(int argc, const char * argv[]) { int hideWindowOnClose = 0; const char* appearance = "NSAppearanceNameDarkAqua"; int windowIsTranslucent = 1; - int debug = 1; + int devtools = 1; int windowStartState = 0; int startsHidden = 0; - WailsContext *result = Create("OI OI!",400,400, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, debug, windowStartState, + WailsContext *result = Create("OI OI!",400,400, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, devtools, windowStartState, startsHidden, 400, 400, 600, 600, false); SetBackgroundColour(result, 255, 0, 0, 255); void *m = NewMenu(""); diff --git a/v2/internal/frontend/desktop/darwin/window.go b/v2/internal/frontend/desktop/darwin/window.go index 8b4c77799..c4e9dcdbd 100644 --- a/v2/internal/frontend/desktop/darwin/window.go +++ b/v2/internal/frontend/desktop/darwin/window.go @@ -40,7 +40,7 @@ func bool2Cint(value bool) C.int { return C.int(0) } -func NewWindow(frontendOptions *options.App, debugMode bool) *Window { +func NewWindow(frontendOptions *options.App, debug bool, devtools bool) *Window { c := NewCalloc() defer c.Free() @@ -51,7 +51,7 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { alwaysOnTop := bool2Cint(frontendOptions.AlwaysOnTop) hideWindowOnClose := bool2Cint(frontendOptions.HideWindowOnClose) startsHidden := bool2Cint(frontendOptions.StartHidden) - debug := bool2Cint(debugMode) + devtoolsEnabled := bool2Cint(devtools) var fullSizeContent, hideTitleBar, hideTitle, useToolbar, webviewIsTransparent C.int var titlebarAppearsTransparent, hideToolbarSeparator, windowIsTranslucent C.int @@ -86,7 +86,7 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { } var context *C.WailsContext = C.Create(title, width, height, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, - alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, debug, windowStartState, startsHidden, + alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, devtoolsEnabled, windowStartState, startsHidden, minWidth, minHeight, maxWidth, maxHeight, enableFraudulentWebsiteWarnings) // Create menu @@ -114,7 +114,7 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { result.SetApplicationMenu(frontendOptions.Menu) } - if debugMode && frontendOptions.Debug.OpenInspectorOnStartup { + if debug && frontendOptions.Debug.OpenInspectorOnStartup { showInspector(result.context) } return result diff --git a/v2/internal/frontend/desktop/linux/frontend.go b/v2/internal/frontend/desktop/linux/frontend.go index 58b8d746b..14c202d82 100644 --- a/v2/internal/frontend/desktop/linux/frontend.go +++ b/v2/internal/frontend/desktop/linux/frontend.go @@ -106,6 +106,7 @@ type Frontend struct { frontendOptions *options.App logger *logger.Logger debug bool + devtools bool // Assets assets *assetserver.AssetServer @@ -176,10 +177,16 @@ func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger. go result.startMessageProcessor() var _debug = ctx.Value("debug") + var _devtools = ctx.Value("devtools") + if _debug != nil { result.debug = _debug.(bool) } - result.mainWindow = NewWindow(appoptions, result.debug) + if _devtools != nil { + result.devtools = _devtools.(bool) + } + + result.mainWindow = NewWindow(appoptions, result.debug, result.devtools) C.install_signal_handlers() diff --git a/v2/internal/frontend/desktop/linux/window.go b/v2/internal/frontend/desktop/linux/window.go index 9cc86afbb..79fc46b6f 100644 --- a/v2/internal/frontend/desktop/linux/window.go +++ b/v2/internal/frontend/desktop/linux/window.go @@ -37,6 +37,7 @@ func gtkBool(input bool) C.gboolean { type Window struct { appoptions *options.App debug bool + devtools bool gtkWindow unsafe.Pointer contentManager unsafe.Pointer webview unsafe.Pointer @@ -54,12 +55,13 @@ func bool2Cint(value bool) C.int { return C.int(0) } -func NewWindow(appoptions *options.App, debug bool) *Window { +func NewWindow(appoptions *options.App, debug bool, devtools bool) *Window { validateWebKit2Version(appoptions) result := &Window{ appoptions: appoptions, debug: debug, + devtools: devtools, minHeight: appoptions.MinHeight, minWidth: appoptions.MinWidth, maxHeight: appoptions.MaxHeight, @@ -95,8 +97,8 @@ func NewWindow(appoptions *options.App, debug bool) *Window { defer C.free(unsafe.Pointer(buttonPressedName)) C.ConnectButtons(unsafe.Pointer(webview)) - if debug { - C.DevtoolsEnabled(unsafe.Pointer(webview), C.int(1), C.bool(appoptions.Debug.OpenInspectorOnStartup)) + if devtools { + C.DevtoolsEnabled(unsafe.Pointer(webview), C.int(1), C.bool(debug && appoptions.Debug.OpenInspectorOnStartup)) } else { C.DisableContextMenu(unsafe.Pointer(webview)) } diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index c4186eda6..ef6b9d575 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -48,6 +48,7 @@ type Frontend struct { logger *logger.Logger chromium *edge.Chromium debug bool + devtools bool // Assets assets *assetserver.AssetServer @@ -142,9 +143,14 @@ func (f *Frontend) Run(ctx context.Context) error { f.mainWindow = mainWindow var _debug = ctx.Value("debug") + var _devtools = ctx.Value("devtools") + if _debug != nil { f.debug = _debug.(bool) } + if _devtools != nil { + f.devtools = _devtools.(bool) + } f.WindowCenter() f.setupChromium() @@ -489,11 +495,11 @@ func (f *Frontend) setupChromium() { if err != nil { log.Fatal(err) } - err = settings.PutAreDefaultContextMenusEnabled(f.debug) + err = settings.PutAreDefaultContextMenusEnabled(f.devtools) if err != nil { log.Fatal(err) } - err = settings.PutAreDevToolsEnabled(f.debug) + err = settings.PutAreDevToolsEnabled(f.devtools) if err != nil { log.Fatal(err) } diff --git a/v2/pkg/commands/build/base.go b/v2/pkg/commands/build/base.go index fbae6ce7e..abfbafff5 100644 --- a/v2/pkg/commands/build/base.go +++ b/v2/pkg/commands/build/base.go @@ -234,6 +234,11 @@ func (b *BaseBuilder) CompileProject(options *Options) error { tags.Add("debug") } + // This options allows you to enable devtools in production build (not dev build as it's always enabled there) + if options.Devtools { + tags.Add("devtools") + } + if options.Obfuscated { tags.Add("obfuscated") } diff --git a/v2/pkg/commands/build/build.go b/v2/pkg/commands/build/build.go index cad768fa2..85b3e4f5b 100644 --- a/v2/pkg/commands/build/build.go +++ b/v2/pkg/commands/build/build.go @@ -40,6 +40,7 @@ type Options struct { Logger *clilogger.CLILogger // All output to the logger OutputType string // EG: desktop, server.... Mode Mode // release or dev + Devtools bool // Enable devtools in production ProjectData *project.Project // The project data Pack bool // Create a package for the app after building Platform string // The platform to build for diff --git a/website/docs/reference/cli.mdx b/website/docs/reference/cli.mdx index 8b2f5b405..9dcc25bc9 100644 --- a/website/docs/reference/cli.mdx +++ b/website/docs/reference/cli.mdx @@ -56,7 +56,8 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for |:---------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------| | -clean | Cleans the `build/bin` directory | | | -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | | +| -debug | Retains debug information in the application and shows the debug console. Allows the use of the devtools in the application window | | +| -devtools | Allows the use of the devtools in the application window in production (when -debug is not used) | | | -dryrun | Prints the build command without executing it | | | -f | Force build application | | | -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | diff --git a/website/docs/tutorials/helloworld.mdx b/website/docs/tutorials/helloworld.mdx index c7d4d01c5..f9e789bb1 100644 --- a/website/docs/tutorials/helloworld.mdx +++ b/website/docs/tutorials/helloworld.mdx @@ -73,6 +73,7 @@ App Type: desktop Platforms: windows/amd64 Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe Build Mode: Production +Devtools: false Skip Frontend: false Compress: false Package: true diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 921521e85..4118bea99 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) +### Added + +- Added `-devtools` production build flag. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2725) + ### Changed - Now uses new `go-webview2` module. Added by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/2687). From 07c971476df6f299dfe8c4780cc9591894844d15 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 20:54:20 +1000 Subject: [PATCH 11/36] chore: update sponsors.svg (#2729) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 44 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index 4953896df..fba5ae184 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -59,77 +59,77 @@ text { Buying Coffee - + - + - + - + - - - - - + - + - + - + - + Helpers - + - + + + + + - + - + - + - + - + - + - + From 4162f097f1fa56698171c64aefeb10594971f2cd Mon Sep 17 00:00:00 2001 From: Mohamed Gharib Date: Mon, 19 Jun 2023 23:31:47 +0300 Subject: [PATCH 12/36] [v2, options] Add EnableDefaultContextMenu option (#2733) * [v2, options] Add EnableDefaultContextMenu option * Update changelog & docs * go mod tidy (./v2) --------- Co-authored-by: Lea Anthony --- v2/go.mod | 3 +- v2/go.sum | 63 ++----------------- .../frontend/desktop/darwin/Application.h | 2 +- .../frontend/desktop/darwin/Application.m | 3 +- .../frontend/desktop/darwin/WailsContext.h | 1 + .../frontend/desktop/darwin/WailsContext.m | 2 +- v2/internal/frontend/desktop/darwin/main.m | 3 +- v2/internal/frontend/desktop/darwin/window.go | 5 +- v2/internal/frontend/desktop/linux/window.go | 2 +- .../frontend/desktop/windows/frontend.go | 2 +- v2/pkg/options/options.go | 4 ++ website/docs/reference/options.mdx | 9 +++ website/src/pages/changelog.mdx | 1 + 13 files changed, 31 insertions(+), 69 deletions(-) diff --git a/v2/go.mod b/v2/go.mod index 5d45d171f..a83fc12ff 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -15,7 +15,6 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.3.0 github.com/jackmordaunt/icns v1.0.0 - github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e github.com/labstack/echo/v4 v4.10.2 github.com/labstack/gommon v0.4.0 github.com/leaanthony/clir v1.3.0 @@ -34,8 +33,8 @@ require ( github.com/tc-hib/winres v0.1.5 github.com/tidwall/sjson v1.1.7 github.com/tkrajina/go-reflector v0.5.6 + github.com/wailsapp/go-webview2 v1.0.1 github.com/wailsapp/mimetype v1.4.1 - github.com/wailsapp/go-webview2 v1.0.1 github.com/wzshiming/ctc v1.2.3 golang.org/x/mod v0.8.0 golang.org/x/net v0.10.0 diff --git a/v2/go.sum b/v2/go.sum index 0a3125661..5c8c5a5c0 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -28,11 +28,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= -github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= -github.com/aymanbagabas/go-osc52 v1.2.2 h1:NT7wkhEhPTcKnBCdPi9djmyy9L3JOL4+3SsfJyqptCo= -github.com/aymanbagabas/go-osc52 v1.2.2/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= @@ -41,8 +36,6 @@ github.com/bitfield/script v0.19.0 h1:W24f+FQuPab9gXcW8bhcbo5qO8AtrXyu3XOnR4zhHN github.com/bitfield/script v0.19.0/go.mod h1:ana6F8YOSZ3ImT8SauIzuYSqXgFVkSUJ6kgja+WMmIY= github.com/charmbracelet/glamour v0.5.0 h1:wu15ykPdB7X6chxugG/NNfDUbyyrCLV9XBalj5wdu3g= github.com/charmbracelet/glamour v0.5.0/go.mod h1:9ZRtG19AUIzcTm7FGLGbq3D5WKQ5UyZBbQsMQN0XIqc= -github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= -github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -51,8 +44,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= -github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -76,13 +67,10 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= @@ -115,12 +103,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY= -github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= -github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= -github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= @@ -128,13 +112,10 @@ github.com/leaanthony/clir v1.3.0 h1:L9nPDWrmc/qU9UWZZvRaFajWYuO0np9V5p+5gxyYno0 github.com/leaanthony/clir v1.3.0/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= -github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4= -github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM= github.com/leaanthony/go-ansi-parser v1.6.0 h1:T8TuMhFB6TUMIUm0oRrSbgJudTFw9csT3ZK09w0t4Pg= github.com/leaanthony/go-ansi-parser v1.6.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ= github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4= -github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY= github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= @@ -146,12 +127,10 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= @@ -160,29 +139,19 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.17 h1:Z1a//hgsQ4yjC+8zEkV8IWySkXnsxmdSY642CTFQb5Y= github.com/microcosm-cc/bluemonday v1.0.17/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/microcosm-cc/bluemonday v1.0.24 h1:NGQoPtwGVcbGkKfvyYk1yRqknzBuoMiUrO6R7uFTPlw= -github.com/microcosm-cc/bluemonday v1.0.24/go.mod h1:ArQySAMps0790cHSkdPEJ7bGkF2VePWH773hsJNSHf8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.9.0 h1:wnbOaGz+LUR3jNT0zOzinPnyDaCZUQRZj9GxK8eRVl8= github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw= -github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= -github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= -github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 h1:acNfDZXmm28D2Yg/c3ALnZStzNaZMSagpbr96vY6Zjc= -github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -200,7 +169,6 @@ github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkG github.com/pterm/pterm v0.12.49 h1:qeNm0wTWawy6WhKoY8ZKq6qTXFr0s2UtUyRW0yVztEg= github.com/pterm/pterm v0.12.49/go.mod h1:D4OBoWNqAfXkm5QLTjIgjNiMXPHemLJHnIreGUsWzWg= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -208,8 +176,6 @@ github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBO github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= -github.com/samber/lo v1.27.1 h1:sTXwkRiIFIQG+G0HeAvOEnGjqWeWtI9cg5/n51KrxPg= -github.com/samber/lo v1.27.1/go.mod h1:it33p9UtPMS7z72fP4gw/EIfQB2eI8ke7GR2wc6+Rhg= github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -225,12 +191,11 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tc-hib/winres v0.1.5 h1:2dA5yfjdoEA3UyRaOC92HNMt3jap66pLzoW4MjpC/0M= github.com/tc-hib/winres v0.1.5/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A= -github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= github.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E= github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -242,18 +207,15 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.1.7 h1:sgVPwu/yygHJ2m1pJDLgGM/h+1F5odx5Q9ljG3imRm8= github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs= -github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ= -github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE= github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/wailsapp/go-webview2 v1.0.1 h1:dEJIeEApW/MhO2tTMISZBFZPuW7kwrFA1NtgFB1z1II= -github.com/wailsapp/go-webview2 v1.0.1/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wailsapp/go-webview2 v1.0.1 h1:dEJIeEApW/MhO2tTMISZBFZPuW7kwrFA1NtgFB1z1II= +github.com/wailsapp/go-webview2 v1.0.1/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= github.com/wzshiming/ctc v1.2.3 h1:q+hW3IQNsjIlOFBTGZZZeIXTElFM4grF4spW/errh/c= @@ -268,28 +230,20 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= -github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -299,13 +253,11 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -330,10 +282,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -341,21 +290,17 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/v2/internal/frontend/desktop/darwin/Application.h b/v2/internal/frontend/desktop/darwin/Application.h index 5e6aa0657..4239da93b 100644 --- a/v2/internal/frontend/desktop/darwin/Application.h +++ b/v2/internal/frontend/desktop/darwin/Application.h @@ -17,7 +17,7 @@ #define WindowStartsMinimised 2 #define WindowStartsFullscreen 3 -WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int devtools, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled); +WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int devtools, int defaultContextMenu, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled); void Run(void*, const char* url); void SetTitle(void* ctx, const char *title); diff --git a/v2/internal/frontend/desktop/darwin/Application.m b/v2/internal/frontend/desktop/darwin/Application.m index f79b0b8f2..2c08002d4 100644 --- a/v2/internal/frontend/desktop/darwin/Application.m +++ b/v2/internal/frontend/desktop/darwin/Application.m @@ -13,13 +13,14 @@ #import "WailsMenu.h" #import "WailsMenuItem.h" -WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int devtools, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled) { +WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int devtools, int defaultContextMenu, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight, bool fraudulentWebsiteWarningEnabled) { [NSApplication sharedApplication]; WailsContext *result = [WailsContext new]; result.devtools = devtools; + result.defaultContextMenu = defaultContextMenu; if ( windowStartState == WindowStartsFullscreen ) { fullscreen = 1; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.h b/v2/internal/frontend/desktop/darwin/WailsContext.h index f39514d9f..7cdf034bb 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.h +++ b/v2/internal/frontend/desktop/darwin/WailsContext.h @@ -45,6 +45,7 @@ @property bool alwaysOnTop; @property bool devtools; +@property bool defaultContextMenu; @property (retain) WKUserContentController* userContentController; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.m b/v2/internal/frontend/desktop/darwin/WailsContext.m index fffbe25c5..15c9edff7 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.m +++ b/v2/internal/frontend/desktop/darwin/WailsContext.m @@ -227,7 +227,7 @@ typedef void (^schemeTaskCaller)(id); self.userContentController = userContentController; if (self.devtools) { [config.preferences setValue:@YES forKey:@"developerExtrasEnabled"]; - } else { + } else if (!self.defaultContextMenu) { // Disable default context menus WKUserScript *initScript = [WKUserScript new]; [initScript initWithSource:@"window.wails.flags.disableWailsDefaultContextMenu = true;" diff --git a/v2/internal/frontend/desktop/darwin/main.m b/v2/internal/frontend/desktop/darwin/main.m index 48f4f66ad..45a7d2684 100644 --- a/v2/internal/frontend/desktop/darwin/main.m +++ b/v2/internal/frontend/desktop/darwin/main.m @@ -216,9 +216,10 @@ int main(int argc, const char * argv[]) { const char* appearance = "NSAppearanceNameDarkAqua"; int windowIsTranslucent = 1; int devtools = 1; + int defaultContextMenu = 1; int windowStartState = 0; int startsHidden = 0; - WailsContext *result = Create("OI OI!",400,400, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, devtools, windowStartState, + WailsContext *result = Create("OI OI!",400,400, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, devtools, defaultContextMenu, windowStartState, startsHidden, 400, 400, 600, 600, false); SetBackgroundColour(result, 255, 0, 0, 255); void *m = NewMenu(""); diff --git a/v2/internal/frontend/desktop/darwin/window.go b/v2/internal/frontend/desktop/darwin/window.go index c4e9dcdbd..c4fb9c0f3 100644 --- a/v2/internal/frontend/desktop/darwin/window.go +++ b/v2/internal/frontend/desktop/darwin/window.go @@ -52,6 +52,7 @@ func NewWindow(frontendOptions *options.App, debug bool, devtools bool) *Window hideWindowOnClose := bool2Cint(frontendOptions.HideWindowOnClose) startsHidden := bool2Cint(frontendOptions.StartHidden) devtoolsEnabled := bool2Cint(devtools) + defaultContextMenu := bool2Cint(frontendOptions.EnableDefaultContextMenu) var fullSizeContent, hideTitleBar, hideTitle, useToolbar, webviewIsTransparent C.int var titlebarAppearsTransparent, hideToolbarSeparator, windowIsTranslucent C.int @@ -86,8 +87,8 @@ func NewWindow(frontendOptions *options.App, debug bool, devtools bool) *Window } var context *C.WailsContext = C.Create(title, width, height, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, - alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, devtoolsEnabled, windowStartState, startsHidden, - minWidth, minHeight, maxWidth, maxHeight, enableFraudulentWebsiteWarnings) + alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, devtoolsEnabled, defaultContextMenu, + windowStartState, startsHidden, minWidth, minHeight, maxWidth, maxHeight, enableFraudulentWebsiteWarnings) // Create menu result := &Window{ diff --git a/v2/internal/frontend/desktop/linux/window.go b/v2/internal/frontend/desktop/linux/window.go index 79fc46b6f..dd087f57e 100644 --- a/v2/internal/frontend/desktop/linux/window.go +++ b/v2/internal/frontend/desktop/linux/window.go @@ -99,7 +99,7 @@ func NewWindow(appoptions *options.App, debug bool, devtools bool) *Window { if devtools { C.DevtoolsEnabled(unsafe.Pointer(webview), C.int(1), C.bool(debug && appoptions.Debug.OpenInspectorOnStartup)) - } else { + } else if !appoptions.EnableDefaultContextMenu { C.DisableContextMenu(unsafe.Pointer(webview)) } diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index ef6b9d575..76cecbc93 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -495,7 +495,7 @@ func (f *Frontend) setupChromium() { if err != nil { log.Fatal(err) } - err = settings.PutAreDefaultContextMenusEnabled(f.devtools) + err = settings.PutAreDefaultContextMenusEnabled(f.devtools || f.frontendOptions.EnableDefaultContextMenu) if err != nil { log.Fatal(err) } diff --git a/v2/pkg/options/options.go b/v2/pkg/options/options.go index 74b2aef72..1562a7dff 100644 --- a/v2/pkg/options/options.go +++ b/v2/pkg/options/options.go @@ -70,6 +70,10 @@ type App struct { // The CSS Value that the CSSDragProperty must have to be draggable, EG: "drag" CSSDragValue string + // EnableDefaultContextMenu enables the browser's default context-menu in production + // This menu is already enabled in development, as well as in debug builds and production builds with the `-devtools` flag + EnableDefaultContextMenu bool + // EnableFraudulentWebsiteDetection enables scan services for fraudulent content, such as malware or phishing attempts. // These services might send information from your app like URLs navigated to and possibly other content to cloud // services of Apple and Microsoft. diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index 4bc0d0ffd..2f977bde3 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -51,6 +51,7 @@ func main() { OnBeforeClose: app.beforeClose, CSSDragProperty: "--wails-draggable", CSSDragValue: "drag", + EnableDefaultContextMenu: false, EnableFraudulentWebsiteDetection: false, ZoomFactor: 1.0, IsZoomControlEnabled: false, @@ -417,6 +418,14 @@ Indicates what value the `CSSDragProperty` style should have to drag the window. Name: CSSDragValue
Type: `string` +### EnableDefaultContextMenu + +EnableDefaultContextMenu enables the browser's default context-menu in production (Without the devtools inspector). +This menu is already enabled in development, as well as in debug builds and production builds with the `-devtools` flag. + +Name: EnableDefaultContextMenu
+Type: `bool` + ### EnableFraudulentWebsiteDetection EnableFraudulentWebsiteDetection enables scan services for fraudulent content, such as malware or phishing attempts. diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 4118bea99..a9ebdbd48 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added `-devtools` production build flag. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2725) +- Added `EnableDefaultContextMenu` option to allow enabling the browser's default context-menu in production . Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2733) ### Changed From 8fd16d4be3f830960583d9866a3bb2cdacce58f3 Mon Sep 17 00:00:00 2001 From: stffabi Date: Tue, 20 Jun 2023 08:06:42 +0200 Subject: [PATCH 13/36] [assetServer] Make WebView request URL and RequestURI RFC and Go docs compliant (#2722) * [v2 dev] Improve logging of external AssetHandler * [assetServer] Make WebView request URL and RequestURI RFC and Go docs conforme --- v2/pkg/assetserver/assethandler_external.go | 2 +- v2/pkg/assetserver/assetserver_webview.go | 16 ++++++++++++---- website/src/pages/changelog.mdx | 8 ++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/v2/pkg/assetserver/assethandler_external.go b/v2/pkg/assetserver/assethandler_external.go index 588b350f5..743f051e7 100644 --- a/v2/pkg/assetserver/assethandler_external.go +++ b/v2/pkg/assetserver/assethandler_external.go @@ -46,7 +46,7 @@ func NewExternalAssetsHandler(logger Logger, options assetserver.Options, url *u proxy.ErrorHandler = func(rw http.ResponseWriter, r *http.Request, err error) { if baseHandler != nil && errors.Is(err, errSkipProxy) { if logger != nil { - logger.Debug("[ExternalAssetHandler] Loading '%s' failed, using original AssetHandler", r.URL) + logger.Debug("[ExternalAssetHandler] '%s' returned not found, using AssetHandler", r.URL) } baseHandler.ServeHTTP(rw, r) } else { diff --git a/v2/pkg/assetserver/assetserver_webview.go b/v2/pkg/assetserver/assetserver_webview.go index ae85f2513..7fad1b01e 100644 --- a/v2/pkg/assetserver/assetserver_webview.go +++ b/v2/pkg/assetserver/assetserver_webview.go @@ -96,6 +96,18 @@ func (d *AssetServer) processWebViewRequest(r webview.Request) { d.webviewRequestErrorHandler(uri, rw, fmt.Errorf("HTTP-Request: %w", err)) return } + + // For server requests, the URL is parsed from the URI supplied on the Request-Line as stored in RequestURI. For + // most requests, fields other than Path and RawQuery will be empty. (See RFC 7230, Section 5.3) + req.URL.Scheme = "" + req.URL.Host = "" + req.URL.Fragment = "" + req.URL.RawFragment = "" + + if url := req.URL; req.RequestURI == "" && url != nil { + req.RequestURI = url.String() + } + req.Header = header if req.RemoteAddr == "" { @@ -103,10 +115,6 @@ func (d *AssetServer) processWebViewRequest(r webview.Request) { req.RemoteAddr = "192.0.2.1:1234" } - if req.RequestURI == "" && req.URL != nil { - req.RequestURI = req.URL.String() - } - if req.ContentLength == 0 { req.ContentLength, _ = strconv.ParseInt(req.Header.Get(HeaderContentLength), 10, 64) } else { diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index a9ebdbd48..e6b243ebd 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -14,9 +14,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Breaking Changes + +- AssetServer RequestURI and URL are now RFC and Go Docs compliant for server requests. This means Scheme, Host and Fragments are not provided anymore. Changed by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2722) + ### Fixed -- Avoid app crashing when the Linux GTK key is empty by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) +- Avoid app crashing when the Linux GTK key is empty. Fixed by @aminya in [PR](https://github.com/wailsapp/wails/pull/2672) ### Added @@ -27,7 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Now uses new `go-webview2` module. Added by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/2687). - Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) -- Enable HiDPI option by default in windows nsis installer by @5aaee9 in [PR](https://github.com/wailsapp/wails/pull/2694) +- Enable HiDPI option by default in windows nsis installer. Changed by @5aaee9 in [PR](https://github.com/wailsapp/wails/pull/2694) ## v2.5.1 - 2023-05-16 From 4c7c3d9d82e8a193b986a91139eac1046dd46aa6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 21:52:55 +1000 Subject: [PATCH 14/36] chore: update sponsors.svg (#2738) Co-authored-by: leaanthony --- website/static/img/sponsors.svg | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg index fba5ae184..1a20e9c23 100644 --- a/website/static/img/sponsors.svg +++ b/website/static/img/sponsors.svg @@ -59,39 +59,35 @@ text { Buying Coffee - + - + - + - + - + - + - + - - - - - + Helpers From abbbf05a79631c585807875883935cd8ca1ab021 Mon Sep 17 00:00:00 2001 From: Mahcks Date: Sun, 25 Jun 2023 15:50:52 -0700 Subject: [PATCH 15/36] added shadcn-ui template (#2744) --- website/docs/community/templates.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/community/templates.mdx b/website/docs/community/templates.mdx index e73bbec2b..3543cbe9c 100644 --- a/website/docs/community/templates.mdx +++ b/website/docs/community/templates.mdx @@ -41,6 +41,7 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for - [wails-react-template](https://github.com/flin7/wails-react-template) - A minimal template for React that supports live development - [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A template using Next.js and TypeScript - [wails-vite-react-ts-tailwind-template](https://github.com/hotafrika/wails-vite-react-ts-tailwind-template) - A template for React + TypeScript + Vite + TailwindCSS +- [wails-vite-react-ts-tailwind-shadcnui-template](https://github.com/Mahcks/wails-vite-react-tailwind-shadcnui-ts) - A template with Vite, React, TypeScript, TailwindCSS, and shadcn/ui ## Svelte From 5292ced7311395d3b89ea13da9b5aa3c08fd3e60 Mon Sep 17 00:00:00 2001 From: Mohamed Gharib Date: Tue, 27 Jun 2023 14:31:08 +0300 Subject: [PATCH 16/36] [v2, runtime] Separate runtime js debug build (#2745) --- v2/internal/frontend/runtime/desktop/main.js | 6 ++---- v2/internal/frontend/runtime/package.json | 4 ++-- v2/internal/frontend/runtime/runtime_debug_desktop.go | 8 ++++++++ .../{runtime_dev_desktop.js => runtime_debug_desktop.js} | 9 +-------- v2/internal/frontend/runtime/runtime_dev_desktop.go | 8 -------- v2/internal/frontend/runtime/runtime_prod_desktop.go | 2 +- v2/internal/frontend/runtime/runtime_prod_desktop.js | 2 +- website/src/pages/changelog.mdx | 1 + 8 files changed, 16 insertions(+), 24 deletions(-) create mode 100644 v2/internal/frontend/runtime/runtime_debug_desktop.go rename v2/internal/frontend/runtime/{runtime_dev_desktop.js => runtime_debug_desktop.js} (71%) delete mode 100644 v2/internal/frontend/runtime/runtime_dev_desktop.go diff --git a/v2/internal/frontend/runtime/desktop/main.js b/v2/internal/frontend/runtime/desktop/main.js index 9ec68acd6..38c56069e 100644 --- a/v2/internal/frontend/runtime/desktop/main.js +++ b/v2/internal/frontend/runtime/desktop/main.js @@ -78,10 +78,8 @@ if (window.wailsbindings) { delete window.wails.SetBindings; } -// This is evaluated at build time in package.json -// const dev = 0; -// const production = 1; -if (ENV === 1) { +// (bool) This is evaluated at build time in package.json +if (!DEBUG) { delete window.wailsbindings; } diff --git a/v2/internal/frontend/runtime/package.json b/v2/internal/frontend/runtime/package.json index aa6c3aad5..09ff4d50f 100644 --- a/v2/internal/frontend/runtime/package.json +++ b/v2/internal/frontend/runtime/package.json @@ -7,8 +7,8 @@ "build": "run-p build:*", "build:ipc-desktop": "npx esbuild desktop/ipc.js --bundle --minify --outfile=ipc.js", "build:ipc-dev": "cd dev && npm install && npm run build", - "build:runtime-desktop-prod": "npx esbuild desktop/main.js --bundle --minify --outfile=runtime_prod_desktop.js --define:ENV=1", - "build:runtime-desktop-dev": "npx esbuild desktop/main.js --bundle --sourcemap=inline --outfile=runtime_dev_desktop.js --define:ENV=0", + "build:runtime-desktop-prod": "npx esbuild desktop/main.js --bundle --minify --outfile=runtime_prod_desktop.js --define:DEBUG=false", + "build:runtime-desktop-debug": "npx esbuild desktop/main.js --bundle --sourcemap=inline --outfile=runtime_debug_desktop.js --define:DEBUG=true", "test": "vitest" }, "author": "Lea Anthony ", diff --git a/v2/internal/frontend/runtime/runtime_debug_desktop.go b/v2/internal/frontend/runtime/runtime_debug_desktop.go new file mode 100644 index 000000000..8dff343c0 --- /dev/null +++ b/v2/internal/frontend/runtime/runtime_debug_desktop.go @@ -0,0 +1,8 @@ +//go:build debug || !production + +package runtime + +import _ "embed" + +//go:embed runtime_debug_desktop.js +var RuntimeDesktopJS []byte diff --git a/v2/internal/frontend/runtime/runtime_dev_desktop.js b/v2/internal/frontend/runtime/runtime_debug_desktop.js similarity index 71% rename from v2/internal/frontend/runtime/runtime_dev_desktop.js rename to v2/internal/frontend/runtime/runtime_debug_desktop.js index 6bfce9f5b..825ea5893 100644 --- a/v2/internal/frontend/runtime/runtime_dev_desktop.js +++ b/v2/internal/frontend/runtime/runtime_debug_desktop.js @@ -55,13 +55,6 @@ // desktop/events.js var Listener = class { - /** - * Creates an instance of Listener. - * @param {string} eventName - * @param {function} callback - * @param {number} maxCallbacks - * @memberof Listener - */ constructor(eventName, callback, maxCallbacks) { this.eventName = eventName; this.maxCallbacks = maxCallbacks || -1; @@ -583,4 +576,4 @@ }); window.WailsInvoke("runtime:ready"); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiZGVza3RvcC9sb2cuanMiLCAiZGVza3RvcC9ldmVudHMuanMiLCAiZGVza3RvcC9jYWxscy5qcyIsICJkZXNrdG9wL2JpbmRpbmdzLmpzIiwgImRlc2t0b3Avd2luZG93LmpzIiwgImRlc2t0b3Avc2NyZWVuLmpzIiwgImRlc2t0b3AvYnJvd3Nlci5qcyIsICJkZXNrdG9wL2NsaXBib2FyZC5qcyIsICJkZXNrdG9wL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX19cbnwgfCAgICAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5cbi8qKlxuICogU2VuZHMgYSBsb2cgbWVzc2FnZSB0byB0aGUgYmFja2VuZCB3aXRoIHRoZSBnaXZlbiBsZXZlbCArIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIHNlbmRMb2dNZXNzYWdlKGxldmVsLCBtZXNzYWdlKSB7XG5cblx0Ly8gTG9nIE1lc3NhZ2UgZm9ybWF0OlxuXHQvLyBsW3R5cGVdW21lc3NhZ2VdXG5cdHdpbmRvdy5XYWlsc0ludm9rZSgnTCcgKyBsZXZlbCArIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gdHJhY2UgbWVzc2FnZSB3aXRoIHRoZSBiYWNrZW5kXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExvZ1RyYWNlKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1QnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dQcmludChtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdQJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nRGVidWcobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnRCcsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gaW5mbyBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nSW5mbyhtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdJJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dXYXJuaW5nKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1cnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dFcnJvcihtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdFJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBmYXRhbCBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nRmF0YWwobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnRicsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIExvZyBsZXZlbCB0byB0aGUgZ2l2ZW4gbG9nIGxldmVsXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IGxvZ2xldmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRMb2dMZXZlbChsb2dsZXZlbCkge1xuXHRzZW5kTG9nTWVzc2FnZSgnUycsIGxvZ2xldmVsKTtcbn1cblxuLy8gTG9nIGxldmVsc1xuZXhwb3J0IGNvbnN0IExvZ0xldmVsID0ge1xuXHRUUkFDRTogMSxcblx0REVCVUc6IDIsXG5cdElORk86IDMsXG5cdFdBUk5JTkc6IDQsXG5cdEVSUk9SOiA1LFxufTtcbiIsICIvKlxuIF8gICAgICAgX18gICAgICBfIF9fXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuLy8gRGVmaW5lcyBhIHNpbmdsZSBsaXN0ZW5lciB3aXRoIGEgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gY2FsbGJhY2tcblxuLyoqXG4gKiBUaGUgTGlzdGVuZXIgY2xhc3MgZGVmaW5lcyBhIGxpc3RlbmVyISA6LSlcbiAqXG4gKiBAY2xhc3MgTGlzdGVuZXJcbiAqL1xuY2xhc3MgTGlzdGVuZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heENhbGxiYWNrc1xuICAgICAqIEBtZW1iZXJvZiBMaXN0ZW5lclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcykge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgLy8gRGVmYXVsdCBvZiAtMSBtZWFucyBpbmZpbml0ZVxuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICAgICAgLy8gQ2FsbGJhY2sgaW52b2tlcyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gZGF0YVxuICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaXN0ZW5lciBzaG91bGQgYmUgZGVzdHJveWVkXG4gICAgICAgIHRoaXMuQ2FsbGJhY2sgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgZGF0YSk7XG4gICAgICAgICAgICAvLyBJZiBtYXhDYWxsYmFja3MgaXMgaW5maW5pdGUsIHJldHVybiBmYWxzZSAoZG8gbm90IGRlc3Ryb3kpXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGVjcmVtZW50IG1heENhbGxiYWNrcy4gUmV0dXJuIHRydWUgaWYgbm93IDAsIG90aGVyd2lzZSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5tYXhDYWxsYmFja3MgLT0gMTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IHt9O1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBgbWF4Q2FsbGJhY2tzYCB0aW1lcyBiZWZvcmUgYmVpbmcgZGVzdHJveWVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3NcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcykge1xuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaCh0aGlzTGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeSB0aW1lIHRoZSBldmVudCBpcyBlbWl0dGVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIEV2ZW50c09uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgLTEpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbmNlIHRoZW4gZGVzdHJveWVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gRXZlbnRzT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAxKTtcbn1cblxuZnVuY3Rpb24gbm90aWZ5TGlzdGVuZXJzKGV2ZW50RGF0YSkge1xuXG4gICAgLy8gR2V0IHRoZSBldmVudCBuYW1lXG4gICAgbGV0IGV2ZW50TmFtZSA9IGV2ZW50RGF0YS5uYW1lO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgbGlzdGVuZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgaWYgKGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcblxuICAgICAgICAvLyBLZWVwIGEgbGlzdCBvZiBsaXN0ZW5lciBpbmRleGVzIHRvIGRlc3Ryb3lcbiAgICAgICAgY29uc3QgbmV3RXZlbnRMaXN0ZW5lckxpc3QgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLnNsaWNlKCk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChsZXQgY291bnQgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCAtIDE7IGNvdW50ID49IDA7IGNvdW50IC09IDEpIHtcblxuICAgICAgICAgICAgLy8gR2V0IG5leHQgbGlzdGVuZXJcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXVtjb3VudF07XG5cbiAgICAgICAgICAgIGxldCBkYXRhID0gZXZlbnREYXRhLmRhdGE7XG5cbiAgICAgICAgICAgIC8vIERvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgY29uc3QgZGVzdHJveSA9IGxpc3RlbmVyLkNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdGVuZXIgaW5kaWNhdGVkIHRvIGRlc3Ryb3kgaXRzZWxmLCBhZGQgaXQgdG8gdGhlIGRlc3Ryb3kgbGlzdFxuICAgICAgICAgICAgICAgIG5ld0V2ZW50TGlzdGVuZXJMaXN0LnNwbGljZShjb3VudCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY2FsbGJhY2tzIHdpdGggbmV3IGxpc3Qgb2YgbGlzdGVuZXJzXG4gICAgICAgIGlmIChuZXdFdmVudExpc3RlbmVyTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gbmV3RXZlbnRMaXN0ZW5lckxpc3Q7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogTm90aWZ5IGluZm9ybXMgZnJvbnRlbmQgbGlzdGVuZXJzIHRoYXQgYW4gZXZlbnQgd2FzIGVtaXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YVxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBub3RpZnlNZXNzYWdlIC0gZW5jb2RlZCBub3RpZmljYXRpb24gbWVzc2FnZVxuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNOb3RpZnkobm90aWZ5TWVzc2FnZSkge1xuICAgIC8vIFBhcnNlIHRoZSBtZXNzYWdlXG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04ucGFyc2Uobm90aWZ5TWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9ICdJbnZhbGlkIEpTT04gcGFzc2VkIHRvIE5vdGlmeTogJyArIG5vdGlmeU1lc3NhZ2U7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIG5vdGlmeUxpc3RlbmVycyhtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRhdGFcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNFbWl0KGV2ZW50TmFtZSkge1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICBkYXRhOiBbXS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpLFxuICAgIH07XG5cbiAgICAvLyBOb3RpZnkgSlMgbGlzdGVuZXJzXG4gICAgbm90aWZ5TGlzdGVuZXJzKHBheWxvYWQpO1xuXG4gICAgLy8gTm90aWZ5IEdvIGxpc3RlbmVyc1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnRUUnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudE5hbWUpIHtcbiAgICAvLyBSZW1vdmUgbG9jYWwgbGlzdGVuZXJzXG4gICAgZGVsZXRlIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAvLyBOb3RpZnkgR28gbGlzdGVuZXJzXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdFWCcgKyBldmVudE5hbWUpO1xufVxuXG4vKipcbiAqIE9mZiB1bnJlZ2lzdGVycyBhIGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIE9uLFxuICogb3B0aW9uYWxseSBtdWx0aXBsZSBsaXN0ZW5lcmVzIGNhbiBiZSB1bnJlZ2lzdGVyZWQgdmlhIGBhZGRpdGlvbmFsRXZlbnROYW1lc2BcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IGFkZGl0aW9uYWxFdmVudE5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPZmYoZXZlbnROYW1lLCAuLi5hZGRpdGlvbmFsRXZlbnROYW1lcykge1xuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSlcblxuICAgIGlmIChhZGRpdGlvbmFsRXZlbnROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFkZGl0aW9uYWxFdmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbi8qKlxuICogT2ZmIHVucmVnaXN0ZXJzIGFsbCBldmVudCBsaXN0ZW5lcnMgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggT25cbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiBFdmVudHNPZmZBbGwoKSB7XG4gICAgY29uc3QgZXZlbnROYW1lcyA9IE9iamVjdC5rZXlzKGV2ZW50TGlzdGVuZXJzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZW1vdmVMaXN0ZW5lcihldmVudE5hbWVzW2ldKTtcbiAgICB9XG59XG5cbi8qKlxuICogbGlzdGVuZXJPZmYgdW5yZWdpc3RlcnMgYSBsaXN0ZW5lciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBFdmVudHNPblxuICpcbiAqIEBwYXJhbSB7TGlzdGVuZXJ9IGxpc3RlbmVyXG4gKi9cbiBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcbiAgICAvLyBSZW1vdmUgbG9jYWwgbGlzdGVuZXJcbiAgICBldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG5cbiAgICAvLyBDbGVhbiB1cCBpZiB0aGVyZSBhcmUgbm8gZXZlbnQgbGlzdGVuZXJzIGxlZnRcbiAgICBpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgICB9XG59XG4iLCAiLypcbiBfICAgICAgIF9fICAgICAgXyBfX1xufCB8ICAgICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5cbmV4cG9ydCBjb25zdCBjYWxsYmFja3MgPSB7fTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbnVtYmVyIGZyb20gdGhlIG5hdGl2ZSBicm93c2VyIHJhbmRvbSBmdW5jdGlvblxuICpcbiAqIEByZXR1cm5zIG51bWJlclxuICovXG5mdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7XG5cdHZhciBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKTtcblx0cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbnVtYmVyIHVzaW5nIGRhIG9sZC1za29vbCBNYXRoLlJhbmRvbVxuICogSSBsaWtlcyB0byBjYWxsIGl0IExPTFJhbmRvbVxuICpcbiAqIEByZXR1cm5zIG51bWJlclxuICovXG5mdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHtcblx0cmV0dXJuIE1hdGgucmFuZG9tKCkgKiA5MDA3MTk5MjU0NzQwOTkxO1xufVxuXG4vLyBQaWNrIGEgcmFuZG9tIG51bWJlciBmdW5jdGlvbiBiYXNlZCBvbiBicm93c2VyIGNhcGFiaWxpdHlcbnZhciByYW5kb21GdW5jO1xuaWYgKHdpbmRvdy5jcnlwdG8pIHtcblx0cmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTtcbn0gZWxzZSB7XG5cdHJhbmRvbUZ1bmMgPSBiYXNpY1JhbmRvbTtcbn1cblxuXG4vKipcbiAqIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGVcbiAqIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGVcbiAqIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsXG4gKiBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay5cbiAqIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW5cbiAqIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHthbnk9fSBhcmdzXG4gKiBAcGFyYW0ge251bWJlcj19IHRpbWVvdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG5hbWUsIGFyZ3MsIHRpbWVvdXQpIHtcblxuXHQvLyBUaW1lb3V0IGluZmluaXRlIGJ5IGRlZmF1bHRcblx0aWYgKHRpbWVvdXQgPT0gbnVsbCkge1xuXHRcdHRpbWVvdXQgPSAwO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgcHJvbWlzZVxuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG5cdFx0Ly8gQ3JlYXRlIGEgdW5pcXVlIGNhbGxiYWNrSURcblx0XHR2YXIgY2FsbGJhY2tJRDtcblx0XHRkbyB7XG5cdFx0XHRjYWxsYmFja0lEID0gbmFtZSArICctJyArIHJhbmRvbUZ1bmMoKTtcblx0XHR9IHdoaWxlIChjYWxsYmFja3NbY2FsbGJhY2tJRF0pO1xuXG5cdFx0dmFyIHRpbWVvdXRIYW5kbGU7XG5cdFx0Ly8gU2V0IHRpbWVvdXRcblx0XHRpZiAodGltZW91dCA+IDApIHtcblx0XHRcdHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmVqZWN0KEVycm9yKCdDYWxsIHRvICcgKyBuYW1lICsgJyB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICcgKyBjYWxsYmFja0lEKSk7XG5cdFx0XHR9LCB0aW1lb3V0KTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrc1tjYWxsYmFja0lEXSA9IHtcblx0XHRcdHRpbWVvdXRIYW5kbGU6IHRpbWVvdXRIYW5kbGUsXG5cdFx0XHRyZWplY3Q6IHJlamVjdCxcblx0XHRcdHJlc29sdmU6IHJlc29sdmVcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBheWxvYWQgPSB7XG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdGFyZ3MsXG5cdFx0XHRcdGNhbGxiYWNrSUQsXG5cdFx0XHR9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBjYWxsXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ0MnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxud2luZG93Lk9iZnVzY2F0ZWRDYWxsID0gKGlkLCBhcmdzLCB0aW1lb3V0KSA9PiB7XG5cbiAgICAvLyBUaW1lb3V0IGluZmluaXRlIGJ5IGRlZmF1bHRcbiAgICBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVvdXQgPSAwO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIHByb21pc2VcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lEXG4gICAgICAgIHZhciBjYWxsYmFja0lEO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFja0lEID0gaWQgKyAnLScgKyByYW5kb21GdW5jKCk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSk7XG5cbiAgICAgICAgdmFyIHRpbWVvdXRIYW5kbGU7XG4gICAgICAgIC8vIFNldCB0aW1lb3V0XG4gICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignQ2FsbCB0byBtZXRob2QgJyArIGlkICsgJyB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICcgKyBjYWxsYmFja0lEKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrc1tjYWxsYmFja0lEXSA9IHtcbiAgICAgICAgICAgIHRpbWVvdXRIYW5kbGU6IHRpbWVvdXRIYW5kbGUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmVcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGFyZ3MsXG5cdFx0XHRcdGNhbGxiYWNrSUQsXG5cdFx0XHR9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBjYWxsXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ2MnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cblxuLyoqXG4gKiBDYWxsZWQgYnkgdGhlIGJhY2tlbmQgdG8gcmV0dXJuIGRhdGEgdG8gYSBwcmV2aW91c2x5IGNhbGxlZFxuICogYmluZGluZyBpbnZvY2F0aW9uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGluY29taW5nTWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbGJhY2soaW5jb21pbmdNZXNzYWdlKSB7XG5cdC8vIFBhcnNlIHRoZSBtZXNzYWdlXG5cdGxldCBtZXNzYWdlO1xuXHR0cnkge1xuXHRcdG1lc3NhZ2UgPSBKU09OLnBhcnNlKGluY29taW5nTWVzc2FnZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zdCBlcnJvciA9IGBJbnZhbGlkIEpTT04gcGFzc2VkIHRvIGNhbGxiYWNrOiAke2UubWVzc2FnZX0uIE1lc3NhZ2U6ICR7aW5jb21pbmdNZXNzYWdlfWA7XG5cdFx0cnVudGltZS5Mb2dEZWJ1ZyhlcnJvcik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKTtcblx0fVxuXHRsZXQgY2FsbGJhY2tJRCA9IG1lc3NhZ2UuY2FsbGJhY2tpZDtcblx0bGV0IGNhbGxiYWNrRGF0YSA9IGNhbGxiYWNrc1tjYWxsYmFja0lEXTtcblx0aWYgKCFjYWxsYmFja0RhdGEpIHtcblx0XHRjb25zdCBlcnJvciA9IGBDYWxsYmFjayAnJHtjYWxsYmFja0lEfScgbm90IHJlZ2lzdGVyZWQhISFgO1xuXHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKTtcblx0fVxuXHRjbGVhclRpbWVvdXQoY2FsbGJhY2tEYXRhLnRpbWVvdXRIYW5kbGUpO1xuXG5cdGRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJRF07XG5cblx0aWYgKG1lc3NhZ2UuZXJyb3IpIHtcblx0XHRjYWxsYmFja0RhdGEucmVqZWN0KG1lc3NhZ2UuZXJyb3IpO1xuXHR9IGVsc2Uge1xuXHRcdGNhbGxiYWNrRGF0YS5yZXNvbHZlKG1lc3NhZ2UucmVzdWx0KTtcblx0fVxufVxuIiwgIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX18gICAgXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gICkgXG58X18vfF9fL1xcX18sXy9fL18vX19fXy8gIFxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuaW1wb3J0IHtDYWxsfSBmcm9tICcuL2NhbGxzJztcblxuLy8gVGhpcyBpcyB3aGVyZSB3ZSBiaW5kIGdvIG1ldGhvZCB3cmFwcGVyc1xud2luZG93LmdvID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXRCaW5kaW5ncyhiaW5kaW5nc01hcCkge1xuXHR0cnkge1xuXHRcdGJpbmRpbmdzTWFwID0gSlNPTi5wYXJzZShiaW5kaW5nc01hcCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9XG5cblx0Ly8gSW5pdGlhbGlzZSB0aGUgYmluZGluZ3MgbWFwXG5cdHdpbmRvdy5nbyA9IHdpbmRvdy5nbyB8fCB7fTtcblxuXHQvLyBJdGVyYXRlIHBhY2thZ2UgbmFtZXNcblx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXApLmZvckVhY2goKHBhY2thZ2VOYW1lKSA9PiB7XG5cblx0XHQvLyBDcmVhdGUgaW5uZXIgbWFwIGlmIGl0IGRvZXNuJ3QgZXhpc3Rcblx0XHR3aW5kb3cuZ29bcGFja2FnZU5hbWVdID0gd2luZG93LmdvW3BhY2thZ2VOYW1lXSB8fCB7fTtcblxuXHRcdC8vIEl0ZXJhdGUgc3RydWN0IG5hbWVzXG5cdFx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXBbcGFja2FnZU5hbWVdKS5mb3JFYWNoKChzdHJ1Y3ROYW1lKSA9PiB7XG5cblx0XHRcdC8vIENyZWF0ZSBpbm5lciBtYXAgaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdFx0d2luZG93LmdvW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSA9IHdpbmRvdy5nb1twYWNrYWdlTmFtZV1bc3RydWN0TmFtZV0gfHwge307XG5cblx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdzTWFwW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSkuZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuXG5cdFx0XHRcdHdpbmRvdy5nb1twYWNrYWdlTmFtZV1bc3RydWN0TmFtZV1bbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHQvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHRcblx0XHRcdFx0XHRsZXQgdGltZW91dCA9IDA7XG5cblx0XHRcdFx0XHQvLyBBY3R1YWwgZnVuY3Rpb25cblx0XHRcdFx0XHRmdW5jdGlvbiBkeW5hbWljKCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHRcdFx0XHRcdHJldHVybiBDYWxsKFtwYWNrYWdlTmFtZSwgc3RydWN0TmFtZSwgbWV0aG9kTmFtZV0uam9pbignLicpLCBhcmdzLCB0aW1lb3V0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb25cblx0XHRcdFx0XHRkeW5hbWljLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAobmV3VGltZW91dCkge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IG5ld1RpbWVvdXQ7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIEFsbG93IGdldHRpbmcgdGltZW91dCB0byBmdW5jdGlvblxuXHRcdFx0XHRcdGR5bmFtaWMuZ2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aW1lb3V0O1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gZHluYW1pYztcblx0XHRcdFx0fSgpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0pO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cblxuaW1wb3J0IHtDYWxsfSBmcm9tIFwiLi9jYWxsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93UmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1JlbG9hZEFwcCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dSJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRTeXN0ZW1EZWZhdWx0VGhlbWUoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXQVNEVCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0TGlnaHRUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBTFQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldERhcmtUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBRFQnKTtcbn1cblxuLyoqXG4gKiBQbGFjZSB0aGUgd2luZG93IGluIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0NlbnRlcigpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1djJyk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgd2luZG93IHRpdGxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRUaXRsZSh0aXRsZSkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV1QnICsgdGl0bGUpO1xufVxuXG4vKipcbiAqIE1ha2VzIHRoZSB3aW5kb3cgZ28gZnVsbHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0Z1bGxzY3JlZW4oKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXRicpO1xufVxuXG4vKipcbiAqIFJldmVydHMgdGhlIHdpbmRvdyBmcm9tIGZ1bGxzY3JlZW5cbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dVbmZ1bGxzY3JlZW4oKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXZicpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB3aW5kb3csIGkuZS4gd2hldGhlciB0aGUgd2luZG93IGlzIGluIGZ1bGwgc2NyZWVuIG1vZGUgb3Igbm90LlxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFRoZSBzdGF0ZSBvZiB0aGUgd2luZG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dJc0Z1bGxzY3JlZW4oKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNGdWxsc2NyZWVuXCIpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgU2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dzOicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBTaXplIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPHt3OiBudW1iZXIsIGg6IG51bWJlcn0+fSBUaGUgc2l6ZSBvZiB0aGUgd2luZG93XG5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0dldFNpemUoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93R2V0U2l6ZVwiKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRNYXhTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1daOicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0TWluU2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXejonICsgd2lkdGggKyAnOicgKyBoZWlnaHQpO1xufVxuXG5cblxuLyoqXG4gKiBTZXQgdGhlIHdpbmRvdyBBbHdheXNPblRvcCBvciBub3Qgb24gdG9wXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0QWx3YXlzT25Ub3AoYikge1xuXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXQVRQOicgKyAoYiA/ICcxJyA6ICcwJykpO1xufVxuXG5cblxuXG4vKipcbiAqIFNldCB0aGUgUG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0UG9zaXRpb24oeCwgeSkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3A6JyArIHggKyAnOicgKyB5KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFBvc2l0aW9uIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPHt4OiBudW1iZXIsIHk6IG51bWJlcn0+fSBUaGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93R2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93R2V0UG9zXCIpO1xufVxuXG4vKipcbiAqIEhpZGUgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0hpZGUoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXSCcpO1xufVxuXG4vKipcbiAqIFNob3cgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1Nob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXUycpO1xufVxuXG4vKipcbiAqIE1heGltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dNYXhpbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dNJyk7XG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBNYXhpbWlzZSBvZiB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VG9nZ2xlTWF4aW1pc2UoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXdCcpO1xufVxuXG4vKipcbiAqIFVubWF4aW1pc2UgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1VubWF4aW1pc2UoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXVScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB3aW5kb3csIGkuZS4gd2hldGhlciB0aGUgd2luZG93IGlzIG1heGltaXNlZCBvciBub3QuXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gVGhlIHN0YXRlIG9mIHRoZSB3aW5kb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0lzTWF4aW1pc2VkKCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOldpbmRvd0lzTWF4aW1pc2VkXCIpO1xufVxuXG4vKipcbiAqIE1pbmltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dNaW5pbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dtJyk7XG59XG5cbi8qKlxuICogVW5taW5pbWlzZSB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VW5taW5pbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1d1Jyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNNaW5pbWlzZWQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNNaW5pbWlzZWRcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbm9ybWFsIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNOb3JtYWwoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNOb3JtYWxcIik7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBSIFJlZFxuICogQHBhcmFtIHtudW1iZXJ9IEcgR3JlZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBCIEJsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBBIEFscGhhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRCYWNrZ3JvdW5kQ29sb3VyKFIsIEcsIEIsIEEpIHtcbiAgICBsZXQgcmdiYSA9IEpTT04uc3RyaW5naWZ5KHtyOiBSIHx8IDAsIGc6IEcgfHwgMCwgYjogQiB8fCAwLCBhOiBBIHx8IDI1NX0pO1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3I6JyArIHJnYmEpO1xufVxuXG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuXG5pbXBvcnQge0NhbGx9IGZyb20gXCIuL2NhbGxzXCI7XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBhbGwgc2NyZWVucy4gQ2FsbCB0aGlzIGFuZXcgZWFjaCB0aW1lIHlvdSB3YW50IHRvIHJlZnJlc2ggZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHdpbmRvd2luZyBzeXN0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi93cmFwcGVyL3J1bnRpbWUnKS5TY3JlZW59IFNjcmVlblxuICogQHJldHVybiB7UHJvbWlzZTx7U2NyZWVuW119Pn0gVGhlIHNjcmVlbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNjcmVlbkdldEFsbCgpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpTY3JlZW5HZXRBbGxcIik7XG59XG4iLCAiLyoqXG4gKiBAZGVzY3JpcHRpb246IFVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgYnJvd3NlciB0byBvcGVuIHRoZSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gQnJvd3Nlck9wZW5VUkwodXJsKSB7XG4gIHdpbmRvdy5XYWlsc0ludm9rZSgnQk86JyArIHVybCk7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7Q2FsbH0gZnJvbSBcIi4vY2FsbHNcIjtcblxuLyoqXG4gKiBTZXQgdGhlIFNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDbGlwYm9hcmRTZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpDbGlwYm9hcmRTZXRUZXh0XCIsIFt0ZXh0XSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZFxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8e3N0cmluZ30+fSBUZXh0IGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZFxuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDbGlwYm9hcmRHZXRUZXh0KCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOkNsaXBib2FyZEdldFRleHRcIik7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuaW1wb3J0ICogYXMgTG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7ZXZlbnRMaXN0ZW5lcnMsIEV2ZW50c0VtaXQsIEV2ZW50c05vdGlmeSwgRXZlbnRzT2ZmLCBFdmVudHNPbiwgRXZlbnRzT25jZSwgRXZlbnRzT25NdWx0aXBsZX0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHtDYWxsLCBDYWxsYmFjaywgY2FsbGJhY2tzfSBmcm9tICcuL2NhbGxzJztcbmltcG9ydCB7U2V0QmluZGluZ3N9IGZyb20gXCIuL2JpbmRpbmdzXCI7XG5pbXBvcnQgKiBhcyBXaW5kb3cgZnJvbSBcIi4vd2luZG93XCI7XG5pbXBvcnQgKiBhcyBTY3JlZW4gZnJvbSBcIi4vc2NyZWVuXCI7XG5pbXBvcnQgKiBhcyBCcm93c2VyIGZyb20gXCIuL2Jyb3dzZXJcIjtcbmltcG9ydCAqIGFzIENsaXBib2FyZCBmcm9tIFwiLi9jbGlwYm9hcmRcIjtcblxuXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1EnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdTJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnSCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6RW52aXJvbm1lbnRcIik7XG59XG5cbi8vIFRoZSBKUyBydW50aW1lXG53aW5kb3cucnVudGltZSA9IHtcbiAgICAuLi5Mb2csXG4gICAgLi4uV2luZG93LFxuICAgIC4uLkJyb3dzZXIsXG4gICAgLi4uU2NyZWVuLFxuICAgIC4uLkNsaXBib2FyZCxcbiAgICBFdmVudHNPbixcbiAgICBFdmVudHNPbmNlLFxuICAgIEV2ZW50c09uTXVsdGlwbGUsXG4gICAgRXZlbnRzRW1pdCxcbiAgICBFdmVudHNPZmYsXG4gICAgRW52aXJvbm1lbnQsXG4gICAgU2hvdyxcbiAgICBIaWRlLFxuICAgIFF1aXRcbn07XG5cbi8vIEludGVybmFsIHdhaWxzIGVuZHBvaW50c1xud2luZG93LndhaWxzID0ge1xuICAgIENhbGxiYWNrLFxuICAgIEV2ZW50c05vdGlmeSxcbiAgICBTZXRCaW5kaW5ncyxcbiAgICBldmVudExpc3RlbmVycyxcbiAgICBjYWxsYmFja3MsXG4gICAgZmxhZ3M6IHtcbiAgICAgICAgZGlzYWJsZVNjcm9sbGJhckRyYWc6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlV2FpbHNEZWZhdWx0Q29udGV4dE1lbnU6IGZhbHNlLFxuICAgICAgICBlbmFibGVSZXNpemU6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0Q3Vyc29yOiBudWxsLFxuICAgICAgICBib3JkZXJUaGlja25lc3M6IDYsXG4gICAgICAgIHNob3VsZERyYWc6IGZhbHNlLFxuICAgICAgICBkZWZlckRyYWdUb01vdXNlTW92ZTogdHJ1ZSxcbiAgICAgICAgY3NzRHJhZ1Byb3BlcnR5OiBcIi0td2FpbHMtZHJhZ2dhYmxlXCIsXG4gICAgICAgIGNzc0RyYWdWYWx1ZTogXCJkcmFnXCIsXG4gICAgfVxufTtcblxuLy8gU2V0IHRoZSBiaW5kaW5nc1xuaWYgKHdpbmRvdy53YWlsc2JpbmRpbmdzKSB7XG4gICAgd2luZG93LndhaWxzLlNldEJpbmRpbmdzKHdpbmRvdy53YWlsc2JpbmRpbmdzKTtcbiAgICBkZWxldGUgd2luZG93LndhaWxzLlNldEJpbmRpbmdzO1xufVxuXG4vLyBUaGlzIGlzIGV2YWx1YXRlZCBhdCBidWlsZCB0aW1lIGluIHBhY2thZ2UuanNvblxuLy8gY29uc3QgZGV2ID0gMDtcbi8vIGNvbnN0IHByb2R1Y3Rpb24gPSAxO1xuaWYgKEVOViA9PT0gMSkge1xuICAgIGRlbGV0ZSB3aW5kb3cud2FpbHNiaW5kaW5ncztcbn1cblxubGV0IGRyYWdUZXN0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgdmFsID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZS50YXJnZXQpLmdldFByb3BlcnR5VmFsdWUod2luZG93LndhaWxzLmZsYWdzLmNzc0RyYWdQcm9wZXJ0eSk7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdmFsID0gdmFsLnRyaW0oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHZhbCAhPT0gd2luZG93LndhaWxzLmZsYWdzLmNzc0RyYWdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGUuYnV0dG9ucyAhPT0gMSkge1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZ2dpbmcgaWYgbm90IHRoZSBwcmltYXJ5IGJ1dHRvbiBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGUuZGV0YWlsICE9PSAxKSB7XG4gICAgICAgIC8vIERvIG5vdCBzdGFydCBkcmFnZ2luZyBpZiBtb3JlIHRoYW4gb25jZSBoYXMgYmVlbiBjbGlja2VkLCBlLmcuIHdoZW4gZG91YmxlIGNsaWNraW5nXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbndpbmRvdy53YWlscy5zZXRDU1NEcmFnUHJvcGVydGllcyA9IGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICB3aW5kb3cud2FpbHMuZmxhZ3MuY3NzRHJhZ1Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgd2luZG93LndhaWxzLmZsYWdzLmNzc0RyYWdWYWx1ZSA9IHZhbHVlO1xufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHtcblxuICAgIC8vIENoZWNrIGZvciByZXNpemluZ1xuICAgIGlmICh3aW5kb3cud2FpbHMuZmxhZ3MucmVzaXplRWRnZSkge1xuICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoXCJyZXNpemU6XCIgKyB3aW5kb3cud2FpbHMuZmxhZ3MucmVzaXplRWRnZSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcmFnVGVzdChlKSkge1xuICAgICAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLmRpc2FibGVTY3JvbGxiYXJEcmFnKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNoZWNrcyBmb3IgY2xpY2tzIG9uIHRoZSBzY3JvbGwgYmFyXG4gICAgICAgICAgICBpZiAoZS5vZmZzZXRYID4gZS50YXJnZXQuY2xpZW50V2lkdGggfHwgZS5vZmZzZXRZID4gZS50YXJnZXQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3aW5kb3cud2FpbHMuZmxhZ3MuZGVmZXJEcmFnVG9Nb3VzZU1vdmUpIHtcbiAgICAgICAgICAgIHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgd2luZG93LldhaWxzSW52b2tlKFwiZHJhZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LndhaWxzLmZsYWdzLnNob3VsZERyYWcgPSBmYWxzZTtcbiAgICB9XG59KTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PiB7XG4gICAgd2luZG93LndhaWxzLmZsYWdzLnNob3VsZERyYWcgPSBmYWxzZTtcbn0pO1xuXG5mdW5jdGlvbiBzZXRSZXNpemUoY3Vyc29yKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmN1cnNvciA9IGN1cnNvciB8fCB3aW5kb3cud2FpbHMuZmxhZ3MuZGVmYXVsdEN1cnNvcjtcbiAgICB3aW5kb3cud2FpbHMuZmxhZ3MucmVzaXplRWRnZSA9IGN1cnNvcjtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnKSB7XG4gICAgICAgIHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnID0gZmFsc2U7XG4gICAgICAgIGxldCBtb3VzZVByZXNzZWQgPSBlLmJ1dHRvbnMgIT09IHVuZGVmaW5lZCA/IGUuYnV0dG9ucyA6IGUud2hpY2g7XG4gICAgICAgIGlmIChtb3VzZVByZXNzZWQgPiAwKSB7XG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoXCJkcmFnXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghd2luZG93LndhaWxzLmZsYWdzLmVuYWJsZVJlc2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh3aW5kb3cud2FpbHMuZmxhZ3MuZGVmYXVsdEN1cnNvciA9PSBudWxsKSB7XG4gICAgICAgIHdpbmRvdy53YWlscy5mbGFncy5kZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmN1cnNvcjtcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5vdXRlcldpZHRoIC0gZS5jbGllbnRYIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcyAmJiB3aW5kb3cub3V0ZXJIZWlnaHQgLSBlLmNsaWVudFkgPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jdXJzb3IgPSBcInNlLXJlc2l6ZVwiO1xuICAgIH1cbiAgICBsZXQgcmlnaHRCb3JkZXIgPSB3aW5kb3cub3V0ZXJXaWR0aCAtIGUuY2xpZW50WCA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3M7XG4gICAgbGV0IGxlZnRCb3JkZXIgPSBlLmNsaWVudFggPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzO1xuICAgIGxldCB0b3BCb3JkZXIgPSBlLmNsaWVudFkgPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzO1xuICAgIGxldCBib3R0b21Cb3JkZXIgPSB3aW5kb3cub3V0ZXJIZWlnaHQgLSBlLmNsaWVudFkgPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzO1xuXG4gICAgLy8gSWYgd2UgYXJlbid0IG9uIGFuIGVkZ2UsIGJ1dCB3ZXJlLCByZXNldCB0aGUgY3Vyc29yIHRvIGRlZmF1bHRcbiAgICBpZiAoIWxlZnRCb3JkZXIgJiYgIXJpZ2h0Qm9yZGVyICYmICF0b3BCb3JkZXIgJiYgIWJvdHRvbUJvcmRlciAmJiB3aW5kb3cud2FpbHMuZmxhZ3MucmVzaXplRWRnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNldFJlc2l6ZSgpO1xuICAgIH0gZWxzZSBpZiAocmlnaHRCb3JkZXIgJiYgYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdEJvcmRlciAmJiBib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInN3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyICYmIHRvcEJvcmRlcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlciAmJiByaWdodEJvcmRlcikgc2V0UmVzaXplKFwibmUtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlcikgc2V0UmVzaXplKFwibi1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAoYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XG5cbn0pO1xuXG4vLyBTZXR1cCBjb250ZXh0IG1lbnUgaG9va1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLmRpc2FibGVXYWlsc0RlZmF1bHRDb250ZXh0TWVudSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufSk7XG5cbndpbmRvdy5XYWlsc0ludm9rZShcInJ1bnRpbWU6cmVhZHlcIik7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QSxFQUNwQztBQUVBLFNBQU8saUJBQWlCLGFBQWEsU0FBVSxHQUFHO0FBQzlDLFFBQUksT0FBTyxNQUFNLE1BQU0sWUFBWTtBQUMvQixhQUFPLE1BQU0sTUFBTSxhQUFhO0FBQ2hDLFVBQUksZUFBZSxFQUFFLFlBQVksU0FBWSxFQUFFLFVBQVUsRUFBRTtBQUMzRCxVQUFJLGVBQWUsR0FBRztBQUNsQixlQUFPLFlBQVksTUFBTTtBQUN6QjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsUUFBSSxDQUFDLE9BQU8sTUFBTSxNQUFNLGNBQWM7QUFDbEM7QUFBQSxJQUNKO0FBQ0EsUUFBSSxPQUFPLE1BQU0sTUFBTSxpQkFBaUIsTUFBTTtBQUMxQyxhQUFPLE1BQU0sTUFBTSxnQkFBZ0IsU0FBUyxnQkFBZ0IsTUFBTTtBQUFBLElBQ3RFO0FBQ0EsUUFBSSxPQUFPLGFBQWEsRUFBRSxVQUFVLE9BQU8sTUFBTSxNQUFNLG1CQUFtQixPQUFPLGNBQWMsRUFBRSxVQUFVLE9BQU8sTUFBTSxNQUFNLGlCQUFpQjtBQUMzSSxlQUFTLGdCQUFnQixNQUFNLFNBQVM7QUFBQSxJQUM1QztBQUNBLFFBQUksY0FBYyxPQUFPLGFBQWEsRUFBRSxVQUFVLE9BQU8sTUFBTSxNQUFNO0FBQ3JFLFFBQUksYUFBYSxFQUFFLFVBQVUsT0FBTyxNQUFNLE1BQU07QUFDaEQsUUFBSSxZQUFZLEVBQUUsVUFBVSxPQUFPLE1BQU0sTUFBTTtBQUMvQyxRQUFJLGVBQWUsT0FBTyxjQUFjLEVBQUUsVUFBVSxPQUFPLE1BQU0sTUFBTTtBQUd2RSxRQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLE9BQU8sTUFBTSxNQUFNLGVBQWUsUUFBVztBQUMzRyxnQkFBVTtBQUFBLElBQ2QsV0FBVyxlQUFlO0FBQWMsZ0JBQVUsV0FBVztBQUFBLGFBQ3BELGNBQWM7QUFBYyxnQkFBVSxXQUFXO0FBQUEsYUFDakQsY0FBYztBQUFXLGdCQUFVLFdBQVc7QUFBQSxhQUM5QyxhQUFhO0FBQWEsZ0JBQVUsV0FBVztBQUFBLGFBQy9DO0FBQVksZ0JBQVUsVUFBVTtBQUFBLGFBQ2hDO0FBQVcsZ0JBQVUsVUFBVTtBQUFBLGFBQy9CO0FBQWMsZ0JBQVUsVUFBVTtBQUFBLGFBQ2xDO0FBQWEsZ0JBQVUsVUFBVTtBQUFBLEVBRTlDLENBQUM7QUFHRCxTQUFPLGlCQUFpQixlQUFlLFNBQVUsR0FBRztBQUNoRCxRQUFJLE9BQU8sTUFBTSxNQUFNLGdDQUFnQztBQUNuRCxRQUFFLGVBQWU7QUFBQSxJQUNyQjtBQUFBLEVBQ0osQ0FBQztBQUVELFNBQU8sWUFBWSxlQUFlOyIsCiAgIm5hbWVzIjogWyJldmVudE5hbWUiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiZGVza3RvcC9sb2cuanMiLCAiZGVza3RvcC9ldmVudHMuanMiLCAiZGVza3RvcC9jYWxscy5qcyIsICJkZXNrdG9wL2JpbmRpbmdzLmpzIiwgImRlc2t0b3Avd2luZG93LmpzIiwgImRlc2t0b3Avc2NyZWVuLmpzIiwgImRlc2t0b3AvYnJvd3Nlci5qcyIsICJkZXNrdG9wL2NsaXBib2FyZC5qcyIsICJkZXNrdG9wL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX19cbnwgfCAgICAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5cbi8qKlxuICogU2VuZHMgYSBsb2cgbWVzc2FnZSB0byB0aGUgYmFja2VuZCB3aXRoIHRoZSBnaXZlbiBsZXZlbCArIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIHNlbmRMb2dNZXNzYWdlKGxldmVsLCBtZXNzYWdlKSB7XG5cblx0Ly8gTG9nIE1lc3NhZ2UgZm9ybWF0OlxuXHQvLyBsW3R5cGVdW21lc3NhZ2VdXG5cdHdpbmRvdy5XYWlsc0ludm9rZSgnTCcgKyBsZXZlbCArIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gdHJhY2UgbWVzc2FnZSB3aXRoIHRoZSBiYWNrZW5kXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExvZ1RyYWNlKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1QnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dQcmludChtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdQJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nRGVidWcobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnRCcsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gaW5mbyBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nSW5mbyhtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdJJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dXYXJuaW5nKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1cnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dFcnJvcihtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdFJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBmYXRhbCBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nRmF0YWwobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnRicsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIExvZyBsZXZlbCB0byB0aGUgZ2l2ZW4gbG9nIGxldmVsXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IGxvZ2xldmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRMb2dMZXZlbChsb2dsZXZlbCkge1xuXHRzZW5kTG9nTWVzc2FnZSgnUycsIGxvZ2xldmVsKTtcbn1cblxuLy8gTG9nIGxldmVsc1xuZXhwb3J0IGNvbnN0IExvZ0xldmVsID0ge1xuXHRUUkFDRTogMSxcblx0REVCVUc6IDIsXG5cdElORk86IDMsXG5cdFdBUk5JTkc6IDQsXG5cdEVSUk9SOiA1LFxufTtcbiIsICIvKlxuIF8gICAgICAgX18gICAgICBfIF9fXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuLy8gRGVmaW5lcyBhIHNpbmdsZSBsaXN0ZW5lciB3aXRoIGEgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gY2FsbGJhY2tcblxuLyoqXG4gKiBUaGUgTGlzdGVuZXIgY2xhc3MgZGVmaW5lcyBhIGxpc3RlbmVyISA6LSlcbiAqXG4gKiBAY2xhc3MgTGlzdGVuZXJcbiAqL1xuY2xhc3MgTGlzdGVuZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heENhbGxiYWNrc1xuICAgICAqIEBtZW1iZXJvZiBMaXN0ZW5lclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcykge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgLy8gRGVmYXVsdCBvZiAtMSBtZWFucyBpbmZpbml0ZVxuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICAgICAgLy8gQ2FsbGJhY2sgaW52b2tlcyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gZGF0YVxuICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaXN0ZW5lciBzaG91bGQgYmUgZGVzdHJveWVkXG4gICAgICAgIHRoaXMuQ2FsbGJhY2sgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgZGF0YSk7XG4gICAgICAgICAgICAvLyBJZiBtYXhDYWxsYmFja3MgaXMgaW5maW5pdGUsIHJldHVybiBmYWxzZSAoZG8gbm90IGRlc3Ryb3kpXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGVjcmVtZW50IG1heENhbGxiYWNrcy4gUmV0dXJuIHRydWUgaWYgbm93IDAsIG90aGVyd2lzZSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5tYXhDYWxsYmFja3MgLT0gMTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IHt9O1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBgbWF4Q2FsbGJhY2tzYCB0aW1lcyBiZWZvcmUgYmVpbmcgZGVzdHJveWVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3NcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcykge1xuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaCh0aGlzTGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeSB0aW1lIHRoZSBldmVudCBpcyBlbWl0dGVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIEV2ZW50c09uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgLTEpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbmNlIHRoZW4gZGVzdHJveWVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gRXZlbnRzT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAxKTtcbn1cblxuZnVuY3Rpb24gbm90aWZ5TGlzdGVuZXJzKGV2ZW50RGF0YSkge1xuXG4gICAgLy8gR2V0IHRoZSBldmVudCBuYW1lXG4gICAgbGV0IGV2ZW50TmFtZSA9IGV2ZW50RGF0YS5uYW1lO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgbGlzdGVuZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgaWYgKGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcblxuICAgICAgICAvLyBLZWVwIGEgbGlzdCBvZiBsaXN0ZW5lciBpbmRleGVzIHRvIGRlc3Ryb3lcbiAgICAgICAgY29uc3QgbmV3RXZlbnRMaXN0ZW5lckxpc3QgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLnNsaWNlKCk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChsZXQgY291bnQgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCAtIDE7IGNvdW50ID49IDA7IGNvdW50IC09IDEpIHtcblxuICAgICAgICAgICAgLy8gR2V0IG5leHQgbGlzdGVuZXJcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXVtjb3VudF07XG5cbiAgICAgICAgICAgIGxldCBkYXRhID0gZXZlbnREYXRhLmRhdGE7XG5cbiAgICAgICAgICAgIC8vIERvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgY29uc3QgZGVzdHJveSA9IGxpc3RlbmVyLkNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdGVuZXIgaW5kaWNhdGVkIHRvIGRlc3Ryb3kgaXRzZWxmLCBhZGQgaXQgdG8gdGhlIGRlc3Ryb3kgbGlzdFxuICAgICAgICAgICAgICAgIG5ld0V2ZW50TGlzdGVuZXJMaXN0LnNwbGljZShjb3VudCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY2FsbGJhY2tzIHdpdGggbmV3IGxpc3Qgb2YgbGlzdGVuZXJzXG4gICAgICAgIGlmIChuZXdFdmVudExpc3RlbmVyTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gbmV3RXZlbnRMaXN0ZW5lckxpc3Q7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogTm90aWZ5IGluZm9ybXMgZnJvbnRlbmQgbGlzdGVuZXJzIHRoYXQgYW4gZXZlbnQgd2FzIGVtaXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YVxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBub3RpZnlNZXNzYWdlIC0gZW5jb2RlZCBub3RpZmljYXRpb24gbWVzc2FnZVxuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNOb3RpZnkobm90aWZ5TWVzc2FnZSkge1xuICAgIC8vIFBhcnNlIHRoZSBtZXNzYWdlXG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04ucGFyc2Uobm90aWZ5TWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9ICdJbnZhbGlkIEpTT04gcGFzc2VkIHRvIE5vdGlmeTogJyArIG5vdGlmeU1lc3NhZ2U7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIG5vdGlmeUxpc3RlbmVycyhtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRhdGFcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNFbWl0KGV2ZW50TmFtZSkge1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICBkYXRhOiBbXS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpLFxuICAgIH07XG5cbiAgICAvLyBOb3RpZnkgSlMgbGlzdGVuZXJzXG4gICAgbm90aWZ5TGlzdGVuZXJzKHBheWxvYWQpO1xuXG4gICAgLy8gTm90aWZ5IEdvIGxpc3RlbmVyc1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnRUUnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudE5hbWUpIHtcbiAgICAvLyBSZW1vdmUgbG9jYWwgbGlzdGVuZXJzXG4gICAgZGVsZXRlIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAvLyBOb3RpZnkgR28gbGlzdGVuZXJzXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdFWCcgKyBldmVudE5hbWUpO1xufVxuXG4vKipcbiAqIE9mZiB1bnJlZ2lzdGVycyBhIGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIE9uLFxuICogb3B0aW9uYWxseSBtdWx0aXBsZSBsaXN0ZW5lcmVzIGNhbiBiZSB1bnJlZ2lzdGVyZWQgdmlhIGBhZGRpdGlvbmFsRXZlbnROYW1lc2BcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IGFkZGl0aW9uYWxFdmVudE5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPZmYoZXZlbnROYW1lLCAuLi5hZGRpdGlvbmFsRXZlbnROYW1lcykge1xuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSlcblxuICAgIGlmIChhZGRpdGlvbmFsRXZlbnROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFkZGl0aW9uYWxFdmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbi8qKlxuICogT2ZmIHVucmVnaXN0ZXJzIGFsbCBldmVudCBsaXN0ZW5lcnMgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggT25cbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiBFdmVudHNPZmZBbGwoKSB7XG4gICAgY29uc3QgZXZlbnROYW1lcyA9IE9iamVjdC5rZXlzKGV2ZW50TGlzdGVuZXJzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZW1vdmVMaXN0ZW5lcihldmVudE5hbWVzW2ldKTtcbiAgICB9XG59XG5cbi8qKlxuICogbGlzdGVuZXJPZmYgdW5yZWdpc3RlcnMgYSBsaXN0ZW5lciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBFdmVudHNPblxuICpcbiAqIEBwYXJhbSB7TGlzdGVuZXJ9IGxpc3RlbmVyXG4gKi9cbiBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcbiAgICAvLyBSZW1vdmUgbG9jYWwgbGlzdGVuZXJcbiAgICBldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG5cbiAgICAvLyBDbGVhbiB1cCBpZiB0aGVyZSBhcmUgbm8gZXZlbnQgbGlzdGVuZXJzIGxlZnRcbiAgICBpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgICB9XG59XG4iLCAiLypcbiBfICAgICAgIF9fICAgICAgXyBfX1xufCB8ICAgICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5cbmV4cG9ydCBjb25zdCBjYWxsYmFja3MgPSB7fTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbnVtYmVyIGZyb20gdGhlIG5hdGl2ZSBicm93c2VyIHJhbmRvbSBmdW5jdGlvblxuICpcbiAqIEByZXR1cm5zIG51bWJlclxuICovXG5mdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7XG5cdHZhciBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKTtcblx0cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbnVtYmVyIHVzaW5nIGRhIG9sZC1za29vbCBNYXRoLlJhbmRvbVxuICogSSBsaWtlcyB0byBjYWxsIGl0IExPTFJhbmRvbVxuICpcbiAqIEByZXR1cm5zIG51bWJlclxuICovXG5mdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHtcblx0cmV0dXJuIE1hdGgucmFuZG9tKCkgKiA5MDA3MTk5MjU0NzQwOTkxO1xufVxuXG4vLyBQaWNrIGEgcmFuZG9tIG51bWJlciBmdW5jdGlvbiBiYXNlZCBvbiBicm93c2VyIGNhcGFiaWxpdHlcbnZhciByYW5kb21GdW5jO1xuaWYgKHdpbmRvdy5jcnlwdG8pIHtcblx0cmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTtcbn0gZWxzZSB7XG5cdHJhbmRvbUZ1bmMgPSBiYXNpY1JhbmRvbTtcbn1cblxuXG4vKipcbiAqIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGVcbiAqIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGVcbiAqIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsXG4gKiBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay5cbiAqIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW5cbiAqIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHthbnk9fSBhcmdzXG4gKiBAcGFyYW0ge251bWJlcj19IHRpbWVvdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG5hbWUsIGFyZ3MsIHRpbWVvdXQpIHtcblxuXHQvLyBUaW1lb3V0IGluZmluaXRlIGJ5IGRlZmF1bHRcblx0aWYgKHRpbWVvdXQgPT0gbnVsbCkge1xuXHRcdHRpbWVvdXQgPSAwO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgcHJvbWlzZVxuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG5cdFx0Ly8gQ3JlYXRlIGEgdW5pcXVlIGNhbGxiYWNrSURcblx0XHR2YXIgY2FsbGJhY2tJRDtcblx0XHRkbyB7XG5cdFx0XHRjYWxsYmFja0lEID0gbmFtZSArICctJyArIHJhbmRvbUZ1bmMoKTtcblx0XHR9IHdoaWxlIChjYWxsYmFja3NbY2FsbGJhY2tJRF0pO1xuXG5cdFx0dmFyIHRpbWVvdXRIYW5kbGU7XG5cdFx0Ly8gU2V0IHRpbWVvdXRcblx0XHRpZiAodGltZW91dCA+IDApIHtcblx0XHRcdHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmVqZWN0KEVycm9yKCdDYWxsIHRvICcgKyBuYW1lICsgJyB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICcgKyBjYWxsYmFja0lEKSk7XG5cdFx0XHR9LCB0aW1lb3V0KTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrc1tjYWxsYmFja0lEXSA9IHtcblx0XHRcdHRpbWVvdXRIYW5kbGU6IHRpbWVvdXRIYW5kbGUsXG5cdFx0XHRyZWplY3Q6IHJlamVjdCxcblx0XHRcdHJlc29sdmU6IHJlc29sdmVcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBheWxvYWQgPSB7XG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdGFyZ3MsXG5cdFx0XHRcdGNhbGxiYWNrSUQsXG5cdFx0XHR9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBjYWxsXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ0MnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxud2luZG93Lk9iZnVzY2F0ZWRDYWxsID0gKGlkLCBhcmdzLCB0aW1lb3V0KSA9PiB7XG5cbiAgICAvLyBUaW1lb3V0IGluZmluaXRlIGJ5IGRlZmF1bHRcbiAgICBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVvdXQgPSAwO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIHByb21pc2VcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lEXG4gICAgICAgIHZhciBjYWxsYmFja0lEO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFja0lEID0gaWQgKyAnLScgKyByYW5kb21GdW5jKCk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSk7XG5cbiAgICAgICAgdmFyIHRpbWVvdXRIYW5kbGU7XG4gICAgICAgIC8vIFNldCB0aW1lb3V0XG4gICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignQ2FsbCB0byBtZXRob2QgJyArIGlkICsgJyB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICcgKyBjYWxsYmFja0lEKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrc1tjYWxsYmFja0lEXSA9IHtcbiAgICAgICAgICAgIHRpbWVvdXRIYW5kbGU6IHRpbWVvdXRIYW5kbGUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmVcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGFyZ3MsXG5cdFx0XHRcdGNhbGxiYWNrSUQsXG5cdFx0XHR9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBjYWxsXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ2MnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cblxuLyoqXG4gKiBDYWxsZWQgYnkgdGhlIGJhY2tlbmQgdG8gcmV0dXJuIGRhdGEgdG8gYSBwcmV2aW91c2x5IGNhbGxlZFxuICogYmluZGluZyBpbnZvY2F0aW9uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGluY29taW5nTWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbGJhY2soaW5jb21pbmdNZXNzYWdlKSB7XG5cdC8vIFBhcnNlIHRoZSBtZXNzYWdlXG5cdGxldCBtZXNzYWdlO1xuXHR0cnkge1xuXHRcdG1lc3NhZ2UgPSBKU09OLnBhcnNlKGluY29taW5nTWVzc2FnZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zdCBlcnJvciA9IGBJbnZhbGlkIEpTT04gcGFzc2VkIHRvIGNhbGxiYWNrOiAke2UubWVzc2FnZX0uIE1lc3NhZ2U6ICR7aW5jb21pbmdNZXNzYWdlfWA7XG5cdFx0cnVudGltZS5Mb2dEZWJ1ZyhlcnJvcik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKTtcblx0fVxuXHRsZXQgY2FsbGJhY2tJRCA9IG1lc3NhZ2UuY2FsbGJhY2tpZDtcblx0bGV0IGNhbGxiYWNrRGF0YSA9IGNhbGxiYWNrc1tjYWxsYmFja0lEXTtcblx0aWYgKCFjYWxsYmFja0RhdGEpIHtcblx0XHRjb25zdCBlcnJvciA9IGBDYWxsYmFjayAnJHtjYWxsYmFja0lEfScgbm90IHJlZ2lzdGVyZWQhISFgO1xuXHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKTtcblx0fVxuXHRjbGVhclRpbWVvdXQoY2FsbGJhY2tEYXRhLnRpbWVvdXRIYW5kbGUpO1xuXG5cdGRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJRF07XG5cblx0aWYgKG1lc3NhZ2UuZXJyb3IpIHtcblx0XHRjYWxsYmFja0RhdGEucmVqZWN0KG1lc3NhZ2UuZXJyb3IpO1xuXHR9IGVsc2Uge1xuXHRcdGNhbGxiYWNrRGF0YS5yZXNvbHZlKG1lc3NhZ2UucmVzdWx0KTtcblx0fVxufVxuIiwgIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX18gICAgXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gICkgXG58X18vfF9fL1xcX18sXy9fL18vX19fXy8gIFxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuaW1wb3J0IHtDYWxsfSBmcm9tICcuL2NhbGxzJztcblxuLy8gVGhpcyBpcyB3aGVyZSB3ZSBiaW5kIGdvIG1ldGhvZCB3cmFwcGVyc1xud2luZG93LmdvID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXRCaW5kaW5ncyhiaW5kaW5nc01hcCkge1xuXHR0cnkge1xuXHRcdGJpbmRpbmdzTWFwID0gSlNPTi5wYXJzZShiaW5kaW5nc01hcCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9XG5cblx0Ly8gSW5pdGlhbGlzZSB0aGUgYmluZGluZ3MgbWFwXG5cdHdpbmRvdy5nbyA9IHdpbmRvdy5nbyB8fCB7fTtcblxuXHQvLyBJdGVyYXRlIHBhY2thZ2UgbmFtZXNcblx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXApLmZvckVhY2goKHBhY2thZ2VOYW1lKSA9PiB7XG5cblx0XHQvLyBDcmVhdGUgaW5uZXIgbWFwIGlmIGl0IGRvZXNuJ3QgZXhpc3Rcblx0XHR3aW5kb3cuZ29bcGFja2FnZU5hbWVdID0gd2luZG93LmdvW3BhY2thZ2VOYW1lXSB8fCB7fTtcblxuXHRcdC8vIEl0ZXJhdGUgc3RydWN0IG5hbWVzXG5cdFx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXBbcGFja2FnZU5hbWVdKS5mb3JFYWNoKChzdHJ1Y3ROYW1lKSA9PiB7XG5cblx0XHRcdC8vIENyZWF0ZSBpbm5lciBtYXAgaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdFx0d2luZG93LmdvW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSA9IHdpbmRvdy5nb1twYWNrYWdlTmFtZV1bc3RydWN0TmFtZV0gfHwge307XG5cblx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdzTWFwW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSkuZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuXG5cdFx0XHRcdHdpbmRvdy5nb1twYWNrYWdlTmFtZV1bc3RydWN0TmFtZV1bbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHQvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHRcblx0XHRcdFx0XHRsZXQgdGltZW91dCA9IDA7XG5cblx0XHRcdFx0XHQvLyBBY3R1YWwgZnVuY3Rpb25cblx0XHRcdFx0XHRmdW5jdGlvbiBkeW5hbWljKCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHRcdFx0XHRcdHJldHVybiBDYWxsKFtwYWNrYWdlTmFtZSwgc3RydWN0TmFtZSwgbWV0aG9kTmFtZV0uam9pbignLicpLCBhcmdzLCB0aW1lb3V0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb25cblx0XHRcdFx0XHRkeW5hbWljLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAobmV3VGltZW91dCkge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IG5ld1RpbWVvdXQ7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIEFsbG93IGdldHRpbmcgdGltZW91dCB0byBmdW5jdGlvblxuXHRcdFx0XHRcdGR5bmFtaWMuZ2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aW1lb3V0O1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gZHluYW1pYztcblx0XHRcdFx0fSgpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0pO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cblxuaW1wb3J0IHtDYWxsfSBmcm9tIFwiLi9jYWxsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93UmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1JlbG9hZEFwcCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dSJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRTeXN0ZW1EZWZhdWx0VGhlbWUoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXQVNEVCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0TGlnaHRUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBTFQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldERhcmtUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBRFQnKTtcbn1cblxuLyoqXG4gKiBQbGFjZSB0aGUgd2luZG93IGluIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0NlbnRlcigpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1djJyk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgd2luZG93IHRpdGxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRUaXRsZSh0aXRsZSkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV1QnICsgdGl0bGUpO1xufVxuXG4vKipcbiAqIE1ha2VzIHRoZSB3aW5kb3cgZ28gZnVsbHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0Z1bGxzY3JlZW4oKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXRicpO1xufVxuXG4vKipcbiAqIFJldmVydHMgdGhlIHdpbmRvdyBmcm9tIGZ1bGxzY3JlZW5cbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dVbmZ1bGxzY3JlZW4oKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXZicpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB3aW5kb3csIGkuZS4gd2hldGhlciB0aGUgd2luZG93IGlzIGluIGZ1bGwgc2NyZWVuIG1vZGUgb3Igbm90LlxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFRoZSBzdGF0ZSBvZiB0aGUgd2luZG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dJc0Z1bGxzY3JlZW4oKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNGdWxsc2NyZWVuXCIpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgU2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dzOicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBTaXplIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPHt3OiBudW1iZXIsIGg6IG51bWJlcn0+fSBUaGUgc2l6ZSBvZiB0aGUgd2luZG93XG5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0dldFNpemUoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93R2V0U2l6ZVwiKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRNYXhTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1daOicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0TWluU2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXejonICsgd2lkdGggKyAnOicgKyBoZWlnaHQpO1xufVxuXG5cblxuLyoqXG4gKiBTZXQgdGhlIHdpbmRvdyBBbHdheXNPblRvcCBvciBub3Qgb24gdG9wXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0QWx3YXlzT25Ub3AoYikge1xuXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXQVRQOicgKyAoYiA/ICcxJyA6ICcwJykpO1xufVxuXG5cblxuXG4vKipcbiAqIFNldCB0aGUgUG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0UG9zaXRpb24oeCwgeSkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3A6JyArIHggKyAnOicgKyB5KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFBvc2l0aW9uIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPHt4OiBudW1iZXIsIHk6IG51bWJlcn0+fSBUaGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93R2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93R2V0UG9zXCIpO1xufVxuXG4vKipcbiAqIEhpZGUgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0hpZGUoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXSCcpO1xufVxuXG4vKipcbiAqIFNob3cgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1Nob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXUycpO1xufVxuXG4vKipcbiAqIE1heGltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dNYXhpbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dNJyk7XG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBNYXhpbWlzZSBvZiB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VG9nZ2xlTWF4aW1pc2UoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXdCcpO1xufVxuXG4vKipcbiAqIFVubWF4aW1pc2UgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1VubWF4aW1pc2UoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXVScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB3aW5kb3csIGkuZS4gd2hldGhlciB0aGUgd2luZG93IGlzIG1heGltaXNlZCBvciBub3QuXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gVGhlIHN0YXRlIG9mIHRoZSB3aW5kb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0lzTWF4aW1pc2VkKCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOldpbmRvd0lzTWF4aW1pc2VkXCIpO1xufVxuXG4vKipcbiAqIE1pbmltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dNaW5pbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dtJyk7XG59XG5cbi8qKlxuICogVW5taW5pbWlzZSB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VW5taW5pbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1d1Jyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNNaW5pbWlzZWQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNNaW5pbWlzZWRcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbm9ybWFsIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNOb3JtYWwoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNOb3JtYWxcIik7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBSIFJlZFxuICogQHBhcmFtIHtudW1iZXJ9IEcgR3JlZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBCIEJsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBBIEFscGhhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRCYWNrZ3JvdW5kQ29sb3VyKFIsIEcsIEIsIEEpIHtcbiAgICBsZXQgcmdiYSA9IEpTT04uc3RyaW5naWZ5KHtyOiBSIHx8IDAsIGc6IEcgfHwgMCwgYjogQiB8fCAwLCBhOiBBIHx8IDI1NX0pO1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3I6JyArIHJnYmEpO1xufVxuXG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuXG5pbXBvcnQge0NhbGx9IGZyb20gXCIuL2NhbGxzXCI7XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBhbGwgc2NyZWVucy4gQ2FsbCB0aGlzIGFuZXcgZWFjaCB0aW1lIHlvdSB3YW50IHRvIHJlZnJlc2ggZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHdpbmRvd2luZyBzeXN0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi93cmFwcGVyL3J1bnRpbWUnKS5TY3JlZW59IFNjcmVlblxuICogQHJldHVybiB7UHJvbWlzZTx7U2NyZWVuW119Pn0gVGhlIHNjcmVlbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNjcmVlbkdldEFsbCgpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpTY3JlZW5HZXRBbGxcIik7XG59XG4iLCAiLyoqXG4gKiBAZGVzY3JpcHRpb246IFVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgYnJvd3NlciB0byBvcGVuIHRoZSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gQnJvd3Nlck9wZW5VUkwodXJsKSB7XG4gIHdpbmRvdy5XYWlsc0ludm9rZSgnQk86JyArIHVybCk7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7Q2FsbH0gZnJvbSBcIi4vY2FsbHNcIjtcblxuLyoqXG4gKiBTZXQgdGhlIFNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDbGlwYm9hcmRTZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpDbGlwYm9hcmRTZXRUZXh0XCIsIFt0ZXh0XSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZFxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8e3N0cmluZ30+fSBUZXh0IGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZFxuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDbGlwYm9hcmRHZXRUZXh0KCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOkNsaXBib2FyZEdldFRleHRcIik7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuaW1wb3J0ICogYXMgTG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7ZXZlbnRMaXN0ZW5lcnMsIEV2ZW50c0VtaXQsIEV2ZW50c05vdGlmeSwgRXZlbnRzT2ZmLCBFdmVudHNPbiwgRXZlbnRzT25jZSwgRXZlbnRzT25NdWx0aXBsZX0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHtDYWxsLCBDYWxsYmFjaywgY2FsbGJhY2tzfSBmcm9tICcuL2NhbGxzJztcbmltcG9ydCB7U2V0QmluZGluZ3N9IGZyb20gXCIuL2JpbmRpbmdzXCI7XG5pbXBvcnQgKiBhcyBXaW5kb3cgZnJvbSBcIi4vd2luZG93XCI7XG5pbXBvcnQgKiBhcyBTY3JlZW4gZnJvbSBcIi4vc2NyZWVuXCI7XG5pbXBvcnQgKiBhcyBCcm93c2VyIGZyb20gXCIuL2Jyb3dzZXJcIjtcbmltcG9ydCAqIGFzIENsaXBib2FyZCBmcm9tIFwiLi9jbGlwYm9hcmRcIjtcblxuXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1EnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdTJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnSCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6RW52aXJvbm1lbnRcIik7XG59XG5cbi8vIFRoZSBKUyBydW50aW1lXG53aW5kb3cucnVudGltZSA9IHtcbiAgICAuLi5Mb2csXG4gICAgLi4uV2luZG93LFxuICAgIC4uLkJyb3dzZXIsXG4gICAgLi4uU2NyZWVuLFxuICAgIC4uLkNsaXBib2FyZCxcbiAgICBFdmVudHNPbixcbiAgICBFdmVudHNPbmNlLFxuICAgIEV2ZW50c09uTXVsdGlwbGUsXG4gICAgRXZlbnRzRW1pdCxcbiAgICBFdmVudHNPZmYsXG4gICAgRW52aXJvbm1lbnQsXG4gICAgU2hvdyxcbiAgICBIaWRlLFxuICAgIFF1aXRcbn07XG5cbi8vIEludGVybmFsIHdhaWxzIGVuZHBvaW50c1xud2luZG93LndhaWxzID0ge1xuICAgIENhbGxiYWNrLFxuICAgIEV2ZW50c05vdGlmeSxcbiAgICBTZXRCaW5kaW5ncyxcbiAgICBldmVudExpc3RlbmVycyxcbiAgICBjYWxsYmFja3MsXG4gICAgZmxhZ3M6IHtcbiAgICAgICAgZGlzYWJsZVNjcm9sbGJhckRyYWc6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlV2FpbHNEZWZhdWx0Q29udGV4dE1lbnU6IGZhbHNlLFxuICAgICAgICBlbmFibGVSZXNpemU6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0Q3Vyc29yOiBudWxsLFxuICAgICAgICBib3JkZXJUaGlja25lc3M6IDYsXG4gICAgICAgIHNob3VsZERyYWc6IGZhbHNlLFxuICAgICAgICBkZWZlckRyYWdUb01vdXNlTW92ZTogdHJ1ZSxcbiAgICAgICAgY3NzRHJhZ1Byb3BlcnR5OiBcIi0td2FpbHMtZHJhZ2dhYmxlXCIsXG4gICAgICAgIGNzc0RyYWdWYWx1ZTogXCJkcmFnXCIsXG4gICAgfVxufTtcblxuLy8gU2V0IHRoZSBiaW5kaW5nc1xuaWYgKHdpbmRvdy53YWlsc2JpbmRpbmdzKSB7XG4gICAgd2luZG93LndhaWxzLlNldEJpbmRpbmdzKHdpbmRvdy53YWlsc2JpbmRpbmdzKTtcbiAgICBkZWxldGUgd2luZG93LndhaWxzLlNldEJpbmRpbmdzO1xufVxuXG4vLyAoYm9vbCkgVGhpcyBpcyBldmFsdWF0ZWQgYXQgYnVpbGQgdGltZSBpbiBwYWNrYWdlLmpzb25cbmlmICghREVCVUcpIHtcbiAgICBkZWxldGUgd2luZG93LndhaWxzYmluZGluZ3M7XG59XG5cbmxldCBkcmFnVGVzdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHZhbCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUudGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnUHJvcGVydHkpO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHZhbCA9IHZhbC50cmltKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICh2YWwgIT09IHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlLmJ1dHRvbnMgIT09IDEpIHtcbiAgICAgICAgLy8gRG8gbm90IHN0YXJ0IGRyYWdnaW5nIGlmIG5vdCB0aGUgcHJpbWFyeSBidXR0b24gaGFzIGJlZW4gY2xpY2tlZC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlLmRldGFpbCAhPT0gMSkge1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZ2dpbmcgaWYgbW9yZSB0aGFuIG9uY2UgaGFzIGJlZW4gY2xpY2tlZCwgZS5nLiB3aGVuIGRvdWJsZSBjbGlja2luZ1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG53aW5kb3cud2FpbHMuc2V0Q1NTRHJhZ1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAocHJvcGVydHksIHZhbHVlKSB7XG4gICAgd2luZG93LndhaWxzLmZsYWdzLmNzc0RyYWdQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnVmFsdWUgPSB2YWx1ZTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7XG5cbiAgICAvLyBDaGVjayBmb3IgcmVzaXppbmdcbiAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgd2luZG93LldhaWxzSW52b2tlKFwicmVzaXplOlwiICsgd2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ1Rlc3QoZSkpIHtcbiAgICAgICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kaXNhYmxlU2Nyb2xsYmFyRHJhZykge1xuICAgICAgICAgICAgLy8gVGhpcyBjaGVja3MgZm9yIGNsaWNrcyBvbiB0aGUgc2Nyb2xsIGJhclxuICAgICAgICAgICAgaWYgKGUub2Zmc2V0WCA+IGUudGFyZ2V0LmNsaWVudFdpZHRoIHx8IGUub2Zmc2V0WSA+IGUudGFyZ2V0LmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLmRlZmVyRHJhZ1RvTW91c2VNb3ZlKSB7XG4gICAgICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIHdpbmRvdy5XYWlsc0ludm9rZShcImRyYWdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnID0gZmFsc2U7XG4gICAgfVxufSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgIHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnID0gZmFsc2U7XG59KTtcblxuZnVuY3Rpb24gc2V0UmVzaXplKGN1cnNvcikge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jdXJzb3IgPSBjdXJzb3IgfHwgd2luZG93LndhaWxzLmZsYWdzLmRlZmF1bHRDdXJzb3I7XG4gICAgd2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UgPSBjdXJzb3I7XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICh3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZykge1xuICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgbW91c2VQcmVzc2VkID0gZS5idXR0b25zICE9PSB1bmRlZmluZWQgPyBlLmJ1dHRvbnMgOiBlLndoaWNoO1xuICAgICAgICBpZiAobW91c2VQcmVzc2VkID4gMCkge1xuICAgICAgICAgICAgd2luZG93LldhaWxzSW52b2tlKFwiZHJhZ1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXdpbmRvdy53YWlscy5mbGFncy5lbmFibGVSZXNpemUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLmRlZmF1bHRDdXJzb3IgPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3MuZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jdXJzb3I7XG4gICAgfVxuICAgIGlmICh3aW5kb3cub3V0ZXJXaWR0aCAtIGUuY2xpZW50WCA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3MgJiYgd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcykge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gXCJzZS1yZXNpemVcIjtcbiAgICB9XG4gICAgbGV0IHJpZ2h0Qm9yZGVyID0gd2luZG93Lm91dGVyV2lkdGggLSBlLmNsaWVudFggPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzO1xuICAgIGxldCBsZWZ0Qm9yZGVyID0gZS5jbGllbnRYIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcbiAgICBsZXQgdG9wQm9yZGVyID0gZS5jbGllbnRZIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcbiAgICBsZXQgYm90dG9tQm9yZGVyID0gd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcblxuICAgIC8vIElmIHdlIGFyZW4ndCBvbiBhbiBlZGdlLCBidXQgd2VyZSwgcmVzZXQgdGhlIGN1cnNvciB0byBkZWZhdWx0XG4gICAgaWYgKCFsZWZ0Qm9yZGVyICYmICFyaWdodEJvcmRlciAmJiAhdG9wQm9yZGVyICYmICFib3R0b21Cb3JkZXIgJiYgd2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0Qm9yZGVyICYmIGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwic2UtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIgJiYgYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdEJvcmRlciAmJiB0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm53LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIgJiYgcmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcIm5lLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyKSBzZXRSZXNpemUoXCJ3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm4tcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAocmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcImUtcmVzaXplXCIpO1xuXG59KTtcblxuLy8gU2V0dXAgY29udGV4dCBtZW51IGhvb2tcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kaXNhYmxlV2FpbHNEZWZhdWx0Q29udGV4dE1lbnUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn0pO1xuXG53aW5kb3cuV2FpbHNJbnZva2UoXCJydW50aW1lOnJlYWR5XCIpOyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0JBLFdBQVMsZUFBZSxPQUFPLFNBQVM7QUFJdkMsV0FBTyxZQUFZ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 diff --git a/v2/internal/frontend/runtime/runtime_dev_desktop.go b/v2/internal/frontend/runtime/runtime_dev_desktop.go deleted file mode 100644 index c0dcb1fc5..000000000 --- a/v2/internal/frontend/runtime/runtime_dev_desktop.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build dev || bindings || (!dev && !production && !bindings) - -package runtime - -import _ "embed" - -//go:embed runtime_dev_desktop.js -var RuntimeDesktopJS []byte diff --git a/v2/internal/frontend/runtime/runtime_prod_desktop.go b/v2/internal/frontend/runtime/runtime_prod_desktop.go index 4fd8aaa58..7336f0102 100644 --- a/v2/internal/frontend/runtime/runtime_prod_desktop.go +++ b/v2/internal/frontend/runtime/runtime_prod_desktop.go @@ -1,4 +1,4 @@ -//go:build production +//go:build production && !debug package runtime diff --git a/v2/internal/frontend/runtime/runtime_prod_desktop.js b/v2/internal/frontend/runtime/runtime_prod_desktop.js index 23b66953b..a22739c94 100644 --- a/v2/internal/frontend/runtime/runtime_prod_desktop.js +++ b/v2/internal/frontend/runtime/runtime_prod_desktop.js @@ -1 +1 @@ -(()=>{var L=Object.defineProperty;var c=(e,n)=>{for(var o in n)L(e,o,{get:n[o],enumerable:!0})};var m={};c(m,{LogDebug:()=>M,LogError:()=>A,LogFatal:()=>H,LogInfo:()=>P,LogLevel:()=>J,LogPrint:()=>R,LogTrace:()=>z,LogWarning:()=>B,SetLogLevel:()=>G});function d(e,n){window.WailsInvoke("L"+e+n)}function z(e){d("T",e)}function R(e){d("P",e)}function M(e){d("D",e)}function P(e){d("I",e)}function B(e){d("W",e)}function A(e){d("E",e)}function H(e){d("F",e)}function G(e){d("S",e)}var J={TRACE:1,DEBUG:2,INFO:3,WARNING:4,ERROR:5};var v=class{constructor(n,o,i){this.eventName=n,this.maxCallbacks=i||-1,this.Callback=t=>(o.apply(null,t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},l={};function p(e,n,o){l[e]=l[e]||[];let i=new v(e,n,o);return l[e].push(i),()=>F(i)}function b(e,n){return p(e,n,-1)}function E(e,n){return p(e,n,1)}function S(e){let n=e.name;if(l[n]){let o=l[n].slice();for(let i=l[n].length-1;i>=0;i-=1){let t=l[n][i],r=e.data;t.Callback(r)&&o.splice(i,1)}o.length===0?g(n):l[n]=o}}function y(e){let n;try{n=JSON.parse(e)}catch{let i="Invalid JSON passed to Notify: "+e;throw new Error(i)}S(n)}function C(e){let n={name:e,data:[].slice.apply(arguments).slice(1)};S(n),window.WailsInvoke("EE"+JSON.stringify(n))}function g(e){delete l[e],window.WailsInvoke("EX"+e)}function D(e,...n){g(e),n.length>0&&n.forEach(o=>{g(o)})}function F(e){let n=e.eventName;l[n]=l[n].filter(o=>o!==e),l[n].length===0&&g(n)}var f={};function U(){var e=new Uint32Array(1);return window.crypto.getRandomValues(e)[0]}function j(){return Math.random()*9007199254740991}var W;window.crypto?W=U:W=j;function s(e,n,o){return o==null&&(o=0),new Promise(function(i,t){var r;do r=e+"-"+W();while(f[r]);var a;o>0&&(a=setTimeout(function(){t(Error("Call to "+e+" timed out. Request ID: "+r))},o)),f[r]={timeoutHandle:a,reject:t,resolve:i};try{let u={name:e,args:n,callbackID:r};window.WailsInvoke("C"+JSON.stringify(u))}catch(u){console.error(u)}})}window.ObfuscatedCall=(e,n,o)=>(o==null&&(o=0),new Promise(function(i,t){var r;do r=e+"-"+W();while(f[r]);var a;o>0&&(a=setTimeout(function(){t(Error("Call to method "+e+" timed out. Request ID: "+r))},o)),f[r]={timeoutHandle:a,reject:t,resolve:i};try{let u={id:e,args:n,callbackID:r};window.WailsInvoke("c"+JSON.stringify(u))}catch(u){console.error(u)}}));function T(e){let n;try{n=JSON.parse(e)}catch(t){let r=`Invalid JSON passed to callback: ${t.message}. Message: ${e}`;throw runtime.LogDebug(r),new Error(r)}let o=n.callbackid,i=f[o];if(!i){let t=`Callback '${o}' not registered!!!`;throw console.error(t),new Error(t)}clearTimeout(i.timeoutHandle),delete f[o],n.error?i.reject(n.error):i.resolve(n.result)}window.go={};function O(e){try{e=JSON.parse(e)}catch(n){console.error(n)}window.go=window.go||{},Object.keys(e).forEach(n=>{window.go[n]=window.go[n]||{},Object.keys(e[n]).forEach(o=>{window.go[n][o]=window.go[n][o]||{},Object.keys(e[n][o]).forEach(i=>{window.go[n][o][i]=function(){let t=0;function r(){let a=[].slice.call(arguments);return s([n,o,i].join("."),a,t)}return r.setTimeout=function(a){t=a},r.getTimeout=function(){return t},r}()})})})}var x={};c(x,{WindowCenter:()=>q,WindowFullscreen:()=>Z,WindowGetPosition:()=>se,WindowGetSize:()=>ne,WindowHide:()=>le,WindowIsFullscreen:()=>_,WindowIsMaximised:()=>ue,WindowIsMinimised:()=>pe,WindowIsNormal:()=>We,WindowMaximise:()=>we,WindowMinimise:()=>ce,WindowReload:()=>N,WindowReloadApp:()=>V,WindowSetAlwaysOnTop:()=>te,WindowSetBackgroundColour:()=>me,WindowSetDarkTheme:()=>$,WindowSetLightTheme:()=>Y,WindowSetMaxSize:()=>oe,WindowSetMinSize:()=>ie,WindowSetPosition:()=>re,WindowSetSize:()=>ee,WindowSetSystemDefaultTheme:()=>X,WindowSetTitle:()=>Q,WindowShow:()=>ae,WindowToggleMaximise:()=>de,WindowUnfullscreen:()=>K,WindowUnmaximise:()=>fe,WindowUnminimise:()=>ge});function N(){window.location.reload()}function V(){window.WailsInvoke("WR")}function X(){window.WailsInvoke("WASDT")}function Y(){window.WailsInvoke("WALT")}function $(){window.WailsInvoke("WADT")}function q(){window.WailsInvoke("Wc")}function Q(e){window.WailsInvoke("WT"+e)}function Z(){window.WailsInvoke("WF")}function K(){window.WailsInvoke("Wf")}function _(){return s(":wails:WindowIsFullscreen")}function ee(e,n){window.WailsInvoke("Ws:"+e+":"+n)}function ne(){return s(":wails:WindowGetSize")}function oe(e,n){window.WailsInvoke("WZ:"+e+":"+n)}function ie(e,n){window.WailsInvoke("Wz:"+e+":"+n)}function te(e){window.WailsInvoke("WATP:"+(e?"1":"0"))}function re(e,n){window.WailsInvoke("Wp:"+e+":"+n)}function se(){return s(":wails:WindowGetPos")}function le(){window.WailsInvoke("WH")}function ae(){window.WailsInvoke("WS")}function we(){window.WailsInvoke("WM")}function de(){window.WailsInvoke("Wt")}function fe(){window.WailsInvoke("WU")}function ue(){return s(":wails:WindowIsMaximised")}function ce(){window.WailsInvoke("Wm")}function ge(){window.WailsInvoke("Wu")}function pe(){return s(":wails:WindowIsMinimised")}function We(){return s(":wails:WindowIsNormal")}function me(e,n,o,i){let t=JSON.stringify({r:e||0,g:n||0,b:o||0,a:i||255});window.WailsInvoke("Wr:"+t)}var k={};c(k,{ScreenGetAll:()=>ve});function ve(){return s(":wails:ScreenGetAll")}var h={};c(h,{BrowserOpenURL:()=>xe});function xe(e){window.WailsInvoke("BO:"+e)}var I={};c(I,{ClipboardGetText:()=>he,ClipboardSetText:()=>ke});function ke(e){return s(":wails:ClipboardSetText",[e])}function he(){return s(":wails:ClipboardGetText")}function Ie(){window.WailsInvoke("Q")}function be(){window.WailsInvoke("S")}function Ee(){window.WailsInvoke("H")}function Se(){return s(":wails:Environment")}window.runtime={...m,...x,...h,...k,...I,EventsOn:b,EventsOnce:E,EventsOnMultiple:p,EventsEmit:C,EventsOff:D,Environment:Se,Show:be,Hide:Ee,Quit:Ie};window.wails={Callback:T,EventsNotify:y,SetBindings:O,eventListeners:l,callbacks:f,flags:{disableScrollbarDrag:!1,disableWailsDefaultContextMenu:!1,enableResize:!1,defaultCursor:null,borderThickness:6,shouldDrag:!1,deferDragToMouseMove:!0,cssDragProperty:"--wails-draggable",cssDragValue:"drag"}};window.wailsbindings&&(window.wails.SetBindings(window.wailsbindings),delete window.wails.SetBindings);delete window.wailsbindings;var ye=function(e){var n=window.getComputedStyle(e.target).getPropertyValue(window.wails.flags.cssDragProperty);return n&&(n=n.trim()),!(n!==window.wails.flags.cssDragValue||e.buttons!==1||e.detail!==1)};window.wails.setCSSDragProperties=function(e,n){window.wails.flags.cssDragProperty=e,window.wails.flags.cssDragValue=n};window.addEventListener("mousedown",e=>{if(window.wails.flags.resizeEdge){window.WailsInvoke("resize:"+window.wails.flags.resizeEdge),e.preventDefault();return}if(ye(e)){if(window.wails.flags.disableScrollbarDrag&&(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight))return;window.wails.flags.deferDragToMouseMove?window.wails.flags.shouldDrag=!0:(e.preventDefault(),window.WailsInvoke("drag"));return}else window.wails.flags.shouldDrag=!1});window.addEventListener("mouseup",()=>{window.wails.flags.shouldDrag=!1});function w(e){document.documentElement.style.cursor=e||window.wails.flags.defaultCursor,window.wails.flags.resizeEdge=e}window.addEventListener("mousemove",function(e){if(window.wails.flags.shouldDrag&&(window.wails.flags.shouldDrag=!1,(e.buttons!==void 0?e.buttons:e.which)>0)){window.WailsInvoke("drag");return}if(!window.wails.flags.enableResize)return;window.wails.flags.defaultCursor==null&&(window.wails.flags.defaultCursor=document.documentElement.style.cursor),window.outerWidth-e.clientX{var L=Object.defineProperty;var c=(e,n)=>{for(var o in n)L(e,o,{get:n[o],enumerable:!0})};var m={};c(m,{LogDebug:()=>M,LogError:()=>A,LogFatal:()=>H,LogInfo:()=>P,LogLevel:()=>J,LogPrint:()=>R,LogTrace:()=>z,LogWarning:()=>B,SetLogLevel:()=>G});function d(e,n){window.WailsInvoke("L"+e+n)}function z(e){d("T",e)}function R(e){d("P",e)}function M(e){d("D",e)}function P(e){d("I",e)}function B(e){d("W",e)}function A(e){d("E",e)}function H(e){d("F",e)}function G(e){d("S",e)}var J={TRACE:1,DEBUG:2,INFO:3,WARNING:4,ERROR:5};var v=class{constructor(n,o,i){this.eventName=n,this.maxCallbacks=i||-1,this.Callback=t=>(o.apply(null,t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},l={};function p(e,n,o){l[e]=l[e]||[];let i=new v(e,n,o);return l[e].push(i),()=>F(i)}function b(e,n){return p(e,n,-1)}function E(e,n){return p(e,n,1)}function S(e){let n=e.name;if(l[n]){let o=l[n].slice();for(let i=l[n].length-1;i>=0;i-=1){let t=l[n][i],r=e.data;t.Callback(r)&&o.splice(i,1)}o.length===0?g(n):l[n]=o}}function y(e){let n;try{n=JSON.parse(e)}catch{let i="Invalid JSON passed to Notify: "+e;throw new Error(i)}S(n)}function D(e){let n={name:e,data:[].slice.apply(arguments).slice(1)};S(n),window.WailsInvoke("EE"+JSON.stringify(n))}function g(e){delete l[e],window.WailsInvoke("EX"+e)}function C(e,...n){g(e),n.length>0&&n.forEach(o=>{g(o)})}function F(e){let n=e.eventName;l[n]=l[n].filter(o=>o!==e),l[n].length===0&&g(n)}var f={};function U(){var e=new Uint32Array(1);return window.crypto.getRandomValues(e)[0]}function j(){return Math.random()*9007199254740991}var W;window.crypto?W=U:W=j;function s(e,n,o){return o==null&&(o=0),new Promise(function(i,t){var r;do r=e+"-"+W();while(f[r]);var a;o>0&&(a=setTimeout(function(){t(Error("Call to "+e+" timed out. Request ID: "+r))},o)),f[r]={timeoutHandle:a,reject:t,resolve:i};try{let u={name:e,args:n,callbackID:r};window.WailsInvoke("C"+JSON.stringify(u))}catch(u){console.error(u)}})}window.ObfuscatedCall=(e,n,o)=>(o==null&&(o=0),new Promise(function(i,t){var r;do r=e+"-"+W();while(f[r]);var a;o>0&&(a=setTimeout(function(){t(Error("Call to method "+e+" timed out. Request ID: "+r))},o)),f[r]={timeoutHandle:a,reject:t,resolve:i};try{let u={id:e,args:n,callbackID:r};window.WailsInvoke("c"+JSON.stringify(u))}catch(u){console.error(u)}}));function T(e){let n;try{n=JSON.parse(e)}catch(t){let r=`Invalid JSON passed to callback: ${t.message}. Message: ${e}`;throw runtime.LogDebug(r),new Error(r)}let o=n.callbackid,i=f[o];if(!i){let t=`Callback '${o}' not registered!!!`;throw console.error(t),new Error(t)}clearTimeout(i.timeoutHandle),delete f[o],n.error?i.reject(n.error):i.resolve(n.result)}window.go={};function O(e){try{e=JSON.parse(e)}catch(n){console.error(n)}window.go=window.go||{},Object.keys(e).forEach(n=>{window.go[n]=window.go[n]||{},Object.keys(e[n]).forEach(o=>{window.go[n][o]=window.go[n][o]||{},Object.keys(e[n][o]).forEach(i=>{window.go[n][o][i]=function(){let t=0;function r(){let a=[].slice.call(arguments);return s([n,o,i].join("."),a,t)}return r.setTimeout=function(a){t=a},r.getTimeout=function(){return t},r}()})})})}var x={};c(x,{WindowCenter:()=>q,WindowFullscreen:()=>Z,WindowGetPosition:()=>se,WindowGetSize:()=>ne,WindowHide:()=>le,WindowIsFullscreen:()=>_,WindowIsMaximised:()=>ue,WindowIsMinimised:()=>pe,WindowIsNormal:()=>We,WindowMaximise:()=>we,WindowMinimise:()=>ce,WindowReload:()=>N,WindowReloadApp:()=>V,WindowSetAlwaysOnTop:()=>te,WindowSetBackgroundColour:()=>me,WindowSetDarkTheme:()=>$,WindowSetLightTheme:()=>Y,WindowSetMaxSize:()=>oe,WindowSetMinSize:()=>ie,WindowSetPosition:()=>re,WindowSetSize:()=>ee,WindowSetSystemDefaultTheme:()=>X,WindowSetTitle:()=>Q,WindowShow:()=>ae,WindowToggleMaximise:()=>de,WindowUnfullscreen:()=>K,WindowUnmaximise:()=>fe,WindowUnminimise:()=>ge});function N(){window.location.reload()}function V(){window.WailsInvoke("WR")}function X(){window.WailsInvoke("WASDT")}function Y(){window.WailsInvoke("WALT")}function $(){window.WailsInvoke("WADT")}function q(){window.WailsInvoke("Wc")}function Q(e){window.WailsInvoke("WT"+e)}function Z(){window.WailsInvoke("WF")}function K(){window.WailsInvoke("Wf")}function _(){return s(":wails:WindowIsFullscreen")}function ee(e,n){window.WailsInvoke("Ws:"+e+":"+n)}function ne(){return s(":wails:WindowGetSize")}function oe(e,n){window.WailsInvoke("WZ:"+e+":"+n)}function ie(e,n){window.WailsInvoke("Wz:"+e+":"+n)}function te(e){window.WailsInvoke("WATP:"+(e?"1":"0"))}function re(e,n){window.WailsInvoke("Wp:"+e+":"+n)}function se(){return s(":wails:WindowGetPos")}function le(){window.WailsInvoke("WH")}function ae(){window.WailsInvoke("WS")}function we(){window.WailsInvoke("WM")}function de(){window.WailsInvoke("Wt")}function fe(){window.WailsInvoke("WU")}function ue(){return s(":wails:WindowIsMaximised")}function ce(){window.WailsInvoke("Wm")}function ge(){window.WailsInvoke("Wu")}function pe(){return s(":wails:WindowIsMinimised")}function We(){return s(":wails:WindowIsNormal")}function me(e,n,o,i){let t=JSON.stringify({r:e||0,g:n||0,b:o||0,a:i||255});window.WailsInvoke("Wr:"+t)}var k={};c(k,{ScreenGetAll:()=>ve});function ve(){return s(":wails:ScreenGetAll")}var h={};c(h,{BrowserOpenURL:()=>xe});function xe(e){window.WailsInvoke("BO:"+e)}var I={};c(I,{ClipboardGetText:()=>he,ClipboardSetText:()=>ke});function ke(e){return s(":wails:ClipboardSetText",[e])}function he(){return s(":wails:ClipboardGetText")}function Ie(){window.WailsInvoke("Q")}function be(){window.WailsInvoke("S")}function Ee(){window.WailsInvoke("H")}function Se(){return s(":wails:Environment")}window.runtime={...m,...x,...h,...k,...I,EventsOn:b,EventsOnce:E,EventsOnMultiple:p,EventsEmit:D,EventsOff:C,Environment:Se,Show:be,Hide:Ee,Quit:Ie};window.wails={Callback:T,EventsNotify:y,SetBindings:O,eventListeners:l,callbacks:f,flags:{disableScrollbarDrag:!1,disableWailsDefaultContextMenu:!1,enableResize:!1,defaultCursor:null,borderThickness:6,shouldDrag:!1,deferDragToMouseMove:!0,cssDragProperty:"--wails-draggable",cssDragValue:"drag"}};window.wailsbindings&&(window.wails.SetBindings(window.wailsbindings),delete window.wails.SetBindings);delete window.wailsbindings;var ye=function(e){var n=window.getComputedStyle(e.target).getPropertyValue(window.wails.flags.cssDragProperty);return n&&(n=n.trim()),!(n!==window.wails.flags.cssDragValue||e.buttons!==1||e.detail!==1)};window.wails.setCSSDragProperties=function(e,n){window.wails.flags.cssDragProperty=e,window.wails.flags.cssDragValue=n};window.addEventListener("mousedown",e=>{if(window.wails.flags.resizeEdge){window.WailsInvoke("resize:"+window.wails.flags.resizeEdge),e.preventDefault();return}if(ye(e)){if(window.wails.flags.disableScrollbarDrag&&(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight))return;window.wails.flags.deferDragToMouseMove?window.wails.flags.shouldDrag=!0:(e.preventDefault(),window.WailsInvoke("drag"));return}else window.wails.flags.shouldDrag=!1});window.addEventListener("mouseup",()=>{window.wails.flags.shouldDrag=!1});function w(e){document.documentElement.style.cursor=e||window.wails.flags.defaultCursor,window.wails.flags.resizeEdge=e}window.addEventListener("mousemove",function(e){if(window.wails.flags.shouldDrag&&(window.wails.flags.shouldDrag=!1,(e.buttons!==void 0?e.buttons:e.which)>0)){window.WailsInvoke("drag");return}if(!window.wails.flags.enableResize)return;window.wails.flags.defaultCursor==null&&(window.wails.flags.defaultCursor=document.documentElement.style.cursor),window.outerWidth-e.clientX Date: Wed, 28 Jun 2023 06:25:00 +1000 Subject: [PATCH 17/36] Bump semver from 7.3.8 to 7.5.3 in /scripts/sponsors (#2747) Bumps [semver](https://github.com/npm/node-semver) from 7.3.8 to 7.5.3. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v7.3.8...v7.5.3) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- scripts/sponsors/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/sponsors/package-lock.json b/scripts/sponsors/package-lock.json index cb6cc8b9e..5153e9cf8 100644 --- a/scripts/sponsors/package-lock.json +++ b/scripts/sponsors/package-lock.json @@ -1446,9 +1446,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, From 8acbdc246cd0a339b89dfce21971bbbd5c41d83e Mon Sep 17 00:00:00 2001 From: Mohamed Gharib Date: Tue, 27 Jun 2023 23:35:02 +0300 Subject: [PATCH 18/36] [v2] Add smart default context-menu functionality (backported from v3) (#2748) * [v2] Add smart default context-menu functionality (backported from v3) * Update changelog --- .../frontend/desktop/darwin/WailsContext.m | 2 +- .../frontend/runtime/desktop/contextmenu.js | 50 +++++++++++++++++++ v2/internal/frontend/runtime/desktop/main.js | 10 +++- .../frontend/runtime/runtime_debug_desktop.js | 48 ++++++++++++++++-- .../frontend/runtime/runtime_prod_desktop.js | 2 +- website/docs/reference/options.mdx | 24 ++++++++- website/src/pages/changelog.mdx | 1 + 7 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 v2/internal/frontend/runtime/desktop/contextmenu.js diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.m b/v2/internal/frontend/desktop/darwin/WailsContext.m index 15c9edff7..cc5aa2349 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.m +++ b/v2/internal/frontend/desktop/darwin/WailsContext.m @@ -230,7 +230,7 @@ typedef void (^schemeTaskCaller)(id); } else if (!self.defaultContextMenu) { // Disable default context menus WKUserScript *initScript = [WKUserScript new]; - [initScript initWithSource:@"window.wails.flags.disableWailsDefaultContextMenu = true;" + [initScript initWithSource:@"window.wails.flags.disableDefaultContextMenu = true;" injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:false]; [userContentController addUserScript:initScript]; diff --git a/v2/internal/frontend/runtime/desktop/contextmenu.js b/v2/internal/frontend/runtime/desktop/contextmenu.js new file mode 100644 index 000000000..b9c397546 --- /dev/null +++ b/v2/internal/frontend/runtime/desktop/contextmenu.js @@ -0,0 +1,50 @@ +/* +--default-contextmenu: auto; (default) will show the default context menu if contentEditable is true OR text has been selected OR element is input or textarea +--default-contextmenu: show; will always show the default context menu +--default-contextmenu: hide; will always hide the default context menu + +This rule is inherited like normal CSS rules, so nesting works as expected +*/ +export function processDefaultContextMenu(event) { + // Process default context menu + const element = event.target; + const computedStyle = window.getComputedStyle(element); + const defaultContextMenuAction = computedStyle.getPropertyValue("--default-contextmenu").trim(); + switch (defaultContextMenuAction) { + case "show": + return; + case "hide": + event.preventDefault(); + return; + default: + // Check if contentEditable is true + if (element.isContentEditable) { + return; + } + + // Check if text has been selected and action is on the selected elements + const selection = window.getSelection(); + const hasSelection = (selection.toString().length > 0) + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === element) { + return; + } + } + } + } + // Check if tagname is input or textarea + if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") { + if (hasSelection || (!element.readOnly && !element.disabled)) { + return; + } + } + + // hide default context menu + event.preventDefault(); + } +} diff --git a/v2/internal/frontend/runtime/desktop/main.js b/v2/internal/frontend/runtime/desktop/main.js index 38c56069e..65d954d95 100644 --- a/v2/internal/frontend/runtime/desktop/main.js +++ b/v2/internal/frontend/runtime/desktop/main.js @@ -16,6 +16,7 @@ import * as Window from "./window"; import * as Screen from "./screen"; import * as Browser from "./browser"; import * as Clipboard from "./clipboard"; +import * as ContextMenu from "./contextmenu"; export function Quit() { @@ -61,7 +62,7 @@ window.wails = { callbacks, flags: { disableScrollbarDrag: false, - disableWailsDefaultContextMenu: false, + disableDefaultContextMenu: false, enableResize: false, defaultCursor: null, borderThickness: 6, @@ -187,8 +188,13 @@ window.addEventListener('mousemove', function (e) { // Setup context menu hook window.addEventListener('contextmenu', function (e) { - if (window.wails.flags.disableWailsDefaultContextMenu) { + // always show the contextmenu in debug & dev + if (DEBUG) return; + + if (window.wails.flags.disableDefaultContextMenu) { e.preventDefault(); + } else { + ContextMenu.processDefaultContextMenu(e); } }); diff --git a/v2/internal/frontend/runtime/runtime_debug_desktop.js b/v2/internal/frontend/runtime/runtime_debug_desktop.js index 825ea5893..e680df85d 100644 --- a/v2/internal/frontend/runtime/runtime_debug_desktop.js +++ b/v2/internal/frontend/runtime/runtime_debug_desktop.js @@ -424,6 +424,44 @@ return Call(":wails:ClipboardGetText"); } + // desktop/contextmenu.js + function processDefaultContextMenu(event) { + const element = event.target; + const computedStyle = window.getComputedStyle(element); + const defaultContextMenuAction = computedStyle.getPropertyValue("--default-contextmenu").trim(); + switch (defaultContextMenuAction) { + case "show": + return; + case "hide": + event.preventDefault(); + return; + default: + if (element.isContentEditable) { + return; + } + const selection = window.getSelection(); + const hasSelection = selection.toString().length > 0; + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === element) { + return; + } + } + } + } + if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") { + if (hasSelection || !element.readOnly && !element.disabled) { + return; + } + } + event.preventDefault(); + } + } + // desktop/main.js function Quit() { window.WailsInvoke("Q"); @@ -461,7 +499,7 @@ callbacks, flags: { disableScrollbarDrag: false, - disableWailsDefaultContextMenu: false, + disableDefaultContextMenu: false, enableResize: false, defaultCursor: null, borderThickness: 6, @@ -570,10 +608,14 @@ setResize("e-resize"); }); window.addEventListener("contextmenu", function(e) { - if (window.wails.flags.disableWailsDefaultContextMenu) { + if (true) + return; + if (window.wails.flags.disableDefaultContextMenu) { e.preventDefault(); + } else { + processDefaultContextMenu(e); } }); window.WailsInvoke("runtime:ready"); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiZGVza3RvcC9sb2cuanMiLCAiZGVza3RvcC9ldmVudHMuanMiLCAiZGVza3RvcC9jYWxscy5qcyIsICJkZXNrdG9wL2JpbmRpbmdzLmpzIiwgImRlc2t0b3Avd2luZG93LmpzIiwgImRlc2t0b3Avc2NyZWVuLmpzIiwgImRlc2t0b3AvYnJvd3Nlci5qcyIsICJkZXNrdG9wL2NsaXBib2FyZC5qcyIsICJkZXNrdG9wL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX19cbnwgfCAgICAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5cbi8qKlxuICogU2VuZHMgYSBsb2cgbWVzc2FnZSB0byB0aGUgYmFja2VuZCB3aXRoIHRoZSBnaXZlbiBsZXZlbCArIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIHNlbmRMb2dNZXNzYWdlKGxldmVsLCBtZXNzYWdlKSB7XG5cblx0Ly8gTG9nIE1lc3NhZ2UgZm9ybWF0OlxuXHQvLyBsW3R5cGVdW21lc3NhZ2VdXG5cdHdpbmRvdy5XYWlsc0ludm9rZSgnTCcgKyBsZXZlbCArIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gdHJhY2UgbWVzc2FnZSB3aXRoIHRoZSBiYWNrZW5kXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExvZ1RyYWNlKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1QnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dQcmludChtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdQJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nRGVidWcobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnRCcsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gaW5mbyBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nSW5mbyhtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdJJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dXYXJuaW5nKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1cnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dFcnJvcihtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdFJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBmYXRhbCBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nRmF0YWwobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnRicsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIExvZyBsZXZlbCB0byB0aGUgZ2l2ZW4gbG9nIGxldmVsXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IGxvZ2xldmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRMb2dMZXZlbChsb2dsZXZlbCkge1xuXHRzZW5kTG9nTWVzc2FnZSgnUycsIGxvZ2xldmVsKTtcbn1cblxuLy8gTG9nIGxldmVsc1xuZXhwb3J0IGNvbnN0IExvZ0xldmVsID0ge1xuXHRUUkFDRTogMSxcblx0REVCVUc6IDIsXG5cdElORk86IDMsXG5cdFdBUk5JTkc6IDQsXG5cdEVSUk9SOiA1LFxufTtcbiIsICIvKlxuIF8gICAgICAgX18gICAgICBfIF9fXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuLy8gRGVmaW5lcyBhIHNpbmdsZSBsaXN0ZW5lciB3aXRoIGEgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gY2FsbGJhY2tcblxuLyoqXG4gKiBUaGUgTGlzdGVuZXIgY2xhc3MgZGVmaW5lcyBhIGxpc3RlbmVyISA6LSlcbiAqXG4gKiBAY2xhc3MgTGlzdGVuZXJcbiAqL1xuY2xhc3MgTGlzdGVuZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heENhbGxiYWNrc1xuICAgICAqIEBtZW1iZXJvZiBMaXN0ZW5lclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcykge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgLy8gRGVmYXVsdCBvZiAtMSBtZWFucyBpbmZpbml0ZVxuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICAgICAgLy8gQ2FsbGJhY2sgaW52b2tlcyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gZGF0YVxuICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaXN0ZW5lciBzaG91bGQgYmUgZGVzdHJveWVkXG4gICAgICAgIHRoaXMuQ2FsbGJhY2sgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgZGF0YSk7XG4gICAgICAgICAgICAvLyBJZiBtYXhDYWxsYmFja3MgaXMgaW5maW5pdGUsIHJldHVybiBmYWxzZSAoZG8gbm90IGRlc3Ryb3kpXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGVjcmVtZW50IG1heENhbGxiYWNrcy4gUmV0dXJuIHRydWUgaWYgbm93IDAsIG90aGVyd2lzZSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5tYXhDYWxsYmFja3MgLT0gMTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IHt9O1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBgbWF4Q2FsbGJhY2tzYCB0aW1lcyBiZWZvcmUgYmVpbmcgZGVzdHJveWVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3NcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcykge1xuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaCh0aGlzTGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeSB0aW1lIHRoZSBldmVudCBpcyBlbWl0dGVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIEV2ZW50c09uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgLTEpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbmNlIHRoZW4gZGVzdHJveWVkXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gRXZlbnRzT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAxKTtcbn1cblxuZnVuY3Rpb24gbm90aWZ5TGlzdGVuZXJzKGV2ZW50RGF0YSkge1xuXG4gICAgLy8gR2V0IHRoZSBldmVudCBuYW1lXG4gICAgbGV0IGV2ZW50TmFtZSA9IGV2ZW50RGF0YS5uYW1lO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgbGlzdGVuZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgaWYgKGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcblxuICAgICAgICAvLyBLZWVwIGEgbGlzdCBvZiBsaXN0ZW5lciBpbmRleGVzIHRvIGRlc3Ryb3lcbiAgICAgICAgY29uc3QgbmV3RXZlbnRMaXN0ZW5lckxpc3QgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLnNsaWNlKCk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChsZXQgY291bnQgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCAtIDE7IGNvdW50ID49IDA7IGNvdW50IC09IDEpIHtcblxuICAgICAgICAgICAgLy8gR2V0IG5leHQgbGlzdGVuZXJcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXVtjb3VudF07XG5cbiAgICAgICAgICAgIGxldCBkYXRhID0gZXZlbnREYXRhLmRhdGE7XG5cbiAgICAgICAgICAgIC8vIERvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgY29uc3QgZGVzdHJveSA9IGxpc3RlbmVyLkNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdGVuZXIgaW5kaWNhdGVkIHRvIGRlc3Ryb3kgaXRzZWxmLCBhZGQgaXQgdG8gdGhlIGRlc3Ryb3kgbGlzdFxuICAgICAgICAgICAgICAgIG5ld0V2ZW50TGlzdGVuZXJMaXN0LnNwbGljZShjb3VudCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY2FsbGJhY2tzIHdpdGggbmV3IGxpc3Qgb2YgbGlzdGVuZXJzXG4gICAgICAgIGlmIChuZXdFdmVudExpc3RlbmVyTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gbmV3RXZlbnRMaXN0ZW5lckxpc3Q7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogTm90aWZ5IGluZm9ybXMgZnJvbnRlbmQgbGlzdGVuZXJzIHRoYXQgYW4gZXZlbnQgd2FzIGVtaXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YVxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBub3RpZnlNZXNzYWdlIC0gZW5jb2RlZCBub3RpZmljYXRpb24gbWVzc2FnZVxuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNOb3RpZnkobm90aWZ5TWVzc2FnZSkge1xuICAgIC8vIFBhcnNlIHRoZSBtZXNzYWdlXG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04ucGFyc2Uobm90aWZ5TWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9ICdJbnZhbGlkIEpTT04gcGFzc2VkIHRvIE5vdGlmeTogJyArIG5vdGlmeU1lc3NhZ2U7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIG5vdGlmeUxpc3RlbmVycyhtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRhdGFcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNFbWl0KGV2ZW50TmFtZSkge1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICBkYXRhOiBbXS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpLFxuICAgIH07XG5cbiAgICAvLyBOb3RpZnkgSlMgbGlzdGVuZXJzXG4gICAgbm90aWZ5TGlzdGVuZXJzKHBheWxvYWQpO1xuXG4gICAgLy8gTm90aWZ5IEdvIGxpc3RlbmVyc1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnRUUnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudE5hbWUpIHtcbiAgICAvLyBSZW1vdmUgbG9jYWwgbGlzdGVuZXJzXG4gICAgZGVsZXRlIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAvLyBOb3RpZnkgR28gbGlzdGVuZXJzXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdFWCcgKyBldmVudE5hbWUpO1xufVxuXG4vKipcbiAqIE9mZiB1bnJlZ2lzdGVycyBhIGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIE9uLFxuICogb3B0aW9uYWxseSBtdWx0aXBsZSBsaXN0ZW5lcmVzIGNhbiBiZSB1bnJlZ2lzdGVyZWQgdmlhIGBhZGRpdGlvbmFsRXZlbnROYW1lc2BcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IGFkZGl0aW9uYWxFdmVudE5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNPZmYoZXZlbnROYW1lLCAuLi5hZGRpdGlvbmFsRXZlbnROYW1lcykge1xuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSlcblxuICAgIGlmIChhZGRpdGlvbmFsRXZlbnROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFkZGl0aW9uYWxFdmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbi8qKlxuICogT2ZmIHVucmVnaXN0ZXJzIGFsbCBldmVudCBsaXN0ZW5lcnMgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggT25cbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiBFdmVudHNPZmZBbGwoKSB7XG4gICAgY29uc3QgZXZlbnROYW1lcyA9IE9iamVjdC5rZXlzKGV2ZW50TGlzdGVuZXJzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZW1vdmVMaXN0ZW5lcihldmVudE5hbWVzW2ldKTtcbiAgICB9XG59XG5cbi8qKlxuICogbGlzdGVuZXJPZmYgdW5yZWdpc3RlcnMgYSBsaXN0ZW5lciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBFdmVudHNPblxuICpcbiAqIEBwYXJhbSB7TGlzdGVuZXJ9IGxpc3RlbmVyXG4gKi9cbiBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcbiAgICAvLyBSZW1vdmUgbG9jYWwgbGlzdGVuZXJcbiAgICBldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG5cbiAgICAvLyBDbGVhbiB1cCBpZiB0aGVyZSBhcmUgbm8gZXZlbnQgbGlzdGVuZXJzIGxlZnRcbiAgICBpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgICB9XG59XG4iLCAiLypcbiBfICAgICAgIF9fICAgICAgXyBfX1xufCB8ICAgICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA2ICovXG5cbmV4cG9ydCBjb25zdCBjYWxsYmFja3MgPSB7fTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbnVtYmVyIGZyb20gdGhlIG5hdGl2ZSBicm93c2VyIHJhbmRvbSBmdW5jdGlvblxuICpcbiAqIEByZXR1cm5zIG51bWJlclxuICovXG5mdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7XG5cdHZhciBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKTtcblx0cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbnVtYmVyIHVzaW5nIGRhIG9sZC1za29vbCBNYXRoLlJhbmRvbVxuICogSSBsaWtlcyB0byBjYWxsIGl0IExPTFJhbmRvbVxuICpcbiAqIEByZXR1cm5zIG51bWJlclxuICovXG5mdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHtcblx0cmV0dXJuIE1hdGgucmFuZG9tKCkgKiA5MDA3MTk5MjU0NzQwOTkxO1xufVxuXG4vLyBQaWNrIGEgcmFuZG9tIG51bWJlciBmdW5jdGlvbiBiYXNlZCBvbiBicm93c2VyIGNhcGFiaWxpdHlcbnZhciByYW5kb21GdW5jO1xuaWYgKHdpbmRvdy5jcnlwdG8pIHtcblx0cmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTtcbn0gZWxzZSB7XG5cdHJhbmRvbUZ1bmMgPSBiYXNpY1JhbmRvbTtcbn1cblxuXG4vKipcbiAqIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGVcbiAqIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGVcbiAqIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsXG4gKiBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay5cbiAqIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW5cbiAqIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHthbnk9fSBhcmdzXG4gKiBAcGFyYW0ge251bWJlcj19IHRpbWVvdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG5hbWUsIGFyZ3MsIHRpbWVvdXQpIHtcblxuXHQvLyBUaW1lb3V0IGluZmluaXRlIGJ5IGRlZmF1bHRcblx0aWYgKHRpbWVvdXQgPT0gbnVsbCkge1xuXHRcdHRpbWVvdXQgPSAwO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgcHJvbWlzZVxuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG5cdFx0Ly8gQ3JlYXRlIGEgdW5pcXVlIGNhbGxiYWNrSURcblx0XHR2YXIgY2FsbGJhY2tJRDtcblx0XHRkbyB7XG5cdFx0XHRjYWxsYmFja0lEID0gbmFtZSArICctJyArIHJhbmRvbUZ1bmMoKTtcblx0XHR9IHdoaWxlIChjYWxsYmFja3NbY2FsbGJhY2tJRF0pO1xuXG5cdFx0dmFyIHRpbWVvdXRIYW5kbGU7XG5cdFx0Ly8gU2V0IHRpbWVvdXRcblx0XHRpZiAodGltZW91dCA+IDApIHtcblx0XHRcdHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmVqZWN0KEVycm9yKCdDYWxsIHRvICcgKyBuYW1lICsgJyB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICcgKyBjYWxsYmFja0lEKSk7XG5cdFx0XHR9LCB0aW1lb3V0KTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrc1tjYWxsYmFja0lEXSA9IHtcblx0XHRcdHRpbWVvdXRIYW5kbGU6IHRpbWVvdXRIYW5kbGUsXG5cdFx0XHRyZWplY3Q6IHJlamVjdCxcblx0XHRcdHJlc29sdmU6IHJlc29sdmVcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBheWxvYWQgPSB7XG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdGFyZ3MsXG5cdFx0XHRcdGNhbGxiYWNrSUQsXG5cdFx0XHR9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBjYWxsXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ0MnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxud2luZG93Lk9iZnVzY2F0ZWRDYWxsID0gKGlkLCBhcmdzLCB0aW1lb3V0KSA9PiB7XG5cbiAgICAvLyBUaW1lb3V0IGluZmluaXRlIGJ5IGRlZmF1bHRcbiAgICBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVvdXQgPSAwO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIHByb21pc2VcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lEXG4gICAgICAgIHZhciBjYWxsYmFja0lEO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFja0lEID0gaWQgKyAnLScgKyByYW5kb21GdW5jKCk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSk7XG5cbiAgICAgICAgdmFyIHRpbWVvdXRIYW5kbGU7XG4gICAgICAgIC8vIFNldCB0aW1lb3V0XG4gICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignQ2FsbCB0byBtZXRob2QgJyArIGlkICsgJyB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICcgKyBjYWxsYmFja0lEKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrc1tjYWxsYmFja0lEXSA9IHtcbiAgICAgICAgICAgIHRpbWVvdXRIYW5kbGU6IHRpbWVvdXRIYW5kbGUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmVcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGFyZ3MsXG5cdFx0XHRcdGNhbGxiYWNrSUQsXG5cdFx0XHR9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBjYWxsXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ2MnICsgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cblxuLyoqXG4gKiBDYWxsZWQgYnkgdGhlIGJhY2tlbmQgdG8gcmV0dXJuIGRhdGEgdG8gYSBwcmV2aW91c2x5IGNhbGxlZFxuICogYmluZGluZyBpbnZvY2F0aW9uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IGluY29taW5nTWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbGJhY2soaW5jb21pbmdNZXNzYWdlKSB7XG5cdC8vIFBhcnNlIHRoZSBtZXNzYWdlXG5cdGxldCBtZXNzYWdlO1xuXHR0cnkge1xuXHRcdG1lc3NhZ2UgPSBKU09OLnBhcnNlKGluY29taW5nTWVzc2FnZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zdCBlcnJvciA9IGBJbnZhbGlkIEpTT04gcGFzc2VkIHRvIGNhbGxiYWNrOiAke2UubWVzc2FnZX0uIE1lc3NhZ2U6ICR7aW5jb21pbmdNZXNzYWdlfWA7XG5cdFx0cnVudGltZS5Mb2dEZWJ1ZyhlcnJvcik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKTtcblx0fVxuXHRsZXQgY2FsbGJhY2tJRCA9IG1lc3NhZ2UuY2FsbGJhY2tpZDtcblx0bGV0IGNhbGxiYWNrRGF0YSA9IGNhbGxiYWNrc1tjYWxsYmFja0lEXTtcblx0aWYgKCFjYWxsYmFja0RhdGEpIHtcblx0XHRjb25zdCBlcnJvciA9IGBDYWxsYmFjayAnJHtjYWxsYmFja0lEfScgbm90IHJlZ2lzdGVyZWQhISFgO1xuXHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKTtcblx0fVxuXHRjbGVhclRpbWVvdXQoY2FsbGJhY2tEYXRhLnRpbWVvdXRIYW5kbGUpO1xuXG5cdGRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJRF07XG5cblx0aWYgKG1lc3NhZ2UuZXJyb3IpIHtcblx0XHRjYWxsYmFja0RhdGEucmVqZWN0KG1lc3NhZ2UuZXJyb3IpO1xuXHR9IGVsc2Uge1xuXHRcdGNhbGxiYWNrRGF0YS5yZXNvbHZlKG1lc3NhZ2UucmVzdWx0KTtcblx0fVxufVxuIiwgIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX18gICAgXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gICkgXG58X18vfF9fL1xcX18sXy9fL18vX19fXy8gIFxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuaW1wb3J0IHtDYWxsfSBmcm9tICcuL2NhbGxzJztcblxuLy8gVGhpcyBpcyB3aGVyZSB3ZSBiaW5kIGdvIG1ldGhvZCB3cmFwcGVyc1xud2luZG93LmdvID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXRCaW5kaW5ncyhiaW5kaW5nc01hcCkge1xuXHR0cnkge1xuXHRcdGJpbmRpbmdzTWFwID0gSlNPTi5wYXJzZShiaW5kaW5nc01hcCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9XG5cblx0Ly8gSW5pdGlhbGlzZSB0aGUgYmluZGluZ3MgbWFwXG5cdHdpbmRvdy5nbyA9IHdpbmRvdy5nbyB8fCB7fTtcblxuXHQvLyBJdGVyYXRlIHBhY2thZ2UgbmFtZXNcblx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXApLmZvckVhY2goKHBhY2thZ2VOYW1lKSA9PiB7XG5cblx0XHQvLyBDcmVhdGUgaW5uZXIgbWFwIGlmIGl0IGRvZXNuJ3QgZXhpc3Rcblx0XHR3aW5kb3cuZ29bcGFja2FnZU5hbWVdID0gd2luZG93LmdvW3BhY2thZ2VOYW1lXSB8fCB7fTtcblxuXHRcdC8vIEl0ZXJhdGUgc3RydWN0IG5hbWVzXG5cdFx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXBbcGFja2FnZU5hbWVdKS5mb3JFYWNoKChzdHJ1Y3ROYW1lKSA9PiB7XG5cblx0XHRcdC8vIENyZWF0ZSBpbm5lciBtYXAgaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdFx0d2luZG93LmdvW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSA9IHdpbmRvdy5nb1twYWNrYWdlTmFtZV1bc3RydWN0TmFtZV0gfHwge307XG5cblx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdzTWFwW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSkuZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuXG5cdFx0XHRcdHdpbmRvdy5nb1twYWNrYWdlTmFtZV1bc3RydWN0TmFtZV1bbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHQvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHRcblx0XHRcdFx0XHRsZXQgdGltZW91dCA9IDA7XG5cblx0XHRcdFx0XHQvLyBBY3R1YWwgZnVuY3Rpb25cblx0XHRcdFx0XHRmdW5jdGlvbiBkeW5hbWljKCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHRcdFx0XHRcdHJldHVybiBDYWxsKFtwYWNrYWdlTmFtZSwgc3RydWN0TmFtZSwgbWV0aG9kTmFtZV0uam9pbignLicpLCBhcmdzLCB0aW1lb3V0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb25cblx0XHRcdFx0XHRkeW5hbWljLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAobmV3VGltZW91dCkge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IG5ld1RpbWVvdXQ7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIEFsbG93IGdldHRpbmcgdGltZW91dCB0byBmdW5jdGlvblxuXHRcdFx0XHRcdGR5bmFtaWMuZ2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aW1lb3V0O1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gZHluYW1pYztcblx0XHRcdFx0fSgpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0pO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cblxuaW1wb3J0IHtDYWxsfSBmcm9tIFwiLi9jYWxsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93UmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1JlbG9hZEFwcCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dSJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRTeXN0ZW1EZWZhdWx0VGhlbWUoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXQVNEVCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0TGlnaHRUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBTFQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldERhcmtUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBRFQnKTtcbn1cblxuLyoqXG4gKiBQbGFjZSB0aGUgd2luZG93IGluIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0NlbnRlcigpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1djJyk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgd2luZG93IHRpdGxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRUaXRsZSh0aXRsZSkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV1QnICsgdGl0bGUpO1xufVxuXG4vKipcbiAqIE1ha2VzIHRoZSB3aW5kb3cgZ28gZnVsbHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0Z1bGxzY3JlZW4oKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXRicpO1xufVxuXG4vKipcbiAqIFJldmVydHMgdGhlIHdpbmRvdyBmcm9tIGZ1bGxzY3JlZW5cbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dVbmZ1bGxzY3JlZW4oKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXZicpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB3aW5kb3csIGkuZS4gd2hldGhlciB0aGUgd2luZG93IGlzIGluIGZ1bGwgc2NyZWVuIG1vZGUgb3Igbm90LlxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFRoZSBzdGF0ZSBvZiB0aGUgd2luZG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dJc0Z1bGxzY3JlZW4oKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNGdWxsc2NyZWVuXCIpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgU2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dzOicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBTaXplIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPHt3OiBudW1iZXIsIGg6IG51bWJlcn0+fSBUaGUgc2l6ZSBvZiB0aGUgd2luZG93XG5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0dldFNpemUoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93R2V0U2l6ZVwiKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRNYXhTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1daOicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0TWluU2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXejonICsgd2lkdGggKyAnOicgKyBoZWlnaHQpO1xufVxuXG5cblxuLyoqXG4gKiBTZXQgdGhlIHdpbmRvdyBBbHdheXNPblRvcCBvciBub3Qgb24gdG9wXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0QWx3YXlzT25Ub3AoYikge1xuXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXQVRQOicgKyAoYiA/ICcxJyA6ICcwJykpO1xufVxuXG5cblxuXG4vKipcbiAqIFNldCB0aGUgUG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0UG9zaXRpb24oeCwgeSkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3A6JyArIHggKyAnOicgKyB5KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFBvc2l0aW9uIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPHt4OiBudW1iZXIsIHk6IG51bWJlcn0+fSBUaGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93R2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93R2V0UG9zXCIpO1xufVxuXG4vKipcbiAqIEhpZGUgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0hpZGUoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXSCcpO1xufVxuXG4vKipcbiAqIFNob3cgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1Nob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXUycpO1xufVxuXG4vKipcbiAqIE1heGltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dNYXhpbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dNJyk7XG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBNYXhpbWlzZSBvZiB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VG9nZ2xlTWF4aW1pc2UoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXdCcpO1xufVxuXG4vKipcbiAqIFVubWF4aW1pc2UgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1VubWF4aW1pc2UoKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXVScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB3aW5kb3csIGkuZS4gd2hldGhlciB0aGUgd2luZG93IGlzIG1heGltaXNlZCBvciBub3QuXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gVGhlIHN0YXRlIG9mIHRoZSB3aW5kb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0lzTWF4aW1pc2VkKCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOldpbmRvd0lzTWF4aW1pc2VkXCIpO1xufVxuXG4vKipcbiAqIE1pbmltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dNaW5pbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dtJyk7XG59XG5cbi8qKlxuICogVW5taW5pbWlzZSB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VW5taW5pbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1d1Jyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNNaW5pbWlzZWQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNNaW5pbWlzZWRcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbm9ybWFsIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNOb3JtYWwoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNOb3JtYWxcIik7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBSIFJlZFxuICogQHBhcmFtIHtudW1iZXJ9IEcgR3JlZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBCIEJsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBBIEFscGhhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRCYWNrZ3JvdW5kQ29sb3VyKFIsIEcsIEIsIEEpIHtcbiAgICBsZXQgcmdiYSA9IEpTT04uc3RyaW5naWZ5KHtyOiBSIHx8IDAsIGc6IEcgfHwgMCwgYjogQiB8fCAwLCBhOiBBIHx8IDI1NX0pO1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3I6JyArIHJnYmEpO1xufVxuXG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuXG5pbXBvcnQge0NhbGx9IGZyb20gXCIuL2NhbGxzXCI7XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBhbGwgc2NyZWVucy4gQ2FsbCB0aGlzIGFuZXcgZWFjaCB0aW1lIHlvdSB3YW50IHRvIHJlZnJlc2ggZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHdpbmRvd2luZyBzeXN0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi93cmFwcGVyL3J1bnRpbWUnKS5TY3JlZW59IFNjcmVlblxuICogQHJldHVybiB7UHJvbWlzZTx7U2NyZWVuW119Pn0gVGhlIHNjcmVlbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNjcmVlbkdldEFsbCgpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpTY3JlZW5HZXRBbGxcIik7XG59XG4iLCAiLyoqXG4gKiBAZGVzY3JpcHRpb246IFVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgYnJvd3NlciB0byBvcGVuIHRoZSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gQnJvd3Nlck9wZW5VUkwodXJsKSB7XG4gIHdpbmRvdy5XYWlsc0ludm9rZSgnQk86JyArIHVybCk7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7Q2FsbH0gZnJvbSBcIi4vY2FsbHNcIjtcblxuLyoqXG4gKiBTZXQgdGhlIFNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDbGlwYm9hcmRTZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpDbGlwYm9hcmRTZXRUZXh0XCIsIFt0ZXh0XSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZFxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8e3N0cmluZ30+fSBUZXh0IGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZFxuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDbGlwYm9hcmRHZXRUZXh0KCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOkNsaXBib2FyZEdldFRleHRcIik7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuaW1wb3J0ICogYXMgTG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7ZXZlbnRMaXN0ZW5lcnMsIEV2ZW50c0VtaXQsIEV2ZW50c05vdGlmeSwgRXZlbnRzT2ZmLCBFdmVudHNPbiwgRXZlbnRzT25jZSwgRXZlbnRzT25NdWx0aXBsZX0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHtDYWxsLCBDYWxsYmFjaywgY2FsbGJhY2tzfSBmcm9tICcuL2NhbGxzJztcbmltcG9ydCB7U2V0QmluZGluZ3N9IGZyb20gXCIuL2JpbmRpbmdzXCI7XG5pbXBvcnQgKiBhcyBXaW5kb3cgZnJvbSBcIi4vd2luZG93XCI7XG5pbXBvcnQgKiBhcyBTY3JlZW4gZnJvbSBcIi4vc2NyZWVuXCI7XG5pbXBvcnQgKiBhcyBCcm93c2VyIGZyb20gXCIuL2Jyb3dzZXJcIjtcbmltcG9ydCAqIGFzIENsaXBib2FyZCBmcm9tIFwiLi9jbGlwYm9hcmRcIjtcblxuXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1EnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdTJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnSCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6RW52aXJvbm1lbnRcIik7XG59XG5cbi8vIFRoZSBKUyBydW50aW1lXG53aW5kb3cucnVudGltZSA9IHtcbiAgICAuLi5Mb2csXG4gICAgLi4uV2luZG93LFxuICAgIC4uLkJyb3dzZXIsXG4gICAgLi4uU2NyZWVuLFxuICAgIC4uLkNsaXBib2FyZCxcbiAgICBFdmVudHNPbixcbiAgICBFdmVudHNPbmNlLFxuICAgIEV2ZW50c09uTXVsdGlwbGUsXG4gICAgRXZlbnRzRW1pdCxcbiAgICBFdmVudHNPZmYsXG4gICAgRW52aXJvbm1lbnQsXG4gICAgU2hvdyxcbiAgICBIaWRlLFxuICAgIFF1aXRcbn07XG5cbi8vIEludGVybmFsIHdhaWxzIGVuZHBvaW50c1xud2luZG93LndhaWxzID0ge1xuICAgIENhbGxiYWNrLFxuICAgIEV2ZW50c05vdGlmeSxcbiAgICBTZXRCaW5kaW5ncyxcbiAgICBldmVudExpc3RlbmVycyxcbiAgICBjYWxsYmFja3MsXG4gICAgZmxhZ3M6IHtcbiAgICAgICAgZGlzYWJsZVNjcm9sbGJhckRyYWc6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlV2FpbHNEZWZhdWx0Q29udGV4dE1lbnU6IGZhbHNlLFxuICAgICAgICBlbmFibGVSZXNpemU6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0Q3Vyc29yOiBudWxsLFxuICAgICAgICBib3JkZXJUaGlja25lc3M6IDYsXG4gICAgICAgIHNob3VsZERyYWc6IGZhbHNlLFxuICAgICAgICBkZWZlckRyYWdUb01vdXNlTW92ZTogdHJ1ZSxcbiAgICAgICAgY3NzRHJhZ1Byb3BlcnR5OiBcIi0td2FpbHMtZHJhZ2dhYmxlXCIsXG4gICAgICAgIGNzc0RyYWdWYWx1ZTogXCJkcmFnXCIsXG4gICAgfVxufTtcblxuLy8gU2V0IHRoZSBiaW5kaW5nc1xuaWYgKHdpbmRvdy53YWlsc2JpbmRpbmdzKSB7XG4gICAgd2luZG93LndhaWxzLlNldEJpbmRpbmdzKHdpbmRvdy53YWlsc2JpbmRpbmdzKTtcbiAgICBkZWxldGUgd2luZG93LndhaWxzLlNldEJpbmRpbmdzO1xufVxuXG4vLyAoYm9vbCkgVGhpcyBpcyBldmFsdWF0ZWQgYXQgYnVpbGQgdGltZSBpbiBwYWNrYWdlLmpzb25cbmlmICghREVCVUcpIHtcbiAgICBkZWxldGUgd2luZG93LndhaWxzYmluZGluZ3M7XG59XG5cbmxldCBkcmFnVGVzdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHZhbCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUudGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnUHJvcGVydHkpO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHZhbCA9IHZhbC50cmltKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICh2YWwgIT09IHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlLmJ1dHRvbnMgIT09IDEpIHtcbiAgICAgICAgLy8gRG8gbm90IHN0YXJ0IGRyYWdnaW5nIGlmIG5vdCB0aGUgcHJpbWFyeSBidXR0b24gaGFzIGJlZW4gY2xpY2tlZC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlLmRldGFpbCAhPT0gMSkge1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZ2dpbmcgaWYgbW9yZSB0aGFuIG9uY2UgaGFzIGJlZW4gY2xpY2tlZCwgZS5nLiB3aGVuIGRvdWJsZSBjbGlja2luZ1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG53aW5kb3cud2FpbHMuc2V0Q1NTRHJhZ1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAocHJvcGVydHksIHZhbHVlKSB7XG4gICAgd2luZG93LndhaWxzLmZsYWdzLmNzc0RyYWdQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnVmFsdWUgPSB2YWx1ZTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7XG5cbiAgICAvLyBDaGVjayBmb3IgcmVzaXppbmdcbiAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgd2luZG93LldhaWxzSW52b2tlKFwicmVzaXplOlwiICsgd2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ1Rlc3QoZSkpIHtcbiAgICAgICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kaXNhYmxlU2Nyb2xsYmFyRHJhZykge1xuICAgICAgICAgICAgLy8gVGhpcyBjaGVja3MgZm9yIGNsaWNrcyBvbiB0aGUgc2Nyb2xsIGJhclxuICAgICAgICAgICAgaWYgKGUub2Zmc2V0WCA+IGUudGFyZ2V0LmNsaWVudFdpZHRoIHx8IGUub2Zmc2V0WSA+IGUudGFyZ2V0LmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLmRlZmVyRHJhZ1RvTW91c2VNb3ZlKSB7XG4gICAgICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIHdpbmRvdy5XYWlsc0ludm9rZShcImRyYWdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnID0gZmFsc2U7XG4gICAgfVxufSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgIHdpbmRvdy53YWlscy5mbGFncy5zaG91bGREcmFnID0gZmFsc2U7XG59KTtcblxuZnVuY3Rpb24gc2V0UmVzaXplKGN1cnNvcikge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jdXJzb3IgPSBjdXJzb3IgfHwgd2luZG93LndhaWxzLmZsYWdzLmRlZmF1bHRDdXJzb3I7XG4gICAgd2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UgPSBjdXJzb3I7XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICh3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZykge1xuICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgbW91c2VQcmVzc2VkID0gZS5idXR0b25zICE9PSB1bmRlZmluZWQgPyBlLmJ1dHRvbnMgOiBlLndoaWNoO1xuICAgICAgICBpZiAobW91c2VQcmVzc2VkID4gMCkge1xuICAgICAgICAgICAgd2luZG93LldhaWxzSW52b2tlKFwiZHJhZ1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXdpbmRvdy53YWlscy5mbGFncy5lbmFibGVSZXNpemUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLmRlZmF1bHRDdXJzb3IgPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3MuZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jdXJzb3I7XG4gICAgfVxuICAgIGlmICh3aW5kb3cub3V0ZXJXaWR0aCAtIGUuY2xpZW50WCA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3MgJiYgd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcykge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gXCJzZS1yZXNpemVcIjtcbiAgICB9XG4gICAgbGV0IHJpZ2h0Qm9yZGVyID0gd2luZG93Lm91dGVyV2lkdGggLSBlLmNsaWVudFggPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzO1xuICAgIGxldCBsZWZ0Qm9yZGVyID0gZS5jbGllbnRYIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcbiAgICBsZXQgdG9wQm9yZGVyID0gZS5jbGllbnRZIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcbiAgICBsZXQgYm90dG9tQm9yZGVyID0gd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcblxuICAgIC8vIElmIHdlIGFyZW4ndCBvbiBhbiBlZGdlLCBidXQgd2VyZSwgcmVzZXQgdGhlIGN1cnNvciB0byBkZWZhdWx0XG4gICAgaWYgKCFsZWZ0Qm9yZGVyICYmICFyaWdodEJvcmRlciAmJiAhdG9wQm9yZGVyICYmICFib3R0b21Cb3JkZXIgJiYgd2luZG93LndhaWxzLmZsYWdzLnJlc2l6ZUVkZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0Qm9yZGVyICYmIGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwic2UtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIgJiYgYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdEJvcmRlciAmJiB0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm53LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIgJiYgcmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcIm5lLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyKSBzZXRSZXNpemUoXCJ3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm4tcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAocmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcImUtcmVzaXplXCIpO1xuXG59KTtcblxuLy8gU2V0dXAgY29udGV4dCBtZW51IGhvb2tcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kaXNhYmxlV2FpbHNEZWZhdWx0Q29udGV4dE1lbnUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn0pO1xuXG53aW5kb3cuV2FpbHNJbnZva2UoXCJydW50aW1lOnJlYWR5XCIpOyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0JBLFdBQVMsZUFBZSxPQUFPLFNBQVM7QUFJdkMsV0FBTyxZQUFZ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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiZGVza3RvcC9sb2cuanMiLCAiZGVza3RvcC9ldmVudHMuanMiLCAiZGVza3RvcC9jYWxscy5qcyIsICJkZXNrdG9wL2JpbmRpbmdzLmpzIiwgImRlc2t0b3Avd2luZG93LmpzIiwgImRlc2t0b3Avc2NyZWVuLmpzIiwgImRlc2t0b3AvYnJvd3Nlci5qcyIsICJkZXNrdG9wL2NsaXBib2FyZC5qcyIsICJkZXNrdG9wL2NvbnRleHRtZW51LmpzIiwgImRlc2t0b3AvbWFpbi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiBfICAgICAgIF9fICAgICAgXyBfX1xufCB8ICAgICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuLyoqXG4gKiBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHdpdGggdGhlIGdpdmVuIGxldmVsICsgbWVzc2FnZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gc2VuZExvZ01lc3NhZ2UobGV2ZWwsIG1lc3NhZ2UpIHtcblxuXHQvLyBMb2cgTWVzc2FnZSBmb3JtYXQ6XG5cdC8vIGxbdHlwZV1bbWVzc2FnZV1cblx0d2luZG93LldhaWxzSW52b2tlKCdMJyArIGxldmVsICsgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiB0cmFjZSBtZXNzYWdlIHdpdGggdGhlIGJhY2tlbmRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9nVHJhY2UobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnVCcsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoIHRoZSBiYWNrZW5kXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExvZ1ByaW50KG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ1AnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIGRlYnVnIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dEZWJ1ZyhtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdEJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogTG9nIHRoZSBnaXZlbiBpbmZvIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dJbmZvKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ0knLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSB3aXRoIHRoZSBiYWNrZW5kXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExvZ1dhcm5pbmcobWVzc2FnZSkge1xuXHRzZW5kTG9nTWVzc2FnZSgnVycsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIExvZyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBiYWNrZW5kXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExvZ0Vycm9yKG1lc3NhZ2UpIHtcblx0c2VuZExvZ01lc3NhZ2UoJ0UnLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBMb2cgdGhlIGdpdmVuIGZhdGFsIG1lc3NhZ2Ugd2l0aCB0aGUgYmFja2VuZFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMb2dGYXRhbChtZXNzYWdlKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdGJywgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgTG9nIGxldmVsIHRvIHRoZSBnaXZlbiBsb2cgbGV2ZWxcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gbG9nbGV2ZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldExvZ0xldmVsKGxvZ2xldmVsKSB7XG5cdHNlbmRMb2dNZXNzYWdlKCdTJywgbG9nbGV2ZWwpO1xufVxuXG4vLyBMb2cgbGV2ZWxzXG5leHBvcnQgY29uc3QgTG9nTGV2ZWwgPSB7XG5cdFRSQUNFOiAxLFxuXHRERUJVRzogMixcblx0SU5GTzogMyxcblx0V0FSTklORzogNCxcblx0RVJST1I6IDUsXG59O1xuIiwgIi8qXG4gXyAgICAgICBfXyAgICAgIF8gX19cbnwgfCAgICAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuLyoganNoaW50IGVzdmVyc2lvbjogNiAqL1xuXG4vLyBEZWZpbmVzIGEgc2luZ2xlIGxpc3RlbmVyIHdpdGggYSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byBjYWxsYmFja1xuXG4vKipcbiAqIFRoZSBMaXN0ZW5lciBjbGFzcyBkZWZpbmVzIGEgbGlzdGVuZXIhIDotKVxuICpcbiAqIEBjbGFzcyBMaXN0ZW5lclxuICovXG5jbGFzcyBMaXN0ZW5lciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Q2FsbGJhY2tzXG4gICAgICogQG1lbWJlcm9mIExpc3RlbmVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICAvLyBEZWZhdWx0IG9mIC0xIG1lYW5zIGluZmluaXRlXG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzID0gbWF4Q2FsbGJhY2tzIHx8IC0xO1xuICAgICAgICAvLyBDYWxsYmFjayBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBnaXZlbiBkYXRhXG4gICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxpc3RlbmVyIHNob3VsZCBiZSBkZXN0cm95ZWRcbiAgICAgICAgdGhpcy5DYWxsYmFjayA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBkYXRhKTtcbiAgICAgICAgICAgIC8vIElmIG1heENhbGxiYWNrcyBpcyBpbmZpbml0ZSwgcmV0dXJuIGZhbHNlIChkbyBub3QgZGVzdHJveSlcbiAgICAgICAgICAgIGlmICh0aGlzLm1heENhbGxiYWNrcyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEZWNyZW1lbnQgbWF4Q2FsbGJhY2tzLiBSZXR1cm4gdHJ1ZSBpZiBub3cgMCwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF4Q2FsbGJhY2tzID09PSAwO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGV2ZW50TGlzdGVuZXJzID0ge307XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIGBtYXhDYWxsYmFja3NgIHRpbWVzIGJlZm9yZSBiZWluZyBkZXN0cm95ZWRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtudW1iZXJ9IG1heENhbGxiYWNrc1xuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIGNhbmNlbCB0aGUgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c09uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gfHwgW107XG4gICAgY29uc3QgdGhpc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcyk7XG4gICAgZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXS5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IGxpc3RlbmVyT2ZmKHRoaXNMaXN0ZW5lcik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IHRpbWUgdGhlIGV2ZW50IGlzIGVtaXR0ZWRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIGNhbmNlbCB0aGUgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c09uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gRXZlbnRzT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uY2UgdGhlbiBkZXN0cm95ZWRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIGNhbmNlbCB0aGUgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c09uY2UoZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBFdmVudHNPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG5mdW5jdGlvbiBub3RpZnlMaXN0ZW5lcnMoZXZlbnREYXRhKSB7XG5cbiAgICAvLyBHZXQgdGhlIGV2ZW50IG5hbWVcbiAgICBsZXQgZXZlbnROYW1lID0gZXZlbnREYXRhLm5hbWU7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFueSBsaXN0ZW5lcnMgZm9yIHRoaXMgZXZlbnRcbiAgICBpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuXG4gICAgICAgIC8vIEtlZXAgYSBsaXN0IG9mIGxpc3RlbmVyIGluZGV4ZXMgdG8gZGVzdHJveVxuICAgICAgICBjb25zdCBuZXdFdmVudExpc3RlbmVyTGlzdCA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0uc2xpY2UoKTtcblxuICAgICAgICAvLyBJdGVyYXRlIGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGxldCBjb3VudCA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RoIC0gMTsgY291bnQgPj0gMDsgY291bnQgLT0gMSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgbmV4dCBsaXN0ZW5lclxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdW2NvdW50XTtcblxuICAgICAgICAgICAgbGV0IGRhdGEgPSBldmVudERhdGEuZGF0YTtcblxuICAgICAgICAgICAgLy8gRG8gdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICBjb25zdCBkZXN0cm95ID0gbGlzdGVuZXIuQ2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgICBpZiAoZGVzdHJveSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0ZW5lciBpbmRpY2F0ZWQgdG8gZGVzdHJveSBpdHNlbGYsIGFkZCBpdCB0byB0aGUgZGVzdHJveSBsaXN0XG4gICAgICAgICAgICAgICAgbmV3RXZlbnRMaXN0ZW5lckxpc3Quc3BsaWNlKGNvdW50LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBjYWxsYmFja3Mgd2l0aCBuZXcgbGlzdCBvZiBsaXN0ZW5lcnNcbiAgICAgICAgaWYgKG5ld0V2ZW50TGlzdGVuZXJMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBuZXdFdmVudExpc3RlbmVyTGlzdDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBOb3RpZnkgaW5mb3JtcyBmcm9udGVuZCBsaXN0ZW5lcnMgdGhhdCBhbiBldmVudCB3YXMgZW1pdHRlZCB3aXRoIHRoZSBnaXZlbiBkYXRhXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IG5vdGlmeU1lc3NhZ2UgLSBlbmNvZGVkIG5vdGlmaWNhdGlvbiBtZXNzYWdlXG5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c05vdGlmeShub3RpZnlNZXNzYWdlKSB7XG4gICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2VcbiAgICBsZXQgbWVzc2FnZTtcbiAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShub3RpZnlNZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gJ0ludmFsaWQgSlNPTiBwYXNzZWQgdG8gTm90aWZ5OiAnICsgbm90aWZ5TWVzc2FnZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgbm90aWZ5TGlzdGVuZXJzKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEVtaXQgYW4gZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgZGF0YVxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c0VtaXQoZXZlbnROYW1lKSB7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBuYW1lOiBldmVudE5hbWUsXG4gICAgICAgIGRhdGE6IFtdLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykuc2xpY2UoMSksXG4gICAgfTtcblxuICAgIC8vIE5vdGlmeSBKUyBsaXN0ZW5lcnNcbiAgICBub3RpZnlMaXN0ZW5lcnMocGF5bG9hZCk7XG5cbiAgICAvLyBOb3RpZnkgR28gbGlzdGVuZXJzXG4gICAgd2luZG93LldhaWxzSW52b2tlKCdFRScgKyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSkge1xuICAgIC8vIFJlbW92ZSBsb2NhbCBsaXN0ZW5lcnNcbiAgICBkZWxldGUgZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXTtcblxuICAgIC8vIE5vdGlmeSBHbyBsaXN0ZW5lcnNcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ0VYJyArIGV2ZW50TmFtZSk7XG59XG5cbi8qKlxuICogT2ZmIHVucmVnaXN0ZXJzIGEgbGlzdGVuZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggT24sXG4gKiBvcHRpb25hbGx5IG11bHRpcGxlIGxpc3RlbmVyZXMgY2FuIGJlIHVucmVnaXN0ZXJlZCB2aWEgYGFkZGl0aW9uYWxFdmVudE5hbWVzYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gYWRkaXRpb25hbEV2ZW50TmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c09mZihldmVudE5hbWUsIC4uLmFkZGl0aW9uYWxFdmVudE5hbWVzKSB7XG4gICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lKVxuXG4gICAgaWYgKGFkZGl0aW9uYWxFdmVudE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWRkaXRpb25hbEV2ZW50TmFtZXMuZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lKVxuICAgICAgICB9KVxuICAgIH1cbn1cblxuLyoqXG4gKiBPZmYgdW5yZWdpc3RlcnMgYWxsIGV2ZW50IGxpc3RlbmVycyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBPblxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c09mZkFsbCgpIHtcbiAgICBjb25zdCBldmVudE5hbWVzID0gT2JqZWN0LmtleXMoZXZlbnRMaXN0ZW5lcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZXNbaV0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBsaXN0ZW5lck9mZiB1bnJlZ2lzdGVycyBhIGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIEV2ZW50c09uXG4gKlxuICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXJcbiAqL1xuIGZ1bmN0aW9uIGxpc3RlbmVyT2ZmKGxpc3RlbmVyKSB7XG4gICAgY29uc3QgZXZlbnROYW1lID0gbGlzdGVuZXIuZXZlbnROYW1lO1xuICAgIC8vIFJlbW92ZSBsb2NhbCBsaXN0ZW5lclxuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmZpbHRlcihsID0+IGwgIT09IGxpc3RlbmVyKTtcblxuICAgIC8vIENsZWFuIHVwIGlmIHRoZXJlIGFyZSBubyBldmVudCBsaXN0ZW5lcnMgbGVmdFxuICAgIGlmIChldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZW1vdmVMaXN0ZW5lcihldmVudE5hbWUpO1xuICAgIH1cbn1cbiIsICIvKlxuIF8gICAgICAgX18gICAgICBfIF9fXG58IHwgICAgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cbi8qIGpzaGludCBlc3ZlcnNpb246IDYgKi9cblxuZXhwb3J0IGNvbnN0IGNhbGxiYWNrcyA9IHt9O1xuXG4vKipcbiAqIFJldHVybnMgYSBudW1iZXIgZnJvbSB0aGUgbmF0aXZlIGJyb3dzZXIgcmFuZG9tIGZ1bmN0aW9uXG4gKlxuICogQHJldHVybnMgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIGNyeXB0b1JhbmRvbSgpIHtcblx0dmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuXHRyZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpWzBdO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBudW1iZXIgdXNpbmcgZGEgb2xkLXNrb29sIE1hdGguUmFuZG9tXG4gKiBJIGxpa2VzIHRvIGNhbGwgaXQgTE9MUmFuZG9tXG4gKlxuICogQHJldHVybnMgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIGJhc2ljUmFuZG9tKCkge1xuXHRyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7XG59XG5cbi8vIFBpY2sgYSByYW5kb20gbnVtYmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGJyb3dzZXIgY2FwYWJpbGl0eVxudmFyIHJhbmRvbUZ1bmM7XG5pZiAod2luZG93LmNyeXB0bykge1xuXHRyYW5kb21GdW5jID0gY3J5cHRvUmFuZG9tO1xufSBlbHNlIHtcblx0cmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tO1xufVxuXG5cbi8qKlxuICogQ2FsbCBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGJhY2tlbmQgdG8gY2FsbCB0aGUgYmluZGluZyB3aXRoIHRoZVxuICogZ2l2ZW4gZGF0YS4gQSBwcm9taXNlIGlzIHJldHVybmVkIGFuZCB3aWxsIGJlIGNvbXBsZXRlZCB3aGVuIHRoZVxuICogYmFja2VuZCByZXNwb25kcy4gVGhpcyB3aWxsIGJlIHJlc29sdmVkIHdoZW4gdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWxcbiAqIG9yIHJlamVjdGVkIGlmIGFuIGVycm9yIGlzIHBhc3NlZCBiYWNrLlxuICogVGhlcmUgaXMgYSB0aW1lb3V0IG1lY2hhbmlzbS4gSWYgdGhlIGNhbGwgZG9lc24ndCByZXNwb25kIGluIHRoZSBnaXZlblxuICogdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGVuIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2FueT19IGFyZ3NcbiAqIEBwYXJhbSB7bnVtYmVyPX0gdGltZW91dFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhbGwobmFtZSwgYXJncywgdGltZW91dCkge1xuXG5cdC8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdFxuXHRpZiAodGltZW91dCA9PSBudWxsKSB7XG5cdFx0dGltZW91dCA9IDA7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSBwcm9taXNlXG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cblx0XHQvLyBDcmVhdGUgYSB1bmlxdWUgY2FsbGJhY2tJRFxuXHRcdHZhciBjYWxsYmFja0lEO1xuXHRcdGRvIHtcblx0XHRcdGNhbGxiYWNrSUQgPSBuYW1lICsgJy0nICsgcmFuZG9tRnVuYygpO1xuXHRcdH0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSk7XG5cblx0XHR2YXIgdGltZW91dEhhbmRsZTtcblx0XHQvLyBTZXQgdGltZW91dFxuXHRcdGlmICh0aW1lb3V0ID4gMCkge1xuXHRcdFx0dGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZWplY3QoRXJyb3IoJ0NhbGwgdG8gJyArIG5hbWUgKyAnIHRpbWVkIG91dC4gUmVxdWVzdCBJRDogJyArIGNhbGxiYWNrSUQpKTtcblx0XHRcdH0sIHRpbWVvdXQpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2tzW2NhbGxiYWNrSURdID0ge1xuXHRcdFx0dGltZW91dEhhbmRsZTogdGltZW91dEhhbmRsZSxcblx0XHRcdHJlamVjdDogcmVqZWN0LFxuXHRcdFx0cmVzb2x2ZTogcmVzb2x2ZVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGF5bG9hZCA9IHtcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0YXJncyxcblx0XHRcdFx0Y2FsbGJhY2tJRCxcblx0XHRcdH07XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNhbGxcbiAgICAgICAgICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnQycgKyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG53aW5kb3cuT2JmdXNjYXRlZENhbGwgPSAoaWQsIGFyZ3MsIHRpbWVvdXQpID0+IHtcblxuICAgIC8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdFxuICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHtcbiAgICAgICAgdGltZW91dCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgcHJvbWlzZVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgdW5pcXVlIGNhbGxiYWNrSURcbiAgICAgICAgdmFyIGNhbGxiYWNrSUQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrSUQgPSBpZCArICctJyArIHJhbmRvbUZ1bmMoKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2tzW2NhbGxiYWNrSURdKTtcblxuICAgICAgICB2YXIgdGltZW91dEhhbmRsZTtcbiAgICAgICAgLy8gU2V0IHRpbWVvdXRcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCdDYWxsIHRvIG1ldGhvZCAnICsgaWQgKyAnIHRpbWVkIG91dC4gUmVxdWVzdCBJRDogJyArIGNhbGxiYWNrSUQpKTtcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgY2FsbGJhY2tcbiAgICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSURdID0ge1xuICAgICAgICAgICAgdGltZW91dEhhbmRsZTogdGltZW91dEhhbmRsZSxcbiAgICAgICAgICAgIHJlamVjdDogcmVqZWN0LFxuICAgICAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuXHRcdFx0XHRpZCxcblx0XHRcdFx0YXJncyxcblx0XHRcdFx0Y2FsbGJhY2tJRCxcblx0XHRcdH07XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNhbGxcbiAgICAgICAgICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnYycgKyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuXG4vKipcbiAqIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkXG4gKiBiaW5kaW5nIGludm9jYXRpb25cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gaW5jb21pbmdNZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsYmFjayhpbmNvbWluZ01lc3NhZ2UpIHtcblx0Ly8gUGFyc2UgdGhlIG1lc3NhZ2Vcblx0bGV0IG1lc3NhZ2U7XG5cdHRyeSB7XG5cdFx0bWVzc2FnZSA9IEpTT04ucGFyc2UoaW5jb21pbmdNZXNzYWdlKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGNvbnN0IGVycm9yID0gYEludmFsaWQgSlNPTiBwYXNzZWQgdG8gY2FsbGJhY2s6ICR7ZS5tZXNzYWdlfS4gTWVzc2FnZTogJHtpbmNvbWluZ01lc3NhZ2V9YDtcblx0XHRydW50aW1lLkxvZ0RlYnVnKGVycm9yKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuXHR9XG5cdGxldCBjYWxsYmFja0lEID0gbWVzc2FnZS5jYWxsYmFja2lkO1xuXHRsZXQgY2FsbGJhY2tEYXRhID0gY2FsbGJhY2tzW2NhbGxiYWNrSURdO1xuXHRpZiAoIWNhbGxiYWNrRGF0YSkge1xuXHRcdGNvbnN0IGVycm9yID0gYENhbGxiYWNrICcke2NhbGxiYWNrSUR9JyBub3QgcmVnaXN0ZXJlZCEhIWA7XG5cdFx0Y29uc29sZS5lcnJvcihlcnJvcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuXHR9XG5cdGNsZWFyVGltZW91dChjYWxsYmFja0RhdGEudGltZW91dEhhbmRsZSk7XG5cblx0ZGVsZXRlIGNhbGxiYWNrc1tjYWxsYmFja0lEXTtcblxuXHRpZiAobWVzc2FnZS5lcnJvcikge1xuXHRcdGNhbGxiYWNrRGF0YS5yZWplY3QobWVzc2FnZS5lcnJvcik7XG5cdH0gZWxzZSB7XG5cdFx0Y2FsbGJhY2tEYXRhLnJlc29sdmUobWVzc2FnZS5yZXN1bHQpO1xuXHR9XG59XG4iLCAiLypcbiBfICAgICAgIF9fICAgICAgXyBfXyAgICBcbnwgfCAgICAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKSBcbnxfXy98X18vXFxfXyxfL18vXy9fX19fLyAgXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuLyoganNoaW50IGVzdmVyc2lvbjogNiAqL1xuXG5pbXBvcnQge0NhbGx9IGZyb20gJy4vY2FsbHMnO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIGJpbmQgZ28gbWV0aG9kIHdyYXBwZXJzXG53aW5kb3cuZ28gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNldEJpbmRpbmdzKGJpbmRpbmdzTWFwKSB7XG5cdHRyeSB7XG5cdFx0YmluZGluZ3NNYXAgPSBKU09OLnBhcnNlKGJpbmRpbmdzTWFwKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH1cblxuXHQvLyBJbml0aWFsaXNlIHRoZSBiaW5kaW5ncyBtYXBcblx0d2luZG93LmdvID0gd2luZG93LmdvIHx8IHt9O1xuXG5cdC8vIEl0ZXJhdGUgcGFja2FnZSBuYW1lc1xuXHRPYmplY3Qua2V5cyhiaW5kaW5nc01hcCkuZm9yRWFjaCgocGFja2FnZU5hbWUpID0+IHtcblxuXHRcdC8vIENyZWF0ZSBpbm5lciBtYXAgaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdHdpbmRvdy5nb1twYWNrYWdlTmFtZV0gPSB3aW5kb3cuZ29bcGFja2FnZU5hbWVdIHx8IHt9O1xuXG5cdFx0Ly8gSXRlcmF0ZSBzdHJ1Y3QgbmFtZXNcblx0XHRPYmplY3Qua2V5cyhiaW5kaW5nc01hcFtwYWNrYWdlTmFtZV0pLmZvckVhY2goKHN0cnVjdE5hbWUpID0+IHtcblxuXHRcdFx0Ly8gQ3JlYXRlIGlubmVyIG1hcCBpZiBpdCBkb2Vzbid0IGV4aXN0XG5cdFx0XHR3aW5kb3cuZ29bcGFja2FnZU5hbWVdW3N0cnVjdE5hbWVdID0gd2luZG93LmdvW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXSB8fCB7fTtcblxuXHRcdFx0T2JqZWN0LmtleXMoYmluZGluZ3NNYXBbcGFja2FnZU5hbWVdW3N0cnVjdE5hbWVdKS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG5cblx0XHRcdFx0d2luZG93LmdvW3BhY2thZ2VOYW1lXVtzdHJ1Y3ROYW1lXVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdC8vIE5vIHRpbWVvdXQgYnkgZGVmYXVsdFxuXHRcdFx0XHRcdGxldCB0aW1lb3V0ID0gMDtcblxuXHRcdFx0XHRcdC8vIEFjdHVhbCBmdW5jdGlvblxuXHRcdFx0XHRcdGZ1bmN0aW9uIGR5bmFtaWMoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIENhbGwoW3BhY2thZ2VOYW1lLCBzdHJ1Y3ROYW1lLCBtZXRob2ROYW1lXS5qb2luKCcuJyksIGFyZ3MsIHRpbWVvdXQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEFsbG93IHNldHRpbmcgdGltZW91dCB0byBmdW5jdGlvblxuXHRcdFx0XHRcdGR5bmFtaWMuc2V0VGltZW91dCA9IGZ1bmN0aW9uIChuZXdUaW1lb3V0KSB7XG5cdFx0XHRcdFx0XHR0aW1lb3V0ID0gbmV3VGltZW91dDtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gQWxsb3cgZ2V0dGluZyB0aW1lb3V0IHRvIGZ1bmN0aW9uXG5cdFx0XHRcdFx0ZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRpbWVvdXQ7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdHJldHVybiBkeW5hbWljO1xuXHRcdFx0XHR9KCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuXG5pbXBvcnQge0NhbGx9IGZyb20gXCIuL2NhbGxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dSZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93UmVsb2FkQXBwKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV1InKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldFN5c3RlbURlZmF1bHRUaGVtZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBU0RUJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRMaWdodFRoZW1lKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV0FMVCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2V0RGFya1RoZW1lKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV0FEVCcpO1xufVxuXG4vKipcbiAqIFBsYWNlIHRoZSB3aW5kb3cgaW4gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93Q2VudGVyKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV2MnKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB3aW5kb3cgdGl0bGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldFRpdGxlKHRpdGxlKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXVCcgKyB0aXRsZSk7XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIHdpbmRvdyBnbyBmdWxsc2NyZWVuXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93RnVsbHNjcmVlbigpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dGJyk7XG59XG5cbi8qKlxuICogUmV2ZXJ0cyB0aGUgd2luZG93IGZyb20gZnVsbHNjcmVlblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1VuZnVsbHNjcmVlbigpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dmJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgaW4gZnVsbCBzY3JlZW4gbW9kZSBvciBub3QuXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gVGhlIHN0YXRlIG9mIHRoZSB3aW5kb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd0lzRnVsbHNjcmVlbigpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpXaW5kb3dJc0Z1bGxzY3JlZW5cIik7XG59XG5cbi8qKlxuICogU2V0IHRoZSBTaXplIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3M6JyArIHdpZHRoICsgJzonICsgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFNpemUgb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8e3c6IG51bWJlciwgaDogbnVtYmVyfT59IFRoZSBzaXplIG9mIHRoZSB3aW5kb3dcblxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93R2V0U2l6ZSgpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpXaW5kb3dHZXRTaXplXCIpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSB3aW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldE1heFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV1o6JyArIHdpZHRoICsgJzonICsgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRNaW5TaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1d6OicgKyB3aWR0aCArICc6JyArIGhlaWdodCk7XG59XG5cblxuXG4vKipcbiAqIFNldCB0aGUgd2luZG93IEFsd2F5c09uVG9wIG9yIG5vdCBvbiB0b3BcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRBbHdheXNPblRvcChiKSB7XG5cbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dBVFA6JyArIChiID8gJzEnIDogJzAnKSk7XG59XG5cblxuXG5cbi8qKlxuICogU2V0IHRoZSBQb3NpdGlvbiBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dTZXRQb3NpdGlvbih4LCB5KSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXcDonICsgeCArICc6JyArIHkpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgUG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8e3g6IG51bWJlciwgeTogbnVtYmVyfT59IFRoZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dHZXRQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpXaW5kb3dHZXRQb3NcIik7XG59XG5cbi8qKlxuICogSGlkZSB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SGlkZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dIJyk7XG59XG5cbi8qKlxuICogU2hvdyB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93U2hvdygpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dTJyk7XG59XG5cbi8qKlxuICogTWF4aW1pc2UgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd01heGltaXNlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV00nKTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgdGhlIE1heGltaXNlIG9mIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dUb2dnbGVNYXhpbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1d0Jyk7XG59XG5cbi8qKlxuICogVW5tYXhpbWlzZSB0aGUgV2luZG93XG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93VW5tYXhpbWlzZSgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1dVJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHdpbmRvdywgaS5lLiB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgbWF4aW1pc2VkIG9yIG5vdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBUaGUgc3RhdGUgb2YgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gV2luZG93SXNNYXhpbWlzZWQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6V2luZG93SXNNYXhpbWlzZWRcIik7XG59XG5cbi8qKlxuICogTWluaW1pc2UgdGhlIFdpbmRvd1xuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd01pbmltaXNlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV20nKTtcbn1cblxuLyoqXG4gKiBVbm1pbmltaXNlIHRoZSBXaW5kb3dcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dVbm1pbmltaXNlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnV3UnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgd2luZG93LCBpLmUuIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyBtaW5pbWlzZWQgb3Igbm90LlxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFRoZSBzdGF0ZSBvZiB0aGUgd2luZG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dJc01pbmltaXNlZCgpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpXaW5kb3dJc01pbmltaXNlZFwiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgd2luZG93LCBpLmUuIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyBub3JtYWwgb3Igbm90LlxuICpcbiAqIEBleHBvcnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFRoZSBzdGF0ZSBvZiB0aGUgd2luZG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaW5kb3dJc05vcm1hbCgpIHtcbiAgICByZXR1cm4gQ2FsbChcIjp3YWlsczpXaW5kb3dJc05vcm1hbFwiKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IFIgUmVkXG4gKiBAcGFyYW0ge251bWJlcn0gRyBHcmVlblxuICogQHBhcmFtIHtudW1iZXJ9IEIgQmx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IEEgQWxwaGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdpbmRvd1NldEJhY2tncm91bmRDb2xvdXIoUiwgRywgQiwgQSkge1xuICAgIGxldCByZ2JhID0gSlNPTi5zdHJpbmdpZnkoe3I6IFIgfHwgMCwgZzogRyB8fCAwLCBiOiBCIHx8IDAsIGE6IEEgfHwgMjU1fSk7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdXcjonICsgcmdiYSk7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5cbmltcG9ydCB7Q2FsbH0gZnJvbSBcIi4vY2FsbHNcIjtcblxuXG4vKipcbiAqIEdldHMgdGhlIGFsbCBzY3JlZW5zLiBDYWxsIHRoaXMgYW5ldyBlYWNoIHRpbWUgeW91IHdhbnQgdG8gcmVmcmVzaCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgd2luZG93aW5nIHN5c3RlbS5cbiAqIEBleHBvcnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3dyYXBwZXIvcnVudGltZScpLlNjcmVlbn0gU2NyZWVuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHtTY3JlZW5bXX0+fSBUaGUgc2NyZWVuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gU2NyZWVuR2V0QWxsKCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOlNjcmVlbkdldEFsbFwiKTtcbn1cbiIsICIvKipcbiAqIEBkZXNjcmlwdGlvbjogVXNlIHRoZSBzeXN0ZW0gZGVmYXVsdCBicm93c2VyIHRvIG9wZW4gdGhlIHVybFxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCcm93c2VyT3BlblVSTCh1cmwpIHtcbiAgd2luZG93LldhaWxzSW52b2tlKCdCTzonICsgdXJsKTtcbn0iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuaW1wb3J0IHtDYWxsfSBmcm9tIFwiLi9jYWxsc1wiO1xuXG4vKipcbiAqIFNldCB0aGUgU2l6ZSBvZiB0aGUgd2luZG93XG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENsaXBib2FyZFNldFRleHQodGV4dCkge1xuICAgIHJldHVybiBDYWxsKFwiOndhaWxzOkNsaXBib2FyZFNldFRleHRcIiwgW3RleHRdKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgY2xpcGJvYXJkXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybiB7UHJvbWlzZTx7c3RyaW5nfT59IFRleHQgY29udGVudCBvZiB0aGUgY2xpcGJvYXJkXG5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENsaXBib2FyZEdldFRleHQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6Q2xpcGJvYXJkR2V0VGV4dFwiKTtcbn0iLCAiLypcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IHNob3c7IHdpbGwgYWx3YXlzIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGhpZGU7IHdpbGwgYWx3YXlzIGhpZGUgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG5cblRoaXMgcnVsZSBpcyBpbmhlcml0ZWQgbGlrZSBub3JtYWwgQ1NTIHJ1bGVzLCBzbyBuZXN0aW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQpIHtcbiAgICAvLyBQcm9jZXNzIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgY29uc3QgZGVmYXVsdENvbnRleHRNZW51QWN0aW9uID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1kZWZhdWx0LWNvbnRleHRtZW51XCIpLnRyaW0oKTtcbiAgICBzd2l0Y2ggKGRlZmF1bHRDb250ZXh0TWVudUFjdGlvbikge1xuICAgICAgICBjYXNlIFwic2hvd1wiOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiaGlkZVwiOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGNvbnRlbnRFZGl0YWJsZSBpcyB0cnVlXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBhbmQgYWN0aW9uIGlzIG9uIHRoZSBzZWxlY3RlZCBlbGVtZW50c1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgaGFzU2VsZWN0aW9uID0gKHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0YWduYW1lIGlzIGlucHV0IG9yIHRleHRhcmVhXG4gICAgICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSBcIklOUFVUXCIgfHwgZWxlbWVudC50YWdOYW1lID09PSBcIlRFWFRBUkVBXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uIHx8ICghZWxlbWVudC5yZWFkT25seSAmJiAhZWxlbWVudC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlkZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQgKiBhcyBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtldmVudExpc3RlbmVycywgRXZlbnRzRW1pdCwgRXZlbnRzTm90aWZ5LCBFdmVudHNPZmYsIEV2ZW50c09uLCBFdmVudHNPbmNlLCBFdmVudHNPbk11bHRpcGxlfSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQge0NhbGwsIENhbGxiYWNrLCBjYWxsYmFja3N9IGZyb20gJy4vY2FsbHMnO1xuaW1wb3J0IHtTZXRCaW5kaW5nc30gZnJvbSBcIi4vYmluZGluZ3NcIjtcbmltcG9ydCAqIGFzIFdpbmRvdyBmcm9tIFwiLi93aW5kb3dcIjtcbmltcG9ydCAqIGFzIFNjcmVlbiBmcm9tIFwiLi9zY3JlZW5cIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZFwiO1xuaW1wb3J0ICogYXMgQ29udGV4dE1lbnUgZnJvbSBcIi4vY29udGV4dG1lbnVcIjtcblxuXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpIHtcbiAgICB3aW5kb3cuV2FpbHNJbnZva2UoJ1EnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNob3coKSB7XG4gICAgd2luZG93LldhaWxzSW52b2tlKCdTJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCkge1xuICAgIHdpbmRvdy5XYWlsc0ludm9rZSgnSCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIENhbGwoXCI6d2FpbHM6RW52aXJvbm1lbnRcIik7XG59XG5cbi8vIFRoZSBKUyBydW50aW1lXG53aW5kb3cucnVudGltZSA9IHtcbiAgICAuLi5Mb2csXG4gICAgLi4uV2luZG93LFxuICAgIC4uLkJyb3dzZXIsXG4gICAgLi4uU2NyZWVuLFxuICAgIC4uLkNsaXBib2FyZCxcbiAgICBFdmVudHNPbixcbiAgICBFdmVudHNPbmNlLFxuICAgIEV2ZW50c09uTXVsdGlwbGUsXG4gICAgRXZlbnRzRW1pdCxcbiAgICBFdmVudHNPZmYsXG4gICAgRW52aXJvbm1lbnQsXG4gICAgU2hvdyxcbiAgICBIaWRlLFxuICAgIFF1aXRcbn07XG5cbi8vIEludGVybmFsIHdhaWxzIGVuZHBvaW50c1xud2luZG93LndhaWxzID0ge1xuICAgIENhbGxiYWNrLFxuICAgIEV2ZW50c05vdGlmeSxcbiAgICBTZXRCaW5kaW5ncyxcbiAgICBldmVudExpc3RlbmVycyxcbiAgICBjYWxsYmFja3MsXG4gICAgZmxhZ3M6IHtcbiAgICAgICAgZGlzYWJsZVNjcm9sbGJhckRyYWc6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlRGVmYXVsdENvbnRleHRNZW51OiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUmVzaXplOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdEN1cnNvcjogbnVsbCxcbiAgICAgICAgYm9yZGVyVGhpY2tuZXNzOiA2LFxuICAgICAgICBzaG91bGREcmFnOiBmYWxzZSxcbiAgICAgICAgZGVmZXJEcmFnVG9Nb3VzZU1vdmU6IHRydWUsXG4gICAgICAgIGNzc0RyYWdQcm9wZXJ0eTogXCItLXdhaWxzLWRyYWdnYWJsZVwiLFxuICAgICAgICBjc3NEcmFnVmFsdWU6IFwiZHJhZ1wiLFxuICAgIH1cbn07XG5cbi8vIFNldCB0aGUgYmluZGluZ3NcbmlmICh3aW5kb3cud2FpbHNiaW5kaW5ncykge1xuICAgIHdpbmRvdy53YWlscy5TZXRCaW5kaW5ncyh3aW5kb3cud2FpbHNiaW5kaW5ncyk7XG4gICAgZGVsZXRlIHdpbmRvdy53YWlscy5TZXRCaW5kaW5ncztcbn1cblxuLy8gKGJvb2wpIFRoaXMgaXMgZXZhbHVhdGVkIGF0IGJ1aWxkIHRpbWUgaW4gcGFja2FnZS5qc29uXG5pZiAoIURFQlVHKSB7XG4gICAgZGVsZXRlIHdpbmRvdy53YWlsc2JpbmRpbmdzO1xufVxuXG5sZXQgZHJhZ1Rlc3QgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB2YWwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLnRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZSh3aW5kb3cud2FpbHMuZmxhZ3MuY3NzRHJhZ1Byb3BlcnR5KTtcbiAgICBpZiAodmFsKSB7XG4gICAgICB2YWwgPSB2YWwudHJpbSgpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodmFsICE9PSB3aW5kb3cud2FpbHMuZmxhZ3MuY3NzRHJhZ1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZS5idXR0b25zICE9PSAxKSB7XG4gICAgICAgIC8vIERvIG5vdCBzdGFydCBkcmFnZ2luZyBpZiBub3QgdGhlIHByaW1hcnkgYnV0dG9uIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZS5kZXRhaWwgIT09IDEpIHtcbiAgICAgICAgLy8gRG8gbm90IHN0YXJ0IGRyYWdnaW5nIGlmIG1vcmUgdGhhbiBvbmNlIGhhcyBiZWVuIGNsaWNrZWQsIGUuZy4gd2hlbiBkb3VibGUgY2xpY2tpbmdcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufTtcblxud2luZG93LndhaWxzLnNldENTU0RyYWdQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIHdpbmRvdy53YWlscy5mbGFncy5jc3NEcmFnUHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICB3aW5kb3cud2FpbHMuZmxhZ3MuY3NzRHJhZ1ZhbHVlID0gdmFsdWU7XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4ge1xuXG4gICAgLy8gQ2hlY2sgZm9yIHJlc2l6aW5nXG4gICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5yZXNpemVFZGdlKSB7XG4gICAgICAgIHdpbmRvdy5XYWlsc0ludm9rZShcInJlc2l6ZTpcIiArIHdpbmRvdy53YWlscy5mbGFncy5yZXNpemVFZGdlKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRyYWdUZXN0KGUpKSB7XG4gICAgICAgIGlmICh3aW5kb3cud2FpbHMuZmxhZ3MuZGlzYWJsZVNjcm9sbGJhckRyYWcpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY2hlY2tzIGZvciBjbGlja3Mgb24gdGhlIHNjcm9sbCBiYXJcbiAgICAgICAgICAgIGlmIChlLm9mZnNldFggPiBlLnRhcmdldC5jbGllbnRXaWR0aCB8fCBlLm9mZnNldFkgPiBlLnRhcmdldC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kZWZlckRyYWdUb01vdXNlTW92ZSkge1xuICAgICAgICAgICAgd2luZG93LndhaWxzLmZsYWdzLnNob3VsZERyYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB3aW5kb3cuV2FpbHNJbnZva2UoXCJkcmFnXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZyA9IGZhbHNlO1xuICAgIH1cbn0pO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICgpID0+IHtcbiAgICB3aW5kb3cud2FpbHMuZmxhZ3Muc2hvdWxkRHJhZyA9IGZhbHNlO1xufSk7XG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShjdXJzb3IpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yIHx8IHdpbmRvdy53YWlscy5mbGFncy5kZWZhdWx0Q3Vyc29yO1xuICAgIHdpbmRvdy53YWlscy5mbGFncy5yZXNpemVFZGdlID0gY3Vyc29yO1xufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAod2luZG93LndhaWxzLmZsYWdzLnNob3VsZERyYWcpIHtcbiAgICAgICAgd2luZG93LndhaWxzLmZsYWdzLnNob3VsZERyYWcgPSBmYWxzZTtcbiAgICAgICAgbGV0IG1vdXNlUHJlc3NlZCA9IGUuYnV0dG9ucyAhPT0gdW5kZWZpbmVkID8gZS5idXR0b25zIDogZS53aGljaDtcbiAgICAgICAgaWYgKG1vdXNlUHJlc3NlZCA+IDApIHtcbiAgICAgICAgICAgIHdpbmRvdy5XYWlsc0ludm9rZShcImRyYWdcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF3aW5kb3cud2FpbHMuZmxhZ3MuZW5hYmxlUmVzaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kZWZhdWx0Q3Vyc29yID09IG51bGwpIHtcbiAgICAgICAgd2luZG93LndhaWxzLmZsYWdzLmRlZmF1bHRDdXJzb3IgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yO1xuICAgIH1cbiAgICBpZiAod2luZG93Lm91dGVyV2lkdGggLSBlLmNsaWVudFggPCB3aW5kb3cud2FpbHMuZmxhZ3MuYm9yZGVyVGhpY2tuZXNzICYmIHdpbmRvdy5vdXRlckhlaWdodCAtIGUuY2xpZW50WSA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3MpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmN1cnNvciA9IFwic2UtcmVzaXplXCI7XG4gICAgfVxuICAgIGxldCByaWdodEJvcmRlciA9IHdpbmRvdy5vdXRlcldpZHRoIC0gZS5jbGllbnRYIDwgd2luZG93LndhaWxzLmZsYWdzLmJvcmRlclRoaWNrbmVzcztcbiAgICBsZXQgbGVmdEJvcmRlciA9IGUuY2xpZW50WCA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3M7XG4gICAgbGV0IHRvcEJvcmRlciA9IGUuY2xpZW50WSA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3M7XG4gICAgbGV0IGJvdHRvbUJvcmRlciA9IHdpbmRvdy5vdXRlckhlaWdodCAtIGUuY2xpZW50WSA8IHdpbmRvdy53YWlscy5mbGFncy5ib3JkZXJUaGlja25lc3M7XG5cbiAgICAvLyBJZiB3ZSBhcmVuJ3Qgb24gYW4gZWRnZSwgYnV0IHdlcmUsIHJlc2V0IHRoZSBjdXJzb3IgdG8gZGVmYXVsdFxuICAgIGlmICghbGVmdEJvcmRlciAmJiAhcmlnaHRCb3JkZXIgJiYgIXRvcEJvcmRlciAmJiAhYm90dG9tQm9yZGVyICYmIHdpbmRvdy53YWlscy5mbGFncy5yZXNpemVFZGdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfSBlbHNlIGlmIChyaWdodEJvcmRlciAmJiBib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInNlLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyICYmIGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwic3ctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIgJiYgdG9wQm9yZGVyKSBzZXRSZXNpemUoXCJudy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQm9yZGVyICYmIHJpZ2h0Qm9yZGVyKSBzZXRSZXNpemUoXCJuZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdEJvcmRlcikgc2V0UmVzaXplKFwidy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQm9yZGVyKSBzZXRSZXNpemUoXCJuLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInMtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHJpZ2h0Qm9yZGVyKSBzZXRSZXNpemUoXCJlLXJlc2l6ZVwiKTtcblxufSk7XG5cbi8vIFNldHVwIGNvbnRleHQgbWVudSBob29rXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBmdW5jdGlvbiAoZSkge1xuICAgIC8vIGFsd2F5cyBzaG93IHRoZSBjb250ZXh0bWVudSBpbiBkZWJ1ZyAmIGRldlxuICAgIGlmIChERUJVRykgcmV0dXJuO1xuXG4gICAgaWYgKHdpbmRvdy53YWlscy5mbGFncy5kaXNhYmxlRGVmYXVsdENvbnRleHRNZW51KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGUpO1xuICAgIH1cbn0pO1xuXG53aW5kb3cuV2FpbHNJbnZva2UoXCJydW50aW1lOnJlYWR5XCIpOyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0JBLFdBQVMsZUFBZSxPQUFPLFNBQVM7QUFJdkMsV0FBTyxZQUFZLE1BQU0sUUFBUSxPQUFPO0FBQUEsRUFDekM7QUFRTyxXQUFTLFNBQVMsU0FBUztBQUNqQyxtQkFBZSxLQUFLLE9BQU87QUFBQSxFQUM1QjtBQVFPLFdBQVMsU0FBUyxTQUFTO0FBQ2pDLG1CQUFlLEtBQUssT0FBTztBQUFBLEVBQzVCO0FBUU8sV0FBUyxTQUFTLFNBQVM7QUFDakMsbUJBQWUsS0FBSyxPQUFPO0FBQUEsRUFDNUI7QUFRTyxXQUFTLFFBQVEsU0FBUztBQUNoQyxtQkFBZSxLQUFLLE9BQU87QUFBQSxFQUM1QjtBQVFPLFdBQVMsV0FBVyxTQUFTO0FBQ25DLG1CQUFlLEtBQUssT0FBTztBQUFBLEVBQzVCO0FBUU8sV0FBUyxTQUFTLFNBQVM7QUFDakMsbUJBQWUsS0FBSyxPQUFPO0FBQUEsRUFDNUI7QUFRTyxXQUFTLFNBQVMsU0FB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 diff --git a/v2/internal/frontend/runtime/runtime_prod_desktop.js b/v2/internal/frontend/runtime/runtime_prod_desktop.js index a22739c94..9b2f39ff0 100644 --- a/v2/internal/frontend/runtime/runtime_prod_desktop.js +++ b/v2/internal/frontend/runtime/runtime_prod_desktop.js @@ -1 +1 @@ -(()=>{var L=Object.defineProperty;var c=(e,n)=>{for(var o in n)L(e,o,{get:n[o],enumerable:!0})};var m={};c(m,{LogDebug:()=>M,LogError:()=>A,LogFatal:()=>H,LogInfo:()=>P,LogLevel:()=>J,LogPrint:()=>R,LogTrace:()=>z,LogWarning:()=>B,SetLogLevel:()=>G});function d(e,n){window.WailsInvoke("L"+e+n)}function z(e){d("T",e)}function R(e){d("P",e)}function M(e){d("D",e)}function P(e){d("I",e)}function B(e){d("W",e)}function A(e){d("E",e)}function H(e){d("F",e)}function G(e){d("S",e)}var J={TRACE:1,DEBUG:2,INFO:3,WARNING:4,ERROR:5};var v=class{constructor(n,o,i){this.eventName=n,this.maxCallbacks=i||-1,this.Callback=t=>(o.apply(null,t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},l={};function p(e,n,o){l[e]=l[e]||[];let i=new v(e,n,o);return l[e].push(i),()=>F(i)}function b(e,n){return p(e,n,-1)}function E(e,n){return p(e,n,1)}function S(e){let n=e.name;if(l[n]){let o=l[n].slice();for(let i=l[n].length-1;i>=0;i-=1){let t=l[n][i],r=e.data;t.Callback(r)&&o.splice(i,1)}o.length===0?g(n):l[n]=o}}function y(e){let n;try{n=JSON.parse(e)}catch{let i="Invalid JSON passed to Notify: "+e;throw new Error(i)}S(n)}function D(e){let n={name:e,data:[].slice.apply(arguments).slice(1)};S(n),window.WailsInvoke("EE"+JSON.stringify(n))}function g(e){delete l[e],window.WailsInvoke("EX"+e)}function C(e,...n){g(e),n.length>0&&n.forEach(o=>{g(o)})}function F(e){let n=e.eventName;l[n]=l[n].filter(o=>o!==e),l[n].length===0&&g(n)}var f={};function U(){var e=new Uint32Array(1);return window.crypto.getRandomValues(e)[0]}function j(){return Math.random()*9007199254740991}var W;window.crypto?W=U:W=j;function s(e,n,o){return o==null&&(o=0),new Promise(function(i,t){var r;do r=e+"-"+W();while(f[r]);var a;o>0&&(a=setTimeout(function(){t(Error("Call to "+e+" timed out. Request ID: "+r))},o)),f[r]={timeoutHandle:a,reject:t,resolve:i};try{let u={name:e,args:n,callbackID:r};window.WailsInvoke("C"+JSON.stringify(u))}catch(u){console.error(u)}})}window.ObfuscatedCall=(e,n,o)=>(o==null&&(o=0),new Promise(function(i,t){var r;do r=e+"-"+W();while(f[r]);var a;o>0&&(a=setTimeout(function(){t(Error("Call to method "+e+" timed out. Request ID: "+r))},o)),f[r]={timeoutHandle:a,reject:t,resolve:i};try{let u={id:e,args:n,callbackID:r};window.WailsInvoke("c"+JSON.stringify(u))}catch(u){console.error(u)}}));function T(e){let n;try{n=JSON.parse(e)}catch(t){let r=`Invalid JSON passed to callback: ${t.message}. Message: ${e}`;throw runtime.LogDebug(r),new Error(r)}let o=n.callbackid,i=f[o];if(!i){let t=`Callback '${o}' not registered!!!`;throw console.error(t),new Error(t)}clearTimeout(i.timeoutHandle),delete f[o],n.error?i.reject(n.error):i.resolve(n.result)}window.go={};function O(e){try{e=JSON.parse(e)}catch(n){console.error(n)}window.go=window.go||{},Object.keys(e).forEach(n=>{window.go[n]=window.go[n]||{},Object.keys(e[n]).forEach(o=>{window.go[n][o]=window.go[n][o]||{},Object.keys(e[n][o]).forEach(i=>{window.go[n][o][i]=function(){let t=0;function r(){let a=[].slice.call(arguments);return s([n,o,i].join("."),a,t)}return r.setTimeout=function(a){t=a},r.getTimeout=function(){return t},r}()})})})}var x={};c(x,{WindowCenter:()=>q,WindowFullscreen:()=>Z,WindowGetPosition:()=>se,WindowGetSize:()=>ne,WindowHide:()=>le,WindowIsFullscreen:()=>_,WindowIsMaximised:()=>ue,WindowIsMinimised:()=>pe,WindowIsNormal:()=>We,WindowMaximise:()=>we,WindowMinimise:()=>ce,WindowReload:()=>N,WindowReloadApp:()=>V,WindowSetAlwaysOnTop:()=>te,WindowSetBackgroundColour:()=>me,WindowSetDarkTheme:()=>$,WindowSetLightTheme:()=>Y,WindowSetMaxSize:()=>oe,WindowSetMinSize:()=>ie,WindowSetPosition:()=>re,WindowSetSize:()=>ee,WindowSetSystemDefaultTheme:()=>X,WindowSetTitle:()=>Q,WindowShow:()=>ae,WindowToggleMaximise:()=>de,WindowUnfullscreen:()=>K,WindowUnmaximise:()=>fe,WindowUnminimise:()=>ge});function N(){window.location.reload()}function V(){window.WailsInvoke("WR")}function X(){window.WailsInvoke("WASDT")}function Y(){window.WailsInvoke("WALT")}function $(){window.WailsInvoke("WADT")}function q(){window.WailsInvoke("Wc")}function Q(e){window.WailsInvoke("WT"+e)}function Z(){window.WailsInvoke("WF")}function K(){window.WailsInvoke("Wf")}function _(){return s(":wails:WindowIsFullscreen")}function ee(e,n){window.WailsInvoke("Ws:"+e+":"+n)}function ne(){return s(":wails:WindowGetSize")}function oe(e,n){window.WailsInvoke("WZ:"+e+":"+n)}function ie(e,n){window.WailsInvoke("Wz:"+e+":"+n)}function te(e){window.WailsInvoke("WATP:"+(e?"1":"0"))}function re(e,n){window.WailsInvoke("Wp:"+e+":"+n)}function se(){return s(":wails:WindowGetPos")}function le(){window.WailsInvoke("WH")}function ae(){window.WailsInvoke("WS")}function we(){window.WailsInvoke("WM")}function de(){window.WailsInvoke("Wt")}function fe(){window.WailsInvoke("WU")}function ue(){return s(":wails:WindowIsMaximised")}function ce(){window.WailsInvoke("Wm")}function ge(){window.WailsInvoke("Wu")}function pe(){return s(":wails:WindowIsMinimised")}function We(){return s(":wails:WindowIsNormal")}function me(e,n,o,i){let t=JSON.stringify({r:e||0,g:n||0,b:o||0,a:i||255});window.WailsInvoke("Wr:"+t)}var k={};c(k,{ScreenGetAll:()=>ve});function ve(){return s(":wails:ScreenGetAll")}var h={};c(h,{BrowserOpenURL:()=>xe});function xe(e){window.WailsInvoke("BO:"+e)}var I={};c(I,{ClipboardGetText:()=>he,ClipboardSetText:()=>ke});function ke(e){return s(":wails:ClipboardSetText",[e])}function he(){return s(":wails:ClipboardGetText")}function Ie(){window.WailsInvoke("Q")}function be(){window.WailsInvoke("S")}function Ee(){window.WailsInvoke("H")}function Se(){return s(":wails:Environment")}window.runtime={...m,...x,...h,...k,...I,EventsOn:b,EventsOnce:E,EventsOnMultiple:p,EventsEmit:D,EventsOff:C,Environment:Se,Show:be,Hide:Ee,Quit:Ie};window.wails={Callback:T,EventsNotify:y,SetBindings:O,eventListeners:l,callbacks:f,flags:{disableScrollbarDrag:!1,disableWailsDefaultContextMenu:!1,enableResize:!1,defaultCursor:null,borderThickness:6,shouldDrag:!1,deferDragToMouseMove:!0,cssDragProperty:"--wails-draggable",cssDragValue:"drag"}};window.wailsbindings&&(window.wails.SetBindings(window.wailsbindings),delete window.wails.SetBindings);delete window.wailsbindings;var ye=function(e){var n=window.getComputedStyle(e.target).getPropertyValue(window.wails.flags.cssDragProperty);return n&&(n=n.trim()),!(n!==window.wails.flags.cssDragValue||e.buttons!==1||e.detail!==1)};window.wails.setCSSDragProperties=function(e,n){window.wails.flags.cssDragProperty=e,window.wails.flags.cssDragValue=n};window.addEventListener("mousedown",e=>{if(window.wails.flags.resizeEdge){window.WailsInvoke("resize:"+window.wails.flags.resizeEdge),e.preventDefault();return}if(ye(e)){if(window.wails.flags.disableScrollbarDrag&&(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight))return;window.wails.flags.deferDragToMouseMove?window.wails.flags.shouldDrag=!0:(e.preventDefault(),window.WailsInvoke("drag"));return}else window.wails.flags.shouldDrag=!1});window.addEventListener("mouseup",()=>{window.wails.flags.shouldDrag=!1});function w(e){document.documentElement.style.cursor=e||window.wails.flags.defaultCursor,window.wails.flags.resizeEdge=e}window.addEventListener("mousemove",function(e){if(window.wails.flags.shouldDrag&&(window.wails.flags.shouldDrag=!1,(e.buttons!==void 0?e.buttons:e.which)>0)){window.WailsInvoke("drag");return}if(!window.wails.flags.enableResize)return;window.wails.flags.defaultCursor==null&&(window.wails.flags.defaultCursor=document.documentElement.style.cursor),window.outerWidth-e.clientX{var P=Object.defineProperty;var c=(e,n)=>{for(var o in n)P(e,o,{get:n[o],enumerable:!0})};var x={};c(x,{LogDebug:()=>G,LogError:()=>F,LogFatal:()=>J,LogInfo:()=>H,LogLevel:()=>j,LogPrint:()=>B,LogTrace:()=>A,LogWarning:()=>U,SetLogLevel:()=>N});function f(e,n){window.WailsInvoke("L"+e+n)}function A(e){f("T",e)}function B(e){f("P",e)}function G(e){f("D",e)}function H(e){f("I",e)}function U(e){f("W",e)}function F(e){f("E",e)}function J(e){f("F",e)}function N(e){f("S",e)}var j={TRACE:1,DEBUG:2,INFO:3,WARNING:4,ERROR:5};var v=class{constructor(n,o,t){this.eventName=n,this.maxCallbacks=t||-1,this.Callback=i=>(o.apply(null,i),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},a={};function p(e,n,o){a[e]=a[e]||[];let t=new v(e,n,o);return a[e].push(t),()=>V(t)}function y(e,n){return p(e,n,-1)}function C(e,n){return p(e,n,1)}function D(e){let n=e.name;if(a[n]){let o=a[n].slice();for(let t=a[n].length-1;t>=0;t-=1){let i=a[n][t],r=e.data;i.Callback(r)&&o.splice(t,1)}o.length===0?g(n):a[n]=o}}function T(e){let n;try{n=JSON.parse(e)}catch{let t="Invalid JSON passed to Notify: "+e;throw new Error(t)}D(n)}function O(e){let n={name:e,data:[].slice.apply(arguments).slice(1)};D(n),window.WailsInvoke("EE"+JSON.stringify(n))}function g(e){delete a[e],window.WailsInvoke("EX"+e)}function L(e,...n){g(e),n.length>0&&n.forEach(o=>{g(o)})}function V(e){let n=e.eventName;a[n]=a[n].filter(o=>o!==e),a[n].length===0&&g(n)}var u={};function X(){var e=new Uint32Array(1);return window.crypto.getRandomValues(e)[0]}function Y(){return Math.random()*9007199254740991}var W;window.crypto?W=X:W=Y;function s(e,n,o){return o==null&&(o=0),new Promise(function(t,i){var r;do r=e+"-"+W();while(u[r]);var l;o>0&&(l=setTimeout(function(){i(Error("Call to "+e+" timed out. Request ID: "+r))},o)),u[r]={timeoutHandle:l,reject:i,resolve:t};try{let d={name:e,args:n,callbackID:r};window.WailsInvoke("C"+JSON.stringify(d))}catch(d){console.error(d)}})}window.ObfuscatedCall=(e,n,o)=>(o==null&&(o=0),new Promise(function(t,i){var r;do r=e+"-"+W();while(u[r]);var l;o>0&&(l=setTimeout(function(){i(Error("Call to method "+e+" timed out. Request ID: "+r))},o)),u[r]={timeoutHandle:l,reject:i,resolve:t};try{let d={id:e,args:n,callbackID:r};window.WailsInvoke("c"+JSON.stringify(d))}catch(d){console.error(d)}}));function z(e){let n;try{n=JSON.parse(e)}catch(i){let r=`Invalid JSON passed to callback: ${i.message}. Message: ${e}`;throw runtime.LogDebug(r),new Error(r)}let o=n.callbackid,t=u[o];if(!t){let i=`Callback '${o}' not registered!!!`;throw console.error(i),new Error(i)}clearTimeout(t.timeoutHandle),delete u[o],n.error?t.reject(n.error):t.resolve(n.result)}window.go={};function M(e){try{e=JSON.parse(e)}catch(n){console.error(n)}window.go=window.go||{},Object.keys(e).forEach(n=>{window.go[n]=window.go[n]||{},Object.keys(e[n]).forEach(o=>{window.go[n][o]=window.go[n][o]||{},Object.keys(e[n][o]).forEach(t=>{window.go[n][o][t]=function(){let i=0;function r(){let l=[].slice.call(arguments);return s([n,o,t].join("."),l,i)}return r.setTimeout=function(l){i=l},r.getTimeout=function(){return i},r}()})})})}var h={};c(h,{WindowCenter:()=>_,WindowFullscreen:()=>ne,WindowGetPosition:()=>de,WindowGetSize:()=>re,WindowHide:()=>fe,WindowIsFullscreen:()=>te,WindowIsMaximised:()=>We,WindowIsMinimised:()=>ve,WindowIsNormal:()=>he,WindowMaximise:()=>ce,WindowMinimise:()=>me,WindowReload:()=>$,WindowReloadApp:()=>q,WindowSetAlwaysOnTop:()=>ae,WindowSetBackgroundColour:()=>ke,WindowSetDarkTheme:()=>K,WindowSetLightTheme:()=>Z,WindowSetMaxSize:()=>se,WindowSetMinSize:()=>le,WindowSetPosition:()=>we,WindowSetSize:()=>ie,WindowSetSystemDefaultTheme:()=>Q,WindowSetTitle:()=>ee,WindowShow:()=>ue,WindowToggleMaximise:()=>ge,WindowUnfullscreen:()=>oe,WindowUnmaximise:()=>pe,WindowUnminimise:()=>xe});function $(){window.location.reload()}function q(){window.WailsInvoke("WR")}function Q(){window.WailsInvoke("WASDT")}function Z(){window.WailsInvoke("WALT")}function K(){window.WailsInvoke("WADT")}function _(){window.WailsInvoke("Wc")}function ee(e){window.WailsInvoke("WT"+e)}function ne(){window.WailsInvoke("WF")}function oe(){window.WailsInvoke("Wf")}function te(){return s(":wails:WindowIsFullscreen")}function ie(e,n){window.WailsInvoke("Ws:"+e+":"+n)}function re(){return s(":wails:WindowGetSize")}function se(e,n){window.WailsInvoke("WZ:"+e+":"+n)}function le(e,n){window.WailsInvoke("Wz:"+e+":"+n)}function ae(e){window.WailsInvoke("WATP:"+(e?"1":"0"))}function we(e,n){window.WailsInvoke("Wp:"+e+":"+n)}function de(){return s(":wails:WindowGetPos")}function fe(){window.WailsInvoke("WH")}function ue(){window.WailsInvoke("WS")}function ce(){window.WailsInvoke("WM")}function ge(){window.WailsInvoke("Wt")}function pe(){window.WailsInvoke("WU")}function We(){return s(":wails:WindowIsMaximised")}function me(){window.WailsInvoke("Wm")}function xe(){window.WailsInvoke("Wu")}function ve(){return s(":wails:WindowIsMinimised")}function he(){return s(":wails:WindowIsNormal")}function ke(e,n,o,t){let i=JSON.stringify({r:e||0,g:n||0,b:o||0,a:t||255});window.WailsInvoke("Wr:"+i)}var k={};c(k,{ScreenGetAll:()=>Ie});function Ie(){return s(":wails:ScreenGetAll")}var I={};c(I,{BrowserOpenURL:()=>be});function be(e){window.WailsInvoke("BO:"+e)}var b={};c(b,{ClipboardGetText:()=>Ee,ClipboardSetText:()=>Se});function Se(e){return s(":wails:ClipboardSetText",[e])}function Ee(){return s(":wails:ClipboardGetText")}function R(e){let n=e.target;switch(window.getComputedStyle(n).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(n.isContentEditable)return;let i=window.getSelection(),r=i.toString().length>0;if(r)for(let l=0;l{if(window.wails.flags.resizeEdge){window.WailsInvoke("resize:"+window.wails.flags.resizeEdge),e.preventDefault();return}if(Le(e)){if(window.wails.flags.disableScrollbarDrag&&(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight))return;window.wails.flags.deferDragToMouseMove?window.wails.flags.shouldDrag=!0:(e.preventDefault(),window.WailsInvoke("drag"));return}else window.wails.flags.shouldDrag=!1});window.addEventListener("mouseup",()=>{window.wails.flags.shouldDrag=!1});function w(e){document.documentElement.style.cursor=e||window.wails.flags.defaultCursor,window.wails.flags.resizeEdge=e}window.addEventListener("mousemove",function(e){if(window.wails.flags.shouldDrag&&(window.wails.flags.shouldDrag=!1,(e.buttons!==void 0?e.buttons:e.which)>0)){window.WailsInvoke("drag");return}if(!window.wails.flags.enableResize)return;window.wails.flags.defaultCursor==null&&(window.wails.flags.defaultCursor=document.documentElement.style.cursor),window.outerWidth-e.clientX contentEditable is true OR text has been selected OR element is input or textarea | +| `--default-contextmenu: show;` | will always show the default context menu | +| `--default-contextmenu: hide;` | will always hide the default context menu | + +This rule is inherited like any normal CSS rule, so nesting works as expected. + +:::note +This filtering functionality is only enabled in production, so in development and in debug build, the full context-menu is always available everywhere. +::: + +:::warning +This filtering functionality is NOT a security measure, the developer should expect that the full context-menu could be leaked anytime which could contain commands like (Download image, Reload, Save webpage), if this is a concern, the developer SHOULD NOT enable the default context-menu. +::: + Name: EnableDefaultContextMenu
Type: `bool` diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 43b1bf08a..f82f2fd53 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `-devtools` production build flag. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2725) - Added `EnableDefaultContextMenu` option to allow enabling the browser's default context-menu in production . Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2733) +- Added smart functionality for the default context-menu in production with CSS styles to control it. Added by @mmghv in [PR](https://github.com/wailsapp/wails/pull/2748) ### Changed From f150d251520c0a4acd2b8f45e4d49949443bda72 Mon Sep 17 00:00:00 2001 From: Marcus Crane Date: Thu, 6 Jul 2023 22:51:40 +1200 Subject: [PATCH 19/36] Update October showcase image (#2762) --- website/static/img/showcase/october.webp | Bin 71756 -> 39314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/website/static/img/showcase/october.webp b/website/static/img/showcase/october.webp index e731189a47ebe2a28cc6b6aa3617426636a4b2cf..98e620c3bcf66751ce59c72e40aa0e5b865f22d0 100644 GIT binary patch literal 39314 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 literal 71756 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%0DqB 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 From 61f7b10f360721f42803253b30509fc0ed4d3a16 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 11 Jul 2023 05:27:41 +1000 Subject: [PATCH 20/36] [v2 templates] Add explicit style import (#2721) * [v2 templates] Add explicit style import * [v2] Remove style import --- v2/pkg/templates/generate/assets/lit-ts/frontend/index.tmpl.html | 1 - v2/pkg/templates/generate/assets/lit/frontend/index.tmpl.html | 1 - .../templates/generate/assets/svelte-ts/frontend/index.tmpl.html | 1 - v2/pkg/templates/generate/assets/vue-ts/frontend/index.tmpl.html | 1 - v2/pkg/templates/generate/assets/vue/frontend/index.tmpl.html | 1 - v2/pkg/templates/templates/lit-ts/frontend/index.tmpl.html | 1 - v2/pkg/templates/templates/lit-ts/frontend/src/my-element.ts | 1 + v2/pkg/templates/templates/lit/frontend/index.tmpl.html | 1 - v2/pkg/templates/templates/lit/frontend/src/my-element.js | 1 + v2/pkg/templates/templates/plain/frontend/src/main.js | 1 + v2/pkg/templates/templates/svelte-ts/frontend/index.tmpl.html | 1 - v2/pkg/templates/templates/vue-ts/frontend/index.tmpl.html | 1 - v2/pkg/templates/templates/vue-ts/frontend/src/main.ts | 1 + v2/pkg/templates/templates/vue/frontend/index.tmpl.html | 1 - v2/pkg/templates/templates/vue/frontend/src/main.js | 1 + 15 files changed, 5 insertions(+), 10 deletions(-) diff --git a/v2/pkg/templates/generate/assets/lit-ts/frontend/index.tmpl.html b/v2/pkg/templates/generate/assets/lit-ts/frontend/index.tmpl.html index 4944992b5..febcb76cb 100644 --- a/v2/pkg/templates/generate/assets/lit-ts/frontend/index.tmpl.html +++ b/v2/pkg/templates/generate/assets/lit-ts/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} - diff --git a/v2/pkg/templates/generate/assets/lit/frontend/index.tmpl.html b/v2/pkg/templates/generate/assets/lit/frontend/index.tmpl.html index e2db01c7d..fbe3eb240 100644 --- a/v2/pkg/templates/generate/assets/lit/frontend/index.tmpl.html +++ b/v2/pkg/templates/generate/assets/lit/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} - diff --git a/v2/pkg/templates/generate/assets/svelte-ts/frontend/index.tmpl.html b/v2/pkg/templates/generate/assets/svelte-ts/frontend/index.tmpl.html index e88b655ef..3dd212f2d 100644 --- a/v2/pkg/templates/generate/assets/svelte-ts/frontend/index.tmpl.html +++ b/v2/pkg/templates/generate/assets/svelte-ts/frontend/index.tmpl.html @@ -3,7 +3,6 @@ - {{.ProjectName}} diff --git a/v2/pkg/templates/generate/assets/vue-ts/frontend/index.tmpl.html b/v2/pkg/templates/generate/assets/vue-ts/frontend/index.tmpl.html index 5c0949b5e..cc259435b 100644 --- a/v2/pkg/templates/generate/assets/vue-ts/frontend/index.tmpl.html +++ b/v2/pkg/templates/generate/assets/vue-ts/frontend/index.tmpl.html @@ -4,7 +4,6 @@ {{.ProjectName}} -