From 354680f702f041d6d9a5152539a38d141652385f Mon Sep 17 00:00:00 2001 From: fsociety Date: Sun, 29 Sep 2024 01:02:04 +0200 Subject: [PATCH] voting system with nostr added --- .gitignore | 1 + app/Console/Commands/Nostr/SyncProfiles.php | 1 - app/Enums/AssociationStatus.php | 50 + app/Enums/Color.php | 11 + app/Enums/Label.php | 11 + app/Http/Controllers/Api/Nostr/GetProfile.php | 24 + app/Models/EinundzwanzigPleb.php | 8 + app/Models/Election.php | 10 + app/Traits/NostrFetcherTrait.php | 8 + bootstrap/app.php | 1 + composer.json | 5 +- composer.lock | 861 +- config/sanctum.php | 83 + ...16_create_personal_access_tokens_table.php | 33 + ...tus_field_to_einundzwanzig_plebs_table.php | 28 + ...24_09_28_181901_create_elections_table.php | 28 + docker-compose.yml | 10 + package-lock.json | 2601 --- package.json | 3 +- public/dist/einundzwanzig.chat.css | 1568 -- public/dist/einundzwanzig.chat.js | 14879 ---------------- public/dist/filepond-plugin-image-edit.css | 47 - public/dist/filepond.css | 1047 -- public/img/meetup_saarland.jpg | Bin 0 -> 264638 bytes resources/css/app.css | 3 + resources/css/flatpickr.css | 237 + resources/css/utility-patterns.css | 138 + resources/js/app.js | 14 + resources/js/nostrApp.js | 15 + resources/js/nostrLogin.js | 29 + .../views/components/layouts/app.blade.php | 17 +- .../layouts/navigation/association.blade.php | 34 + .../layouts/navigation/meetups.blade.php | 2 +- .../components/layouts/sidebar.blade.php | 12 +- .../views/livewire/layout/sidebar.blade.php | 87 + .../election/[Election:year].blade.php | 502 + .../association/election/index.blade.php | 54 + .../views/pages/association/profile.blade.php | 164 + resources/views/pages/meetups/grid.blade.php | 247 + .../views/pages/meetups/mockup.blade.php | 135 + routes/api.php | 5 + tailwind.config.js | 34 +- yarn.lock | 658 +- 43 files changed, 3017 insertions(+), 20688 deletions(-) create mode 100644 app/Enums/AssociationStatus.php create mode 100644 app/Enums/Color.php create mode 100644 app/Enums/Label.php create mode 100644 app/Http/Controllers/Api/Nostr/GetProfile.php create mode 100644 app/Models/Election.php create mode 100644 config/sanctum.php create mode 100644 database/migrations/2024_09_28_140716_create_personal_access_tokens_table.php create mode 100644 database/migrations/2024_09_28_144203_add_association_status_field_to_einundzwanzig_plebs_table.php create mode 100644 database/migrations/2024_09_28_181901_create_elections_table.php delete mode 100644 package-lock.json delete mode 100644 public/dist/einundzwanzig.chat.css delete mode 100644 public/dist/einundzwanzig.chat.js delete mode 100644 public/dist/filepond-plugin-image-edit.css delete mode 100644 public/dist/filepond.css create mode 100644 public/img/meetup_saarland.jpg create mode 100644 resources/css/flatpickr.css create mode 100644 resources/css/utility-patterns.css create mode 100644 resources/js/nostrApp.js create mode 100644 resources/js/nostrLogin.js create mode 100644 resources/views/components/layouts/navigation/association.blade.php create mode 100644 resources/views/livewire/layout/sidebar.blade.php create mode 100644 resources/views/pages/association/election/[Election:year].blade.php create mode 100644 resources/views/pages/association/election/index.blade.php create mode 100644 resources/views/pages/association/profile.blade.php create mode 100644 resources/views/pages/meetups/grid.blade.php create mode 100644 resources/views/pages/meetups/mockup.blade.php create mode 100644 routes/api.php diff --git a/.gitignore b/.gitignore index 46340a6..862902c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ yarn-error.log /.fleet /.idea /.vscode +/relay diff --git a/app/Console/Commands/Nostr/SyncProfiles.php b/app/Console/Commands/Nostr/SyncProfiles.php index bcddeb5..30667bf 100644 --- a/app/Console/Commands/Nostr/SyncProfiles.php +++ b/app/Console/Commands/Nostr/SyncProfiles.php @@ -5,7 +5,6 @@ namespace App\Console\Commands\Nostr; use App\Models\EinundzwanzigPleb; use App\Traits\NostrFetcherTrait; use Illuminate\Console\Command; -use swentel\nostr\Subscription\Subscription; class SyncProfiles extends Command { diff --git a/app/Enums/AssociationStatus.php b/app/Enums/AssociationStatus.php new file mode 100644 index 0000000..70188de --- /dev/null +++ b/app/Enums/AssociationStatus.php @@ -0,0 +1,50 @@ +map( + fn( + $option, + $name + ) => [ + 'value' => $option, + 'label' => __( + self::fromName($name) + ->label() + ), + ] + ) + ->values() + ->toArray(); + } +} diff --git a/app/Enums/Color.php b/app/Enums/Color.php new file mode 100644 index 0000000..54754ce --- /dev/null +++ b/app/Enums/Color.php @@ -0,0 +1,11 @@ +where('pubkey', $key)->exists()) { + $this->fetchProfile([$key]); + } + + return Profile::query() + ->where('pubkey', $key) + ->first(); + } +} diff --git a/app/Models/EinundzwanzigPleb.php b/app/Models/EinundzwanzigPleb.php index 7afe49e..dff4120 100644 --- a/app/Models/EinundzwanzigPleb.php +++ b/app/Models/EinundzwanzigPleb.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Enums\AssociationStatus; use Illuminate\Database\Eloquent\Model; class EinundzwanzigPleb extends Model @@ -9,6 +10,13 @@ class EinundzwanzigPleb extends Model protected $guarded = []; + protected function casts(): array + { + return [ + 'association_status' => AssociationStatus::class, + ]; + } + public function profile() { return $this->hasOne(Profile::class, 'pubkey', 'pubkey'); diff --git a/app/Models/Election.php b/app/Models/Election.php new file mode 100644 index 0000000..d5c6b9d --- /dev/null +++ b/app/Models/Election.php @@ -0,0 +1,10 @@ +push([ + 'hex' => $item, + 'npub' => (new Key)->convertPublicKeyToBech32($item), + ]); + continue; + } $hex->push([ 'hex' => (new Key)->convertToHex($item), 'npub' => $item, diff --git a/bootstrap/app.php b/bootstrap/app.php index 2e4d7c7..245c52c 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -7,6 +7,7 @@ use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', channels: __DIR__.'/../routes/channels.php', health: '/up', diff --git a/composer.json b/composer.json index c6fde73..4ee4d19 100644 --- a/composer.json +++ b/composer.json @@ -7,12 +7,14 @@ "require": { "php": "^8.2", "akuechler/laravel-geoly": "^1.0", + "archtechx/enums": "^1.1", "calebporzio/sushi": "^2.5", "laravel/folio": "^1.1", "laravel/framework": "^11.9", "laravel/pulse": "^1.2", "laravel/reverb": "^1.0", "laravel/sail": "^1.31", + "laravel/sanctum": "^4.0", "laravel/tinker": "^2.9", "livewire/livewire": "^3.5", "livewire/volt": "^1.6", @@ -24,7 +26,8 @@ "spatie/laravel-sluggable": "^3.6", "spatie/laravel-tags": "^4.6", "staudenmeir/eloquent-has-many-deep": "^1.7", - "swentel/nostr-php": "^1.4" + "swentel/nostr-php": "^1.4", + "wireui/wireui": "^2.1" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index dd3878d..455b2dd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6e2e55d8f8eff735c8f3eafb06ad3c0b", + "content-hash": "0eb579a82f9d6b1b37ea98f73debb4a0", "packages": [ { "name": "akuechler/laravel-geoly", @@ -64,6 +64,52 @@ }, "time": "2021-04-20T07:17:32+00:00" }, + { + "name": "archtechx/enums", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/archtechx/enums.git", + "reference": "37326d5e26cdfcc2810f4664cdd625ea4fd528d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/enums/zipball/37326d5e26cdfcc2810f4664cdd625ea4fd528d7", + "reference": "37326d5e26cdfcc2810f4664cdd625ea4fd528d7", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "larastan/larastan": "^2.4", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^2.0", + "pestphp/pest-plugin-laravel": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ArchTech\\Enums\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel@archte.ch" + } + ], + "description": "Helpers for making PHP enums more lovable.", + "support": { + "issues": "https://github.com/archtechx/enums/issues", + "source": "https://github.com/archtechx/enums/tree/v1.1.0" + }, + "time": "2024-07-15T14:28:34+00:00" + }, { "name": "bitwasp/bech32", "version": "v0.0.1", @@ -425,24 +471,24 @@ }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -486,7 +532,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -502,7 +548,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "dflydev/dot-access-data", @@ -1672,16 +1718,16 @@ }, { "name": "laravel/framework", - "version": "v11.22.0", + "version": "v11.25.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "868c75beacc47d0f361b919bbc155c0b619bf3d5" + "reference": "b487a9089c0b1c71ac63bb6bc44fb4b00dc6da2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/868c75beacc47d0f361b919bbc155c0b619bf3d5", - "reference": "868c75beacc47d0f361b919bbc155c0b619bf3d5", + "url": "https://api.github.com/repos/laravel/framework/zipball/b487a9089c0b1c71ac63bb6bc44fb4b00dc6da2e", + "reference": "b487a9089c0b1c71ac63bb6bc44fb4b00dc6da2e", "shasum": "" }, "require": { @@ -1700,7 +1746,7 @@ "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18", + "laravel/prompts": "^0.1.18|^0.2.0", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", @@ -1743,6 +1789,7 @@ "illuminate/bus": "self.version", "illuminate/cache": "self.version", "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", "illuminate/conditionable": "self.version", "illuminate/config": "self.version", "illuminate/console": "self.version", @@ -1785,7 +1832,7 @@ "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.6", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^9.1.5", + "orchestra/testbench-core": "^9.5", "pda/pheanstalk": "^5.0", "phpstan/phpstan": "^1.11.5", "phpunit/phpunit": "^10.5|^11.0", @@ -1843,6 +1890,8 @@ "src/Illuminate/Events/functions.php", "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", "src/Illuminate/Support/helpers.php" ], "psr-4": { @@ -1874,7 +1923,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-09-03T15:27:15+00:00" + "time": "2024-09-26T11:21:58+00:00" }, { "name": "laravel/prompts", @@ -2023,16 +2072,16 @@ }, { "name": "laravel/reverb", - "version": "v1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/laravel/reverb.git", - "reference": "46bb5dd0b14ba0ae9d3dd740e60bca279b689a63" + "reference": "3adc873bbab29c76c37f1969b9644dbdf58d3857" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/reverb/zipball/46bb5dd0b14ba0ae9d3dd740e60bca279b689a63", - "reference": "46bb5dd0b14ba0ae9d3dd740e60bca279b689a63", + "url": "https://api.github.com/repos/laravel/reverb/zipball/3adc873bbab29c76c37f1969b9644dbdf58d3857", + "reference": "3adc873bbab29c76c37f1969b9644dbdf58d3857", "shasum": "" }, "require": { @@ -2042,7 +2091,7 @@ "illuminate/contracts": "^10.47|^11.0", "illuminate/http": "^10.47|^11.0", "illuminate/support": "^10.47|^11.0", - "laravel/prompts": "^0.1.15", + "laravel/prompts": "^0.1.15|^0.2.0", "php": "^8.2", "pusher/pusher-php-server": "^7.2", "ratchet/rfc6455": "^0.3.1", @@ -2099,22 +2148,22 @@ ], "support": { "issues": "https://github.com/laravel/reverb/issues", - "source": "https://github.com/laravel/reverb/tree/v1.3.0" + "source": "https://github.com/laravel/reverb/tree/v1.3.1" }, - "time": "2024-09-03T10:04:47+00:00" + "time": "2024-09-19T11:14:31+00:00" }, { "name": "laravel/sail", - "version": "v1.31.3", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1" + "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1", - "reference": "0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1", + "url": "https://api.github.com/repos/laravel/sail/zipball/d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", + "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", "shasum": "" }, "require": { @@ -2164,20 +2213,84 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-09-03T20:05:33+00:00" + "time": "2024-09-22T19:04:21+00:00" }, { - "name": "laravel/serializable-closure", - "version": "v1.3.4", + "name": "laravel/sanctum", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" + "url": "https://github.com/laravel/sanctum.git", + "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/9cfc0ce80cabad5334efff73ec856339e8ec1ac1", + "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/database": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2", + "symfony/console": "^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2024-04-10T19:39:58+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", "shasum": "" }, "require": { @@ -2225,20 +2338,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-08-02T07:48:17+00:00" + "time": "2024-09-23T13:33:08+00:00" }, { "name": "laravel/tinker", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", "shasum": "" }, "require": { @@ -2289,9 +2402,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.9.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.0" }, - "time": "2024-01-04T16:10:04+00:00" + "time": "2024-09-23T13:32:56+00:00" }, { "name": "league/commonmark", @@ -2615,16 +2728,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.15.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { @@ -2655,7 +2768,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { @@ -2667,20 +2780,20 @@ "type": "tidelift" } ], - "time": "2024-01-28T23:22:08+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { "name": "livewire/livewire", - "version": "v3.5.6", + "version": "v3.5.8", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f" + "reference": "ce1ce71b39a3492b98f7d2f2a4583f1b163fe6ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", - "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", + "url": "https://api.github.com/repos/livewire/livewire/zipball/ce1ce71b39a3492b98f7d2f2a4583f1b163fe6ae", + "reference": "ce1ce71b39a3492b98f7d2f2a4583f1b163fe6ae", "shasum": "" }, "require": { @@ -2735,7 +2848,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.5.6" + "source": "https://github.com/livewire/livewire/tree/v3.5.8" }, "funding": [ { @@ -2743,7 +2856,7 @@ "type": "github" } ], - "time": "2024-08-19T11:52:18+00:00" + "time": "2024-09-20T19:41:19+00:00" }, { "name": "livewire/volt", @@ -3255,16 +3368,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.1.0", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", + "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", "shasum": "" }, "require": { @@ -3307,22 +3420,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0" }, - "time": "2024-07-01T20:03:41+00:00" + "time": "2024-09-15T16:40:33+00:00" }, { "name": "nunomaduro/termwind", - "version": "v2.0.1", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a" + "reference": "e5f21eade88689536c0cdad4c3cd75f3ed26e01a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/58c4c58cf23df7f498daeb97092e34f5259feb6a", - "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/e5f21eade88689536c0cdad4c3cd75f3ed26e01a", + "reference": "e5f21eade88689536c0cdad4c3cd75f3ed26e01a", "shasum": "" }, "require": { @@ -3332,11 +3445,11 @@ }, "require-dev": { "ergebnis/phpstan-rules": "^2.2.0", - "illuminate/console": "^11.0.0", - "laravel/pint": "^1.14.0", - "mockery/mockery": "^1.6.7", - "pestphp/pest": "^2.34.1", - "phpstan/phpstan": "^1.10.59", + "illuminate/console": "^11.1.1", + "laravel/pint": "^1.15.0", + "mockery/mockery": "^1.6.11", + "pestphp/pest": "^2.34.6", + "phpstan/phpstan": "^1.10.66", "phpstan/phpstan-strict-rules": "^1.5.2", "symfony/var-dumper": "^7.0.4", "thecodingmachine/phpstan-strict-rules": "^1.0.0" @@ -3381,7 +3494,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.0.1" + "source": "https://github.com/nunomaduro/termwind/tree/v2.1.0" }, "funding": [ { @@ -3397,20 +3510,20 @@ "type": "github" } ], - "time": "2024-03-06T16:17:14+00:00" + "time": "2024-09-05T15:25:50+00:00" }, { "name": "openspout/openspout", - "version": "v4.24.5", + "version": "v4.26.0", "source": { "type": "git", "url": "https://github.com/openspout/openspout.git", - "reference": "393299ae21153f042f48b185f2adeb4b157d1d93" + "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openspout/openspout/zipball/393299ae21153f042f48b185f2adeb4b157d1d93", - "reference": "393299ae21153f042f48b185f2adeb4b157d1d93", + "url": "https://api.github.com/repos/openspout/openspout/zipball/a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", + "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", "shasum": "" }, "require": { @@ -3420,17 +3533,17 @@ "ext-libxml": "*", "ext-xmlreader": "*", "ext-zip": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "ext-zlib": "*", - "friendsofphp/php-cs-fixer": "^3.60.0", + "friendsofphp/php-cs-fixer": "^3.64.0", "infection/infection": "^0.29.6", "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan": "^1.12.4", "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.0", - "phpunit/phpunit": "^10.5.20 || ^11.2.8" + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^11.3.6" }, "suggest": { "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", @@ -3478,7 +3591,7 @@ ], "support": { "issues": "https://github.com/openspout/openspout/issues", - "source": "https://github.com/openspout/openspout/tree/v4.24.5" + "source": "https://github.com/openspout/openspout/tree/v4.26.0" }, "funding": [ { @@ -3490,7 +3603,7 @@ "type": "github" } ], - "time": "2024-07-26T05:48:04+00:00" + "time": "2024-09-24T14:04:43+00:00" }, { "name": "paragonie/random_compat", @@ -3705,16 +3818,16 @@ }, { "name": "phrity/net-stream", - "version": "2.0.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-net-stream.git", - "reference": "4a6704fae3ad2e7c1576f51f1b8425973ba77c63" + "reference": "875d87c246cfacd66feaf6b0390f1e5d6985ad54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-net-stream/zipball/4a6704fae3ad2e7c1576f51f1b8425973ba77c63", - "reference": "4a6704fae3ad2e7c1576f51f1b8425973ba77c63", + "url": "https://api.github.com/repos/sirn-se/phrity-net-stream/zipball/875d87c246cfacd66feaf6b0390f1e5d6985ad54", + "reference": "875d87c246cfacd66feaf6b0390f1e5d6985ad54", "shasum": "" }, "require": { @@ -3759,9 +3872,9 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-net-stream/issues", - "source": "https://github.com/sirn-se/phrity-net-stream/tree/2.0.1" + "source": "https://github.com/sirn-se/phrity-net-stream/tree/2.1.0" }, - "time": "2024-06-30T10:44:58+00:00" + "time": "2024-09-14T12:03:20+00:00" }, { "name": "phrity/net-uri", @@ -3825,16 +3938,16 @@ }, { "name": "phrity/util-errorhandler", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-util-errorhandler.git", - "reference": "4016d9f9615a4c602f525b0542e4835e316a42e4" + "reference": "483228156e06673963902b1cc1e6bd9541ab4d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-util-errorhandler/zipball/4016d9f9615a4c602f525b0542e4835e316a42e4", - "reference": "4016d9f9615a4c602f525b0542e4835e316a42e4", + "url": "https://api.github.com/repos/sirn-se/phrity-util-errorhandler/zipball/483228156e06673963902b1cc1e6bd9541ab4d5e", + "reference": "483228156e06673963902b1cc1e6bd9541ab4d5e", "shasum": "" }, "require": { @@ -3870,36 +3983,36 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-util-errorhandler/issues", - "source": "https://github.com/sirn-se/phrity-util-errorhandler/tree/1.1.0" + "source": "https://github.com/sirn-se/phrity-util-errorhandler/tree/1.1.1" }, - "time": "2024-03-05T19:32:14+00:00" + "time": "2024-09-12T06:49:16+00:00" }, { "name": "phrity/websocket", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sirn-se/websocket-php.git", - "reference": "36a79edf2a00b93ff1fea3cbac1bd213f98d5ef9" + "reference": "5488e59e7e68d9e129a112fc7ede6e72a2c83b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/websocket-php/zipball/36a79edf2a00b93ff1fea3cbac1bd213f98d5ef9", - "reference": "36a79edf2a00b93ff1fea3cbac1bd213f98d5ef9", + "url": "https://api.github.com/repos/sirn-se/websocket-php/zipball/5488e59e7e68d9e129a112fc7ede6e72a2c83b01", + "reference": "5488e59e7e68d9e129a112fc7ede6e72a2c83b01", "shasum": "" }, "require": { "php": "^8.1", - "phrity/net-stream": "^2.0", + "phrity/net-stream": "^2.1", "phrity/net-uri": "^2.1", - "phrity/util-errorhandler": "^1.1", "psr/http-message": "^1.1 | ^2.0", "psr/log": "^1.0 | ^2.0 | ^3.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.0", "phpunit/phpunit": "^10.0 | ^11.0", - "phrity/net-mock": "^2.0", + "phrity/net-mock": "^2.1", + "phrity/util-errorhandler": "^1.1", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", @@ -3931,22 +4044,22 @@ ], "support": { "issues": "https://github.com/sirn-se/websocket-php/issues", - "source": "https://github.com/sirn-se/websocket-php/tree/3.1.0" + "source": "https://github.com/sirn-se/websocket-php/tree/3.2.0" }, - "time": "2024-07-09T11:00:42+00:00" + "time": "2024-09-28T08:44:22+00:00" }, { "name": "power-components/livewire-powergrid", - "version": "v5.10.4", + "version": "v5.10.6", "source": { "type": "git", "url": "https://github.com/Power-Components/livewire-powergrid.git", - "reference": "180ca4a1056def54b19ea626f6f0e483848ccf65" + "reference": "36fa962c8a84ce09ea690e7b6ffad2234e96f4b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Power-Components/livewire-powergrid/zipball/180ca4a1056def54b19ea626f6f0e483848ccf65", - "reference": "180ca4a1056def54b19ea626f6f0e483848ccf65", + "url": "https://api.github.com/repos/Power-Components/livewire-powergrid/zipball/36fa962c8a84ce09ea690e7b6ffad2234e96f4b1", + "reference": "36fa962c8a84ce09ea690e7b6ffad2234e96f4b1", "shasum": "" }, "require": { @@ -4006,7 +4119,7 @@ "homepage": "https://github.com/power-components/livewire-powergrid", "support": { "issues": "https://github.com/Power-Components/livewire-powergrid/issues", - "source": "https://github.com/Power-Components/livewire-powergrid/tree/v5.10.4" + "source": "https://github.com/Power-Components/livewire-powergrid/tree/v5.10.6" }, "funding": [ { @@ -4014,7 +4127,7 @@ "type": "github" } ], - "time": "2024-08-21T19:41:49+00:00" + "time": "2024-09-17T12:20:04+00:00" }, { "name": "psr/clock", @@ -4329,16 +4442,16 @@ }, { "name": "psr/log", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "79dff0b268932c640297f5208d6298f71855c03e" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", - "reference": "79dff0b268932c640297f5208d6298f71855c03e", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -4373,9 +4486,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.1" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2024-08-21T13:31:24+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -6320,16 +6433,16 @@ }, { "name": "staudenmeir/eloquent-has-many-deep-contracts", - "version": "v1.2", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts.git", - "reference": "bcbe1a921caad7201b324e297eddb696d4bd8647" + "reference": "3ad76c6eeda60042f262d113bf471dcce584d88b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/staudenmeir/eloquent-has-many-deep-contracts/zipball/bcbe1a921caad7201b324e297eddb696d4bd8647", - "reference": "bcbe1a921caad7201b324e297eddb696d4bd8647", + "url": "https://api.github.com/repos/staudenmeir/eloquent-has-many-deep-contracts/zipball/3ad76c6eeda60042f262d113bf471dcce584d88b", + "reference": "3ad76c6eeda60042f262d113bf471dcce584d88b", "shasum": "" }, "require": { @@ -6355,22 +6468,22 @@ "description": "Contracts for staudenmeir/eloquent-has-many-deep", "support": { "issues": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts/issues", - "source": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts/tree/v1.2" + "source": "https://github.com/staudenmeir/eloquent-has-many-deep-contracts/tree/v1.2.1" }, - "time": "2024-01-18T01:20:44+00:00" + "time": "2024-09-25T18:24:22+00:00" }, { "name": "swentel/nostr-php", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/nostrver-se/nostr-php.git", - "reference": "ebdd3ce598eb62446f114f796c6f7bfad075594e" + "reference": "058c3cfa906b1881025e9ca9797f195c7992c7c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nostrver-se/nostr-php/zipball/ebdd3ce598eb62446f114f796c6f7bfad075594e", - "reference": "ebdd3ce598eb62446f114f796c6f7bfad075594e", + "url": "https://api.github.com/repos/nostrver-se/nostr-php/zipball/058c3cfa906b1881025e9ca9797f195c7992c7c4", + "reference": "058c3cfa906b1881025e9ca9797f195c7992c7c4", "shasum": "" }, "require": { @@ -6415,7 +6528,6 @@ "description": "Nostr helper library for PHP", "homepage": "https://nostr-php.dev", "keywords": [ - "dev", "library", "nostr" ], @@ -6423,9 +6535,9 @@ "chat": "https://t.me/nostr_php", "issue": "https://github.com/swentel/nostr-php/issues", "issues": "https://github.com/nostrver-se/nostr-php/issues", - "source": "https://github.com/nostrver-se/nostr-php/tree/1.4.0" + "source": "https://github.com/nostrver-se/nostr-php/tree/1.4.1" }, - "time": "2024-08-29T09:29:56+00:00" + "time": "2024-09-14T20:30:03+00:00" }, { "name": "symfony/clock", @@ -6503,16 +6615,16 @@ }, { "name": "symfony/console", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111" + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1eed7af6961d763e7832e874d7f9b21c3ea9c111", - "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111", + "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", "shasum": "" }, "require": { @@ -6576,7 +6688,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.4" + "source": "https://github.com/symfony/console/tree/v7.1.5" }, "funding": [ { @@ -6592,7 +6704,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:53+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/css-selector", @@ -7023,16 +7135,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.1.3", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a" + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", - "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", "shasum": "" }, "require": { @@ -7080,7 +7192,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" }, "funding": [ { @@ -7096,20 +7208,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6efcbd1b3f444f631c386504fc83eeca25963747" + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6efcbd1b3f444f631c386504fc83eeca25963747", - "reference": "6efcbd1b3f444f631c386504fc83eeca25963747", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", "shasum": "" }, "require": { @@ -7194,7 +7306,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" }, "funding": [ { @@ -7210,20 +7322,20 @@ "type": "tidelift" } ], - "time": "2024-08-30T17:02:28+00:00" + "time": "2024-09-21T06:09:21+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.2", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee" + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee", - "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee", + "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b", + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b", "shasum": "" }, "require": { @@ -7274,7 +7386,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.2" + "source": "https://github.com/symfony/mailer/tree/v7.1.5" }, "funding": [ { @@ -7290,20 +7402,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T08:00:31+00:00" + "time": "2024-09-08T12:32:26+00:00" }, { "name": "symfony/mime", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ccaa6c2503db867f472a587291e764d6a1e58758" + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ccaa6c2503db867f472a587291e764d6a1e58758", - "reference": "ccaa6c2503db867f472a587291e764d6a1e58758", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", "shasum": "" }, "require": { @@ -7358,7 +7470,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.4" + "source": "https://github.com/symfony/mime/tree/v7.1.5" }, "funding": [ { @@ -7374,24 +7486,24 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:28:19+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -7437,7 +7549,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -7453,24 +7565,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7515,7 +7627,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -7531,26 +7643,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -7599,7 +7710,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -7615,24 +7726,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7680,7 +7791,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -7696,24 +7807,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -7760,7 +7871,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -7776,97 +7887,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7913,7 +7951,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -7929,24 +7967,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7989,7 +8027,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -8005,24 +8043,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:35:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -8068,7 +8106,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -8084,20 +8122,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v7.1.3", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca" + "reference": "5c03ee6369281177f07f7c68252a280beccba847" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7f2f542c668ad6c313dc4a5e9c3321f733197eca", - "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", "shasum": "" }, "require": { @@ -8129,7 +8167,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.3" + "source": "https://github.com/symfony/process/tree/v7.1.5" }, "funding": [ { @@ -8145,7 +8183,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:44:47+00:00" + "time": "2024-09-19T21:48:23+00:00" }, { "name": "symfony/routing", @@ -8313,16 +8351,16 @@ }, { "name": "symfony/string", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b" + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/6cd670a6d968eaeb1c77c2e76091c45c56bc367b", - "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", "shasum": "" }, "require": { @@ -8380,7 +8418,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.4" + "source": "https://github.com/symfony/string/tree/v7.1.5" }, "funding": [ { @@ -8396,20 +8434,20 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:59:40+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/translation", - "version": "v7.1.3", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1" + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1", - "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1", + "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", "shasum": "" }, "require": { @@ -8474,7 +8512,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.3" + "source": "https://github.com/symfony/translation/tree/v7.1.5" }, "funding": [ { @@ -8490,7 +8528,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-09-16T06:30:38+00:00" }, { "name": "symfony/translation-contracts", @@ -8572,16 +8610,16 @@ }, { "name": "symfony/uid", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "82177535395109075cdb45a70533aa3d7a521cdf" + "reference": "8c7bb8acb933964055215d89f9a9871df0239317" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/82177535395109075cdb45a70533aa3d7a521cdf", - "reference": "82177535395109075cdb45a70533aa3d7a521cdf", + "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317", + "reference": "8c7bb8acb933964055215d89f9a9871df0239317", "shasum": "" }, "require": { @@ -8626,7 +8664,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.4" + "source": "https://github.com/symfony/uid/tree/v7.1.5" }, "funding": [ { @@ -8642,20 +8680,20 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:59:40+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa" + "reference": "e20e03889539fd4e4211e14d2179226c513c010d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a5fa7481b199090964d6fd5dab6294d5a870c7aa", - "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d", "shasum": "" }, "require": { @@ -8709,7 +8747,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.4" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" }, "funding": [ { @@ -8725,20 +8763,20 @@ "type": "tidelift" } ], - "time": "2024-08-30T16:12:47+00:00" + "time": "2024-09-16T10:07:02+00:00" }, { "name": "symfony/yaml", - "version": "v7.1.4", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "92e080b851c1c655c786a2da77f188f2dccd0f4b" + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/92e080b851c1c655c786a2da77f188f2dccd0f4b", - "reference": "92e080b851c1c655c786a2da77f188f2dccd0f4b", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", "shasum": "" }, "require": { @@ -8780,7 +8818,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.4" + "source": "https://github.com/symfony/yaml/tree/v7.1.5" }, "funding": [ { @@ -8796,7 +8834,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:59:40+00:00" + "time": "2024-09-17T12:49:58+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9151,6 +9189,139 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "wireui/heroicons", + "version": "v2.6.1", + "source": { + "type": "git", + "url": "https://github.com/wireui/heroicons.git", + "reference": "d90dc12a6759140f2dc7e94fd8da9bc355574aea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wireui/heroicons/zipball/d90dc12a6759140f2dc7e94fd8da9bc355574aea", + "reference": "d90dc12a6759140f2dc7e94fd8da9bc355574aea", + "shasum": "" + }, + "require": { + "laravel/framework": "^9.16|^10.0|^11.0", + "php": "^8.1|^8.2|^8.3|^8.4" + }, + "require-dev": { + "laravel/pint": "^1.6", + "mockery/mockery": "^1.5", + "nunomaduro/larastan": "^2.4", + "orchestra/testbench": "^7.7|^8.0|^9.0", + "pestphp/pest": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "WireUi\\Heroicons\\HeroiconsServiceProvider" + ] + }, + "aliases": [] + }, + "autoload": { + "psr-4": { + "WireUi\\Heroicons\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pedro Oliveira", + "email": "pedro@wireui.dev" + } + ], + "description": "The Tailwind Heroicons for laravel blade by WireUI", + "keywords": [ + "blade components", + "blade heroicons", + "laravel components", + "livewire icons", + "livewire icons components", + "wireui" + ], + "support": { + "issues": "https://github.com/wireui/heroicons/issues", + "source": "https://github.com/wireui/heroicons/tree/v2.6.1" + }, + "time": "2024-05-23T15:15:30+00:00" + }, + { + "name": "wireui/wireui", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/wireui/wireui.git", + "reference": "a457654912055f4dcc559da04d4e319f76b80fc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wireui/wireui/zipball/a457654912055f4dcc559da04d4e319f76b80fc5", + "reference": "a457654912055f4dcc559da04d4e319f76b80fc5", + "shasum": "" + }, + "require": { + "laravel/framework": "^10.0|^11.0", + "php": "^8.2|^8.3", + "wireui/heroicons": "^2.6" + }, + "require-dev": { + "laravel/pint": "^1.16", + "livewire/livewire": "^3.5", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^8.14|^9.0", + "orchestra/testbench-dusk": "^8.14|^9.0", + "pestphp/pest": "^2.34", + "pestphp/pest-plugin-laravel": "^2.4", + "pestphp/pest-plugin-livewire": "^2.1", + "phpunit/phpunit": "^10.5", + "psy/psysh": "^0.12.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "WireUi\\ServiceProvider" + ], + "aliases": [] + } + }, + "autoload": { + "psr-4": { + "WireUi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pedro Oliveira", + "email": "pedro@wireui.dev" + } + ], + "description": "TallStack components", + "keywords": [ + "blade components", + "laravel components", + "livewire components", + "livewire-ui", + "wireui" + ], + "support": { + "issues": "https://github.com/wireui/wireui/issues", + "source": "https://github.com/wireui/wireui/tree/v2.1.3" + }, + "time": "2024-09-17T04:41:02+00:00" } ], "packages-dev": [ @@ -9421,26 +9592,26 @@ }, { "name": "filp/whoops", - "version": "2.15.4", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", + "php": "^7.1 || ^8.0", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -9480,7 +9651,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.4" + "source": "https://github.com/filp/whoops/tree/2.16.0" }, "funding": [ { @@ -9488,7 +9659,7 @@ "type": "github" } ], - "time": "2023-11-03T12:00:00+00:00" + "time": "2024-09-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -9602,16 +9773,16 @@ }, { "name": "laravel/pint", - "version": "v1.17.3", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "9d77be916e145864f10788bb94531d03e1f7b482" + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/9d77be916e145864f10788bb94531d03e1f7b482", - "reference": "9d77be916e145864f10788bb94531d03e1f7b482", + "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", "shasum": "" }, "require": { @@ -9664,7 +9835,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-09-03T15:00:28+00:00" + "time": "2024-09-24T17:22:50+00:00" }, { "name": "mockery/mockery", @@ -10524,16 +10695,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.30.0", + "version": "1.32.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "5ceb0e384997db59f38774bf79c2a6134252c08f" + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/5ceb0e384997db59f38774bf79c2a6134252c08f", - "reference": "5ceb0e384997db59f38774bf79c2a6134252c08f", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", "shasum": "" }, "require": { @@ -10565,9 +10736,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0" }, - "time": "2024-08-29T09:54:52+00:00" + "time": "2024-09-26T07:23:32+00:00" }, { "name": "phpunit/php-code-coverage", diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..764a82f --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,83 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/database/migrations/2024_09_28_140716_create_personal_access_tokens_table.php b/database/migrations/2024_09_28_140716_create_personal_access_tokens_table.php new file mode 100644 index 0000000..e828ad8 --- /dev/null +++ b/database/migrations/2024_09_28_140716_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2024_09_28_144203_add_association_status_field_to_einundzwanzig_plebs_table.php b/database/migrations/2024_09_28_144203_add_association_status_field_to_einundzwanzig_plebs_table.php new file mode 100644 index 0000000..8b779a4 --- /dev/null +++ b/database/migrations/2024_09_28_144203_add_association_status_field_to_einundzwanzig_plebs_table.php @@ -0,0 +1,28 @@ +unsignedInteger('association_status')->default(1); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('einundzwanzig_plebs', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2024_09_28_181901_create_elections_table.php b/database/migrations/2024_09_28_181901_create_elections_table.php new file mode 100644 index 0000000..3bc366b --- /dev/null +++ b/database/migrations/2024_09_28_181901_create_elections_table.php @@ -0,0 +1,28 @@ +id(); + $table->unsignedInteger('year'); + $table->json('candidates'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('elections'); + } +}; diff --git a/docker-compose.yml b/docker-compose.yml index 914f77b..08eb7c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -65,6 +65,16 @@ services: - ping retries: 3 timeout: 5s + relay: + ports: + - "7000" + volumes: + - ./relay:/usr/src/app/db + - ./relay/config.toml:/usr/src/app/config.toml + image: scsibug/nostr-rs-relay:latest + user: "${DOCKER_UID:-1000}:${DOCKER_GID:-1000}" + networks: + - sail networks: sail: driver: bridge diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b3a8764..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2601 +0,0 @@ -{ - "name": "html", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "devDependencies": { - "autoprefixer": "^10.4.20", - "axios": "^1.6.4", - "laravel-echo": "^1.16.1", - "laravel-vite-plugin": "^1.0", - "postcss": "^8.4.41", - "pusher-js": "^8.4.0-rc2", - "tailwindcss": "^3.4.10", - "vite": "^5.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", - "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz", - "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz", - "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz", - "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz", - "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz", - "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz", - "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz", - "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz", - "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz", - "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz", - "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz", - "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz", - "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz", - "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz", - "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz", - "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", - "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001653", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", - "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/laravel-echo": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.16.1.tgz", - "integrity": "sha512-++Ylb6M3ariC9Rk5WE5gZjj6wcEV5kvLF8b+geJ5/rRIfdoOA+eG6b9qJPrarMD9rY28Apx+l3eelIrCc2skVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/laravel-vite-plugin": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.5.tgz", - "integrity": "sha512-Zv+to82YLBknDCZ6g3iwOv9wZ7f6EWStb9pjSm7MGe9Mfoy5ynT2ssZbGsMr1udU6rDg9HOoYEVGw5Qf+p9zbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "vite-plugin-full-reload": "^1.1.0" - }, - "bin": { - "clean-orphaned-assets": "bin/clean.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/pusher-js": { - "version": "8.4.0-rc2", - "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0-rc2.tgz", - "integrity": "sha512-d87GjOEEl9QgO5BWmViSqW0LOzPvybvX6WA9zLUstNdB57jVJuR27zHkRnrav2a3+zAMlHbP2Og8wug+rG8T+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tweetnacl": "^1.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz", - "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.1", - "@rollup/rollup-android-arm64": "4.21.1", - "@rollup/rollup-darwin-arm64": "4.21.1", - "@rollup/rollup-darwin-x64": "4.21.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.1", - "@rollup/rollup-linux-arm-musleabihf": "4.21.1", - "@rollup/rollup-linux-arm64-gnu": "4.21.1", - "@rollup/rollup-linux-arm64-musl": "4.21.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1", - "@rollup/rollup-linux-riscv64-gnu": "4.21.1", - "@rollup/rollup-linux-s390x-gnu": "4.21.1", - "@rollup/rollup-linux-x64-gnu": "4.21.1", - "@rollup/rollup-linux-x64-musl": "4.21.1", - "@rollup/rollup-win32-arm64-msvc": "4.21.1", - "@rollup/rollup-win32-ia32-msvc": "4.21.1", - "@rollup/rollup-win32-x64-msvc": "4.21.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", - "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.41", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-full-reload": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", - "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "picomatch": "^2.3.1" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/package.json b/package.json index b1fe2ef..a281784 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ "build": "vite build" }, "devDependencies": { + "@nostr-dev-kit/ndk": "^2.10.0", + "@tailwindcss/forms": "^0.5.8", "autoprefixer": "^10.4.20", - "axios": "^1.6.4", "flatpickr": "^4.6.13", "laravel-echo": "^1.16.1", "laravel-vite-plugin": "^1.0", diff --git a/public/dist/einundzwanzig.chat.css b/public/dist/einundzwanzig.chat.css deleted file mode 100644 index cefccb7..0000000 --- a/public/dist/einundzwanzig.chat.css +++ /dev/null @@ -1,1568 +0,0 @@ -.qr.svelte-2fcki1.svelte-2fcki1 { - display: block; - shape-rendering: crispEdges; - transform: translateZ(0) -} - -.qr.svelte-2fcki1 rect.svelte-2fcki1 { - fill: var(--qr-color, 'currentColor') -} - -.svelte-8015tc, .svelte-8015tc::before, .svelte-8015tc::after { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: #e5e7eb -} - -.svelte-8015tc::before, .svelte-8015tc::after { - --tw-content: '' -} - -h1.svelte-8015tc { - font-size: inherit; - font-weight: inherit -} - -button.svelte-8015tc { - font-family: inherit; - font-size: 100%; - font-weight: inherit; - line-height: inherit; - color: inherit; - margin: 0; - padding: 0 -} - -button.svelte-8015tc { - text-transform: none -} - -button.svelte-8015tc { - -webkit-appearance: button; - background-color: transparent; - background-image: none -} - -.svelte-8015tc:-moz-focusring { - outline: auto -} - -.svelte-8015tc:-moz-ui-invalid { - box-shadow: none -} - -.svelte-8015tc::-webkit-inner-spin-button, .svelte-8015tc::-webkit-outer-spin-button { - height: auto -} - -.svelte-8015tc::-webkit-search-decoration { - -webkit-appearance: none -} - -.svelte-8015tc::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit -} - -h1.svelte-8015tc, p.svelte-8015tc { - margin: 0 -} - -button.svelte-8015tc { - cursor: pointer -} - -.svelte-8015tc:disabled { - cursor: default -} - -.svelte-8015tc, .svelte-8015tc::before, .svelte-8015tc::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -.svelte-8015tc::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -@media (min-width: 640px) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -@media (min-width: 1536px) { -} - -.mb-3.svelte-8015tc { - margin-bottom: 0.75rem -} - -.flex.svelte-8015tc { - display: flex -} - -.w-full.svelte-8015tc { - width: 100% -} - -.flex-col.svelte-8015tc { - flex-direction: column -} - -.gap-1.svelte-8015tc { - gap: 0.25rem -} - -.rounded-xl.svelte-8015tc { - border-radius: 0.75rem -} - -.bg-white.svelte-8015tc { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)) -} - -.bg-purple-900.svelte-8015tc { - --tw-bg-opacity: 1; - background-color: rgb(88 28 135 / var(--tw-bg-opacity)) -} - -.p-2.svelte-8015tc { - padding: 0.5rem -} - -.p-3.svelte-8015tc { - padding: 0.75rem -} - -.p-4.svelte-8015tc { - padding: 1rem -} - -.text-center.svelte-8015tc { - text-align: center -} - -.text-xs.svelte-8015tc { - font-size: 0.75rem; - line-height: 1rem -} - -.text-xl.svelte-8015tc { - font-size: 1.25rem; - line-height: 1.75rem -} - -.font-bold.svelte-8015tc { - font-weight: 700 -} - -.text-gray-600.svelte-8015tc { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)) -} - -.text-white.svelte-8015tc { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)) -} - -.text-gray-400.svelte-8015tc { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)) -} - -.text-gray-200.svelte-8015tc { - --tw-text-opacity: 1; - color: rgb(229 231 235 / var(--tw-text-opacity)) -} - -.text-gray-300.svelte-8015tc { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)) -} - -.hover\:bg-purple-700.svelte-8015tc:hover { - --tw-bg-opacity: 1; - background-color: rgb(126 34 206 / var(--tw-bg-opacity)) -} - -@media (prefers-color-scheme: dark) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -.svelte-r5bhj7, .svelte-r5bhj7::before, .svelte-r5bhj7::after { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: #e5e7eb -} - -.svelte-r5bhj7::before, .svelte-r5bhj7::after { - --tw-content: '' -} - -.svelte-r5bhj7:-moz-focusring { - outline: auto -} - -.svelte-r5bhj7:-moz-ui-invalid { - box-shadow: none -} - -.svelte-r5bhj7::-webkit-inner-spin-button, .svelte-r5bhj7::-webkit-outer-spin-button { - height: auto -} - -.svelte-r5bhj7::-webkit-search-decoration { - -webkit-appearance: none -} - -.svelte-r5bhj7::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit -} - -.svelte-r5bhj7:disabled { - cursor: default -} - -img.svelte-r5bhj7 { - display: block; - vertical-align: middle -} - -img.svelte-r5bhj7 { - max-width: 100%; - height: auto -} - -.svelte-r5bhj7, .svelte-r5bhj7::before, .svelte-r5bhj7::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -.svelte-r5bhj7::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -@media (min-width: 640px) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -@media (min-width: 1536px) { -} - -.mb-3.svelte-r5bhj7 { - margin-bottom: 0.75rem -} - -.mt-1.svelte-r5bhj7 { - margin-top: 0.25rem -} - -.mb-10.svelte-r5bhj7 { - margin-bottom: 2.5rem -} - -.block.svelte-r5bhj7 { - display: block -} - -.flex.svelte-r5bhj7 { - display: flex -} - -.h-10.svelte-r5bhj7 { - height: 2.5rem -} - -.max-h-64.svelte-r5bhj7 { - max-height: 16rem -} - -.w-full.svelte-r5bhj7 { - width: 100% -} - -.w-10.svelte-r5bhj7 { - width: 2.5rem -} - -.min-w-fit.svelte-r5bhj7 { - min-width: -moz-fit-content; - min-width: fit-content -} - -.cursor-pointer.svelte-r5bhj7 { - cursor: pointer -} - -.flex-row.svelte-r5bhj7 { - flex-direction: row -} - -.flex-row-reverse.svelte-r5bhj7 { - flex-direction: row-reverse -} - -.items-center.svelte-r5bhj7 { - align-items: center -} - -.justify-between.svelte-r5bhj7 { - justify-content: space-between -} - -.gap-4.svelte-r5bhj7 { - gap: 1rem -} - -.overflow-hidden.svelte-r5bhj7 { - overflow: hidden -} - -.overflow-clip.svelte-r5bhj7 { - overflow: clip -} - -.overflow-scroll.svelte-r5bhj7 { - overflow: scroll -} - -.text-ellipsis.svelte-r5bhj7 { - text-overflow: ellipsis -} - -.text-clip.svelte-r5bhj7 { - text-overflow: clip -} - -.whitespace-nowrap.svelte-r5bhj7 { - white-space: nowrap -} - -.rounded-full.svelte-r5bhj7 { - border-radius: 9999px -} - -.rounded-2xl.svelte-r5bhj7 { - border-radius: 1rem -} - -.border.svelte-r5bhj7 { - border-width: 1px -} - -.border-l.svelte-r5bhj7 { - border-left-width: 1px -} - -.border-slate-200.svelte-r5bhj7 { - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)) -} - -.border-l-gray-400.svelte-r5bhj7 { - --tw-border-opacity: 1; - border-left-color: rgb(156 163 175 / var(--tw-border-opacity)) -} - -.bg-purple-700.svelte-r5bhj7 { - --tw-bg-opacity: 1; - background-color: rgb(126 34 206 / var(--tw-bg-opacity)) -} - -.bg-slate-50.svelte-r5bhj7 { - --tw-bg-opacity: 1; - background-color: rgb(248 250 252 / var(--tw-bg-opacity)) -} - -.p-4.svelte-r5bhj7 { - padding: 1rem -} - -.py-2.svelte-r5bhj7 { - padding-top: 0.5rem; - padding-bottom: 0.5rem -} - -.pl-5.svelte-r5bhj7 { - padding-left: 1.25rem -} - -.text-center.svelte-r5bhj7 { - text-align: center -} - -.text-xs.svelte-r5bhj7 { - font-size: 0.75rem; - line-height: 1rem -} - -.text-base.svelte-r5bhj7 { - font-size: 1rem; - line-height: 1.5rem -} - -.text-white.svelte-r5bhj7 { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)) -} - -.text-gray-400.svelte-r5bhj7 { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)) -} - -.text-gray-500.svelte-r5bhj7 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)) -} - -.text-purple-500.svelte-r5bhj7 { - --tw-text-opacity: 1; - color: rgb(168 85 247 / var(--tw-text-opacity)) -} - -.ring-4.svelte-r5bhj7 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) -} - -.ring-2.svelte-r5bhj7 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) -} - -.ring-purple-700.svelte-r5bhj7 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(126 34 206 / var(--tw-ring-opacity)) -} - -.ring-gray-300.svelte-r5bhj7 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)) -} - -.hover\:bg-slate-100.svelte-r5bhj7:hover { - --tw-bg-opacity: 1; - background-color: rgb(241 245 249 / var(--tw-bg-opacity)) -} - -@media (prefers-color-scheme: dark) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -.svelte-v3rae1, .svelte-v3rae1::before, .svelte-v3rae1::after { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: #e5e7eb -} - -.svelte-v3rae1::before, .svelte-v3rae1::after { - --tw-content: '' -} - -h1.svelte-v3rae1 { - font-size: inherit; - font-weight: inherit -} - -a.svelte-v3rae1 { - color: inherit; - text-decoration: inherit -} - -b.svelte-v3rae1 { - font-weight: bolder -} - -button.svelte-v3rae1, textarea.svelte-v3rae1 { - font-family: inherit; - font-size: 100%; - font-weight: inherit; - line-height: inherit; - color: inherit; - margin: 0; - padding: 0 -} - -button.svelte-v3rae1 { - text-transform: none -} - -button.svelte-v3rae1, [type='button'].svelte-v3rae1 { - -webkit-appearance: button; - background-color: transparent; - background-image: none -} - -.svelte-v3rae1:-moz-focusring { - outline: auto -} - -.svelte-v3rae1:-moz-ui-invalid { - box-shadow: none -} - -.svelte-v3rae1::-webkit-inner-spin-button, .svelte-v3rae1::-webkit-outer-spin-button { - height: auto -} - -.svelte-v3rae1::-webkit-search-decoration { - -webkit-appearance: none -} - -.svelte-v3rae1::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit -} - -h1.svelte-v3rae1 { - margin: 0 -} - -textarea.svelte-v3rae1 { - resize: vertical -} - -textarea.svelte-v3rae1::-moz-placeholder { - opacity: 1; - color: #9ca3af -} - -textarea.svelte-v3rae1::placeholder { - opacity: 1; - color: #9ca3af -} - -button.svelte-v3rae1 { - cursor: pointer -} - -.svelte-v3rae1:disabled { - cursor: default -} - -svg.svelte-v3rae1 { - display: block; - vertical-align: middle -} - -.svelte-v3rae1, .svelte-v3rae1::before, .svelte-v3rae1::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -.svelte-v3rae1::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -@media (min-width: 640px) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -@media (min-width: 1536px) { -} - -.-m-5.svelte-v3rae1 { - margin: -1.25rem -} - -.-mx-5.svelte-v3rae1 { - margin-left: -1.25rem; - margin-right: -1.25rem -} - -.my-2.svelte-v3rae1 { - margin-top: 0.5rem; - margin-bottom: 0.5rem -} - -.-mx-1.svelte-v3rae1 { - margin-left: -0.25rem; - margin-right: -0.25rem -} - -.mb-3.svelte-v3rae1 { - margin-bottom: 0.75rem -} - -.mt-2.svelte-v3rae1 { - margin-top: 0.5rem -} - -.ml-2.svelte-v3rae1 { - margin-left: 0.5rem -} - -.-mb-2.svelte-v3rae1 { - margin-bottom: -0.5rem -} - -.inline-block.svelte-v3rae1 { - display: inline-block -} - -.flex.svelte-v3rae1 { - display: flex -} - -.inline-flex.svelte-v3rae1 { - display: inline-flex -} - -.h-2.svelte-v3rae1 { - height: 0.5rem -} - -.h-6.svelte-v3rae1 { - height: 1.5rem -} - -.w-2.svelte-v3rae1 { - width: 0.5rem -} - -.w-6.svelte-v3rae1 { - width: 1.5rem -} - -.w-full.svelte-v3rae1 { - width: 100% -} - -.rotate-90.svelte-v3rae1 { - --tw-rotate: 90deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) -} - -.resize-none.svelte-v3rae1 { - resize: none -} - -.flex-row.svelte-v3rae1 { - flex-direction: row -} - -.flex-col.svelte-v3rae1 { - flex-direction: column -} - -.items-end.svelte-v3rae1 { - align-items: flex-end -} - -.items-center.svelte-v3rae1 { - align-items: center -} - -.justify-between.svelte-v3rae1 { - justify-content: space-between -} - -.gap-1.svelte-v3rae1 { - gap: 0.25rem -} - -.gap-2.svelte-v3rae1 { - gap: 0.5rem -} - -.overflow-hidden.svelte-v3rae1 { - overflow: hidden -} - -.overflow-clip.svelte-v3rae1 { - overflow: clip -} - -.overflow-scroll.svelte-v3rae1 { - overflow: scroll -} - -.text-ellipsis.svelte-v3rae1 { - text-overflow: ellipsis -} - -.whitespace-nowrap.svelte-v3rae1 { - white-space: nowrap -} - -.rounded-full.svelte-v3rae1 { - border-radius: 9999px -} - -.rounded-xl.svelte-v3rae1 { - border-radius: 0.75rem -} - -.border.svelte-v3rae1 { - border-width: 1px -} - -.border-y.svelte-v3rae1 { - border-top-width: 1px; - border-bottom-width: 1px -} - -.border-transparent.svelte-v3rae1 { - border-color: transparent -} - -.border-y-slate-200.svelte-v3rae1 { - --tw-border-opacity: 1; - border-top-color: rgb(226 232 240 / var(--tw-border-opacity)); - border-bottom-color: rgb(226 232 240 / var(--tw-border-opacity)) -} - -.bg-purple-700.svelte-v3rae1 { - --tw-bg-opacity: 1; - background-color: rgb(126 34 206 / var(--tw-bg-opacity)) -} - -.bg-green-500.svelte-v3rae1 { - --tw-bg-opacity: 1; - background-color: rgb(34 197 94 / var(--tw-bg-opacity)) -} - -.bg-gray-300.svelte-v3rae1 { - --tw-bg-opacity: 1; - background-color: rgb(209 213 219 / var(--tw-bg-opacity)) -} - -.bg-slate-100.svelte-v3rae1 { - --tw-bg-opacity: 1; - background-color: rgb(241 245 249 / var(--tw-bg-opacity)) -} - -.p-2.svelte-v3rae1 { - padding: 0.5rem -} - -.p-3.svelte-v3rae1 { - padding: 0.75rem -} - -.px-5.svelte-v3rae1 { - padding-left: 1.25rem; - padding-right: 1.25rem -} - -.py-3.svelte-v3rae1 { - padding-top: 0.75rem; - padding-bottom: 0.75rem -} - -.py-2.svelte-v3rae1 { - padding-top: 0.5rem; - padding-bottom: 0.5rem -} - -.text-lg.svelte-v3rae1 { - font-size: 1.125rem; - line-height: 1.75rem -} - -.text-xs.svelte-v3rae1 { - font-size: 0.75rem; - line-height: 1rem -} - -.text-sm.svelte-v3rae1 { - font-size: 0.875rem; - line-height: 1.25rem -} - -.font-semibold.svelte-v3rae1 { - font-weight: 600 -} - -.text-white.svelte-v3rae1 { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)) -} - -.text-gray-200.svelte-v3rae1 { - --tw-text-opacity: 1; - color: rgb(229 231 235 / var(--tw-text-opacity)) -} - -.text-black.svelte-v3rae1 { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)) -} - -.text-gray-600.svelte-v3rae1 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)) -} - -.shadow-sm.svelte-v3rae1 { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) -} - -.hover\:bg-purple-600.svelte-v3rae1:hover { - --tw-bg-opacity: 1; - background-color: rgb(147 51 234 / var(--tw-bg-opacity)) -} - -.focus\:outline-none.svelte-v3rae1:focus { - outline: 2px solid transparent; - outline-offset: 2px -} - -.focus\:ring-2.svelte-v3rae1:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) -} - -.focus\:ring-purple-500.svelte-v3rae1:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity)) -} - -.focus\:ring-offset-2.svelte-v3rae1:focus { - --tw-ring-offset-width: 2px -} - -@media (prefers-color-scheme: dark) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -@media (min-width: 640px) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -@media (min-width: 1536px) { -} - -@media (prefers-color-scheme: dark) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -.svelte-h3q7vr, .svelte-h3q7vr::before, .svelte-h3q7vr::after { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: #e5e7eb -} - -.svelte-h3q7vr::before, .svelte-h3q7vr::after { - --tw-content: '' -} - -h1.svelte-h3q7vr { - font-size: inherit; - font-weight: inherit -} - -a.svelte-h3q7vr { - color: inherit; - text-decoration: inherit -} - -button.svelte-h3q7vr { - font-family: inherit; - font-size: 100%; - font-weight: inherit; - line-height: inherit; - color: inherit; - margin: 0; - padding: 0 -} - -button.svelte-h3q7vr { - text-transform: none -} - -button.svelte-h3q7vr { - -webkit-appearance: button; - background-color: transparent; - background-image: none -} - -.svelte-h3q7vr:-moz-focusring { - outline: auto -} - -.svelte-h3q7vr:-moz-ui-invalid { - box-shadow: none -} - -.svelte-h3q7vr::-webkit-inner-spin-button, .svelte-h3q7vr::-webkit-outer-spin-button { - height: auto -} - -.svelte-h3q7vr::-webkit-search-decoration { - -webkit-appearance: none -} - -.svelte-h3q7vr::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit -} - -h1.svelte-h3q7vr, p.svelte-h3q7vr { - margin: 0 -} - -button.svelte-h3q7vr { - cursor: pointer -} - -.svelte-h3q7vr:disabled { - cursor: default -} - -svg.svelte-h3q7vr { - display: block; - vertical-align: middle -} - -.svelte-h3q7vr, .svelte-h3q7vr::before, .svelte-h3q7vr::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -.svelte-h3q7vr::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: -} - -@media (min-width: 640px) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} - -@media (min-width: 1536px) { -} - -.fixed.svelte-h3q7vr { - position: fixed -} - -.bottom-5.svelte-h3q7vr { - bottom: 1.25rem -} - -.right-5.svelte-h3q7vr { - right: 1.25rem -} - -.-mx-1.svelte-h3q7vr { - margin-left: -0.25rem; - margin-right: -0.25rem -} - -.mb-3.svelte-h3q7vr { - margin-bottom: 0.75rem -} - -.mb-5.svelte-h3q7vr { - margin-bottom: 1.25rem -} - -.mt-3.svelte-h3q7vr { - margin-top: 0.75rem -} - -.inline-block.svelte-h3q7vr { - display: inline-block -} - -.flex.svelte-h3q7vr { - display: flex -} - -.hidden.svelte-h3q7vr { - display: none -} - -.h-6.svelte-h3q7vr { - height: 1.5rem -} - -.w-6.svelte-h3q7vr { - width: 1.5rem -} - -.w-full.svelte-h3q7vr { - width: 100% -} - -.w-96.svelte-h3q7vr { - width: 24rem -} - -.max-w-screen-sm.svelte-h3q7vr { - max-width: 640px -} - -.flex-row.svelte-h3q7vr { - flex-direction: row -} - -.flex-col.svelte-h3q7vr { - flex-direction: column -} - -.items-center.svelte-h3q7vr { - align-items: center -} - -.gap-4.svelte-h3q7vr { - gap: 1rem -} - -.self-end.svelte-h3q7vr { - align-self: flex-end -} - -.overflow-scroll.svelte-h3q7vr { - overflow: scroll -} - -.rounded-full.svelte-h3q7vr { - border-radius: 9999px -} - -.rounded-xl.svelte-h3q7vr { - border-radius: 0.75rem -} - -.bg-white.svelte-h3q7vr { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)) -} - -.bg-purple-900.svelte-h3q7vr { - --tw-bg-opacity: 1; - background-color: rgb(88 28 135 / var(--tw-bg-opacity)) -} - -.p-2.svelte-h3q7vr { - padding: 0.5rem -} - -.p-5.svelte-h3q7vr { - padding: 1.25rem -} - -.py-4.svelte-h3q7vr { - padding-top: 1rem; - padding-bottom: 1rem -} - -.text-center.svelte-h3q7vr { - text-align: center -} - -.font-sans.svelte-h3q7vr { - font-family: Inconsolata, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" -} - -.text-xl.svelte-h3q7vr { - font-size: 1.25rem; - line-height: 1.75rem -} - -.text-2xl.svelte-h3q7vr { - font-size: 1.5rem; - line-height: 2rem -} - -.text-6xl.svelte-h3q7vr { - font-size: 3.75rem; - line-height: 1 -} - -.font-semibold.svelte-h3q7vr { - font-weight: 600 -} - -.font-bold.svelte-h3q7vr { - font-weight: 700 -} - -.uppercase.svelte-h3q7vr { - text-transform: uppercase -} - -.tracking-wide.svelte-h3q7vr { - letter-spacing: 0.025em -} - -.tracking-wider.svelte-h3q7vr { - letter-spacing: 0.05em -} - -.text-white.svelte-h3q7vr { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)) -} - -.text-black.svelte-h3q7vr { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)) -} - -.text-purple-700.svelte-h3q7vr { - --tw-text-opacity: 1; - color: rgb(126 34 206 / var(--tw-text-opacity)) -} - -.text-gray-700.svelte-h3q7vr { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)) -} - -.text-orange-400.svelte-h3q7vr { - --tw-text-opacity: 1; - color: rgb(251 146 60 / var(--tw-text-opacity)) -} - -.text-purple-300.svelte-h3q7vr { - --tw-text-opacity: 1; - color: rgb(216 180 254 / var(--tw-text-opacity)) -} - -.shadow-2xl.svelte-h3q7vr { - --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); - --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) -} - -.hover\:bg-purple-700.svelte-h3q7vr:hover { - --tw-bg-opacity: 1; - background-color: rgb(126 34 206 / var(--tw-bg-opacity)) -} - -@media (prefers-color-scheme: dark) { -} - -@media (min-width: 768px) { -} - -@media (min-width: 1024px) { -} - -@media (min-width: 1280px) { -} diff --git a/public/dist/einundzwanzig.chat.js b/public/dist/einundzwanzig.chat.js deleted file mode 100644 index 179c26c..0000000 --- a/public/dist/einundzwanzig.chat.js +++ /dev/null @@ -1,14879 +0,0 @@ -(function () { - 'use strict'; - - function noop() { } - function assign(tar, src) { - // @ts-ignore - for (const k in src) - tar[k] = src[k]; - return tar; - } - function run(fn) { - return fn(); - } - function blank_object() { - return Object.create(null); - } - function run_all(fns) { - fns.forEach(run); - } - function is_function(thing) { - return typeof thing === 'function'; - } - function safe_not_equal(a, b) { - return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); - } - let src_url_equal_anchor; - function src_url_equal(element_src, url) { - if (!src_url_equal_anchor) { - src_url_equal_anchor = document.createElement('a'); - } - src_url_equal_anchor.href = url; - return element_src === src_url_equal_anchor.href; - } - function is_empty(obj) { - return Object.keys(obj).length === 0; - } - function subscribe(store, ...callbacks) { - if (store == null) { - return noop; - } - const unsub = store.subscribe(...callbacks); - return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; - } - function component_subscribe(component, store, callback) { - component.$$.on_destroy.push(subscribe(store, callback)); - } - function set_store_value(store, ret, value) { - store.set(value); - return ret; - } - - const is_client = typeof window !== 'undefined'; - let now$1 = is_client - ? () => window.performance.now() - : () => Date.now(); - let raf = is_client ? cb => requestAnimationFrame(cb) : noop; - - const tasks = new Set(); - function run_tasks(now) { - tasks.forEach(task => { - if (!task.c(now)) { - tasks.delete(task); - task.f(); - } - }); - if (tasks.size !== 0) - raf(run_tasks); - } - /** - * Creates a new task that runs on each raf frame - * until it returns a falsy value or is aborted - */ - function loop(callback) { - let task; - if (tasks.size === 0) - raf(run_tasks); - return { - promise: new Promise(fulfill => { - tasks.add(task = { c: callback, f: fulfill }); - }), - abort() { - tasks.delete(task); - } - }; - } - function append(target, node) { - target.appendChild(node); - } - function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); - } - function detach(node) { - if (node.parentNode) { - node.parentNode.removeChild(node); - } - } - function destroy_each(iterations, detaching) { - for (let i = 0; i < iterations.length; i += 1) { - if (iterations[i]) - iterations[i].d(detaching); - } - } - function element(name) { - return document.createElement(name); - } - function svg_element(name) { - return document.createElementNS('http://www.w3.org/2000/svg', name); - } - function text(data) { - return document.createTextNode(data); - } - function space() { - return text(' '); - } - function empty() { - return text(''); - } - function listen(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); - } - function prevent_default(fn) { - return function (event) { - event.preventDefault(); - // @ts-ignore - return fn.call(this, event); - }; - } - function attr(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); - } - function set_svg_attributes(node, attributes) { - for (const key in attributes) { - attr(node, key, attributes[key]); - } - } - function children(element) { - return Array.from(element.childNodes); - } - function set_data(text, data) { - data = '' + data; - if (text.wholeText !== data) - text.data = data; - } - function set_style(node, key, value, important) { - if (value === null) { - node.style.removeProperty(key); - } - else { - node.style.setProperty(key, value, important ? 'important' : ''); - } - } - function toggle_class(element, name, toggle) { - element.classList[toggle ? 'add' : 'remove'](name); - } - - let current_component; - function set_current_component(component) { - current_component = component; - } - function get_current_component() { - if (!current_component) - throw new Error('Function called outside component initialization'); - return current_component; - } - /** - * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM. - * It must be called during the component's initialisation (but doesn't need to live *inside* the component; - * it can be called from an external module). - * - * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api). - * - * https://svelte.dev/docs#run-time-svelte-onmount - */ - function onMount(fn) { - get_current_component().$$.on_mount.push(fn); - } - - const dirty_components = []; - const binding_callbacks = []; - const render_callbacks = []; - const flush_callbacks = []; - const resolved_promise = Promise.resolve(); - let update_scheduled = false; - function schedule_update() { - if (!update_scheduled) { - update_scheduled = true; - resolved_promise.then(flush); - } - } - function add_render_callback(fn) { - render_callbacks.push(fn); - } - // flush() calls callbacks in this order: - // 1. All beforeUpdate callbacks, in order: parents before children - // 2. All bind:this callbacks, in reverse order: children before parents. - // 3. All afterUpdate callbacks, in order: parents before children. EXCEPT - // for afterUpdates called during the initial onMount, which are called in - // reverse order: children before parents. - // Since callbacks might update component values, which could trigger another - // call to flush(), the following steps guard against this: - // 1. During beforeUpdate, any updated components will be added to the - // dirty_components array and will cause a reentrant call to flush(). Because - // the flush index is kept outside the function, the reentrant call will pick - // up where the earlier call left off and go through all dirty components. The - // current_component value is saved and restored so that the reentrant call will - // not interfere with the "parent" flush() call. - // 2. bind:this callbacks cannot trigger new flush() calls. - // 3. During afterUpdate, any updated components will NOT have their afterUpdate - // callback called a second time; the seen_callbacks set, outside the flush() - // function, guarantees this behavior. - const seen_callbacks = new Set(); - let flushidx = 0; // Do *not* move this inside the flush() function - function flush() { - // Do not reenter flush while dirty components are updated, as this can - // result in an infinite loop. Instead, let the inner flush handle it. - // Reentrancy is ok afterwards for bindings etc. - if (flushidx !== 0) { - return; - } - const saved_component = current_component; - do { - // first, call beforeUpdate functions - // and update components - try { - while (flushidx < dirty_components.length) { - const component = dirty_components[flushidx]; - flushidx++; - set_current_component(component); - update(component.$$); - } - } - catch (e) { - // reset dirty state to not end up in a deadlocked state and then rethrow - dirty_components.length = 0; - flushidx = 0; - throw e; - } - set_current_component(null); - dirty_components.length = 0; - flushidx = 0; - while (binding_callbacks.length) - binding_callbacks.pop()(); - // then, once components are updated, call - // afterUpdate functions. This may cause - // subsequent updates... - for (let i = 0; i < render_callbacks.length; i += 1) { - const callback = render_callbacks[i]; - if (!seen_callbacks.has(callback)) { - // ...so guard against infinite loops - seen_callbacks.add(callback); - callback(); - } - } - render_callbacks.length = 0; - } while (dirty_components.length); - while (flush_callbacks.length) { - flush_callbacks.pop()(); - } - update_scheduled = false; - seen_callbacks.clear(); - set_current_component(saved_component); - } - function update($$) { - if ($$.fragment !== null) { - $$.update(); - run_all($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback); - } - } - const outroing = new Set(); - let outros; - function group_outros() { - outros = { - r: 0, - c: [], - p: outros // parent group - }; - } - function check_outros() { - if (!outros.r) { - run_all(outros.c); - } - outros = outros.p; - } - function transition_in(block, local) { - if (block && block.i) { - outroing.delete(block); - block.i(local); - } - } - function transition_out(block, local, detach, callback) { - if (block && block.o) { - if (outroing.has(block)) - return; - outroing.add(block); - outros.c.push(() => { - outroing.delete(block); - if (callback) { - if (detach) - block.d(1); - callback(); - } - }); - block.o(local); - } - else if (callback) { - callback(); - } - } - - function get_spread_update(levels, updates) { - const update = {}; - const to_null_out = {}; - const accounted_for = { $$scope: 1 }; - let i = levels.length; - while (i--) { - const o = levels[i]; - const n = updates[i]; - if (n) { - for (const key in o) { - if (!(key in n)) - to_null_out[key] = 1; - } - for (const key in n) { - if (!accounted_for[key]) { - update[key] = n[key]; - accounted_for[key] = 1; - } - } - levels[i] = n; - } - else { - for (const key in o) { - accounted_for[key] = 1; - } - } - } - for (const key in to_null_out) { - if (!(key in update)) - update[key] = undefined; - } - return update; - } - function create_component(block) { - block && block.c(); - } - function mount_component(component, target, anchor, customElement) { - const { fragment, after_update } = component.$$; - fragment && fragment.m(target, anchor); - if (!customElement) { - // onMount happens before the initial afterUpdate - add_render_callback(() => { - const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); - // if the component was destroyed immediately - // it will update the `$$.on_destroy` reference to `null`. - // the destructured on_destroy may still reference to the old array - if (component.$$.on_destroy) { - component.$$.on_destroy.push(...new_on_destroy); - } - else { - // Edge case - component was destroyed immediately, - // most likely as a result of a binding initialising - run_all(new_on_destroy); - } - component.$$.on_mount = []; - }); - } - after_update.forEach(add_render_callback); - } - function destroy_component(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - run_all($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - // TODO null out other refs, including component.$$ (but need to - // preserve final state?) - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } - } - function make_dirty(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components.push(component); - schedule_update(); - component.$$.dirty.fill(0); - } - component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); - } - function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { - const parent_component = current_component; - set_current_component(component); - const $$ = component.$$ = { - fragment: null, - ctx: [], - // state - props, - update: noop, - not_equal, - bound: blank_object(), - // lifecycle - on_mount: [], - on_destroy: [], - on_disconnect: [], - before_update: [], - after_update: [], - context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), - // everything else - callbacks: blank_object(), - dirty, - skip_bound: false, - root: options.target || parent_component.$$.root - }; - append_styles && append_styles($$.root); - let ready = false; - $$.ctx = instance - ? instance(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty(component, i); - } - return ret; - }) - : []; - $$.update(); - ready = true; - run_all($$.before_update); - // `false` as a special case of no DOM component - $$.fragment = create_fragment ? create_fragment($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - const nodes = children(options.target); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach); - } - else { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in(component.$$.fragment); - mount_component(component, options.target, options.anchor, options.customElement); - flush(); - } - set_current_component(parent_component); - } - /** - * Base class for Svelte components. Used when dev=false. - */ - class SvelteComponent { - $destroy() { - destroy_component(this, 1); - this.$destroy = noop; - } - $on(type, callback) { - if (!is_function(callback)) { - return noop; - } - const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } - } - } - - const subscriber_queue = []; - /** - * Create a `Writable` store that allows both updating and reading by subscription. - * @param {*=}value initial value - * @param {StartStopNotifier=}start start and stop notifications for subscriptions - */ - function writable(value, start = noop) { - let stop; - const subscribers = new Set(); - function set(new_value) { - if (safe_not_equal(value, new_value)) { - value = new_value; - if (stop) { // store is ready - const run_queue = !subscriber_queue.length; - for (const subscriber of subscribers) { - subscriber[1](); - subscriber_queue.push(subscriber, value); - } - if (run_queue) { - for (let i = 0; i < subscriber_queue.length; i += 2) { - subscriber_queue[i][0](subscriber_queue[i + 1]); - } - subscriber_queue.length = 0; - } - } - } - } - function update(fn) { - set(fn(value)); - } - function subscribe(run, invalidate = noop) { - const subscriber = [run, invalidate]; - subscribers.add(subscriber); - if (subscribers.size === 1) { - stop = start(set) || noop; - } - run(value); - return () => { - subscribers.delete(subscriber); - if (subscribers.size === 0) { - stop(); - stop = null; - } - }; - } - return { set, update, subscribe }; - } - - const chatAdapter = writable(null); - const chatData = writable({ events: [], profiles: {}}); - const selectedMessage = writable(null); - - var Mode = { - MODE_NUMBER: 1 << 0, - MODE_ALPHA_NUM: 1 << 1, - MODE_8BIT_BYTE: 1 << 2, - MODE_KANJI: 1 << 3, - }; - - function QR8bitByte(data) { - this.mode = Mode.MODE_8BIT_BYTE; - this.data = data; - } - - QR8bitByte.prototype = { - getLength: function () { - return this.data.length - }, - - write: function (buffer) { - for (var i = 0; i < this.data.length; i++) { - // not JIS ... - buffer.put(this.data.charCodeAt(i), 8); - } - }, - }; - - var ErrorCorrectLevel = { - L: 1, - M: 0, - Q: 3, - H: 2, - }; - - // ErrorCorrectLevel - - function QRRSBlock(totalCount, dataCount) { - this.totalCount = totalCount; - this.dataCount = dataCount; - } - - QRRSBlock.RS_BLOCK_TABLE = [ - // L - // M - // Q - // H - - // 1 - [1, 26, 19], - [1, 26, 16], - [1, 26, 13], - [1, 26, 9], - - // 2 - [1, 44, 34], - [1, 44, 28], - [1, 44, 22], - [1, 44, 16], - - // 3 - [1, 70, 55], - [1, 70, 44], - [2, 35, 17], - [2, 35, 13], - - // 4 - [1, 100, 80], - [2, 50, 32], - [2, 50, 24], - [4, 25, 9], - - // 5 - [1, 134, 108], - [2, 67, 43], - [2, 33, 15, 2, 34, 16], - [2, 33, 11, 2, 34, 12], - - // 6 - [2, 86, 68], - [4, 43, 27], - [4, 43, 19], - [4, 43, 15], - - // 7 - [2, 98, 78], - [4, 49, 31], - [2, 32, 14, 4, 33, 15], - [4, 39, 13, 1, 40, 14], - - // 8 - [2, 121, 97], - [2, 60, 38, 2, 61, 39], - [4, 40, 18, 2, 41, 19], - [4, 40, 14, 2, 41, 15], - - // 9 - [2, 146, 116], - [3, 58, 36, 2, 59, 37], - [4, 36, 16, 4, 37, 17], - [4, 36, 12, 4, 37, 13], - - // 10 - [2, 86, 68, 2, 87, 69], - [4, 69, 43, 1, 70, 44], - [6, 43, 19, 2, 44, 20], - [6, 43, 15, 2, 44, 16], - - // 11 - [4, 101, 81], - [1, 80, 50, 4, 81, 51], - [4, 50, 22, 4, 51, 23], - [3, 36, 12, 8, 37, 13], - - // 12 - [2, 116, 92, 2, 117, 93], - [6, 58, 36, 2, 59, 37], - [4, 46, 20, 6, 47, 21], - [7, 42, 14, 4, 43, 15], - - // 13 - [4, 133, 107], - [8, 59, 37, 1, 60, 38], - [8, 44, 20, 4, 45, 21], - [12, 33, 11, 4, 34, 12], - - // 14 - [3, 145, 115, 1, 146, 116], - [4, 64, 40, 5, 65, 41], - [11, 36, 16, 5, 37, 17], - [11, 36, 12, 5, 37, 13], - - // 15 - [5, 109, 87, 1, 110, 88], - [5, 65, 41, 5, 66, 42], - [5, 54, 24, 7, 55, 25], - [11, 36, 12], - - // 16 - [5, 122, 98, 1, 123, 99], - [7, 73, 45, 3, 74, 46], - [15, 43, 19, 2, 44, 20], - [3, 45, 15, 13, 46, 16], - - // 17 - [1, 135, 107, 5, 136, 108], - [10, 74, 46, 1, 75, 47], - [1, 50, 22, 15, 51, 23], - [2, 42, 14, 17, 43, 15], - - // 18 - [5, 150, 120, 1, 151, 121], - [9, 69, 43, 4, 70, 44], - [17, 50, 22, 1, 51, 23], - [2, 42, 14, 19, 43, 15], - - // 19 - [3, 141, 113, 4, 142, 114], - [3, 70, 44, 11, 71, 45], - [17, 47, 21, 4, 48, 22], - [9, 39, 13, 16, 40, 14], - - // 20 - [3, 135, 107, 5, 136, 108], - [3, 67, 41, 13, 68, 42], - [15, 54, 24, 5, 55, 25], - [15, 43, 15, 10, 44, 16], - - // 21 - [4, 144, 116, 4, 145, 117], - [17, 68, 42], - [17, 50, 22, 6, 51, 23], - [19, 46, 16, 6, 47, 17], - - // 22 - [2, 139, 111, 7, 140, 112], - [17, 74, 46], - [7, 54, 24, 16, 55, 25], - [34, 37, 13], - - // 23 - [4, 151, 121, 5, 152, 122], - [4, 75, 47, 14, 76, 48], - [11, 54, 24, 14, 55, 25], - [16, 45, 15, 14, 46, 16], - - // 24 - [6, 147, 117, 4, 148, 118], - [6, 73, 45, 14, 74, 46], - [11, 54, 24, 16, 55, 25], - [30, 46, 16, 2, 47, 17], - - // 25 - [8, 132, 106, 4, 133, 107], - [8, 75, 47, 13, 76, 48], - [7, 54, 24, 22, 55, 25], - [22, 45, 15, 13, 46, 16], - - // 26 - [10, 142, 114, 2, 143, 115], - [19, 74, 46, 4, 75, 47], - [28, 50, 22, 6, 51, 23], - [33, 46, 16, 4, 47, 17], - - // 27 - [8, 152, 122, 4, 153, 123], - [22, 73, 45, 3, 74, 46], - [8, 53, 23, 26, 54, 24], - [12, 45, 15, 28, 46, 16], - - // 28 - [3, 147, 117, 10, 148, 118], - [3, 73, 45, 23, 74, 46], - [4, 54, 24, 31, 55, 25], - [11, 45, 15, 31, 46, 16], - - // 29 - [7, 146, 116, 7, 147, 117], - [21, 73, 45, 7, 74, 46], - [1, 53, 23, 37, 54, 24], - [19, 45, 15, 26, 46, 16], - - // 30 - [5, 145, 115, 10, 146, 116], - [19, 75, 47, 10, 76, 48], - [15, 54, 24, 25, 55, 25], - [23, 45, 15, 25, 46, 16], - - // 31 - [13, 145, 115, 3, 146, 116], - [2, 74, 46, 29, 75, 47], - [42, 54, 24, 1, 55, 25], - [23, 45, 15, 28, 46, 16], - - // 32 - [17, 145, 115], - [10, 74, 46, 23, 75, 47], - [10, 54, 24, 35, 55, 25], - [19, 45, 15, 35, 46, 16], - - // 33 - [17, 145, 115, 1, 146, 116], - [14, 74, 46, 21, 75, 47], - [29, 54, 24, 19, 55, 25], - [11, 45, 15, 46, 46, 16], - - // 34 - [13, 145, 115, 6, 146, 116], - [14, 74, 46, 23, 75, 47], - [44, 54, 24, 7, 55, 25], - [59, 46, 16, 1, 47, 17], - - // 35 - [12, 151, 121, 7, 152, 122], - [12, 75, 47, 26, 76, 48], - [39, 54, 24, 14, 55, 25], - [22, 45, 15, 41, 46, 16], - - // 36 - [6, 151, 121, 14, 152, 122], - [6, 75, 47, 34, 76, 48], - [46, 54, 24, 10, 55, 25], - [2, 45, 15, 64, 46, 16], - - // 37 - [17, 152, 122, 4, 153, 123], - [29, 74, 46, 14, 75, 47], - [49, 54, 24, 10, 55, 25], - [24, 45, 15, 46, 46, 16], - - // 38 - [4, 152, 122, 18, 153, 123], - [13, 74, 46, 32, 75, 47], - [48, 54, 24, 14, 55, 25], - [42, 45, 15, 32, 46, 16], - - // 39 - [20, 147, 117, 4, 148, 118], - [40, 75, 47, 7, 76, 48], - [43, 54, 24, 22, 55, 25], - [10, 45, 15, 67, 46, 16], - - // 40 - [19, 148, 118, 6, 149, 119], - [18, 75, 47, 31, 76, 48], - [34, 54, 24, 34, 55, 25], - [20, 45, 15, 61, 46, 16], - ]; - - QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) { - var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); - - if (rsBlock == undefined) { - throw new Error( - 'bad rs block @ typeNumber:' + typeNumber + '/errorCorrectLevel:' + errorCorrectLevel - ) - } - - var length = rsBlock.length / 3; - - var list = new Array(); - - for (var i = 0; i < length; i++) { - var count = rsBlock[i * 3 + 0]; - var totalCount = rsBlock[i * 3 + 1]; - var dataCount = rsBlock[i * 3 + 2]; - - for (var j = 0; j < count; j++) { - list.push(new QRRSBlock(totalCount, dataCount)); - } - } - - return list - }; - - QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) { - switch (errorCorrectLevel) { - case ErrorCorrectLevel.L: - return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0] - case ErrorCorrectLevel.M: - return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1] - case ErrorCorrectLevel.Q: - return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2] - case ErrorCorrectLevel.H: - return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3] - default: - return undefined - } - }; - - function QRBitBuffer() { - this.buffer = new Array(); - this.length = 0; - } - - QRBitBuffer.prototype = { - get: function (index) { - var bufIndex = Math.floor(index / 8); - return ((this.buffer[bufIndex] >>> (7 - (index % 8))) & 1) == 1 - }, - - put: function (num, length) { - for (var i = 0; i < length; i++) { - this.putBit(((num >>> (length - i - 1)) & 1) == 1); - } - }, - - getLengthInBits: function () { - return this.length - }, - - putBit: function (bit) { - var bufIndex = Math.floor(this.length / 8); - if (this.buffer.length <= bufIndex) { - this.buffer.push(0); - } - - if (bit) { - this.buffer[bufIndex] |= 0x80 >>> this.length % 8; - } - - this.length++; - }, - }; - - const QRMath = { - glog: function (n) { - if (n < 1) { - throw new Error('glog(' + n + ')') - } - - return QRMath.LOG_TABLE[n] - }, - - gexp: function (n) { - while (n < 0) { - n += 255; - } - - while (n >= 256) { - n -= 255; - } - - return QRMath.EXP_TABLE[n] - }, - - EXP_TABLE: new Array(256), - - LOG_TABLE: new Array(256), - }; - - for (var i = 0; i < 8; i++) { - QRMath.EXP_TABLE[i] = 1 << i; - } - for (var i = 8; i < 256; i++) { - QRMath.EXP_TABLE[i] = - QRMath.EXP_TABLE[i - 4] ^ - QRMath.EXP_TABLE[i - 5] ^ - QRMath.EXP_TABLE[i - 6] ^ - QRMath.EXP_TABLE[i - 8]; - } - for (var i = 0; i < 255; i++) { - QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; - } - - function QRPolynomial(num, shift) { - if (num.length == undefined) { - throw new Error(num.length + '/' + shift) - } - - var offset = 0; - - while (offset < num.length && num[offset] == 0) { - offset++; - } - - this.num = new Array(num.length - offset + shift); - for (var i = 0; i < num.length - offset; i++) { - this.num[i] = num[i + offset]; - } - } - - QRPolynomial.prototype = { - get: function (index) { - return this.num[index] - }, - - getLength: function () { - return this.num.length - }, - - multiply: function (e) { - var num = new Array(this.getLength() + e.getLength() - 1); - - for (var i = 0; i < this.getLength(); i++) { - for (var j = 0; j < e.getLength(); j++) { - num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); - } - } - - return new QRPolynomial(num, 0) - }, - - mod: function (e) { - if (this.getLength() - e.getLength() < 0) { - return this - } - - var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); - - var num = new Array(this.getLength()); - - for (var i = 0; i < this.getLength(); i++) { - num[i] = this.get(i); - } - - for (var i = 0; i < e.getLength(); i++) { - num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); - } - - // recursive call - return new QRPolynomial(num, 0).mod(e) - }, - }; - - const QRMaskPattern = { - PATTERN000: 0, - PATTERN001: 1, - PATTERN010: 2, - PATTERN011: 3, - PATTERN100: 4, - PATTERN101: 5, - PATTERN110: 6, - PATTERN111: 7, - }; - - const QRUtil = { - PATTERN_POSITION_TABLE: [ - [], - [6, 18], - [6, 22], - [6, 26], - [6, 30], - [6, 34], - [6, 22, 38], - [6, 24, 42], - [6, 26, 46], - [6, 28, 50], - [6, 30, 54], - [6, 32, 58], - [6, 34, 62], - [6, 26, 46, 66], - [6, 26, 48, 70], - [6, 26, 50, 74], - [6, 30, 54, 78], - [6, 30, 56, 82], - [6, 30, 58, 86], - [6, 34, 62, 90], - [6, 28, 50, 72, 94], - [6, 26, 50, 74, 98], - [6, 30, 54, 78, 102], - [6, 28, 54, 80, 106], - [6, 32, 58, 84, 110], - [6, 30, 58, 86, 114], - [6, 34, 62, 90, 118], - [6, 26, 50, 74, 98, 122], - [6, 30, 54, 78, 102, 126], - [6, 26, 52, 78, 104, 130], - [6, 30, 56, 82, 108, 134], - [6, 34, 60, 86, 112, 138], - [6, 30, 58, 86, 114, 142], - [6, 34, 62, 90, 118, 146], - [6, 30, 54, 78, 102, 126, 150], - [6, 24, 50, 76, 102, 128, 154], - [6, 28, 54, 80, 106, 132, 158], - [6, 32, 58, 84, 110, 136, 162], - [6, 26, 54, 82, 110, 138, 166], - [6, 30, 58, 86, 114, 142, 170], - ], - - G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), - G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), - G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), - - getBCHTypeInfo: function (data) { - var d = data << 10; - while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { - d ^= QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)); - } - return ((data << 10) | d) ^ QRUtil.G15_MASK - }, - - getBCHTypeNumber: function (data) { - var d = data << 12; - while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { - d ^= QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)); - } - return (data << 12) | d - }, - - getBCHDigit: function (data) { - var digit = 0; - - while (data != 0) { - digit++; - data >>>= 1; - } - - return digit - }, - - getPatternPosition: function (typeNumber) { - return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1] - }, - - getMask: function (maskPattern, i, j) { - switch (maskPattern) { - case QRMaskPattern.PATTERN000: - return (i + j) % 2 == 0 - case QRMaskPattern.PATTERN001: - return i % 2 == 0 - case QRMaskPattern.PATTERN010: - return j % 3 == 0 - case QRMaskPattern.PATTERN011: - return (i + j) % 3 == 0 - case QRMaskPattern.PATTERN100: - return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0 - case QRMaskPattern.PATTERN101: - return ((i * j) % 2) + ((i * j) % 3) == 0 - case QRMaskPattern.PATTERN110: - return (((i * j) % 2) + ((i * j) % 3)) % 2 == 0 - case QRMaskPattern.PATTERN111: - return (((i * j) % 3) + ((i + j) % 2)) % 2 == 0 - - default: - throw new Error('bad maskPattern:' + maskPattern) - } - }, - - getErrorCorrectPolynomial: function (errorCorrectLength) { - var a = new QRPolynomial([1], 0); - - for (var i = 0; i < errorCorrectLength; i++) { - a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); - } - - return a - }, - - getLengthInBits: function (mode, type) { - if (1 <= type && type < 10) { - // 1 - 9 - - switch (mode) { - case Mode.MODE_NUMBER: - return 10 - case Mode.MODE_ALPHA_NUM: - return 9 - case Mode.MODE_8BIT_BYTE: - return 8 - case Mode.MODE_KANJI: - return 8 - default: - throw new Error('mode:' + mode) - } - } else if (type < 27) { - // 10 - 26 - - switch (mode) { - case Mode.MODE_NUMBER: - return 12 - case Mode.MODE_ALPHA_NUM: - return 11 - case Mode.MODE_8BIT_BYTE: - return 16 - case Mode.MODE_KANJI: - return 10 - default: - throw new Error('mode:' + mode) - } - } else if (type < 41) { - // 27 - 40 - - switch (mode) { - case Mode.MODE_NUMBER: - return 14 - case Mode.MODE_ALPHA_NUM: - return 13 - case Mode.MODE_8BIT_BYTE: - return 16 - case Mode.MODE_KANJI: - return 12 - default: - throw new Error('mode:' + mode) - } - } else { - throw new Error('type:' + type) - } - }, - - getLostPoint: function (qrCode) { - var moduleCount = qrCode.getModuleCount(); - - var lostPoint = 0; - - // LEVEL1 - - for (var row = 0; row < moduleCount; row++) { - for (var col = 0; col < moduleCount; col++) { - var sameCount = 0; - var dark = qrCode.isDark(row, col); - - for (var r = -1; r <= 1; r++) { - if (row + r < 0 || moduleCount <= row + r) { - continue - } - - for (var c = -1; c <= 1; c++) { - if (col + c < 0 || moduleCount <= col + c) { - continue - } - - if (r == 0 && c == 0) { - continue - } - - if (dark == qrCode.isDark(row + r, col + c)) { - sameCount++; - } - } - } - - if (sameCount > 5) { - lostPoint += 3 + sameCount - 5; - } - } - } - - // LEVEL2 - - for (var row = 0; row < moduleCount - 1; row++) { - for (var col = 0; col < moduleCount - 1; col++) { - var count = 0; - if (qrCode.isDark(row, col)) count++; - if (qrCode.isDark(row + 1, col)) count++; - if (qrCode.isDark(row, col + 1)) count++; - if (qrCode.isDark(row + 1, col + 1)) count++; - if (count == 0 || count == 4) { - lostPoint += 3; - } - } - } - - // LEVEL3 - - for (var row = 0; row < moduleCount; row++) { - for (var col = 0; col < moduleCount - 6; col++) { - if ( - qrCode.isDark(row, col) && - !qrCode.isDark(row, col + 1) && - qrCode.isDark(row, col + 2) && - qrCode.isDark(row, col + 3) && - qrCode.isDark(row, col + 4) && - !qrCode.isDark(row, col + 5) && - qrCode.isDark(row, col + 6) - ) { - lostPoint += 40; - } - } - } - - for (var col = 0; col < moduleCount; col++) { - for (var row = 0; row < moduleCount - 6; row++) { - if ( - qrCode.isDark(row, col) && - !qrCode.isDark(row + 1, col) && - qrCode.isDark(row + 2, col) && - qrCode.isDark(row + 3, col) && - qrCode.isDark(row + 4, col) && - !qrCode.isDark(row + 5, col) && - qrCode.isDark(row + 6, col) - ) { - lostPoint += 40; - } - } - } - - // LEVEL4 - - var darkCount = 0; - - for (var col = 0; col < moduleCount; col++) { - for (var row = 0; row < moduleCount; row++) { - if (qrCode.isDark(row, col)) { - darkCount++; - } - } - } - - var ratio = Math.abs((100 * darkCount) / moduleCount / moduleCount - 50) / 5; - lostPoint += ratio * 10; - - return lostPoint - }, - }; - - function QRCode(typeNumber, errorCorrectLevel) { - this.typeNumber = typeNumber; - this.errorCorrectLevel = errorCorrectLevel; - this.modules = null; - this.moduleCount = 0; - this.dataCache = null; - this.dataList = []; - } - - // for client side minification - var proto = QRCode.prototype; - - proto.addData = function (data) { - var newData = new QR8bitByte(data); - this.dataList.push(newData); - this.dataCache = null; - }; - - proto.isDark = function (row, col) { - if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { - throw new Error(row + ',' + col) - } - return this.modules[row][col] - }; - - proto.getModuleCount = function () { - return this.moduleCount - }; - - proto.make = function () { - // Calculate automatically typeNumber if provided is < 1 - if (this.typeNumber < 1) { - var typeNumber = 1; - for (typeNumber = 1; typeNumber < 40; typeNumber++) { - var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); - - var buffer = new QRBitBuffer(); - var totalDataCount = 0; - for (var i = 0; i < rsBlocks.length; i++) { - totalDataCount += rsBlocks[i].dataCount; - } - - for (var i = 0; i < this.dataList.length; i++) { - var data = this.dataList[i]; - buffer.put(data.mode, 4); - buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); - data.write(buffer); - } - if (buffer.getLengthInBits() <= totalDataCount * 8) break - } - this.typeNumber = typeNumber; - } - this.makeImpl(false, this.getBestMaskPattern()); - }; - - proto.makeImpl = function (test, maskPattern) { - this.moduleCount = this.typeNumber * 4 + 17; - this.modules = new Array(this.moduleCount); - - for (var row = 0; row < this.moduleCount; row++) { - this.modules[row] = new Array(this.moduleCount); - - for (var col = 0; col < this.moduleCount; col++) { - this.modules[row][col] = null; //(col + row) % 3; - } - } - - this.setupPositionProbePattern(0, 0); - this.setupPositionProbePattern(this.moduleCount - 7, 0); - this.setupPositionProbePattern(0, this.moduleCount - 7); - this.setupPositionAdjustPattern(); - this.setupTimingPattern(); - this.setupTypeInfo(test, maskPattern); - - if (this.typeNumber >= 7) { - this.setupTypeNumber(test); - } - - if (this.dataCache == null) { - this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); - } - - this.mapData(this.dataCache, maskPattern); - }; - - proto.setupPositionProbePattern = function (row, col) { - for (var r = -1; r <= 7; r++) { - if (row + r <= -1 || this.moduleCount <= row + r) continue - - for (var c = -1; c <= 7; c++) { - if (col + c <= -1 || this.moduleCount <= col + c) continue - - if ( - (0 <= r && r <= 6 && (c == 0 || c == 6)) || - (0 <= c && c <= 6 && (r == 0 || r == 6)) || - (2 <= r && r <= 4 && 2 <= c && c <= 4) - ) { - this.modules[row + r][col + c] = true; - } else { - this.modules[row + r][col + c] = false; - } - } - } - }; - - proto.getBestMaskPattern = function () { - var minLostPoint = 0; - var pattern = 0; - - for (var i = 0; i < 8; i++) { - this.makeImpl(true, i); - - var lostPoint = QRUtil.getLostPoint(this); - - if (i == 0 || minLostPoint > lostPoint) { - minLostPoint = lostPoint; - pattern = i; - } - } - - return pattern - }; - - proto.setupTimingPattern = function () { - for (var r = 8; r < this.moduleCount - 8; r++) { - if (this.modules[r][6] != null) { - continue - } - this.modules[r][6] = r % 2 == 0; - } - - for (var c = 8; c < this.moduleCount - 8; c++) { - if (this.modules[6][c] != null) { - continue - } - this.modules[6][c] = c % 2 == 0; - } - }; - - proto.setupPositionAdjustPattern = function () { - var pos = QRUtil.getPatternPosition(this.typeNumber); - - for (var i = 0; i < pos.length; i++) { - for (var j = 0; j < pos.length; j++) { - var row = pos[i]; - var col = pos[j]; - - if (this.modules[row][col] != null) { - continue - } - - for (var r = -2; r <= 2; r++) { - for (var c = -2; c <= 2; c++) { - if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) { - this.modules[row + r][col + c] = true; - } else { - this.modules[row + r][col + c] = false; - } - } - } - } - } - }; - - proto.setupTypeNumber = function (test) { - var bits = QRUtil.getBCHTypeNumber(this.typeNumber); - - for (var i = 0; i < 18; i++) { - var mod = !test && ((bits >> i) & 1) == 1; - this.modules[Math.floor(i / 3)][(i % 3) + this.moduleCount - 8 - 3] = mod; - } - - for (var i = 0; i < 18; i++) { - var mod = !test && ((bits >> i) & 1) == 1; - this.modules[(i % 3) + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; - } - }; - - proto.setupTypeInfo = function (test, maskPattern) { - var data = (this.errorCorrectLevel << 3) | maskPattern; - var bits = QRUtil.getBCHTypeInfo(data); - - // vertical - for (var i = 0; i < 15; i++) { - var mod = !test && ((bits >> i) & 1) == 1; - - if (i < 6) { - this.modules[i][8] = mod; - } else if (i < 8) { - this.modules[i + 1][8] = mod; - } else { - this.modules[this.moduleCount - 15 + i][8] = mod; - } - } - - // horizontal - for (var i = 0; i < 15; i++) { - var mod = !test && ((bits >> i) & 1) == 1; - - if (i < 8) { - this.modules[8][this.moduleCount - i - 1] = mod; - } else if (i < 9) { - this.modules[8][15 - i - 1 + 1] = mod; - } else { - this.modules[8][15 - i - 1] = mod; - } - } - - // fixed module - this.modules[this.moduleCount - 8][8] = !test; - }; - - proto.mapData = function (data, maskPattern) { - var inc = -1; - var row = this.moduleCount - 1; - var bitIndex = 7; - var byteIndex = 0; - - for (var col = this.moduleCount - 1; col > 0; col -= 2) { - if (col == 6) col--; - - while (true) { - for (var c = 0; c < 2; c++) { - if (this.modules[row][col - c] == null) { - var dark = false; - - if (byteIndex < data.length) { - dark = ((data[byteIndex] >>> bitIndex) & 1) == 1; - } - - var mask = QRUtil.getMask(maskPattern, row, col - c); - - if (mask) { - dark = !dark; - } - - this.modules[row][col - c] = dark; - bitIndex--; - - if (bitIndex == -1) { - byteIndex++; - bitIndex = 7; - } - } - } - - row += inc; - - if (row < 0 || this.moduleCount <= row) { - row -= inc; - inc = -inc; - break - } - } - } - }; - - QRCode.PAD0 = 0xec; - QRCode.PAD1 = 0x11; - - QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) { - var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); - - var buffer = new QRBitBuffer(); - - for (var i = 0; i < dataList.length; i++) { - var data = dataList[i]; - buffer.put(data.mode, 4); - buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); - data.write(buffer); - } - - // calc num max data. - var totalDataCount = 0; - for (var i = 0; i < rsBlocks.length; i++) { - totalDataCount += rsBlocks[i].dataCount; - } - - if (buffer.getLengthInBits() > totalDataCount * 8) { - throw new Error( - 'code length overflow. (' + buffer.getLengthInBits() + '>' + totalDataCount * 8 + ')' - ) - } - - // end code - if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { - buffer.put(0, 4); - } - - // padding - while (buffer.getLengthInBits() % 8 != 0) { - buffer.putBit(false); - } - - // padding - while (true) { - if (buffer.getLengthInBits() >= totalDataCount * 8) { - break - } - buffer.put(QRCode.PAD0, 8); - - if (buffer.getLengthInBits() >= totalDataCount * 8) { - break - } - buffer.put(QRCode.PAD1, 8); - } - - return QRCode.createBytes(buffer, rsBlocks) - }; - - QRCode.createBytes = function (buffer, rsBlocks) { - var offset = 0; - - var maxDcCount = 0; - var maxEcCount = 0; - - var dcdata = new Array(rsBlocks.length); - var ecdata = new Array(rsBlocks.length); - - for (var r = 0; r < rsBlocks.length; r++) { - var dcCount = rsBlocks[r].dataCount; - var ecCount = rsBlocks[r].totalCount - dcCount; - - maxDcCount = Math.max(maxDcCount, dcCount); - maxEcCount = Math.max(maxEcCount, ecCount); - - dcdata[r] = new Array(dcCount); - - for (var i = 0; i < dcdata[r].length; i++) { - dcdata[r][i] = 0xff & buffer.buffer[i + offset]; - } - offset += dcCount; - - var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); - var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); - - var modPoly = rawPoly.mod(rsPoly); - ecdata[r] = new Array(rsPoly.getLength() - 1); - for (var i = 0; i < ecdata[r].length; i++) { - var modIndex = i + modPoly.getLength() - ecdata[r].length; - ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0; - } - } - - var totalCodeCount = 0; - for (var i = 0; i < rsBlocks.length; i++) { - totalCodeCount += rsBlocks[i].totalCount; - } - - var data = new Array(totalCodeCount); - var index = 0; - - for (var i = 0; i < maxDcCount; i++) { - for (var r = 0; r < rsBlocks.length; r++) { - if (i < dcdata[r].length) { - data[index++] = dcdata[r][i]; - } - } - } - - for (var i = 0; i < maxEcCount; i++) { - for (var r = 0; r < rsBlocks.length; r++) { - if (i < ecdata[r].length) { - data[index++] = ecdata[r][i]; - } - } - } - - return data - }; - - /* node_modules/svelte-qr/src/QR.svelte generated by Svelte v3.55.1 */ - - function get_each_context$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[5] = list[i]; - return child_ctx; - } - - // (48:4) {#each rects as rect} - function create_each_block$2(ctx) { - let rect; - let rect_levels = [/*rect*/ ctx[5]]; - let rect_data = {}; - - for (let i = 0; i < rect_levels.length; i += 1) { - rect_data = assign(rect_data, rect_levels[i]); - } - - return { - c() { - rect = svg_element("rect"); - set_svg_attributes(rect, rect_data); - toggle_class(rect, "svelte-2fcki1", true); - }, - m(target, anchor) { - insert(target, rect, anchor); - }, - p(ctx, dirty) { - set_svg_attributes(rect, rect_data = get_spread_update(rect_levels, [/*rect*/ ctx[5]])); - toggle_class(rect, "svelte-2fcki1", true); - }, - d(detaching) { - if (detaching) detach(rect); - } - }; - } - - function create_fragment$5(ctx) { - let svg; - let svg_viewBox_value; - let each_value = /*rects*/ ctx[1]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); - } - - return { - c() { - svg = svg_element("svg"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(svg, "class", "qr svelte-2fcki1"); - attr(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr(svg, "viewBox", svg_viewBox_value = "0 0 " + /*size*/ ctx[0] + " " + /*size*/ ctx[0]); - }, - m(target, anchor) { - insert(target, svg, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(svg, null); - } - }, - p(ctx, [dirty]) { - if (dirty & /*rects*/ 2) { - each_value = /*rects*/ ctx[1]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$2(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$2(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(svg, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value.length; - } - - if (dirty & /*size*/ 1 && svg_viewBox_value !== (svg_viewBox_value = "0 0 " + /*size*/ ctx[0] + " " + /*size*/ ctx[0])) { - attr(svg, "viewBox", svg_viewBox_value); - } - }, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(svg); - destroy_each(each_blocks, detaching); - } - }; - } - - function instance$5($$self, $$props, $$invalidate) { - let { text } = $$props; - let { level = "L" } = $$props; - let { version = -1 } = $$props; - let size; - let rects = []; - - $$self.$$set = $$props => { - if ('text' in $$props) $$invalidate(2, text = $$props.text); - if ('level' in $$props) $$invalidate(3, level = $$props.level); - if ('version' in $$props) $$invalidate(4, version = $$props.version); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*version, level, text*/ 28) { - { - let qr = new QRCode(version, ErrorCorrectLevel[level]); - qr.addData(text); - qr.make(); - const rows = qr.modules; - $$invalidate(0, size = rows.length); - - for (const [y, row] of rows.entries()) { - let rect; - - for (const [x, on] of row.entries()) { - if (on) { - if (!rect) rect = { x, y, width: 0, height: 1 }; - rect.width++; - } else { - if (rect && rect.width > 0) { - rects.push(rect); - } - - rect = void 0; - } - } - - if (rect && rect.width > 0) { - rects.push(rect); - } - } - } - } - }; - - return [size, rects, text, level, version]; - } - - class QR extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$5, create_fragment$5, safe_not_equal, { text: 2, level: 3, version: 4 }); - } - } - - var _nodeResolve_empty = {}; - - var nodeCrypto = /*#__PURE__*/Object.freeze({ - __proto__: null, - default: _nodeResolve_empty - }); - - /*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */ - const _0n = BigInt(0); - const _1n = BigInt(1); - const _2n = BigInt(2); - const _3n = BigInt(3); - const _8n = BigInt(8); - const CURVE = Object.freeze({ - a: _0n, - b: BigInt(7), - P: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'), - n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'), - h: _1n, - Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'), - Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'), - beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'), - }); - const divNearest = (a, b) => (a + b / _2n) / b; - const endo = { - beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'), - splitScalar(k) { - const { n } = CURVE; - const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15'); - const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3'); - const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'); - const b2 = a1; - const POW_2_128 = BigInt('0x100000000000000000000000000000000'); - const c1 = divNearest(b2 * k, n); - const c2 = divNearest(-b1 * k, n); - let k1 = mod(k - c1 * a1 - c2 * a2, n); - let k2 = mod(-c1 * b1 - c2 * b2, n); - const k1neg = k1 > POW_2_128; - const k2neg = k2 > POW_2_128; - if (k1neg) - k1 = n - k1; - if (k2neg) - k2 = n - k2; - if (k1 > POW_2_128 || k2 > POW_2_128) { - throw new Error('splitScalarEndo: Endomorphism failed, k=' + k); - } - return { k1neg, k1, k2neg, k2 }; - }, - }; - const fieldLen = 32; - const groupLen = 32; - const hashLen = 32; - const compressedLen = fieldLen + 1; - const uncompressedLen = 2 * fieldLen + 1; - function weierstrass(x) { - const { a, b } = CURVE; - const x2 = mod(x * x); - const x3 = mod(x2 * x); - return mod(x3 + a * x + b); - } - const USE_ENDOMORPHISM = CURVE.a === _0n; - class ShaError extends Error { - constructor(message) { - super(message); - } - } - function assertJacPoint(other) { - if (!(other instanceof JacobianPoint)) - throw new TypeError('JacobianPoint expected'); - } - class JacobianPoint { - constructor(x, y, z) { - this.x = x; - this.y = y; - this.z = z; - } - static fromAffine(p) { - if (!(p instanceof Point)) { - throw new TypeError('JacobianPoint#fromAffine: expected Point'); - } - if (p.equals(Point.ZERO)) - return JacobianPoint.ZERO; - return new JacobianPoint(p.x, p.y, _1n); - } - static toAffineBatch(points) { - const toInv = invertBatch(points.map((p) => p.z)); - return points.map((p, i) => p.toAffine(toInv[i])); - } - static normalizeZ(points) { - return JacobianPoint.toAffineBatch(points).map(JacobianPoint.fromAffine); - } - equals(other) { - assertJacPoint(other); - const { x: X1, y: Y1, z: Z1 } = this; - const { x: X2, y: Y2, z: Z2 } = other; - const Z1Z1 = mod(Z1 * Z1); - const Z2Z2 = mod(Z2 * Z2); - const U1 = mod(X1 * Z2Z2); - const U2 = mod(X2 * Z1Z1); - const S1 = mod(mod(Y1 * Z2) * Z2Z2); - const S2 = mod(mod(Y2 * Z1) * Z1Z1); - return U1 === U2 && S1 === S2; - } - negate() { - return new JacobianPoint(this.x, mod(-this.y), this.z); - } - double() { - const { x: X1, y: Y1, z: Z1 } = this; - const A = mod(X1 * X1); - const B = mod(Y1 * Y1); - const C = mod(B * B); - const x1b = X1 + B; - const D = mod(_2n * (mod(x1b * x1b) - A - C)); - const E = mod(_3n * A); - const F = mod(E * E); - const X3 = mod(F - _2n * D); - const Y3 = mod(E * (D - X3) - _8n * C); - const Z3 = mod(_2n * Y1 * Z1); - return new JacobianPoint(X3, Y3, Z3); - } - add(other) { - assertJacPoint(other); - const { x: X1, y: Y1, z: Z1 } = this; - const { x: X2, y: Y2, z: Z2 } = other; - if (X2 === _0n || Y2 === _0n) - return this; - if (X1 === _0n || Y1 === _0n) - return other; - const Z1Z1 = mod(Z1 * Z1); - const Z2Z2 = mod(Z2 * Z2); - const U1 = mod(X1 * Z2Z2); - const U2 = mod(X2 * Z1Z1); - const S1 = mod(mod(Y1 * Z2) * Z2Z2); - const S2 = mod(mod(Y2 * Z1) * Z1Z1); - const H = mod(U2 - U1); - const r = mod(S2 - S1); - if (H === _0n) { - if (r === _0n) { - return this.double(); - } - else { - return JacobianPoint.ZERO; - } - } - const HH = mod(H * H); - const HHH = mod(H * HH); - const V = mod(U1 * HH); - const X3 = mod(r * r - HHH - _2n * V); - const Y3 = mod(r * (V - X3) - S1 * HHH); - const Z3 = mod(Z1 * Z2 * H); - return new JacobianPoint(X3, Y3, Z3); - } - subtract(other) { - return this.add(other.negate()); - } - multiplyUnsafe(scalar) { - const P0 = JacobianPoint.ZERO; - if (typeof scalar === 'bigint' && scalar === _0n) - return P0; - let n = normalizeScalar(scalar); - if (n === _1n) - return this; - if (!USE_ENDOMORPHISM) { - let p = P0; - let d = this; - while (n > _0n) { - if (n & _1n) - p = p.add(d); - d = d.double(); - n >>= _1n; - } - return p; - } - let { k1neg, k1, k2neg, k2 } = endo.splitScalar(n); - let k1p = P0; - let k2p = P0; - let d = this; - while (k1 > _0n || k2 > _0n) { - if (k1 & _1n) - k1p = k1p.add(d); - if (k2 & _1n) - k2p = k2p.add(d); - d = d.double(); - k1 >>= _1n; - k2 >>= _1n; - } - if (k1neg) - k1p = k1p.negate(); - if (k2neg) - k2p = k2p.negate(); - k2p = new JacobianPoint(mod(k2p.x * endo.beta), k2p.y, k2p.z); - return k1p.add(k2p); - } - precomputeWindow(W) { - const windows = USE_ENDOMORPHISM ? 128 / W + 1 : 256 / W + 1; - const points = []; - let p = this; - let base = p; - for (let window = 0; window < windows; window++) { - base = p; - points.push(base); - for (let i = 1; i < 2 ** (W - 1); i++) { - base = base.add(p); - points.push(base); - } - p = base.double(); - } - return points; - } - wNAF(n, affinePoint) { - if (!affinePoint && this.equals(JacobianPoint.BASE)) - affinePoint = Point.BASE; - const W = (affinePoint && affinePoint._WINDOW_SIZE) || 1; - if (256 % W) { - throw new Error('Point#wNAF: Invalid precomputation window, must be power of 2'); - } - let precomputes = affinePoint && pointPrecomputes.get(affinePoint); - if (!precomputes) { - precomputes = this.precomputeWindow(W); - if (affinePoint && W !== 1) { - precomputes = JacobianPoint.normalizeZ(precomputes); - pointPrecomputes.set(affinePoint, precomputes); - } - } - let p = JacobianPoint.ZERO; - let f = JacobianPoint.BASE; - const windows = 1 + (USE_ENDOMORPHISM ? 128 / W : 256 / W); - const windowSize = 2 ** (W - 1); - const mask = BigInt(2 ** W - 1); - const maxNumber = 2 ** W; - const shiftBy = BigInt(W); - for (let window = 0; window < windows; window++) { - const offset = window * windowSize; - let wbits = Number(n & mask); - n >>= shiftBy; - if (wbits > windowSize) { - wbits -= maxNumber; - n += _1n; - } - const offset1 = offset; - const offset2 = offset + Math.abs(wbits) - 1; - const cond1 = window % 2 !== 0; - const cond2 = wbits < 0; - if (wbits === 0) { - f = f.add(constTimeNegate(cond1, precomputes[offset1])); - } - else { - p = p.add(constTimeNegate(cond2, precomputes[offset2])); - } - } - return { p, f }; - } - multiply(scalar, affinePoint) { - let n = normalizeScalar(scalar); - let point; - let fake; - if (USE_ENDOMORPHISM) { - const { k1neg, k1, k2neg, k2 } = endo.splitScalar(n); - let { p: k1p, f: f1p } = this.wNAF(k1, affinePoint); - let { p: k2p, f: f2p } = this.wNAF(k2, affinePoint); - k1p = constTimeNegate(k1neg, k1p); - k2p = constTimeNegate(k2neg, k2p); - k2p = new JacobianPoint(mod(k2p.x * endo.beta), k2p.y, k2p.z); - point = k1p.add(k2p); - fake = f1p.add(f2p); - } - else { - const { p, f } = this.wNAF(n, affinePoint); - point = p; - fake = f; - } - return JacobianPoint.normalizeZ([point, fake])[0]; - } - toAffine(invZ) { - const { x, y, z } = this; - const is0 = this.equals(JacobianPoint.ZERO); - if (invZ == null) - invZ = is0 ? _8n : invert(z); - const iz1 = invZ; - const iz2 = mod(iz1 * iz1); - const iz3 = mod(iz2 * iz1); - const ax = mod(x * iz2); - const ay = mod(y * iz3); - const zz = mod(z * iz1); - if (is0) - return Point.ZERO; - if (zz !== _1n) - throw new Error('invZ was invalid'); - return new Point(ax, ay); - } - } - JacobianPoint.BASE = new JacobianPoint(CURVE.Gx, CURVE.Gy, _1n); - JacobianPoint.ZERO = new JacobianPoint(_0n, _1n, _0n); - function constTimeNegate(condition, item) { - const neg = item.negate(); - return condition ? neg : item; - } - const pointPrecomputes = new WeakMap(); - class Point { - constructor(x, y) { - this.x = x; - this.y = y; - } - _setWindowSize(windowSize) { - this._WINDOW_SIZE = windowSize; - pointPrecomputes.delete(this); - } - hasEvenY() { - return this.y % _2n === _0n; - } - static fromCompressedHex(bytes) { - const isShort = bytes.length === 32; - const x = bytesToNumber$1(isShort ? bytes : bytes.subarray(1)); - if (!isValidFieldElement(x)) - throw new Error('Point is not on curve'); - const y2 = weierstrass(x); - let y = sqrtMod(y2); - const isYOdd = (y & _1n) === _1n; - if (isShort) { - if (isYOdd) - y = mod(-y); - } - else { - const isFirstByteOdd = (bytes[0] & 1) === 1; - if (isFirstByteOdd !== isYOdd) - y = mod(-y); - } - const point = new Point(x, y); - point.assertValidity(); - return point; - } - static fromUncompressedHex(bytes) { - const x = bytesToNumber$1(bytes.subarray(1, fieldLen + 1)); - const y = bytesToNumber$1(bytes.subarray(fieldLen + 1, fieldLen * 2 + 1)); - const point = new Point(x, y); - point.assertValidity(); - return point; - } - static fromHex(hex) { - const bytes = ensureBytes(hex); - const len = bytes.length; - const header = bytes[0]; - if (len === fieldLen) - return this.fromCompressedHex(bytes); - if (len === compressedLen && (header === 0x02 || header === 0x03)) { - return this.fromCompressedHex(bytes); - } - if (len === uncompressedLen && header === 0x04) - return this.fromUncompressedHex(bytes); - throw new Error(`Point.fromHex: received invalid point. Expected 32-${compressedLen} compressed bytes or ${uncompressedLen} uncompressed bytes, not ${len}`); - } - static fromPrivateKey(privateKey) { - return Point.BASE.multiply(normalizePrivateKey(privateKey)); - } - static fromSignature(msgHash, signature, recovery) { - const { r, s } = normalizeSignature(signature); - if (![0, 1, 2, 3].includes(recovery)) - throw new Error('Cannot recover: invalid recovery bit'); - const h = truncateHash(ensureBytes(msgHash)); - const { n } = CURVE; - const radj = recovery === 2 || recovery === 3 ? r + n : r; - const rinv = invert(radj, n); - const u1 = mod(-h * rinv, n); - const u2 = mod(s * rinv, n); - const prefix = recovery & 1 ? '03' : '02'; - const R = Point.fromHex(prefix + numTo32bStr(radj)); - const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); - if (!Q) - throw new Error('Cannot recover signature: point at infinify'); - Q.assertValidity(); - return Q; - } - toRawBytes(isCompressed = false) { - return hexToBytes$1(this.toHex(isCompressed)); - } - toHex(isCompressed = false) { - const x = numTo32bStr(this.x); - if (isCompressed) { - const prefix = this.hasEvenY() ? '02' : '03'; - return `${prefix}${x}`; - } - else { - return `04${x}${numTo32bStr(this.y)}`; - } - } - toHexX() { - return this.toHex(true).slice(2); - } - toRawX() { - return this.toRawBytes(true).slice(1); - } - assertValidity() { - const msg = 'Point is not on elliptic curve'; - const { x, y } = this; - if (!isValidFieldElement(x) || !isValidFieldElement(y)) - throw new Error(msg); - const left = mod(y * y); - const right = weierstrass(x); - if (mod(left - right) !== _0n) - throw new Error(msg); - } - equals(other) { - return this.x === other.x && this.y === other.y; - } - negate() { - return new Point(this.x, mod(-this.y)); - } - double() { - return JacobianPoint.fromAffine(this).double().toAffine(); - } - add(other) { - return JacobianPoint.fromAffine(this).add(JacobianPoint.fromAffine(other)).toAffine(); - } - subtract(other) { - return this.add(other.negate()); - } - multiply(scalar) { - return JacobianPoint.fromAffine(this).multiply(scalar, this).toAffine(); - } - multiplyAndAddUnsafe(Q, a, b) { - const P = JacobianPoint.fromAffine(this); - const aP = a === _0n || a === _1n || this !== Point.BASE ? P.multiplyUnsafe(a) : P.multiply(a); - const bQ = JacobianPoint.fromAffine(Q).multiplyUnsafe(b); - const sum = aP.add(bQ); - return sum.equals(JacobianPoint.ZERO) ? undefined : sum.toAffine(); - } - } - Point.BASE = new Point(CURVE.Gx, CURVE.Gy); - Point.ZERO = new Point(_0n, _0n); - function sliceDER(s) { - return Number.parseInt(s[0], 16) >= 8 ? '00' + s : s; - } - function parseDERInt(data) { - if (data.length < 2 || data[0] !== 0x02) { - throw new Error(`Invalid signature integer tag: ${bytesToHex$1(data)}`); - } - const len = data[1]; - const res = data.subarray(2, len + 2); - if (!len || res.length !== len) { - throw new Error(`Invalid signature integer: wrong length`); - } - if (res[0] === 0x00 && res[1] <= 0x7f) { - throw new Error('Invalid signature integer: trailing length'); - } - return { data: bytesToNumber$1(res), left: data.subarray(len + 2) }; - } - function parseDERSignature(data) { - if (data.length < 2 || data[0] != 0x30) { - throw new Error(`Invalid signature tag: ${bytesToHex$1(data)}`); - } - if (data[1] !== data.length - 2) { - throw new Error('Invalid signature: incorrect length'); - } - const { data: r, left: sBytes } = parseDERInt(data.subarray(2)); - const { data: s, left: rBytesLeft } = parseDERInt(sBytes); - if (rBytesLeft.length) { - throw new Error(`Invalid signature: left bytes after parsing: ${bytesToHex$1(rBytesLeft)}`); - } - return { r, s }; - } - class Signature { - constructor(r, s) { - this.r = r; - this.s = s; - this.assertValidity(); - } - static fromCompact(hex) { - const arr = hex instanceof Uint8Array; - const name = 'Signature.fromCompact'; - if (typeof hex !== 'string' && !arr) - throw new TypeError(`${name}: Expected string or Uint8Array`); - const str = arr ? bytesToHex$1(hex) : hex; - if (str.length !== 128) - throw new Error(`${name}: Expected 64-byte hex`); - return new Signature(hexToNumber(str.slice(0, 64)), hexToNumber(str.slice(64, 128))); - } - static fromDER(hex) { - const arr = hex instanceof Uint8Array; - if (typeof hex !== 'string' && !arr) - throw new TypeError(`Signature.fromDER: Expected string or Uint8Array`); - const { r, s } = parseDERSignature(arr ? hex : hexToBytes$1(hex)); - return new Signature(r, s); - } - static fromHex(hex) { - return this.fromDER(hex); - } - assertValidity() { - const { r, s } = this; - if (!isWithinCurveOrder(r)) - throw new Error('Invalid Signature: r must be 0 < r < n'); - if (!isWithinCurveOrder(s)) - throw new Error('Invalid Signature: s must be 0 < s < n'); - } - hasHighS() { - const HALF = CURVE.n >> _1n; - return this.s > HALF; - } - normalizeS() { - return this.hasHighS() ? new Signature(this.r, mod(-this.s, CURVE.n)) : this; - } - toDERRawBytes() { - return hexToBytes$1(this.toDERHex()); - } - toDERHex() { - const sHex = sliceDER(numberToHexUnpadded(this.s)); - const rHex = sliceDER(numberToHexUnpadded(this.r)); - const sHexL = sHex.length / 2; - const rHexL = rHex.length / 2; - const sLen = numberToHexUnpadded(sHexL); - const rLen = numberToHexUnpadded(rHexL); - const length = numberToHexUnpadded(rHexL + sHexL + 4); - return `30${length}02${rLen}${rHex}02${sLen}${sHex}`; - } - toRawBytes() { - return this.toDERRawBytes(); - } - toHex() { - return this.toDERHex(); - } - toCompactRawBytes() { - return hexToBytes$1(this.toCompactHex()); - } - toCompactHex() { - return numTo32bStr(this.r) + numTo32bStr(this.s); - } - } - function concatBytes$1(...arrays) { - if (!arrays.every((b) => b instanceof Uint8Array)) - throw new Error('Uint8Array list expected'); - if (arrays.length === 1) - return arrays[0]; - const length = arrays.reduce((a, arr) => a + arr.length, 0); - const result = new Uint8Array(length); - for (let i = 0, pad = 0; i < arrays.length; i++) { - const arr = arrays[i]; - result.set(arr, pad); - pad += arr.length; - } - return result; - } - const hexes$1 = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0')); - function bytesToHex$1(uint8a) { - if (!(uint8a instanceof Uint8Array)) - throw new Error('Expected Uint8Array'); - let hex = ''; - for (let i = 0; i < uint8a.length; i++) { - hex += hexes$1[uint8a[i]]; - } - return hex; - } - const POW_2_256 = BigInt('0x10000000000000000000000000000000000000000000000000000000000000000'); - function numTo32bStr(num) { - if (typeof num !== 'bigint') - throw new Error('Expected bigint'); - if (!(_0n <= num && num < POW_2_256)) - throw new Error('Expected number 0 <= n < 2^256'); - return num.toString(16).padStart(64, '0'); - } - function numTo32b(num) { - const b = hexToBytes$1(numTo32bStr(num)); - if (b.length !== 32) - throw new Error('Error: expected 32 bytes'); - return b; - } - function numberToHexUnpadded(num) { - const hex = num.toString(16); - return hex.length & 1 ? `0${hex}` : hex; - } - function hexToNumber(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToNumber: expected string, got ' + typeof hex); - } - return BigInt(`0x${hex}`); - } - function hexToBytes$1(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToBytes: expected string, got ' + typeof hex); - } - if (hex.length % 2) - throw new Error('hexToBytes: received invalid unpadded hex' + hex.length); - const array = new Uint8Array(hex.length / 2); - for (let i = 0; i < array.length; i++) { - const j = i * 2; - const hexByte = hex.slice(j, j + 2); - const byte = Number.parseInt(hexByte, 16); - if (Number.isNaN(byte) || byte < 0) - throw new Error('Invalid byte sequence'); - array[i] = byte; - } - return array; - } - function bytesToNumber$1(bytes) { - return hexToNumber(bytesToHex$1(bytes)); - } - function ensureBytes(hex) { - return hex instanceof Uint8Array ? Uint8Array.from(hex) : hexToBytes$1(hex); - } - function normalizeScalar(num) { - if (typeof num === 'number' && Number.isSafeInteger(num) && num > 0) - return BigInt(num); - if (typeof num === 'bigint' && isWithinCurveOrder(num)) - return num; - throw new TypeError('Expected valid private scalar: 0 < scalar < curve.n'); - } - function mod(a, b = CURVE.P) { - const result = a % b; - return result >= _0n ? result : b + result; - } - function pow2(x, power) { - const { P } = CURVE; - let res = x; - while (power-- > _0n) { - res *= res; - res %= P; - } - return res; - } - function sqrtMod(x) { - const { P } = CURVE; - const _6n = BigInt(6); - const _11n = BigInt(11); - const _22n = BigInt(22); - const _23n = BigInt(23); - const _44n = BigInt(44); - const _88n = BigInt(88); - const b2 = (x * x * x) % P; - const b3 = (b2 * b2 * x) % P; - const b6 = (pow2(b3, _3n) * b3) % P; - const b9 = (pow2(b6, _3n) * b3) % P; - const b11 = (pow2(b9, _2n) * b2) % P; - const b22 = (pow2(b11, _11n) * b11) % P; - const b44 = (pow2(b22, _22n) * b22) % P; - const b88 = (pow2(b44, _44n) * b44) % P; - const b176 = (pow2(b88, _88n) * b88) % P; - const b220 = (pow2(b176, _44n) * b44) % P; - const b223 = (pow2(b220, _3n) * b3) % P; - const t1 = (pow2(b223, _23n) * b22) % P; - const t2 = (pow2(t1, _6n) * b2) % P; - const rt = pow2(t2, _2n); - const xc = (rt * rt) % P; - if (xc !== x) - throw new Error('Cannot find square root'); - return rt; - } - function invert(number, modulo = CURVE.P) { - if (number === _0n || modulo <= _0n) { - throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`); - } - let a = mod(number, modulo); - let b = modulo; - let x = _0n, u = _1n; - while (a !== _0n) { - const q = b / a; - const r = b % a; - const m = x - u * q; - b = a, a = r, x = u, u = m; - } - const gcd = b; - if (gcd !== _1n) - throw new Error('invert: does not exist'); - return mod(x, modulo); - } - function invertBatch(nums, p = CURVE.P) { - const scratch = new Array(nums.length); - const lastMultiplied = nums.reduce((acc, num, i) => { - if (num === _0n) - return acc; - scratch[i] = acc; - return mod(acc * num, p); - }, _1n); - const inverted = invert(lastMultiplied, p); - nums.reduceRight((acc, num, i) => { - if (num === _0n) - return acc; - scratch[i] = mod(acc * scratch[i], p); - return mod(acc * num, p); - }, inverted); - return scratch; - } - function bits2int_2(bytes) { - const delta = bytes.length * 8 - groupLen * 8; - const num = bytesToNumber$1(bytes); - return delta > 0 ? num >> BigInt(delta) : num; - } - function truncateHash(hash, truncateOnly = false) { - const h = bits2int_2(hash); - if (truncateOnly) - return h; - const { n } = CURVE; - return h >= n ? h - n : h; - } - let _sha256Sync; - let _hmacSha256Sync; - class HmacDrbg { - constructor(hashLen, qByteLen) { - this.hashLen = hashLen; - this.qByteLen = qByteLen; - if (typeof hashLen !== 'number' || hashLen < 2) - throw new Error('hashLen must be a number'); - if (typeof qByteLen !== 'number' || qByteLen < 2) - throw new Error('qByteLen must be a number'); - this.v = new Uint8Array(hashLen).fill(1); - this.k = new Uint8Array(hashLen).fill(0); - this.counter = 0; - } - hmac(...values) { - return utils$1.hmacSha256(this.k, ...values); - } - hmacSync(...values) { - return _hmacSha256Sync(this.k, ...values); - } - checkSync() { - if (typeof _hmacSha256Sync !== 'function') - throw new ShaError('hmacSha256Sync needs to be set'); - } - incr() { - if (this.counter >= 1000) - throw new Error('Tried 1,000 k values for sign(), all were invalid'); - this.counter += 1; - } - async reseed(seed = new Uint8Array()) { - this.k = await this.hmac(this.v, Uint8Array.from([0x00]), seed); - this.v = await this.hmac(this.v); - if (seed.length === 0) - return; - this.k = await this.hmac(this.v, Uint8Array.from([0x01]), seed); - this.v = await this.hmac(this.v); - } - reseedSync(seed = new Uint8Array()) { - this.checkSync(); - this.k = this.hmacSync(this.v, Uint8Array.from([0x00]), seed); - this.v = this.hmacSync(this.v); - if (seed.length === 0) - return; - this.k = this.hmacSync(this.v, Uint8Array.from([0x01]), seed); - this.v = this.hmacSync(this.v); - } - async generate() { - this.incr(); - let len = 0; - const out = []; - while (len < this.qByteLen) { - this.v = await this.hmac(this.v); - const sl = this.v.slice(); - out.push(sl); - len += this.v.length; - } - return concatBytes$1(...out); - } - generateSync() { - this.checkSync(); - this.incr(); - let len = 0; - const out = []; - while (len < this.qByteLen) { - this.v = this.hmacSync(this.v); - const sl = this.v.slice(); - out.push(sl); - len += this.v.length; - } - return concatBytes$1(...out); - } - } - function isWithinCurveOrder(num) { - return _0n < num && num < CURVE.n; - } - function isValidFieldElement(num) { - return _0n < num && num < CURVE.P; - } - function kmdToSig(kBytes, m, d, lowS = true) { - const { n } = CURVE; - const k = truncateHash(kBytes, true); - if (!isWithinCurveOrder(k)) - return; - const kinv = invert(k, n); - const q = Point.BASE.multiply(k); - const r = mod(q.x, n); - if (r === _0n) - return; - const s = mod(kinv * mod(m + d * r, n), n); - if (s === _0n) - return; - let sig = new Signature(r, s); - let recovery = (q.x === sig.r ? 0 : 2) | Number(q.y & _1n); - if (lowS && sig.hasHighS()) { - sig = sig.normalizeS(); - recovery ^= 1; - } - return { sig, recovery }; - } - function normalizePrivateKey(key) { - let num; - if (typeof key === 'bigint') { - num = key; - } - else if (typeof key === 'number' && Number.isSafeInteger(key) && key > 0) { - num = BigInt(key); - } - else if (typeof key === 'string') { - if (key.length !== 2 * groupLen) - throw new Error('Expected 32 bytes of private key'); - num = hexToNumber(key); - } - else if (key instanceof Uint8Array) { - if (key.length !== groupLen) - throw new Error('Expected 32 bytes of private key'); - num = bytesToNumber$1(key); - } - else { - throw new TypeError('Expected valid private key'); - } - if (!isWithinCurveOrder(num)) - throw new Error('Expected private key: 0 < key < n'); - return num; - } - function normalizePublicKey(publicKey) { - if (publicKey instanceof Point) { - publicKey.assertValidity(); - return publicKey; - } - else { - return Point.fromHex(publicKey); - } - } - function normalizeSignature(signature) { - if (signature instanceof Signature) { - signature.assertValidity(); - return signature; - } - try { - return Signature.fromDER(signature); - } - catch (error) { - return Signature.fromCompact(signature); - } - } - function getPublicKey$1(privateKey, isCompressed = false) { - return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed); - } - function isProbPub(item) { - const arr = item instanceof Uint8Array; - const str = typeof item === 'string'; - const len = (arr || str) && item.length; - if (arr) - return len === compressedLen || len === uncompressedLen; - if (str) - return len === compressedLen * 2 || len === uncompressedLen * 2; - if (item instanceof Point) - return true; - return false; - } - function getSharedSecret(privateA, publicB, isCompressed = false) { - if (isProbPub(privateA)) - throw new TypeError('getSharedSecret: first arg must be private key'); - if (!isProbPub(publicB)) - throw new TypeError('getSharedSecret: second arg must be public key'); - const b = normalizePublicKey(publicB); - b.assertValidity(); - return b.multiply(normalizePrivateKey(privateA)).toRawBytes(isCompressed); - } - function bits2int(bytes) { - const slice = bytes.length > fieldLen ? bytes.slice(0, fieldLen) : bytes; - return bytesToNumber$1(slice); - } - function bits2octets(bytes) { - const z1 = bits2int(bytes); - const z2 = mod(z1, CURVE.n); - return int2octets(z2 < _0n ? z1 : z2); - } - function int2octets(num) { - return numTo32b(num); - } - function initSigArgs(msgHash, privateKey, extraEntropy) { - if (msgHash == null) - throw new Error(`sign: expected valid message hash, not "${msgHash}"`); - const h1 = ensureBytes(msgHash); - const d = normalizePrivateKey(privateKey); - const seedArgs = [int2octets(d), bits2octets(h1)]; - if (extraEntropy != null) { - if (extraEntropy === true) - extraEntropy = utils$1.randomBytes(fieldLen); - const e = ensureBytes(extraEntropy); - if (e.length !== fieldLen) - throw new Error(`sign: Expected ${fieldLen} bytes of extra data`); - seedArgs.push(e); - } - const seed = concatBytes$1(...seedArgs); - const m = bits2int(h1); - return { seed, m, d }; - } - function finalizeSig(recSig, opts) { - const { sig, recovery } = recSig; - const { der, recovered } = Object.assign({ canonical: true, der: true }, opts); - const hashed = der ? sig.toDERRawBytes() : sig.toCompactRawBytes(); - return recovered ? [hashed, recovery] : hashed; - } - function signSync(msgHash, privKey, opts = {}) { - const { seed, m, d } = initSigArgs(msgHash, privKey, opts.extraEntropy); - const drbg = new HmacDrbg(hashLen, groupLen); - drbg.reseedSync(seed); - let sig; - while (!(sig = kmdToSig(drbg.generateSync(), m, d, opts.canonical))) - drbg.reseedSync(); - return finalizeSig(sig, opts); - } - const vopts = { strict: true }; - function verify(signature, msgHash, publicKey, opts = vopts) { - let sig; - try { - sig = normalizeSignature(signature); - msgHash = ensureBytes(msgHash); - } - catch (error) { - return false; - } - const { r, s } = sig; - if (opts.strict && sig.hasHighS()) - return false; - const h = truncateHash(msgHash); - let P; - try { - P = normalizePublicKey(publicKey); - } - catch (error) { - return false; - } - const { n } = CURVE; - const sinv = invert(s, n); - const u1 = mod(h * sinv, n); - const u2 = mod(r * sinv, n); - const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2); - if (!R) - return false; - const v = mod(R.x, n); - return v === r; - } - function schnorrChallengeFinalize(ch) { - return mod(bytesToNumber$1(ch), CURVE.n); - } - class SchnorrSignature { - constructor(r, s) { - this.r = r; - this.s = s; - this.assertValidity(); - } - static fromHex(hex) { - const bytes = ensureBytes(hex); - if (bytes.length !== 64) - throw new TypeError(`SchnorrSignature.fromHex: expected 64 bytes, not ${bytes.length}`); - const r = bytesToNumber$1(bytes.subarray(0, 32)); - const s = bytesToNumber$1(bytes.subarray(32, 64)); - return new SchnorrSignature(r, s); - } - assertValidity() { - const { r, s } = this; - if (!isValidFieldElement(r) || !isWithinCurveOrder(s)) - throw new Error('Invalid signature'); - } - toHex() { - return numTo32bStr(this.r) + numTo32bStr(this.s); - } - toRawBytes() { - return hexToBytes$1(this.toHex()); - } - } - function schnorrGetPublicKey(privateKey) { - return Point.fromPrivateKey(privateKey).toRawX(); - } - class InternalSchnorrSignature { - constructor(message, privateKey, auxRand = utils$1.randomBytes()) { - if (message == null) - throw new TypeError(`sign: Expected valid message, not "${message}"`); - this.m = ensureBytes(message); - const { x, scalar } = this.getScalar(normalizePrivateKey(privateKey)); - this.px = x; - this.d = scalar; - this.rand = ensureBytes(auxRand); - if (this.rand.length !== 32) - throw new TypeError('sign: Expected 32 bytes of aux randomness'); - } - getScalar(priv) { - const point = Point.fromPrivateKey(priv); - const scalar = point.hasEvenY() ? priv : CURVE.n - priv; - return { point, scalar, x: point.toRawX() }; - } - initNonce(d, t0h) { - return numTo32b(d ^ bytesToNumber$1(t0h)); - } - finalizeNonce(k0h) { - const k0 = mod(bytesToNumber$1(k0h), CURVE.n); - if (k0 === _0n) - throw new Error('sign: Creation of signature failed. k is zero'); - const { point: R, x: rx, scalar: k } = this.getScalar(k0); - return { R, rx, k }; - } - finalizeSig(R, k, e, d) { - return new SchnorrSignature(R.x, mod(k + e * d, CURVE.n)).toRawBytes(); - } - error() { - throw new Error('sign: Invalid signature produced'); - } - async calc() { - const { m, d, px, rand } = this; - const tag = utils$1.taggedHash; - const t = this.initNonce(d, await tag(TAGS.aux, rand)); - const { R, rx, k } = this.finalizeNonce(await tag(TAGS.nonce, t, px, m)); - const e = schnorrChallengeFinalize(await tag(TAGS.challenge, rx, px, m)); - const sig = this.finalizeSig(R, k, e, d); - if (!(await schnorrVerify(sig, m, px))) - this.error(); - return sig; - } - calcSync() { - const { m, d, px, rand } = this; - const tag = utils$1.taggedHashSync; - const t = this.initNonce(d, tag(TAGS.aux, rand)); - const { R, rx, k } = this.finalizeNonce(tag(TAGS.nonce, t, px, m)); - const e = schnorrChallengeFinalize(tag(TAGS.challenge, rx, px, m)); - const sig = this.finalizeSig(R, k, e, d); - if (!schnorrVerifySync(sig, m, px)) - this.error(); - return sig; - } - } - async function schnorrSign(msg, privKey, auxRand) { - return new InternalSchnorrSignature(msg, privKey, auxRand).calc(); - } - function schnorrSignSync(msg, privKey, auxRand) { - return new InternalSchnorrSignature(msg, privKey, auxRand).calcSync(); - } - function initSchnorrVerify(signature, message, publicKey) { - const raw = signature instanceof SchnorrSignature; - const sig = raw ? signature : SchnorrSignature.fromHex(signature); - if (raw) - sig.assertValidity(); - return { - ...sig, - m: ensureBytes(message), - P: normalizePublicKey(publicKey), - }; - } - function finalizeSchnorrVerify(r, P, s, e) { - const R = Point.BASE.multiplyAndAddUnsafe(P, normalizePrivateKey(s), mod(-e, CURVE.n)); - if (!R || !R.hasEvenY() || R.x !== r) - return false; - return true; - } - async function schnorrVerify(signature, message, publicKey) { - try { - const { r, s, m, P } = initSchnorrVerify(signature, message, publicKey); - const e = schnorrChallengeFinalize(await utils$1.taggedHash(TAGS.challenge, numTo32b(r), P.toRawX(), m)); - return finalizeSchnorrVerify(r, P, s, e); - } - catch (error) { - return false; - } - } - function schnorrVerifySync(signature, message, publicKey) { - try { - const { r, s, m, P } = initSchnorrVerify(signature, message, publicKey); - const e = schnorrChallengeFinalize(utils$1.taggedHashSync(TAGS.challenge, numTo32b(r), P.toRawX(), m)); - return finalizeSchnorrVerify(r, P, s, e); - } - catch (error) { - if (error instanceof ShaError) - throw error; - return false; - } - } - const schnorr = { - Signature: SchnorrSignature, - getPublicKey: schnorrGetPublicKey, - sign: schnorrSign, - verify: schnorrVerify, - signSync: schnorrSignSync, - verifySync: schnorrVerifySync, - }; - Point.BASE._setWindowSize(8); - const crypto$2 = { - node: nodeCrypto, - web: typeof self === 'object' && 'crypto' in self ? self.crypto : undefined, - }; - const TAGS = { - challenge: 'BIP0340/challenge', - aux: 'BIP0340/aux', - nonce: 'BIP0340/nonce', - }; - const TAGGED_HASH_PREFIXES = {}; - const utils$1 = { - bytesToHex: bytesToHex$1, - hexToBytes: hexToBytes$1, - concatBytes: concatBytes$1, - mod, - invert, - isValidPrivateKey(privateKey) { - try { - normalizePrivateKey(privateKey); - return true; - } - catch (error) { - return false; - } - }, - _bigintTo32Bytes: numTo32b, - _normalizePrivateKey: normalizePrivateKey, - hashToPrivateKey: (hash) => { - hash = ensureBytes(hash); - const minLen = groupLen + 8; - if (hash.length < minLen || hash.length > 1024) { - throw new Error(`Expected valid bytes of private key as per FIPS 186`); - } - const num = mod(bytesToNumber$1(hash), CURVE.n - _1n) + _1n; - return numTo32b(num); - }, - randomBytes: (bytesLength = 32) => { - if (crypto$2.web) { - return crypto$2.web.getRandomValues(new Uint8Array(bytesLength)); - } - else if (crypto$2.node) { - const { randomBytes } = crypto$2.node; - return Uint8Array.from(randomBytes(bytesLength)); - } - else { - throw new Error("The environment doesn't have randomBytes function"); - } - }, - randomPrivateKey: () => utils$1.hashToPrivateKey(utils$1.randomBytes(groupLen + 8)), - precompute(windowSize = 8, point = Point.BASE) { - const cached = point === Point.BASE ? point : new Point(point.x, point.y); - cached._setWindowSize(windowSize); - cached.multiply(_3n); - return cached; - }, - sha256: async (...messages) => { - if (crypto$2.web) { - const buffer = await crypto$2.web.subtle.digest('SHA-256', concatBytes$1(...messages)); - return new Uint8Array(buffer); - } - else if (crypto$2.node) { - const { createHash } = crypto$2.node; - const hash = createHash('sha256'); - messages.forEach((m) => hash.update(m)); - return Uint8Array.from(hash.digest()); - } - else { - throw new Error("The environment doesn't have sha256 function"); - } - }, - hmacSha256: async (key, ...messages) => { - if (crypto$2.web) { - const ckey = await crypto$2.web.subtle.importKey('raw', key, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']); - const message = concatBytes$1(...messages); - const buffer = await crypto$2.web.subtle.sign('HMAC', ckey, message); - return new Uint8Array(buffer); - } - else if (crypto$2.node) { - const { createHmac } = crypto$2.node; - const hash = createHmac('sha256', key); - messages.forEach((m) => hash.update(m)); - return Uint8Array.from(hash.digest()); - } - else { - throw new Error("The environment doesn't have hmac-sha256 function"); - } - }, - sha256Sync: undefined, - hmacSha256Sync: undefined, - taggedHash: async (tag, ...messages) => { - let tagP = TAGGED_HASH_PREFIXES[tag]; - if (tagP === undefined) { - const tagH = await utils$1.sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0))); - tagP = concatBytes$1(tagH, tagH); - TAGGED_HASH_PREFIXES[tag] = tagP; - } - return utils$1.sha256(tagP, ...messages); - }, - taggedHashSync: (tag, ...messages) => { - if (typeof _sha256Sync !== 'function') - throw new ShaError('sha256Sync is undefined, you need to set it'); - let tagP = TAGGED_HASH_PREFIXES[tag]; - if (tagP === undefined) { - const tagH = _sha256Sync(Uint8Array.from(tag, (c) => c.charCodeAt(0))); - tagP = concatBytes$1(tagH, tagH); - TAGGED_HASH_PREFIXES[tag] = tagP; - } - return _sha256Sync(tagP, ...messages); - }, - _JacobianPoint: JacobianPoint, - }; - Object.defineProperties(utils$1, { - sha256Sync: { - configurable: false, - get() { - return _sha256Sync; - }, - set(val) { - if (!_sha256Sync) - _sha256Sync = val; - }, - }, - hmacSha256Sync: { - configurable: false, - get() { - return _hmacSha256Sync; - }, - set(val) { - if (!_hmacSha256Sync) - _hmacSha256Sync = val; - }, - }, - }); - - const crypto$1 = { - node: undefined, - web: typeof self === 'object' && 'crypto' in self ? self.crypto : undefined, - }; - - /*! noble-hashes - MIT License (c) 2021 Paul Miller (paulmillr.com) */ - // Cast array to view - const createView$1 = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength); - // The rotate right (circular right shift) operation for uint32 - const rotr$1 = (word, shift) => (word << (32 - shift)) | (word >>> shift); - const isLE$1 = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44; - // There is almost no big endian hardware, but js typed arrays uses platform specific endianess. - // So, just to be sure not to corrupt anything. - if (!isLE$1) - throw new Error('Non little-endian hardware is not supported'); - Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0')); - // Currently avoid insertion of polyfills with packers (browserify/webpack/etc) - // But setTimeout is pretty slow, maybe worth to investigate howto do minimal polyfill here - (() => { - const nodeRequire = typeof module !== 'undefined' && - typeof module.require === 'function' && - module.require.bind(module); - try { - if (nodeRequire) { - const { setImmediate } = nodeRequire('timers'); - return () => new Promise((resolve) => setImmediate(resolve)); - } - } - catch (e) { } - return () => new Promise((resolve) => setTimeout(resolve, 0)); - })(); - function utf8ToBytes$1(str) { - if (typeof str !== 'string') { - throw new TypeError(`utf8ToBytes expected string, got ${typeof str}`); - } - return new TextEncoder().encode(str); - } - function toBytes$1(data) { - if (typeof data === 'string') - data = utf8ToBytes$1(data); - if (!(data instanceof Uint8Array)) - throw new TypeError(`Expected input type is Uint8Array (got ${typeof data})`); - return data; - } - function assertNumber$1(n) { - if (!Number.isSafeInteger(n) || n < 0) - throw new Error(`Wrong positive integer: ${n}`); - } - function assertHash(hash) { - if (typeof hash !== 'function' || typeof hash.init !== 'function') - throw new Error('Hash should be wrapped by utils.wrapConstructor'); - assertNumber$1(hash.outputLen); - assertNumber$1(hash.blockLen); - } - // For runtime check if class implements interface - let Hash$1 = class Hash { - // Safe version that clones internal state - clone() { - return this._cloneInto(); - } - }; - function wrapConstructor$1(hashConstructor) { - const hashC = (message) => hashConstructor().update(toBytes$1(message)).digest(); - const tmp = hashConstructor(); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = () => hashConstructor(); - hashC.init = hashC.create; - return hashC; - } - function randomBytes(bytesLength = 32) { - if (crypto$1.web) { - return crypto$1.web.getRandomValues(new Uint8Array(bytesLength)); - } - else { - throw new Error("The environment doesn't have randomBytes function"); - } - } - - // Polyfill for Safari 14 - function setBigUint64$2(view, byteOffset, value, isLE) { - if (typeof view.setBigUint64 === 'function') - return view.setBigUint64(byteOffset, value, isLE); - const _32n = BigInt(32); - const _u32_max = BigInt(0xffffffff); - const wh = Number((value >> _32n) & _u32_max); - const wl = Number(value & _u32_max); - const h = isLE ? 4 : 0; - const l = isLE ? 0 : 4; - view.setUint32(byteOffset + h, wh, isLE); - view.setUint32(byteOffset + l, wl, isLE); - } - // Base SHA2 class (RFC 6234) - let SHA2$2 = class SHA2 extends Hash$1 { - constructor(blockLen, outputLen, padOffset, isLE) { - super(); - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE; - this.finished = false; - this.length = 0; - this.pos = 0; - this.destroyed = false; - this.buffer = new Uint8Array(blockLen); - this.view = createView$1(this.buffer); - } - update(data) { - if (this.destroyed) - throw new Error('instance is destroyed'); - const { view, buffer, blockLen, finished } = this; - if (finished) - throw new Error('digest() was already called'); - data = toBytes$1(data); - const len = data.length; - for (let pos = 0; pos < len;) { - const take = Math.min(blockLen - this.pos, len - pos); - // Fast path: we have at least one block in input, cast it to view and process - if (take === blockLen) { - const dataView = createView$1(data); - for (; blockLen <= len - pos; pos += blockLen) - this.process(dataView, pos); - continue; - } - buffer.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - if (this.destroyed) - throw new Error('instance is destroyed'); - if (!(out instanceof Uint8Array) || out.length < this.outputLen) - throw new Error('_Sha2: Invalid output buffer'); - if (this.finished) - throw new Error('digest() was already called'); - this.finished = true; - // Padding - // We can avoid allocation of buffer for padding completely if it - // was previously not allocated here. But it won't change performance. - const { buffer, view, blockLen, isLE } = this; - let { pos } = this; - // append the bit '1' to the message - buffer[pos++] = 0b10000000; - this.buffer.subarray(pos).fill(0); - // we have less than padOffset left in buffer, so we cannot put length in current block, need process it and pad again - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - // Pad until full block byte with zeros - for (let i = pos; i < blockLen; i++) - buffer[i] = 0; - // NOTE: sha512 requires length to be 128bit integer, but length in JS will overflow before that - // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen. - // So we just write lowest 64bit of that value. - setBigUint64$2(view, blockLen - 8, BigInt(this.length * 8), isLE); - this.process(view, 0); - const oview = createView$1(out); - this.get().forEach((v, i) => oview.setUint32(4 * i, v, isLE)); - } - digest() { - const { buffer, outputLen } = this; - this.digestInto(buffer); - const res = buffer.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to || (to = new this.constructor()); - to.set(...this.get()); - const { blockLen, buffer, length, finished, destroyed, pos } = this; - to.length = length; - to.pos = pos; - to.finished = finished; - to.destroyed = destroyed; - if (length % blockLen) - to.buffer.set(buffer); - return to; - } - }; - - // Choice: a ? b : c - const Chi$2 = (a, b, c) => (a & b) ^ (~a & c); - // Majority function, true if any two inpust is true - const Maj$2 = (a, b, c) => (a & b) ^ (a & c) ^ (b & c); - // Round constants: - // first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) - // prettier-ignore - const SHA256_K$2 = new Uint32Array([ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - ]); - // Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): - // prettier-ignore - const IV$2 = new Uint32Array([ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ]); - // Temporary buffer, not used to store anything between runs - // Named this way because it matches specification. - const SHA256_W$2 = new Uint32Array(64); - let SHA256$2 = class SHA256 extends SHA2$2 { - constructor() { - super(64, 32, 8, false); - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - this.A = IV$2[0] | 0; - this.B = IV$2[1] | 0; - this.C = IV$2[2] | 0; - this.D = IV$2[3] | 0; - this.E = IV$2[4] | 0; - this.F = IV$2[5] | 0; - this.G = IV$2[6] | 0; - this.H = IV$2[7] | 0; - } - get() { - const { A, B, C, D, E, F, G, H } = this; - return [A, B, C, D, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) - SHA256_W$2[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W$2[i - 15]; - const W2 = SHA256_W$2[i - 2]; - const s0 = rotr$1(W15, 7) ^ rotr$1(W15, 18) ^ (W15 >>> 3); - const s1 = rotr$1(W2, 17) ^ rotr$1(W2, 19) ^ (W2 >>> 10); - SHA256_W$2[i] = (s1 + SHA256_W$2[i - 7] + s0 + SHA256_W$2[i - 16]) | 0; - } - // Compression function main loop, 64 rounds - let { A, B, C, D, E, F, G, H } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = rotr$1(E, 6) ^ rotr$1(E, 11) ^ rotr$1(E, 25); - const T1 = (H + sigma1 + Chi$2(E, F, G) + SHA256_K$2[i] + SHA256_W$2[i]) | 0; - const sigma0 = rotr$1(A, 2) ^ rotr$1(A, 13) ^ rotr$1(A, 22); - const T2 = (sigma0 + Maj$2(A, B, C)) | 0; - H = G; - G = F; - F = E; - E = (D + T1) | 0; - D = C; - C = B; - B = A; - A = (T1 + T2) | 0; - } - // Add the compressed chunk to the current hash value - A = (A + this.A) | 0; - B = (B + this.B) | 0; - C = (C + this.C) | 0; - D = (D + this.D) | 0; - E = (E + this.E) | 0; - F = (F + this.F) | 0; - G = (G + this.G) | 0; - H = (H + this.H) | 0; - this.set(A, B, C, D, E, F, G, H); - } - roundClean() { - SHA256_W$2.fill(0); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - this.buffer.fill(0); - } - }; - const sha256$2 = wrapConstructor$1(() => new SHA256$2()); - - /*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */ - function assertNumber(n) { - if (!Number.isSafeInteger(n)) - throw new Error(`Wrong integer: ${n}`); - } - function chain(...args) { - const wrap = (a, b) => (c) => a(b(c)); - const encode = Array.from(args) - .reverse() - .reduce((acc, i) => (acc ? wrap(acc, i.encode) : i.encode), undefined); - const decode = args.reduce((acc, i) => (acc ? wrap(acc, i.decode) : i.decode), undefined); - return { encode, decode }; - } - function alphabet(alphabet) { - return { - encode: (digits) => { - if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number')) - throw new Error('alphabet.encode input should be an array of numbers'); - return digits.map((i) => { - assertNumber(i); - if (i < 0 || i >= alphabet.length) - throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`); - return alphabet[i]; - }); - }, - decode: (input) => { - if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string')) - throw new Error('alphabet.decode input should be array of strings'); - return input.map((letter) => { - if (typeof letter !== 'string') - throw new Error(`alphabet.decode: not string element=${letter}`); - const index = alphabet.indexOf(letter); - if (index === -1) - throw new Error(`Unknown letter: "${letter}". Allowed: ${alphabet}`); - return index; - }); - }, - }; - } - function join(separator = '') { - if (typeof separator !== 'string') - throw new Error('join separator should be string'); - return { - encode: (from) => { - if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string')) - throw new Error('join.encode input should be array of strings'); - for (let i of from) - if (typeof i !== 'string') - throw new Error(`join.encode: non-string input=${i}`); - return from.join(separator); - }, - decode: (to) => { - if (typeof to !== 'string') - throw new Error('join.decode input should be string'); - return to.split(separator); - }, - }; - } - function padding(bits, chr = '=') { - assertNumber(bits); - if (typeof chr !== 'string') - throw new Error('padding chr should be string'); - return { - encode(data) { - if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string')) - throw new Error('padding.encode input should be array of strings'); - for (let i of data) - if (typeof i !== 'string') - throw new Error(`padding.encode: non-string input=${i}`); - while ((data.length * bits) % 8) - data.push(chr); - return data; - }, - decode(input) { - if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string')) - throw new Error('padding.encode input should be array of strings'); - for (let i of input) - if (typeof i !== 'string') - throw new Error(`padding.decode: non-string input=${i}`); - let end = input.length; - if ((end * bits) % 8) - throw new Error('Invalid padding: string should have whole number of bytes'); - for (; end > 0 && input[end - 1] === chr; end--) { - if (!(((end - 1) * bits) % 8)) - throw new Error('Invalid padding: string has too much padding'); - } - return input.slice(0, end); - }, - }; - } - function normalize$1(fn) { - if (typeof fn !== 'function') - throw new Error('normalize fn should be function'); - return { encode: (from) => from, decode: (to) => fn(to) }; - } - function convertRadix(data, from, to) { - if (from < 2) - throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`); - if (to < 2) - throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`); - if (!Array.isArray(data)) - throw new Error('convertRadix: data should be array'); - if (!data.length) - return []; - let pos = 0; - const res = []; - const digits = Array.from(data); - digits.forEach((d) => { - assertNumber(d); - if (d < 0 || d >= from) - throw new Error(`Wrong integer: ${d}`); - }); - while (true) { - let carry = 0; - let done = true; - for (let i = pos; i < digits.length; i++) { - const digit = digits[i]; - const digitBase = from * carry + digit; - if (!Number.isSafeInteger(digitBase) || - (from * carry) / from !== carry || - digitBase - digit !== from * carry) { - throw new Error('convertRadix: carry overflow'); - } - carry = digitBase % to; - digits[i] = Math.floor(digitBase / to); - if (!Number.isSafeInteger(digits[i]) || digits[i] * to + carry !== digitBase) - throw new Error('convertRadix: carry overflow'); - if (!done) - continue; - else if (!digits[i]) - pos = i; - else - done = false; - } - res.push(carry); - if (done) - break; - } - for (let i = 0; i < data.length - 1 && data[i] === 0; i++) - res.push(0); - return res.reverse(); - } - const gcd = (a, b) => (!b ? a : gcd(b, a % b)); - const radix2carry = (from, to) => from + (to - gcd(from, to)); - function convertRadix2(data, from, to, padding) { - if (!Array.isArray(data)) - throw new Error('convertRadix2: data should be array'); - if (from <= 0 || from > 32) - throw new Error(`convertRadix2: wrong from=${from}`); - if (to <= 0 || to > 32) - throw new Error(`convertRadix2: wrong to=${to}`); - if (radix2carry(from, to) > 32) { - throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`); - } - let carry = 0; - let pos = 0; - const mask = 2 ** to - 1; - const res = []; - for (const n of data) { - assertNumber(n); - if (n >= 2 ** from) - throw new Error(`convertRadix2: invalid data word=${n} from=${from}`); - carry = (carry << from) | n; - if (pos + from > 32) - throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`); - pos += from; - for (; pos >= to; pos -= to) - res.push(((carry >> (pos - to)) & mask) >>> 0); - carry &= 2 ** pos - 1; - } - carry = (carry << (to - pos)) & mask; - if (!padding && pos >= from) - throw new Error('Excess padding'); - if (!padding && carry) - throw new Error(`Non-zero padding: ${carry}`); - if (padding && pos > 0) - res.push(carry >>> 0); - return res; - } - function radix(num) { - assertNumber(num); - return { - encode: (bytes) => { - if (!(bytes instanceof Uint8Array)) - throw new Error('radix.encode input should be Uint8Array'); - return convertRadix(Array.from(bytes), 2 ** 8, num); - }, - decode: (digits) => { - if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number')) - throw new Error('radix.decode input should be array of strings'); - return Uint8Array.from(convertRadix(digits, num, 2 ** 8)); - }, - }; - } - function radix2(bits, revPadding = false) { - assertNumber(bits); - if (bits <= 0 || bits > 32) - throw new Error('radix2: bits should be in (0..32]'); - if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32) - throw new Error('radix2: carry overflow'); - return { - encode: (bytes) => { - if (!(bytes instanceof Uint8Array)) - throw new Error('radix2.encode input should be Uint8Array'); - return convertRadix2(Array.from(bytes), 8, bits, !revPadding); - }, - decode: (digits) => { - if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number')) - throw new Error('radix2.decode input should be array of strings'); - return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding)); - }, - }; - } - function unsafeWrapper(fn) { - if (typeof fn !== 'function') - throw new Error('unsafeWrapper fn should be function'); - return function (...args) { - try { - return fn.apply(null, args); - } - catch (e) { } - }; - } - function checksum(len, fn) { - assertNumber(len); - if (typeof fn !== 'function') - throw new Error('checksum fn should be function'); - return { - encode(data) { - if (!(data instanceof Uint8Array)) - throw new Error('checksum.encode: input should be Uint8Array'); - const checksum = fn(data).slice(0, len); - const res = new Uint8Array(data.length + len); - res.set(data); - res.set(checksum, data.length); - return res; - }, - decode(data) { - if (!(data instanceof Uint8Array)) - throw new Error('checksum.decode: input should be Uint8Array'); - const payload = data.slice(0, -len); - const newChecksum = fn(payload).slice(0, len); - const oldChecksum = data.slice(-len); - for (let i = 0; i < len; i++) - if (newChecksum[i] !== oldChecksum[i]) - throw new Error('Invalid checksum'); - return payload; - }, - }; - } - const base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join('')); - const base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join('')); - chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join('')); - chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize$1((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))); - const base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join('')); - const base64url = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join('')); - const genBase58 = (abc) => chain(radix(58), alphabet(abc), join('')); - const base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'); - genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'); - genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'); - const XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11]; - const base58xmr = { - encode(data) { - let res = ''; - for (let i = 0; i < data.length; i += 8) { - const block = data.subarray(i, i + 8); - res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1'); - } - return res; - }, - decode(str) { - let res = []; - for (let i = 0; i < str.length; i += 11) { - const slice = str.slice(i, i + 11); - const blockLen = XMR_BLOCK_LEN.indexOf(slice.length); - const block = base58.decode(slice); - for (let j = 0; j < block.length - blockLen; j++) { - if (block[j] !== 0) - throw new Error('base58xmr: wrong padding'); - } - res = res.concat(Array.from(block.slice(block.length - blockLen))); - } - return Uint8Array.from(res); - }, - }; - const base58check$1 = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), base58); - const BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join('')); - const POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]; - function bech32Polymod(pre) { - const b = pre >> 25; - let chk = (pre & 0x1ffffff) << 5; - for (let i = 0; i < POLYMOD_GENERATORS.length; i++) { - if (((b >> i) & 1) === 1) - chk ^= POLYMOD_GENERATORS[i]; - } - return chk; - } - function bechChecksum(prefix, words, encodingConst = 1) { - const len = prefix.length; - let chk = 1; - for (let i = 0; i < len; i++) { - const c = prefix.charCodeAt(i); - if (c < 33 || c > 126) - throw new Error(`Invalid prefix (${prefix})`); - chk = bech32Polymod(chk) ^ (c >> 5); - } - chk = bech32Polymod(chk); - for (let i = 0; i < len; i++) - chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f); - for (let v of words) - chk = bech32Polymod(chk) ^ v; - for (let i = 0; i < 6; i++) - chk = bech32Polymod(chk); - chk ^= encodingConst; - return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false)); - } - function genBech32(encoding) { - const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3; - const _words = radix2(5); - const fromWords = _words.decode; - const toWords = _words.encode; - const fromWordsUnsafe = unsafeWrapper(fromWords); - function encode(prefix, words, limit = 90) { - if (typeof prefix !== 'string') - throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`); - if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number')) - throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`); - const actualLength = prefix.length + 7 + words.length; - if (limit !== false && actualLength > limit) - throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`); - prefix = prefix.toLowerCase(); - return `${prefix}1${BECH_ALPHABET.encode(words)}${bechChecksum(prefix, words, ENCODING_CONST)}`; - } - function decode(str, limit = 90) { - if (typeof str !== 'string') - throw new Error(`bech32.decode input should be string, not ${typeof str}`); - if (str.length < 8 || (limit !== false && str.length > limit)) - throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`); - const lowered = str.toLowerCase(); - if (str !== lowered && str !== str.toUpperCase()) - throw new Error(`String must be lowercase or uppercase`); - str = lowered; - const sepIndex = str.lastIndexOf('1'); - if (sepIndex === 0 || sepIndex === -1) - throw new Error(`Letter "1" must be present between prefix and data only`); - const prefix = str.slice(0, sepIndex); - const _words = str.slice(sepIndex + 1); - if (_words.length < 6) - throw new Error('Data must be at least 6 characters long'); - const words = BECH_ALPHABET.decode(_words).slice(0, -6); - const sum = bechChecksum(prefix, words, ENCODING_CONST); - if (!_words.endsWith(sum)) - throw new Error(`Invalid checksum in ${str}: expected "${sum}"`); - return { prefix, words }; - } - const decodeUnsafe = unsafeWrapper(decode); - function decodeToBytes(str) { - const { prefix, words } = decode(str, false); - return { prefix, words, bytes: fromWords(words) }; - } - return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords }; - } - const bech32 = genBech32('bech32'); - genBech32('bech32m'); - const utf8 = { - encode: (data) => new TextDecoder().decode(data), - decode: (str) => new TextEncoder().encode(str), - }; - const hex = chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize$1((s) => { - if (typeof s !== 'string' || s.length % 2) - throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`); - return s.toLowerCase(); - })); - const CODERS = { - utf8, hex, base16, base32, base64, base64url, base58, base58xmr - }; - `Invalid encoding type. Available types: ${Object.keys(CODERS).join(', ')}`; - - var english = {}; - - Object.defineProperty(english, "__esModule", { value: true }); - var wordlist = english.wordlist = void 0; - wordlist = english.wordlist = `abandon -ability -able -about -above -absent -absorb -abstract -absurd -abuse -access -accident -account -accuse -achieve -acid -acoustic -acquire -across -act -action -actor -actress -actual -adapt -add -addict -address -adjust -admit -adult -advance -advice -aerobic -affair -afford -afraid -again -age -agent -agree -ahead -aim -air -airport -aisle -alarm -album -alcohol -alert -alien -all -alley -allow -almost -alone -alpha -already -also -alter -always -amateur -amazing -among -amount -amused -analyst -anchor -ancient -anger -angle -angry -animal -ankle -announce -annual -another -answer -antenna -antique -anxiety -any -apart -apology -appear -apple -approve -april -arch -arctic -area -arena -argue -arm -armed -armor -army -around -arrange -arrest -arrive -arrow -art -artefact -artist -artwork -ask -aspect -assault -asset -assist -assume -asthma -athlete -atom -attack -attend -attitude -attract -auction -audit -august -aunt -author -auto -autumn -average -avocado -avoid -awake -aware -away -awesome -awful -awkward -axis -baby -bachelor -bacon -badge -bag -balance -balcony -ball -bamboo -banana -banner -bar -barely -bargain -barrel -base -basic -basket -battle -beach -bean -beauty -because -become -beef -before -begin -behave -behind -believe -below -belt -bench -benefit -best -betray -better -between -beyond -bicycle -bid -bike -bind -biology -bird -birth -bitter -black -blade -blame -blanket -blast -bleak -bless -blind -blood -blossom -blouse -blue -blur -blush -board -boat -body -boil -bomb -bone -bonus -book -boost -border -boring -borrow -boss -bottom -bounce -box -boy -bracket -brain -brand -brass -brave -bread -breeze -brick -bridge -brief -bright -bring -brisk -broccoli -broken -bronze -broom -brother -brown -brush -bubble -buddy -budget -buffalo -build -bulb -bulk -bullet -bundle -bunker -burden -burger -burst -bus -business -busy -butter -buyer -buzz -cabbage -cabin -cable -cactus -cage -cake -call -calm -camera -camp -can -canal -cancel -candy -cannon -canoe -canvas -canyon -capable -capital -captain -car -carbon -card -cargo -carpet -carry -cart -case -cash -casino -castle -casual -cat -catalog -catch -category -cattle -caught -cause -caution -cave -ceiling -celery -cement -census -century -cereal -certain -chair -chalk -champion -change -chaos -chapter -charge -chase -chat -cheap -check -cheese -chef -cherry -chest -chicken -chief -child -chimney -choice -choose -chronic -chuckle -chunk -churn -cigar -cinnamon -circle -citizen -city -civil -claim -clap -clarify -claw -clay -clean -clerk -clever -click -client -cliff -climb -clinic -clip -clock -clog -close -cloth -cloud -clown -club -clump -cluster -clutch -coach -coast -coconut -code -coffee -coil -coin -collect -color -column -combine -come -comfort -comic -common -company -concert -conduct -confirm -congress -connect -consider -control -convince -cook -cool -copper -copy -coral -core -corn -correct -cost -cotton -couch -country -couple -course -cousin -cover -coyote -crack -cradle -craft -cram -crane -crash -crater -crawl -crazy -cream -credit -creek -crew -cricket -crime -crisp -critic -crop -cross -crouch -crowd -crucial -cruel -cruise -crumble -crunch -crush -cry -crystal -cube -culture -cup -cupboard -curious -current -curtain -curve -cushion -custom -cute -cycle -dad -damage -damp -dance -danger -daring -dash -daughter -dawn -day -deal -debate -debris -decade -december -decide -decline -decorate -decrease -deer -defense -define -defy -degree -delay -deliver -demand -demise -denial -dentist -deny -depart -depend -deposit -depth -deputy -derive -describe -desert -design -desk -despair -destroy -detail -detect -develop -device -devote -diagram -dial -diamond -diary -dice -diesel -diet -differ -digital -dignity -dilemma -dinner -dinosaur -direct -dirt -disagree -discover -disease -dish -dismiss -disorder -display -distance -divert -divide -divorce -dizzy -doctor -document -dog -doll -dolphin -domain -donate -donkey -donor -door -dose -double -dove -draft -dragon -drama -drastic -draw -dream -dress -drift -drill -drink -drip -drive -drop -drum -dry -duck -dumb -dune -during -dust -dutch -duty -dwarf -dynamic -eager -eagle -early -earn -earth -easily -east -easy -echo -ecology -economy -edge -edit -educate -effort -egg -eight -either -elbow -elder -electric -elegant -element -elephant -elevator -elite -else -embark -embody -embrace -emerge -emotion -employ -empower -empty -enable -enact -end -endless -endorse -enemy -energy -enforce -engage -engine -enhance -enjoy -enlist -enough -enrich -enroll -ensure -enter -entire -entry -envelope -episode -equal -equip -era -erase -erode -erosion -error -erupt -escape -essay -essence -estate -eternal -ethics -evidence -evil -evoke -evolve -exact -example -excess -exchange -excite -exclude -excuse -execute -exercise -exhaust -exhibit -exile -exist -exit -exotic -expand -expect -expire -explain -expose -express -extend -extra -eye -eyebrow -fabric -face -faculty -fade -faint -faith -fall -false -fame -family -famous -fan -fancy -fantasy -farm -fashion -fat -fatal -father -fatigue -fault -favorite -feature -february -federal -fee -feed -feel -female -fence -festival -fetch -fever -few -fiber -fiction -field -figure -file -film -filter -final -find -fine -finger -finish -fire -firm -first -fiscal -fish -fit -fitness -fix -flag -flame -flash -flat -flavor -flee -flight -flip -float -flock -floor -flower -fluid -flush -fly -foam -focus -fog -foil -fold -follow -food -foot -force -forest -forget -fork -fortune -forum -forward -fossil -foster -found -fox -fragile -frame -frequent -fresh -friend -fringe -frog -front -frost -frown -frozen -fruit -fuel -fun -funny -furnace -fury -future -gadget -gain -galaxy -gallery -game -gap -garage -garbage -garden -garlic -garment -gas -gasp -gate -gather -gauge -gaze -general -genius -genre -gentle -genuine -gesture -ghost -giant -gift -giggle -ginger -giraffe -girl -give -glad -glance -glare -glass -glide -glimpse -globe -gloom -glory -glove -glow -glue -goat -goddess -gold -good -goose -gorilla -gospel -gossip -govern -gown -grab -grace -grain -grant -grape -grass -gravity -great -green -grid -grief -grit -grocery -group -grow -grunt -guard -guess -guide -guilt -guitar -gun -gym -habit -hair -half -hammer -hamster -hand -happy -harbor -hard -harsh -harvest -hat -have -hawk -hazard -head -health -heart -heavy -hedgehog -height -hello -helmet -help -hen -hero -hidden -high -hill -hint -hip -hire -history -hobby -hockey -hold -hole -holiday -hollow -home -honey -hood -hope -horn -horror -horse -hospital -host -hotel -hour -hover -hub -huge -human -humble -humor -hundred -hungry -hunt -hurdle -hurry -hurt -husband -hybrid -ice -icon -idea -identify -idle -ignore -ill -illegal -illness -image -imitate -immense -immune -impact -impose -improve -impulse -inch -include -income -increase -index -indicate -indoor -industry -infant -inflict -inform -inhale -inherit -initial -inject -injury -inmate -inner -innocent -input -inquiry -insane -insect -inside -inspire -install -intact -interest -into -invest -invite -involve -iron -island -isolate -issue -item -ivory -jacket -jaguar -jar -jazz -jealous -jeans -jelly -jewel -job -join -joke -journey -joy -judge -juice -jump -jungle -junior -junk -just -kangaroo -keen -keep -ketchup -key -kick -kid -kidney -kind -kingdom -kiss -kit -kitchen -kite -kitten -kiwi -knee -knife -knock -know -lab -label -labor -ladder -lady -lake -lamp -language -laptop -large -later -latin -laugh -laundry -lava -law -lawn -lawsuit -layer -lazy -leader -leaf -learn -leave -lecture -left -leg -legal -legend -leisure -lemon -lend -length -lens -leopard -lesson -letter -level -liar -liberty -library -license -life -lift -light -like -limb -limit -link -lion -liquid -list -little -live -lizard -load -loan -lobster -local -lock -logic -lonely -long -loop -lottery -loud -lounge -love -loyal -lucky -luggage -lumber -lunar -lunch -luxury -lyrics -machine -mad -magic -magnet -maid -mail -main -major -make -mammal -man -manage -mandate -mango -mansion -manual -maple -marble -march -margin -marine -market -marriage -mask -mass -master -match -material -math -matrix -matter -maximum -maze -meadow -mean -measure -meat -mechanic -medal -media -melody -melt -member -memory -mention -menu -mercy -merge -merit -merry -mesh -message -metal -method -middle -midnight -milk -million -mimic -mind -minimum -minor -minute -miracle -mirror -misery -miss -mistake -mix -mixed -mixture -mobile -model -modify -mom -moment -monitor -monkey -monster -month -moon -moral -more -morning -mosquito -mother -motion -motor -mountain -mouse -move -movie -much -muffin -mule -multiply -muscle -museum -mushroom -music -must -mutual -myself -mystery -myth -naive -name -napkin -narrow -nasty -nation -nature -near -neck -need -negative -neglect -neither -nephew -nerve -nest -net -network -neutral -never -news -next -nice -night -noble -noise -nominee -noodle -normal -north -nose -notable -note -nothing -notice -novel -now -nuclear -number -nurse -nut -oak -obey -object -oblige -obscure -observe -obtain -obvious -occur -ocean -october -odor -off -offer -office -often -oil -okay -old -olive -olympic -omit -once -one -onion -online -only -open -opera -opinion -oppose -option -orange -orbit -orchard -order -ordinary -organ -orient -original -orphan -ostrich -other -outdoor -outer -output -outside -oval -oven -over -own -owner -oxygen -oyster -ozone -pact -paddle -page -pair -palace -palm -panda -panel -panic -panther -paper -parade -parent -park -parrot -party -pass -patch -path -patient -patrol -pattern -pause -pave -payment -peace -peanut -pear -peasant -pelican -pen -penalty -pencil -people -pepper -perfect -permit -person -pet -phone -photo -phrase -physical -piano -picnic -picture -piece -pig -pigeon -pill -pilot -pink -pioneer -pipe -pistol -pitch -pizza -place -planet -plastic -plate -play -please -pledge -pluck -plug -plunge -poem -poet -point -polar -pole -police -pond -pony -pool -popular -portion -position -possible -post -potato -pottery -poverty -powder -power -practice -praise -predict -prefer -prepare -present -pretty -prevent -price -pride -primary -print -priority -prison -private -prize -problem -process -produce -profit -program -project -promote -proof -property -prosper -protect -proud -provide -public -pudding -pull -pulp -pulse -pumpkin -punch -pupil -puppy -purchase -purity -purpose -purse -push -put -puzzle -pyramid -quality -quantum -quarter -question -quick -quit -quiz -quote -rabbit -raccoon -race -rack -radar -radio -rail -rain -raise -rally -ramp -ranch -random -range -rapid -rare -rate -rather -raven -raw -razor -ready -real -reason -rebel -rebuild -recall -receive -recipe -record -recycle -reduce -reflect -reform -refuse -region -regret -regular -reject -relax -release -relief -rely -remain -remember -remind -remove -render -renew -rent -reopen -repair -repeat -replace -report -require -rescue -resemble -resist -resource -response -result -retire -retreat -return -reunion -reveal -review -reward -rhythm -rib -ribbon -rice -rich -ride -ridge -rifle -right -rigid -ring -riot -ripple -risk -ritual -rival -river -road -roast -robot -robust -rocket -romance -roof -rookie -room -rose -rotate -rough -round -route -royal -rubber -rude -rug -rule -run -runway -rural -sad -saddle -sadness -safe -sail -salad -salmon -salon -salt -salute -same -sample -sand -satisfy -satoshi -sauce -sausage -save -say -scale -scan -scare -scatter -scene -scheme -school -science -scissors -scorpion -scout -scrap -screen -script -scrub -sea -search -season -seat -second -secret -section -security -seed -seek -segment -select -sell -seminar -senior -sense -sentence -series -service -session -settle -setup -seven -shadow -shaft -shallow -share -shed -shell -sheriff -shield -shift -shine -ship -shiver -shock -shoe -shoot -shop -short -shoulder -shove -shrimp -shrug -shuffle -shy -sibling -sick -side -siege -sight -sign -silent -silk -silly -silver -similar -simple -since -sing -siren -sister -situate -six -size -skate -sketch -ski -skill -skin -skirt -skull -slab -slam -sleep -slender -slice -slide -slight -slim -slogan -slot -slow -slush -small -smart -smile -smoke -smooth -snack -snake -snap -sniff -snow -soap -soccer -social -sock -soda -soft -solar -soldier -solid -solution -solve -someone -song -soon -sorry -sort -soul -sound -soup -source -south -space -spare -spatial -spawn -speak -special -speed -spell -spend -sphere -spice -spider -spike -spin -spirit -split -spoil -sponsor -spoon -sport -spot -spray -spread -spring -spy -square -squeeze -squirrel -stable -stadium -staff -stage -stairs -stamp -stand -start -state -stay -steak -steel -stem -step -stereo -stick -still -sting -stock -stomach -stone -stool -story -stove -strategy -street -strike -strong -struggle -student -stuff -stumble -style -subject -submit -subway -success -such -sudden -suffer -sugar -suggest -suit -summer -sun -sunny -sunset -super -supply -supreme -sure -surface -surge -surprise -surround -survey -suspect -sustain -swallow -swamp -swap -swarm -swear -sweet -swift -swim -swing -switch -sword -symbol -symptom -syrup -system -table -tackle -tag -tail -talent -talk -tank -tape -target -task -taste -tattoo -taxi -teach -team -tell -ten -tenant -tennis -tent -term -test -text -thank -that -theme -then -theory -there -they -thing -this -thought -three -thrive -throw -thumb -thunder -ticket -tide -tiger -tilt -timber -time -tiny -tip -tired -tissue -title -toast -tobacco -today -toddler -toe -together -toilet -token -tomato -tomorrow -tone -tongue -tonight -tool -tooth -top -topic -topple -torch -tornado -tortoise -toss -total -tourist -toward -tower -town -toy -track -trade -traffic -tragic -train -transfer -trap -trash -travel -tray -treat -tree -trend -trial -tribe -trick -trigger -trim -trip -trophy -trouble -truck -true -truly -trumpet -trust -truth -try -tube -tuition -tumble -tuna -tunnel -turkey -turn -turtle -twelve -twenty -twice -twin -twist -two -type -typical -ugly -umbrella -unable -unaware -uncle -uncover -under -undo -unfair -unfold -unhappy -uniform -unique -unit -universe -unknown -unlock -until -unusual -unveil -update -upgrade -uphold -upon -upper -upset -urban -urge -usage -use -used -useful -useless -usual -utility -vacant -vacuum -vague -valid -valley -valve -van -vanish -vapor -various -vast -vault -vehicle -velvet -vendor -venture -venue -verb -verify -version -very -vessel -veteran -viable -vibrant -vicious -victory -video -view -village -vintage -violin -virtual -virus -visa -visit -visual -vital -vivid -vocal -voice -void -volcano -volume -vote -voyage -wage -wagon -wait -walk -wall -walnut -want -warfare -warm -warrior -wash -wasp -waste -water -wave -way -wealth -weapon -wear -weasel -weather -web -wedding -weekend -weird -welcome -west -wet -whale -what -wheat -wheel -when -where -whip -whisper -wide -width -wife -wild -will -win -window -wine -wing -wink -winner -winter -wire -wisdom -wise -wish -witness -wolf -woman -wonder -wood -wool -word -work -world -worry -worth -wrap -wreck -wrestle -wrist -write -wrong -yard -year -yellow -you -young -youth -zebra -zero -zone -zoo`.split('\n'); - - var bip39 = {}; - - var _assert = {}; - - Object.defineProperty(_assert, "__esModule", { value: true }); - _assert.output = _assert.exists = _assert.hash = _assert.bytes = _assert.bool = _assert.number = void 0; - function number$1(n) { - if (!Number.isSafeInteger(n) || n < 0) - throw new Error(`Wrong positive integer: ${n}`); - } - _assert.number = number$1; - function bool$1(b) { - if (typeof b !== 'boolean') - throw new Error(`Expected boolean, not ${b}`); - } - _assert.bool = bool$1; - function bytes$1(b, ...lengths) { - if (!(b instanceof Uint8Array)) - throw new TypeError('Expected Uint8Array'); - if (lengths.length > 0 && !lengths.includes(b.length)) - throw new TypeError(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`); - } - _assert.bytes = bytes$1; - function hash$1(hash) { - if (typeof hash !== 'function' || typeof hash.create !== 'function') - throw new Error('Hash should be wrapped by utils.wrapConstructor'); - number$1(hash.outputLen); - number$1(hash.blockLen); - } - _assert.hash = hash$1; - function exists$1(instance, checkFinished = true) { - if (instance.destroyed) - throw new Error('Hash instance has been destroyed'); - if (checkFinished && instance.finished) - throw new Error('Hash#digest() has already been called'); - } - _assert.exists = exists$1; - function output$1(out, instance) { - bytes$1(out); - const min = instance.outputLen; - if (out.length < min) { - throw new Error(`digestInto() expects output buffer of length at least ${min}`); - } - } - _assert.output = output$1; - const assert$1 = { - number: number$1, - bool: bool$1, - bytes: bytes$1, - hash: hash$1, - exists: exists$1, - output: output$1, - }; - _assert.default = assert$1; - - var pbkdf2$1 = {}; - - var hmac$2 = {}; - - var utils = {}; - - var cryptoBrowser = {}; - - Object.defineProperty(cryptoBrowser, "__esModule", { value: true }); - cryptoBrowser.crypto = void 0; - cryptoBrowser.crypto = { - node: undefined, - web: typeof self === 'object' && 'crypto' in self ? self.crypto : undefined, - }; - - (function (exports) { - /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ - Object.defineProperty(exports, "__esModule", { value: true }); - exports.randomBytes = exports.wrapConstructorWithOpts = exports.wrapConstructor = exports.checkOpts = exports.Hash = exports.concatBytes = exports.toBytes = exports.utf8ToBytes = exports.asyncLoop = exports.nextTick = exports.hexToBytes = exports.bytesToHex = exports.isLE = exports.rotr = exports.createView = exports.u32 = exports.u8 = void 0; - // The import here is via the package name. This is to ensure - // that exports mapping/resolution does fall into place. - const crypto_1 = cryptoBrowser; - // Cast array to different type - const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength); - exports.u8 = u8; - const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4)); - exports.u32 = u32; - // Cast array to view - const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength); - exports.createView = createView; - // The rotate right (circular right shift) operation for uint32 - const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift); - exports.rotr = rotr; - exports.isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44; - // There is almost no big endian hardware, but js typed arrays uses platform specific endianness. - // So, just to be sure not to corrupt anything. - if (!exports.isLE) - throw new Error('Non little-endian hardware is not supported'); - const hexes = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0')); - /** - * @example bytesToHex(Uint8Array.from([0xde, 0xad, 0xbe, 0xef])) - */ - function bytesToHex(uint8a) { - // pre-caching improves the speed 6x - if (!(uint8a instanceof Uint8Array)) - throw new Error('Uint8Array expected'); - let hex = ''; - for (let i = 0; i < uint8a.length; i++) { - hex += hexes[uint8a[i]]; - } - return hex; - } - exports.bytesToHex = bytesToHex; - /** - * @example hexToBytes('deadbeef') - */ - function hexToBytes(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToBytes: expected string, got ' + typeof hex); - } - if (hex.length % 2) - throw new Error('hexToBytes: received invalid unpadded hex'); - const array = new Uint8Array(hex.length / 2); - for (let i = 0; i < array.length; i++) { - const j = i * 2; - const hexByte = hex.slice(j, j + 2); - const byte = Number.parseInt(hexByte, 16); - if (Number.isNaN(byte) || byte < 0) - throw new Error('Invalid byte sequence'); - array[i] = byte; - } - return array; - } - exports.hexToBytes = hexToBytes; - // There is no setImmediate in browser and setTimeout is slow. However, call to async function will return Promise - // which will be fullfiled only on next scheduler queue processing step and this is exactly what we need. - const nextTick = async () => { }; - exports.nextTick = nextTick; - // Returns control to thread each 'tick' ms to avoid blocking - async function asyncLoop(iters, tick, cb) { - let ts = Date.now(); - for (let i = 0; i < iters; i++) { - cb(i); - // Date.now() is not monotonic, so in case if clock goes backwards we return return control too - const diff = Date.now() - ts; - if (diff >= 0 && diff < tick) - continue; - await (0, exports.nextTick)(); - ts += diff; - } - } - exports.asyncLoop = asyncLoop; - function utf8ToBytes(str) { - if (typeof str !== 'string') { - throw new TypeError(`utf8ToBytes expected string, got ${typeof str}`); - } - return new TextEncoder().encode(str); - } - exports.utf8ToBytes = utf8ToBytes; - function toBytes(data) { - if (typeof data === 'string') - data = utf8ToBytes(data); - if (!(data instanceof Uint8Array)) - throw new TypeError(`Expected input type is Uint8Array (got ${typeof data})`); - return data; - } - exports.toBytes = toBytes; - /** - * Concats Uint8Array-s into one; like `Buffer.concat([buf1, buf2])` - * @example concatBytes(buf1, buf2) - */ - function concatBytes(...arrays) { - if (!arrays.every((a) => a instanceof Uint8Array)) - throw new Error('Uint8Array list expected'); - if (arrays.length === 1) - return arrays[0]; - const length = arrays.reduce((a, arr) => a + arr.length, 0); - const result = new Uint8Array(length); - for (let i = 0, pad = 0; i < arrays.length; i++) { - const arr = arrays[i]; - result.set(arr, pad); - pad += arr.length; - } - return result; - } - exports.concatBytes = concatBytes; - // For runtime check if class implements interface - class Hash { - // Safe version that clones internal state - clone() { - return this._cloneInto(); - } - } - exports.Hash = Hash; - // Check if object doens't have custom constructor (like Uint8Array/Array) - const isPlainObject = (obj) => Object.prototype.toString.call(obj) === '[object Object]' && obj.constructor === Object; - function checkOpts(defaults, opts) { - if (opts !== undefined && (typeof opts !== 'object' || !isPlainObject(opts))) - throw new TypeError('Options should be object or undefined'); - const merged = Object.assign(defaults, opts); - return merged; - } - exports.checkOpts = checkOpts; - function wrapConstructor(hashConstructor) { - const hashC = (message) => hashConstructor().update(toBytes(message)).digest(); - const tmp = hashConstructor(); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = () => hashConstructor(); - return hashC; - } - exports.wrapConstructor = wrapConstructor; - function wrapConstructorWithOpts(hashCons) { - const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest(); - const tmp = hashCons({}); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = (opts) => hashCons(opts); - return hashC; - } - exports.wrapConstructorWithOpts = wrapConstructorWithOpts; - /** - * Secure PRNG - */ - function randomBytes(bytesLength = 32) { - if (crypto_1.crypto.web) { - return crypto_1.crypto.web.getRandomValues(new Uint8Array(bytesLength)); - } - else if (crypto_1.crypto.node) { - return new Uint8Array(crypto_1.crypto.node.randomBytes(bytesLength).buffer); - } - else { - throw new Error("The environment doesn't have randomBytes function"); - } - } - exports.randomBytes = randomBytes; - - } (utils)); - - (function (exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.hmac = void 0; - const _assert_js_1 = _assert; - const utils_js_1 = utils; - // HMAC (RFC 2104) - class HMAC extends utils_js_1.Hash { - constructor(hash, _key) { - super(); - this.finished = false; - this.destroyed = false; - _assert_js_1.default.hash(hash); - const key = (0, utils_js_1.toBytes)(_key); - this.iHash = hash.create(); - if (typeof this.iHash.update !== 'function') - throw new TypeError('Expected instance of class which extends utils.Hash'); - this.blockLen = this.iHash.blockLen; - this.outputLen = this.iHash.outputLen; - const blockLen = this.blockLen; - const pad = new Uint8Array(blockLen); - // blockLen can be bigger than outputLen - pad.set(key.length > blockLen ? hash.create().update(key).digest() : key); - for (let i = 0; i < pad.length; i++) - pad[i] ^= 0x36; - this.iHash.update(pad); - // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone - this.oHash = hash.create(); - // Undo internal XOR && apply outer XOR - for (let i = 0; i < pad.length; i++) - pad[i] ^= 0x36 ^ 0x5c; - this.oHash.update(pad); - pad.fill(0); - } - update(buf) { - _assert_js_1.default.exists(this); - this.iHash.update(buf); - return this; - } - digestInto(out) { - _assert_js_1.default.exists(this); - _assert_js_1.default.bytes(out, this.outputLen); - this.finished = true; - this.iHash.digestInto(out); - this.oHash.update(out); - this.oHash.digestInto(out); - this.destroy(); - } - digest() { - const out = new Uint8Array(this.oHash.outputLen); - this.digestInto(out); - return out; - } - _cloneInto(to) { - // Create new instance without calling constructor since key already in state and we don't know it. - to || (to = Object.create(Object.getPrototypeOf(this), {})); - const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this; - to = to; - to.finished = finished; - to.destroyed = destroyed; - to.blockLen = blockLen; - to.outputLen = outputLen; - to.oHash = oHash._cloneInto(to.oHash); - to.iHash = iHash._cloneInto(to.iHash); - return to; - } - destroy() { - this.destroyed = true; - this.oHash.destroy(); - this.iHash.destroy(); - } - } - /** - * HMAC: RFC2104 message authentication code. - * @param hash - function that would be used e.g. sha256 - * @param key - message key - * @param message - message data - */ - const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest(); - exports.hmac = hmac; - exports.hmac.create = (hash, key) => new HMAC(hash, key); - - } (hmac$2)); - - Object.defineProperty(pbkdf2$1, "__esModule", { value: true }); - pbkdf2$1.pbkdf2Async = pbkdf2$1.pbkdf2 = void 0; - const _assert_js_1$1 = _assert; - const hmac_js_1 = hmac$2; - const utils_js_1$3 = utils; - // Common prologue and epilogue for sync/async functions - function pbkdf2Init(hash, _password, _salt, _opts) { - _assert_js_1$1.default.hash(hash); - const opts = (0, utils_js_1$3.checkOpts)({ dkLen: 32, asyncTick: 10 }, _opts); - const { c, dkLen, asyncTick } = opts; - _assert_js_1$1.default.number(c); - _assert_js_1$1.default.number(dkLen); - _assert_js_1$1.default.number(asyncTick); - if (c < 1) - throw new Error('PBKDF2: iterations (c) should be >= 1'); - const password = (0, utils_js_1$3.toBytes)(_password); - const salt = (0, utils_js_1$3.toBytes)(_salt); - // DK = PBKDF2(PRF, Password, Salt, c, dkLen); - const DK = new Uint8Array(dkLen); - // U1 = PRF(Password, Salt + INT_32_BE(i)) - const PRF = hmac_js_1.hmac.create(hash, password); - const PRFSalt = PRF._cloneInto().update(salt); - return { c, dkLen, asyncTick, DK, PRF, PRFSalt }; - } - function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) { - PRF.destroy(); - PRFSalt.destroy(); - if (prfW) - prfW.destroy(); - u.fill(0); - return DK; - } - /** - * PBKDF2-HMAC: RFC 2898 key derivation function - * @param hash - hash function that would be used e.g. sha256 - * @param password - password from which a derived key is generated - * @param salt - cryptographic salt - * @param opts - {c, dkLen} where c is work factor and dkLen is output message size - */ - function pbkdf2(hash, password, salt, opts) { - const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts); - let prfW; // Working copy - const arr = new Uint8Array(4); - const view = (0, utils_js_1$3.createView)(arr); - const u = new Uint8Array(PRF.outputLen); - // DK = T1 + T2 + ⋯ + Tdklen/hlen - for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) { - // Ti = F(Password, Salt, c, i) - const Ti = DK.subarray(pos, pos + PRF.outputLen); - view.setInt32(0, ti, false); - // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc - // U1 = PRF(Password, Salt + INT_32_BE(i)) - (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u); - Ti.set(u.subarray(0, Ti.length)); - for (let ui = 1; ui < c; ui++) { - // Uc = PRF(Password, Uc−1) - PRF._cloneInto(prfW).update(u).digestInto(u); - for (let i = 0; i < Ti.length; i++) - Ti[i] ^= u[i]; - } - } - return pbkdf2Output(PRF, PRFSalt, DK, prfW, u); - } - pbkdf2$1.pbkdf2 = pbkdf2; - async function pbkdf2Async(hash, password, salt, opts) { - const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts); - let prfW; // Working copy - const arr = new Uint8Array(4); - const view = (0, utils_js_1$3.createView)(arr); - const u = new Uint8Array(PRF.outputLen); - // DK = T1 + T2 + ⋯ + Tdklen/hlen - for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) { - // Ti = F(Password, Salt, c, i) - const Ti = DK.subarray(pos, pos + PRF.outputLen); - view.setInt32(0, ti, false); - // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc - // U1 = PRF(Password, Salt + INT_32_BE(i)) - (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u); - Ti.set(u.subarray(0, Ti.length)); - await (0, utils_js_1$3.asyncLoop)(c - 1, asyncTick, (i) => { - // Uc = PRF(Password, Uc−1) - PRF._cloneInto(prfW).update(u).digestInto(u); - for (let i = 0; i < Ti.length; i++) - Ti[i] ^= u[i]; - }); - } - return pbkdf2Output(PRF, PRFSalt, DK, prfW, u); - } - pbkdf2$1.pbkdf2Async = pbkdf2Async; - - var sha256$1 = {}; - - var _sha2 = {}; - - Object.defineProperty(_sha2, "__esModule", { value: true }); - _sha2.SHA2 = void 0; - const _assert_js_1 = _assert; - const utils_js_1$2 = utils; - // Polyfill for Safari 14 - function setBigUint64$1(view, byteOffset, value, isLE) { - if (typeof view.setBigUint64 === 'function') - return view.setBigUint64(byteOffset, value, isLE); - const _32n = BigInt(32); - const _u32_max = BigInt(0xffffffff); - const wh = Number((value >> _32n) & _u32_max); - const wl = Number(value & _u32_max); - const h = isLE ? 4 : 0; - const l = isLE ? 0 : 4; - view.setUint32(byteOffset + h, wh, isLE); - view.setUint32(byteOffset + l, wl, isLE); - } - // Base SHA2 class (RFC 6234) - let SHA2$1 = class SHA2 extends utils_js_1$2.Hash { - constructor(blockLen, outputLen, padOffset, isLE) { - super(); - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE; - this.finished = false; - this.length = 0; - this.pos = 0; - this.destroyed = false; - this.buffer = new Uint8Array(blockLen); - this.view = (0, utils_js_1$2.createView)(this.buffer); - } - update(data) { - _assert_js_1.default.exists(this); - const { view, buffer, blockLen } = this; - data = (0, utils_js_1$2.toBytes)(data); - const len = data.length; - for (let pos = 0; pos < len;) { - const take = Math.min(blockLen - this.pos, len - pos); - // Fast path: we have at least one block in input, cast it to view and process - if (take === blockLen) { - const dataView = (0, utils_js_1$2.createView)(data); - for (; blockLen <= len - pos; pos += blockLen) - this.process(dataView, pos); - continue; - } - buffer.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - _assert_js_1.default.exists(this); - _assert_js_1.default.output(out, this); - this.finished = true; - // Padding - // We can avoid allocation of buffer for padding completely if it - // was previously not allocated here. But it won't change performance. - const { buffer, view, blockLen, isLE } = this; - let { pos } = this; - // append the bit '1' to the message - buffer[pos++] = 0b10000000; - this.buffer.subarray(pos).fill(0); - // we have less than padOffset left in buffer, so we cannot put length in current block, need process it and pad again - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - // Pad until full block byte with zeros - for (let i = pos; i < blockLen; i++) - buffer[i] = 0; - // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that - // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen. - // So we just write lowest 64 bits of that value. - setBigUint64$1(view, blockLen - 8, BigInt(this.length * 8), isLE); - this.process(view, 0); - const oview = (0, utils_js_1$2.createView)(out); - const len = this.outputLen; - // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT - if (len % 4) - throw new Error('_sha2: outputLen should be aligned to 32bit'); - const outLen = len / 4; - const state = this.get(); - if (outLen > state.length) - throw new Error('_sha2: outputLen bigger than state'); - for (let i = 0; i < outLen; i++) - oview.setUint32(4 * i, state[i], isLE); - } - digest() { - const { buffer, outputLen } = this; - this.digestInto(buffer); - const res = buffer.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to || (to = new this.constructor()); - to.set(...this.get()); - const { blockLen, buffer, length, finished, destroyed, pos } = this; - to.length = length; - to.pos = pos; - to.finished = finished; - to.destroyed = destroyed; - if (length % blockLen) - to.buffer.set(buffer); - return to; - } - }; - _sha2.SHA2 = SHA2$1; - - Object.defineProperty(sha256$1, "__esModule", { value: true }); - sha256$1.sha224 = sha256$1.sha256 = void 0; - const _sha2_js_1$1 = _sha2; - const utils_js_1$1 = utils; - // Choice: a ? b : c - const Chi$1 = (a, b, c) => (a & b) ^ (~a & c); - // Majority function, true if any two inpust is true - const Maj$1 = (a, b, c) => (a & b) ^ (a & c) ^ (b & c); - // Round constants: - // first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) - // prettier-ignore - const SHA256_K$1 = new Uint32Array([ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - ]); - // Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): - // prettier-ignore - const IV$1 = new Uint32Array([ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ]); - // Temporary buffer, not used to store anything between runs - // Named this way because it matches specification. - const SHA256_W$1 = new Uint32Array(64); - let SHA256$1 = class SHA256 extends _sha2_js_1$1.SHA2 { - constructor() { - super(64, 32, 8, false); - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - this.A = IV$1[0] | 0; - this.B = IV$1[1] | 0; - this.C = IV$1[2] | 0; - this.D = IV$1[3] | 0; - this.E = IV$1[4] | 0; - this.F = IV$1[5] | 0; - this.G = IV$1[6] | 0; - this.H = IV$1[7] | 0; - } - get() { - const { A, B, C, D, E, F, G, H } = this; - return [A, B, C, D, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) - SHA256_W$1[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W$1[i - 15]; - const W2 = SHA256_W$1[i - 2]; - const s0 = (0, utils_js_1$1.rotr)(W15, 7) ^ (0, utils_js_1$1.rotr)(W15, 18) ^ (W15 >>> 3); - const s1 = (0, utils_js_1$1.rotr)(W2, 17) ^ (0, utils_js_1$1.rotr)(W2, 19) ^ (W2 >>> 10); - SHA256_W$1[i] = (s1 + SHA256_W$1[i - 7] + s0 + SHA256_W$1[i - 16]) | 0; - } - // Compression function main loop, 64 rounds - let { A, B, C, D, E, F, G, H } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = (0, utils_js_1$1.rotr)(E, 6) ^ (0, utils_js_1$1.rotr)(E, 11) ^ (0, utils_js_1$1.rotr)(E, 25); - const T1 = (H + sigma1 + Chi$1(E, F, G) + SHA256_K$1[i] + SHA256_W$1[i]) | 0; - const sigma0 = (0, utils_js_1$1.rotr)(A, 2) ^ (0, utils_js_1$1.rotr)(A, 13) ^ (0, utils_js_1$1.rotr)(A, 22); - const T2 = (sigma0 + Maj$1(A, B, C)) | 0; - H = G; - G = F; - F = E; - E = (D + T1) | 0; - D = C; - C = B; - B = A; - A = (T1 + T2) | 0; - } - // Add the compressed chunk to the current hash value - A = (A + this.A) | 0; - B = (B + this.B) | 0; - C = (C + this.C) | 0; - D = (D + this.D) | 0; - E = (E + this.E) | 0; - F = (F + this.F) | 0; - G = (G + this.G) | 0; - H = (H + this.H) | 0; - this.set(A, B, C, D, E, F, G, H); - } - roundClean() { - SHA256_W$1.fill(0); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - this.buffer.fill(0); - } - }; - // Constants from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf - let SHA224$1 = class SHA224 extends SHA256$1 { - constructor() { - super(); - this.A = 0xc1059ed8 | 0; - this.B = 0x367cd507 | 0; - this.C = 0x3070dd17 | 0; - this.D = 0xf70e5939 | 0; - this.E = 0xffc00b31 | 0; - this.F = 0x68581511 | 0; - this.G = 0x64f98fa7 | 0; - this.H = 0xbefa4fa4 | 0; - this.outputLen = 28; - } - }; - /** - * SHA2-256 hash function - * @param message - data that would be hashed - */ - sha256$1.sha256 = (0, utils_js_1$1.wrapConstructor)(() => new SHA256$1()); - sha256$1.sha224 = (0, utils_js_1$1.wrapConstructor)(() => new SHA224$1()); - - var sha512$1 = {}; - - var _u64 = {}; - - (function (exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.add = exports.toBig = exports.split = exports.fromBig = void 0; - const U32_MASK64 = BigInt(2 ** 32 - 1); - const _32n = BigInt(32); - // We are not using BigUint64Array, because they are extremely slow as per 2022 - function fromBig(n, le = false) { - if (le) - return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) }; - return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 }; - } - exports.fromBig = fromBig; - function split(lst, le = false) { - let Ah = new Uint32Array(lst.length); - let Al = new Uint32Array(lst.length); - for (let i = 0; i < lst.length; i++) { - const { h, l } = fromBig(lst[i], le); - [Ah[i], Al[i]] = [h, l]; - } - return [Ah, Al]; - } - exports.split = split; - const toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0); - exports.toBig = toBig; - // for Shift in [0, 32) - const shrSH = (h, l, s) => h >>> s; - const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s); - // Right rotate for Shift in [1, 32) - const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s)); - const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s); - // Right rotate for Shift in (32, 64), NOTE: 32 is special case. - const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32)); - const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s)); - // Right rotate for shift===32 (just swaps l&h) - const rotr32H = (h, l) => l; - const rotr32L = (h, l) => h; - // Left rotate for Shift in [1, 32) - const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s)); - const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s)); - // Left rotate for Shift in (32, 64), NOTE: 32 is special case. - const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s)); - const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s)); - // JS uses 32-bit signed integers for bitwise operations which means we cannot - // simple take carry out of low bit sum by shift, we need to use division. - // Removing "export" has 5% perf penalty -_- - function add(Ah, Al, Bh, Bl) { - const l = (Al >>> 0) + (Bl >>> 0); - return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 }; - } - exports.add = add; - // Addition with more than 2 elements - const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0); - const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0; - const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0); - const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0; - const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0); - const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0; - // prettier-ignore - const u64 = { - fromBig, split, toBig: exports.toBig, - shrSH, shrSL, - rotrSH, rotrSL, rotrBH, rotrBL, - rotr32H, rotr32L, - rotlSH, rotlSL, rotlBH, rotlBL, - add, add3L, add3H, add4L, add4H, add5H, add5L, - }; - exports.default = u64; - - } (_u64)); - - Object.defineProperty(sha512$1, "__esModule", { value: true }); - sha512$1.sha384 = sha512$1.sha512_256 = sha512$1.sha512_224 = sha512$1.sha512 = sha512$1.SHA512 = void 0; - const _sha2_js_1 = _sha2; - const _u64_js_1 = _u64; - const utils_js_1 = utils; - // Round contants (first 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409): - // prettier-ignore - const [SHA512_Kh$1, SHA512_Kl$1] = _u64_js_1.default.split([ - '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc', - '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118', - '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2', - '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694', - '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65', - '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5', - '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4', - '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70', - '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df', - '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b', - '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30', - '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8', - '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8', - '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3', - '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec', - '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b', - '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178', - '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b', - '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c', - '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817' - ].map(n => BigInt(n))); - // Temporary buffer, not used to store anything between runs - const SHA512_W_H$1 = new Uint32Array(80); - const SHA512_W_L$1 = new Uint32Array(80); - let SHA512$1 = class SHA512 extends _sha2_js_1.SHA2 { - constructor() { - super(128, 64, 16, false); - // We cannot use array here since array allows indexing by variable which means optimizer/compiler cannot use registers. - // Also looks cleaner and easier to verify with spec. - // Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0x6a09e667 | 0; - this.Al = 0xf3bcc908 | 0; - this.Bh = 0xbb67ae85 | 0; - this.Bl = 0x84caa73b | 0; - this.Ch = 0x3c6ef372 | 0; - this.Cl = 0xfe94f82b | 0; - this.Dh = 0xa54ff53a | 0; - this.Dl = 0x5f1d36f1 | 0; - this.Eh = 0x510e527f | 0; - this.El = 0xade682d1 | 0; - this.Fh = 0x9b05688c | 0; - this.Fl = 0x2b3e6c1f | 0; - this.Gh = 0x1f83d9ab | 0; - this.Gl = 0xfb41bd6b | 0; - this.Hh = 0x5be0cd19 | 0; - this.Hl = 0x137e2179 | 0; - } - // prettier-ignore - get() { - const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; - return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl]; - } - // prettier-ignore - set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) { - this.Ah = Ah | 0; - this.Al = Al | 0; - this.Bh = Bh | 0; - this.Bl = Bl | 0; - this.Ch = Ch | 0; - this.Cl = Cl | 0; - this.Dh = Dh | 0; - this.Dl = Dl | 0; - this.Eh = Eh | 0; - this.El = El | 0; - this.Fh = Fh | 0; - this.Fl = Fl | 0; - this.Gh = Gh | 0; - this.Gl = Gl | 0; - this.Hh = Hh | 0; - this.Hl = Hl | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) { - SHA512_W_H$1[i] = view.getUint32(offset); - SHA512_W_L$1[i] = view.getUint32((offset += 4)); - } - for (let i = 16; i < 80; i++) { - // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7) - const W15h = SHA512_W_H$1[i - 15] | 0; - const W15l = SHA512_W_L$1[i - 15] | 0; - const s0h = _u64_js_1.default.rotrSH(W15h, W15l, 1) ^ _u64_js_1.default.rotrSH(W15h, W15l, 8) ^ _u64_js_1.default.shrSH(W15h, W15l, 7); - const s0l = _u64_js_1.default.rotrSL(W15h, W15l, 1) ^ _u64_js_1.default.rotrSL(W15h, W15l, 8) ^ _u64_js_1.default.shrSL(W15h, W15l, 7); - // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6) - const W2h = SHA512_W_H$1[i - 2] | 0; - const W2l = SHA512_W_L$1[i - 2] | 0; - const s1h = _u64_js_1.default.rotrSH(W2h, W2l, 19) ^ _u64_js_1.default.rotrBH(W2h, W2l, 61) ^ _u64_js_1.default.shrSH(W2h, W2l, 6); - const s1l = _u64_js_1.default.rotrSL(W2h, W2l, 19) ^ _u64_js_1.default.rotrBL(W2h, W2l, 61) ^ _u64_js_1.default.shrSL(W2h, W2l, 6); - // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16]; - const SUMl = _u64_js_1.default.add4L(s0l, s1l, SHA512_W_L$1[i - 7], SHA512_W_L$1[i - 16]); - const SUMh = _u64_js_1.default.add4H(SUMl, s0h, s1h, SHA512_W_H$1[i - 7], SHA512_W_H$1[i - 16]); - SHA512_W_H$1[i] = SUMh | 0; - SHA512_W_L$1[i] = SUMl | 0; - } - let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; - // Compression function main loop, 80 rounds - for (let i = 0; i < 80; i++) { - // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41) - const sigma1h = _u64_js_1.default.rotrSH(Eh, El, 14) ^ _u64_js_1.default.rotrSH(Eh, El, 18) ^ _u64_js_1.default.rotrBH(Eh, El, 41); - const sigma1l = _u64_js_1.default.rotrSL(Eh, El, 14) ^ _u64_js_1.default.rotrSL(Eh, El, 18) ^ _u64_js_1.default.rotrBL(Eh, El, 41); - //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0; - const CHIh = (Eh & Fh) ^ (~Eh & Gh); - const CHIl = (El & Fl) ^ (~El & Gl); - // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i] - // prettier-ignore - const T1ll = _u64_js_1.default.add5L(Hl, sigma1l, CHIl, SHA512_Kl$1[i], SHA512_W_L$1[i]); - const T1h = _u64_js_1.default.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh$1[i], SHA512_W_H$1[i]); - const T1l = T1ll | 0; - // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39) - const sigma0h = _u64_js_1.default.rotrSH(Ah, Al, 28) ^ _u64_js_1.default.rotrBH(Ah, Al, 34) ^ _u64_js_1.default.rotrBH(Ah, Al, 39); - const sigma0l = _u64_js_1.default.rotrSL(Ah, Al, 28) ^ _u64_js_1.default.rotrBL(Ah, Al, 34) ^ _u64_js_1.default.rotrBL(Ah, Al, 39); - const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch); - const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl); - Hh = Gh | 0; - Hl = Gl | 0; - Gh = Fh | 0; - Gl = Fl | 0; - Fh = Eh | 0; - Fl = El | 0; - ({ h: Eh, l: El } = _u64_js_1.default.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0)); - Dh = Ch | 0; - Dl = Cl | 0; - Ch = Bh | 0; - Cl = Bl | 0; - Bh = Ah | 0; - Bl = Al | 0; - const All = _u64_js_1.default.add3L(T1l, sigma0l, MAJl); - Ah = _u64_js_1.default.add3H(All, T1h, sigma0h, MAJh); - Al = All | 0; - } - // Add the compressed chunk to the current hash value - ({ h: Ah, l: Al } = _u64_js_1.default.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0)); - ({ h: Bh, l: Bl } = _u64_js_1.default.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0)); - ({ h: Ch, l: Cl } = _u64_js_1.default.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0)); - ({ h: Dh, l: Dl } = _u64_js_1.default.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0)); - ({ h: Eh, l: El } = _u64_js_1.default.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0)); - ({ h: Fh, l: Fl } = _u64_js_1.default.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0)); - ({ h: Gh, l: Gl } = _u64_js_1.default.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0)); - ({ h: Hh, l: Hl } = _u64_js_1.default.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0)); - this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl); - } - roundClean() { - SHA512_W_H$1.fill(0); - SHA512_W_L$1.fill(0); - } - destroy() { - this.buffer.fill(0); - this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - }; - sha512$1.SHA512 = SHA512$1; - let SHA512_224$1 = class SHA512_224 extends SHA512$1 { - constructor() { - super(); - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0x8c3d37c8 | 0; - this.Al = 0x19544da2 | 0; - this.Bh = 0x73e19966 | 0; - this.Bl = 0x89dcd4d6 | 0; - this.Ch = 0x1dfab7ae | 0; - this.Cl = 0x32ff9c82 | 0; - this.Dh = 0x679dd514 | 0; - this.Dl = 0x582f9fcf | 0; - this.Eh = 0x0f6d2b69 | 0; - this.El = 0x7bd44da8 | 0; - this.Fh = 0x77e36f73 | 0; - this.Fl = 0x04c48942 | 0; - this.Gh = 0x3f9d85a8 | 0; - this.Gl = 0x6a1d36c8 | 0; - this.Hh = 0x1112e6ad | 0; - this.Hl = 0x91d692a1 | 0; - this.outputLen = 28; - } - }; - let SHA512_256$1 = class SHA512_256 extends SHA512$1 { - constructor() { - super(); - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0x22312194 | 0; - this.Al = 0xfc2bf72c | 0; - this.Bh = 0x9f555fa3 | 0; - this.Bl = 0xc84c64c2 | 0; - this.Ch = 0x2393b86b | 0; - this.Cl = 0x6f53b151 | 0; - this.Dh = 0x96387719 | 0; - this.Dl = 0x5940eabd | 0; - this.Eh = 0x96283ee2 | 0; - this.El = 0xa88effe3 | 0; - this.Fh = 0xbe5e1e25 | 0; - this.Fl = 0x53863992 | 0; - this.Gh = 0x2b0199fc | 0; - this.Gl = 0x2c85b8aa | 0; - this.Hh = 0x0eb72ddc | 0; - this.Hl = 0x81c52ca2 | 0; - this.outputLen = 32; - } - }; - let SHA384$1 = class SHA384 extends SHA512$1 { - constructor() { - super(); - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0xcbbb9d5d | 0; - this.Al = 0xc1059ed8 | 0; - this.Bh = 0x629a292a | 0; - this.Bl = 0x367cd507 | 0; - this.Ch = 0x9159015a | 0; - this.Cl = 0x3070dd17 | 0; - this.Dh = 0x152fecd8 | 0; - this.Dl = 0xf70e5939 | 0; - this.Eh = 0x67332667 | 0; - this.El = 0xffc00b31 | 0; - this.Fh = 0x8eb44a87 | 0; - this.Fl = 0x68581511 | 0; - this.Gh = 0xdb0c2e0d | 0; - this.Gl = 0x64f98fa7 | 0; - this.Hh = 0x47b5481d | 0; - this.Hl = 0xbefa4fa4 | 0; - this.outputLen = 48; - } - }; - sha512$1.sha512 = (0, utils_js_1.wrapConstructor)(() => new SHA512$1()); - sha512$1.sha512_224 = (0, utils_js_1.wrapConstructor)(() => new SHA512_224$1()); - sha512$1.sha512_256 = (0, utils_js_1.wrapConstructor)(() => new SHA512_256$1()); - sha512$1.sha384 = (0, utils_js_1.wrapConstructor)(() => new SHA384$1()); - - var lib = {}; - - (function (exports) { - /*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */ - Object.defineProperty(exports, "__esModule", { value: true }); - exports.bytes = exports.stringToBytes = exports.str = exports.bytesToString = exports.hex = exports.utf8 = exports.bech32m = exports.bech32 = exports.base58check = exports.base58xmr = exports.base58xrp = exports.base58flickr = exports.base58 = exports.base64url = exports.base64 = exports.base32crockford = exports.base32hex = exports.base32 = exports.base16 = exports.utils = exports.assertNumber = void 0; - function assertNumber(n) { - if (!Number.isSafeInteger(n)) - throw new Error(`Wrong integer: ${n}`); - } - exports.assertNumber = assertNumber; - function chain(...args) { - const wrap = (a, b) => (c) => a(b(c)); - const encode = Array.from(args) - .reverse() - .reduce((acc, i) => (acc ? wrap(acc, i.encode) : i.encode), undefined); - const decode = args.reduce((acc, i) => (acc ? wrap(acc, i.decode) : i.decode), undefined); - return { encode, decode }; - } - function alphabet(alphabet) { - return { - encode: (digits) => { - if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number')) - throw new Error('alphabet.encode input should be an array of numbers'); - return digits.map((i) => { - assertNumber(i); - if (i < 0 || i >= alphabet.length) - throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`); - return alphabet[i]; - }); - }, - decode: (input) => { - if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string')) - throw new Error('alphabet.decode input should be array of strings'); - return input.map((letter) => { - if (typeof letter !== 'string') - throw new Error(`alphabet.decode: not string element=${letter}`); - const index = alphabet.indexOf(letter); - if (index === -1) - throw new Error(`Unknown letter: "${letter}". Allowed: ${alphabet}`); - return index; - }); - }, - }; - } - function join(separator = '') { - if (typeof separator !== 'string') - throw new Error('join separator should be string'); - return { - encode: (from) => { - if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string')) - throw new Error('join.encode input should be array of strings'); - for (let i of from) - if (typeof i !== 'string') - throw new Error(`join.encode: non-string input=${i}`); - return from.join(separator); - }, - decode: (to) => { - if (typeof to !== 'string') - throw new Error('join.decode input should be string'); - return to.split(separator); - }, - }; - } - function padding(bits, chr = '=') { - assertNumber(bits); - if (typeof chr !== 'string') - throw new Error('padding chr should be string'); - return { - encode(data) { - if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string')) - throw new Error('padding.encode input should be array of strings'); - for (let i of data) - if (typeof i !== 'string') - throw new Error(`padding.encode: non-string input=${i}`); - while ((data.length * bits) % 8) - data.push(chr); - return data; - }, - decode(input) { - if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string')) - throw new Error('padding.encode input should be array of strings'); - for (let i of input) - if (typeof i !== 'string') - throw new Error(`padding.decode: non-string input=${i}`); - let end = input.length; - if ((end * bits) % 8) - throw new Error('Invalid padding: string should have whole number of bytes'); - for (; end > 0 && input[end - 1] === chr; end--) { - if (!(((end - 1) * bits) % 8)) - throw new Error('Invalid padding: string has too much padding'); - } - return input.slice(0, end); - }, - }; - } - function normalize(fn) { - if (typeof fn !== 'function') - throw new Error('normalize fn should be function'); - return { encode: (from) => from, decode: (to) => fn(to) }; - } - function convertRadix(data, from, to) { - if (from < 2) - throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`); - if (to < 2) - throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`); - if (!Array.isArray(data)) - throw new Error('convertRadix: data should be array'); - if (!data.length) - return []; - let pos = 0; - const res = []; - const digits = Array.from(data); - digits.forEach((d) => { - assertNumber(d); - if (d < 0 || d >= from) - throw new Error(`Wrong integer: ${d}`); - }); - while (true) { - let carry = 0; - let done = true; - for (let i = pos; i < digits.length; i++) { - const digit = digits[i]; - const digitBase = from * carry + digit; - if (!Number.isSafeInteger(digitBase) || - (from * carry) / from !== carry || - digitBase - digit !== from * carry) { - throw new Error('convertRadix: carry overflow'); - } - carry = digitBase % to; - digits[i] = Math.floor(digitBase / to); - if (!Number.isSafeInteger(digits[i]) || digits[i] * to + carry !== digitBase) - throw new Error('convertRadix: carry overflow'); - if (!done) - continue; - else if (!digits[i]) - pos = i; - else - done = false; - } - res.push(carry); - if (done) - break; - } - for (let i = 0; i < data.length - 1 && data[i] === 0; i++) - res.push(0); - return res.reverse(); - } - const gcd = (a, b) => (!b ? a : gcd(b, a % b)); - const radix2carry = (from, to) => from + (to - gcd(from, to)); - function convertRadix2(data, from, to, padding) { - if (!Array.isArray(data)) - throw new Error('convertRadix2: data should be array'); - if (from <= 0 || from > 32) - throw new Error(`convertRadix2: wrong from=${from}`); - if (to <= 0 || to > 32) - throw new Error(`convertRadix2: wrong to=${to}`); - if (radix2carry(from, to) > 32) { - throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`); - } - let carry = 0; - let pos = 0; - const mask = 2 ** to - 1; - const res = []; - for (const n of data) { - assertNumber(n); - if (n >= 2 ** from) - throw new Error(`convertRadix2: invalid data word=${n} from=${from}`); - carry = (carry << from) | n; - if (pos + from > 32) - throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`); - pos += from; - for (; pos >= to; pos -= to) - res.push(((carry >> (pos - to)) & mask) >>> 0); - carry &= 2 ** pos - 1; - } - carry = (carry << (to - pos)) & mask; - if (!padding && pos >= from) - throw new Error('Excess padding'); - if (!padding && carry) - throw new Error(`Non-zero padding: ${carry}`); - if (padding && pos > 0) - res.push(carry >>> 0); - return res; - } - function radix(num) { - assertNumber(num); - return { - encode: (bytes) => { - if (!(bytes instanceof Uint8Array)) - throw new Error('radix.encode input should be Uint8Array'); - return convertRadix(Array.from(bytes), 2 ** 8, num); - }, - decode: (digits) => { - if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number')) - throw new Error('radix.decode input should be array of strings'); - return Uint8Array.from(convertRadix(digits, num, 2 ** 8)); - }, - }; - } - function radix2(bits, revPadding = false) { - assertNumber(bits); - if (bits <= 0 || bits > 32) - throw new Error('radix2: bits should be in (0..32]'); - if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32) - throw new Error('radix2: carry overflow'); - return { - encode: (bytes) => { - if (!(bytes instanceof Uint8Array)) - throw new Error('radix2.encode input should be Uint8Array'); - return convertRadix2(Array.from(bytes), 8, bits, !revPadding); - }, - decode: (digits) => { - if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number')) - throw new Error('radix2.decode input should be array of strings'); - return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding)); - }, - }; - } - function unsafeWrapper(fn) { - if (typeof fn !== 'function') - throw new Error('unsafeWrapper fn should be function'); - return function (...args) { - try { - return fn.apply(null, args); - } - catch (e) { } - }; - } - function checksum(len, fn) { - assertNumber(len); - if (typeof fn !== 'function') - throw new Error('checksum fn should be function'); - return { - encode(data) { - if (!(data instanceof Uint8Array)) - throw new Error('checksum.encode: input should be Uint8Array'); - const checksum = fn(data).slice(0, len); - const res = new Uint8Array(data.length + len); - res.set(data); - res.set(checksum, data.length); - return res; - }, - decode(data) { - if (!(data instanceof Uint8Array)) - throw new Error('checksum.decode: input should be Uint8Array'); - const payload = data.slice(0, -len); - const newChecksum = fn(payload).slice(0, len); - const oldChecksum = data.slice(-len); - for (let i = 0; i < len; i++) - if (newChecksum[i] !== oldChecksum[i]) - throw new Error('Invalid checksum'); - return payload; - }, - }; - } - exports.utils = { alphabet, chain, checksum, radix, radix2, join, padding }; - exports.base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join('')); - exports.base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join('')); - exports.base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join('')); - exports.base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))); - exports.base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join('')); - exports.base64url = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join('')); - const genBase58 = (abc) => chain(radix(58), alphabet(abc), join('')); - exports.base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'); - exports.base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'); - exports.base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'); - const XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11]; - exports.base58xmr = { - encode(data) { - let res = ''; - for (let i = 0; i < data.length; i += 8) { - const block = data.subarray(i, i + 8); - res += exports.base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1'); - } - return res; - }, - decode(str) { - let res = []; - for (let i = 0; i < str.length; i += 11) { - const slice = str.slice(i, i + 11); - const blockLen = XMR_BLOCK_LEN.indexOf(slice.length); - const block = exports.base58.decode(slice); - for (let j = 0; j < block.length - blockLen; j++) { - if (block[j] !== 0) - throw new Error('base58xmr: wrong padding'); - } - res = res.concat(Array.from(block.slice(block.length - blockLen))); - } - return Uint8Array.from(res); - }, - }; - const base58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), exports.base58); - exports.base58check = base58check; - const BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join('')); - const POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]; - function bech32Polymod(pre) { - const b = pre >> 25; - let chk = (pre & 0x1ffffff) << 5; - for (let i = 0; i < POLYMOD_GENERATORS.length; i++) { - if (((b >> i) & 1) === 1) - chk ^= POLYMOD_GENERATORS[i]; - } - return chk; - } - function bechChecksum(prefix, words, encodingConst = 1) { - const len = prefix.length; - let chk = 1; - for (let i = 0; i < len; i++) { - const c = prefix.charCodeAt(i); - if (c < 33 || c > 126) - throw new Error(`Invalid prefix (${prefix})`); - chk = bech32Polymod(chk) ^ (c >> 5); - } - chk = bech32Polymod(chk); - for (let i = 0; i < len; i++) - chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f); - for (let v of words) - chk = bech32Polymod(chk) ^ v; - for (let i = 0; i < 6; i++) - chk = bech32Polymod(chk); - chk ^= encodingConst; - return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false)); - } - function genBech32(encoding) { - const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3; - const _words = radix2(5); - const fromWords = _words.decode; - const toWords = _words.encode; - const fromWordsUnsafe = unsafeWrapper(fromWords); - function encode(prefix, words, limit = 90) { - if (typeof prefix !== 'string') - throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`); - if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number')) - throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`); - const actualLength = prefix.length + 7 + words.length; - if (limit !== false && actualLength > limit) - throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`); - prefix = prefix.toLowerCase(); - return `${prefix}1${BECH_ALPHABET.encode(words)}${bechChecksum(prefix, words, ENCODING_CONST)}`; - } - function decode(str, limit = 90) { - if (typeof str !== 'string') - throw new Error(`bech32.decode input should be string, not ${typeof str}`); - if (str.length < 8 || (limit !== false && str.length > limit)) - throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`); - const lowered = str.toLowerCase(); - if (str !== lowered && str !== str.toUpperCase()) - throw new Error(`String must be lowercase or uppercase`); - str = lowered; - const sepIndex = str.lastIndexOf('1'); - if (sepIndex === 0 || sepIndex === -1) - throw new Error(`Letter "1" must be present between prefix and data only`); - const prefix = str.slice(0, sepIndex); - const _words = str.slice(sepIndex + 1); - if (_words.length < 6) - throw new Error('Data must be at least 6 characters long'); - const words = BECH_ALPHABET.decode(_words).slice(0, -6); - const sum = bechChecksum(prefix, words, ENCODING_CONST); - if (!_words.endsWith(sum)) - throw new Error(`Invalid checksum in ${str}: expected "${sum}"`); - return { prefix, words }; - } - const decodeUnsafe = unsafeWrapper(decode); - function decodeToBytes(str) { - const { prefix, words } = decode(str, false); - return { prefix, words, bytes: fromWords(words) }; - } - return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords }; - } - exports.bech32 = genBech32('bech32'); - exports.bech32m = genBech32('bech32m'); - exports.utf8 = { - encode: (data) => new TextDecoder().decode(data), - decode: (str) => new TextEncoder().encode(str), - }; - exports.hex = chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => { - if (typeof s !== 'string' || s.length % 2) - throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`); - return s.toLowerCase(); - })); - const CODERS = { - utf8: exports.utf8, hex: exports.hex, base16: exports.base16, base32: exports.base32, base64: exports.base64, base64url: exports.base64url, base58: exports.base58, base58xmr: exports.base58xmr - }; - const coderTypeError = `Invalid encoding type. Available types: ${Object.keys(CODERS).join(', ')}`; - const bytesToString = (type, bytes) => { - if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) - throw new TypeError(coderTypeError); - if (!(bytes instanceof Uint8Array)) - throw new TypeError('bytesToString() expects Uint8Array'); - return CODERS[type].encode(bytes); - }; - exports.bytesToString = bytesToString; - exports.str = exports.bytesToString; - const stringToBytes = (type, str) => { - if (!CODERS.hasOwnProperty(type)) - throw new TypeError(coderTypeError); - if (typeof str !== 'string') - throw new TypeError('stringToBytes() expects string'); - return CODERS[type].decode(str); - }; - exports.stringToBytes = stringToBytes; - exports.bytes = exports.stringToBytes; - } (lib)); - - Object.defineProperty(bip39, "__esModule", { value: true }); - var mnemonicToSeedSync_1 = bip39.mnemonicToSeedSync = bip39.mnemonicToSeed = validateMnemonic_1 = bip39.validateMnemonic = bip39.entropyToMnemonic = bip39.mnemonicToEntropy = generateMnemonic_1 = bip39.generateMnemonic = void 0; - /*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */ - const _assert_1 = _assert; - const pbkdf2_1 = pbkdf2$1; - const sha256_1 = sha256$1; - const sha512_1 = sha512$1; - const utils_1 = utils; - const base_1 = lib; - // Japanese wordlist - const isJapanese = (wordlist) => wordlist[0] === '\u3042\u3044\u3053\u304f\u3057\u3093'; - // Normalization replaces equivalent sequences of characters - // so that any two texts that are equivalent will be reduced - // to the same sequence of code points, called the normal form of the original text. - function nfkd(str) { - if (typeof str !== 'string') - throw new TypeError(`Invalid mnemonic type: ${typeof str}`); - return str.normalize('NFKD'); - } - function normalize(str) { - const norm = nfkd(str); - const words = norm.split(' '); - if (![12, 15, 18, 21, 24].includes(words.length)) - throw new Error('Invalid mnemonic'); - return { nfkd: norm, words }; - } - function assertEntropy(entropy) { - _assert_1.default.bytes(entropy, 16, 20, 24, 28, 32); - } - /** - * Generate x random words. Uses Cryptographically-Secure Random Number Generator. - * @param wordlist imported wordlist for specific language - * @param strength mnemonic strength 128-256 bits - * @example - * generateMnemonic(wordlist, 128) - * // 'legal winner thank year wave sausage worth useful legal winner thank yellow' - */ - function generateMnemonic(wordlist, strength = 128) { - _assert_1.default.number(strength); - if (strength % 32 !== 0 || strength > 256) - throw new TypeError('Invalid entropy'); - return entropyToMnemonic((0, utils_1.randomBytes)(strength / 8), wordlist); - } - var generateMnemonic_1 = bip39.generateMnemonic = generateMnemonic; - const calcChecksum = (entropy) => { - // Checksum is ent.length/4 bits long - const bitsLeft = 8 - entropy.length / 4; - // Zero rightmost "bitsLeft" bits in byte - // For example: bitsLeft=4 val=10111101 -> 10110000 - return new Uint8Array([((0, sha256_1.sha256)(entropy)[0] >> bitsLeft) << bitsLeft]); - }; - function getCoder(wordlist) { - if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string') - throw new Error('Worlist: expected array of 2048 strings'); - wordlist.forEach((i) => { - if (typeof i !== 'string') - throw new Error(`Wordlist: non-string element: ${i}`); - }); - return base_1.utils.chain(base_1.utils.checksum(1, calcChecksum), base_1.utils.radix2(11, true), base_1.utils.alphabet(wordlist)); - } - /** - * Reversible: Converts mnemonic string to raw entropy in form of byte array. - * @param mnemonic 12-24 words - * @param wordlist imported wordlist for specific language - * @example - * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow'; - * mnemonicToEntropy(mnem, wordlist) - * // Produces - * new Uint8Array([ - * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f - * ]) - */ - function mnemonicToEntropy(mnemonic, wordlist) { - const { words } = normalize(mnemonic); - const entropy = getCoder(wordlist).decode(words); - assertEntropy(entropy); - return entropy; - } - bip39.mnemonicToEntropy = mnemonicToEntropy; - /** - * Reversible: Converts raw entropy in form of byte array to mnemonic string. - * @param entropy byte array - * @param wordlist imported wordlist for specific language - * @returns 12-24 words - * @example - * const ent = new Uint8Array([ - * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f - * ]); - * entropyToMnemonic(ent, wordlist); - * // 'legal winner thank year wave sausage worth useful legal winner thank yellow' - */ - function entropyToMnemonic(entropy, wordlist) { - assertEntropy(entropy); - const words = getCoder(wordlist).encode(entropy); - return words.join(isJapanese(wordlist) ? '\u3000' : ' '); - } - bip39.entropyToMnemonic = entropyToMnemonic; - /** - * Validates mnemonic for being 12-24 words contained in `wordlist`. - */ - function validateMnemonic(mnemonic, wordlist) { - try { - mnemonicToEntropy(mnemonic, wordlist); - } - catch (e) { - return false; - } - return true; - } - var validateMnemonic_1 = bip39.validateMnemonic = validateMnemonic; - const salt = (passphrase) => nfkd(`mnemonic${passphrase}`); - /** - * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password. - * @param mnemonic 12-24 words - * @param passphrase string that will additionally protect the key - * @returns 64 bytes of key data - * @example - * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow'; - * await mnemonicToSeed(mnem, 'password'); - * // new Uint8Array([...64 bytes]) - */ - function mnemonicToSeed(mnemonic, passphrase = '') { - return (0, pbkdf2_1.pbkdf2Async)(sha512_1.sha512, normalize(mnemonic).nfkd, salt(passphrase), { c: 2048, dkLen: 64 }); - } - bip39.mnemonicToSeed = mnemonicToSeed; - /** - * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password. - * @param mnemonic 12-24 words - * @param passphrase string that will additionally protect the key - * @returns 64 bytes of key data - * @example - * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow'; - * mnemonicToSeedSync(mnem, 'password'); - * // new Uint8Array([...64 bytes]) - */ - function mnemonicToSeedSync(mnemonic, passphrase = '') { - return (0, pbkdf2_1.pbkdf2)(sha512_1.sha512, normalize(mnemonic).nfkd, salt(passphrase), { c: 2048, dkLen: 64 }); - } - mnemonicToSeedSync_1 = bip39.mnemonicToSeedSync = mnemonicToSeedSync; - - function number(n) { - if (!Number.isSafeInteger(n) || n < 0) - throw new Error(`Wrong positive integer: ${n}`); - } - function bool(b) { - if (typeof b !== 'boolean') - throw new Error(`Expected boolean, not ${b}`); - } - function bytes(b, ...lengths) { - if (!(b instanceof Uint8Array)) - throw new TypeError('Expected Uint8Array'); - if (lengths.length > 0 && !lengths.includes(b.length)) - throw new TypeError(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`); - } - function hash(hash) { - if (typeof hash !== 'function' || typeof hash.create !== 'function') - throw new Error('Hash should be wrapped by utils.wrapConstructor'); - number(hash.outputLen); - number(hash.blockLen); - } - function exists(instance, checkFinished = true) { - if (instance.destroyed) - throw new Error('Hash instance has been destroyed'); - if (checkFinished && instance.finished) - throw new Error('Hash#digest() has already been called'); - } - function output(out, instance) { - bytes(out); - const min = instance.outputLen; - if (out.length < min) { - throw new Error(`digestInto() expects output buffer of length at least ${min}`); - } - } - const assert = { - number, - bool, - bytes, - hash, - exists, - output, - }; - - /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ - // Cast array to view - const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength); - // The rotate right (circular right shift) operation for uint32 - const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift); - const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44; - // There is almost no big endian hardware, but js typed arrays uses platform specific endianness. - // So, just to be sure not to corrupt anything. - if (!isLE) - throw new Error('Non little-endian hardware is not supported'); - const hexes = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0')); - /** - * @example bytesToHex(Uint8Array.from([0xde, 0xad, 0xbe, 0xef])) - */ - function bytesToHex(uint8a) { - // pre-caching improves the speed 6x - if (!(uint8a instanceof Uint8Array)) - throw new Error('Uint8Array expected'); - let hex = ''; - for (let i = 0; i < uint8a.length; i++) { - hex += hexes[uint8a[i]]; - } - return hex; - } - /** - * @example hexToBytes('deadbeef') - */ - function hexToBytes(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToBytes: expected string, got ' + typeof hex); - } - if (hex.length % 2) - throw new Error('hexToBytes: received invalid unpadded hex'); - const array = new Uint8Array(hex.length / 2); - for (let i = 0; i < array.length; i++) { - const j = i * 2; - const hexByte = hex.slice(j, j + 2); - const byte = Number.parseInt(hexByte, 16); - if (Number.isNaN(byte) || byte < 0) - throw new Error('Invalid byte sequence'); - array[i] = byte; - } - return array; - } - function utf8ToBytes(str) { - if (typeof str !== 'string') { - throw new TypeError(`utf8ToBytes expected string, got ${typeof str}`); - } - return new TextEncoder().encode(str); - } - function toBytes(data) { - if (typeof data === 'string') - data = utf8ToBytes(data); - if (!(data instanceof Uint8Array)) - throw new TypeError(`Expected input type is Uint8Array (got ${typeof data})`); - return data; - } - /** - * Concats Uint8Array-s into one; like `Buffer.concat([buf1, buf2])` - * @example concatBytes(buf1, buf2) - */ - function concatBytes(...arrays) { - if (!arrays.every((a) => a instanceof Uint8Array)) - throw new Error('Uint8Array list expected'); - if (arrays.length === 1) - return arrays[0]; - const length = arrays.reduce((a, arr) => a + arr.length, 0); - const result = new Uint8Array(length); - for (let i = 0, pad = 0; i < arrays.length; i++) { - const arr = arrays[i]; - result.set(arr, pad); - pad += arr.length; - } - return result; - } - // For runtime check if class implements interface - class Hash { - // Safe version that clones internal state - clone() { - return this._cloneInto(); - } - } - function wrapConstructor(hashConstructor) { - const hashC = (message) => hashConstructor().update(toBytes(message)).digest(); - const tmp = hashConstructor(); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = () => hashConstructor(); - return hashC; - } - - // HMAC (RFC 2104) - let HMAC$1 = class HMAC extends Hash { - constructor(hash, _key) { - super(); - this.finished = false; - this.destroyed = false; - assert.hash(hash); - const key = toBytes(_key); - this.iHash = hash.create(); - if (typeof this.iHash.update !== 'function') - throw new TypeError('Expected instance of class which extends utils.Hash'); - this.blockLen = this.iHash.blockLen; - this.outputLen = this.iHash.outputLen; - const blockLen = this.blockLen; - const pad = new Uint8Array(blockLen); - // blockLen can be bigger than outputLen - pad.set(key.length > blockLen ? hash.create().update(key).digest() : key); - for (let i = 0; i < pad.length; i++) - pad[i] ^= 0x36; - this.iHash.update(pad); - // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone - this.oHash = hash.create(); - // Undo internal XOR && apply outer XOR - for (let i = 0; i < pad.length; i++) - pad[i] ^= 0x36 ^ 0x5c; - this.oHash.update(pad); - pad.fill(0); - } - update(buf) { - assert.exists(this); - this.iHash.update(buf); - return this; - } - digestInto(out) { - assert.exists(this); - assert.bytes(out, this.outputLen); - this.finished = true; - this.iHash.digestInto(out); - this.oHash.update(out); - this.oHash.digestInto(out); - this.destroy(); - } - digest() { - const out = new Uint8Array(this.oHash.outputLen); - this.digestInto(out); - return out; - } - _cloneInto(to) { - // Create new instance without calling constructor since key already in state and we don't know it. - to || (to = Object.create(Object.getPrototypeOf(this), {})); - const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this; - to = to; - to.finished = finished; - to.destroyed = destroyed; - to.blockLen = blockLen; - to.outputLen = outputLen; - to.oHash = oHash._cloneInto(to.oHash); - to.iHash = iHash._cloneInto(to.iHash); - return to; - } - destroy() { - this.destroyed = true; - this.oHash.destroy(); - this.iHash.destroy(); - } - }; - /** - * HMAC: RFC2104 message authentication code. - * @param hash - function that would be used e.g. sha256 - * @param key - message key - * @param message - message data - */ - const hmac$1 = (hash, key, message) => new HMAC$1(hash, key).update(message).digest(); - hmac$1.create = (hash, key) => new HMAC$1(hash, key); - - // Polyfill for Safari 14 - function setBigUint64(view, byteOffset, value, isLE) { - if (typeof view.setBigUint64 === 'function') - return view.setBigUint64(byteOffset, value, isLE); - const _32n = BigInt(32); - const _u32_max = BigInt(0xffffffff); - const wh = Number((value >> _32n) & _u32_max); - const wl = Number(value & _u32_max); - const h = isLE ? 4 : 0; - const l = isLE ? 0 : 4; - view.setUint32(byteOffset + h, wh, isLE); - view.setUint32(byteOffset + l, wl, isLE); - } - // Base SHA2 class (RFC 6234) - class SHA2 extends Hash { - constructor(blockLen, outputLen, padOffset, isLE) { - super(); - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE; - this.finished = false; - this.length = 0; - this.pos = 0; - this.destroyed = false; - this.buffer = new Uint8Array(blockLen); - this.view = createView(this.buffer); - } - update(data) { - assert.exists(this); - const { view, buffer, blockLen } = this; - data = toBytes(data); - const len = data.length; - for (let pos = 0; pos < len;) { - const take = Math.min(blockLen - this.pos, len - pos); - // Fast path: we have at least one block in input, cast it to view and process - if (take === blockLen) { - const dataView = createView(data); - for (; blockLen <= len - pos; pos += blockLen) - this.process(dataView, pos); - continue; - } - buffer.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - assert.exists(this); - assert.output(out, this); - this.finished = true; - // Padding - // We can avoid allocation of buffer for padding completely if it - // was previously not allocated here. But it won't change performance. - const { buffer, view, blockLen, isLE } = this; - let { pos } = this; - // append the bit '1' to the message - buffer[pos++] = 0b10000000; - this.buffer.subarray(pos).fill(0); - // we have less than padOffset left in buffer, so we cannot put length in current block, need process it and pad again - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - // Pad until full block byte with zeros - for (let i = pos; i < blockLen; i++) - buffer[i] = 0; - // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that - // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen. - // So we just write lowest 64 bits of that value. - setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE); - this.process(view, 0); - const oview = createView(out); - const len = this.outputLen; - // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT - if (len % 4) - throw new Error('_sha2: outputLen should be aligned to 32bit'); - const outLen = len / 4; - const state = this.get(); - if (outLen > state.length) - throw new Error('_sha2: outputLen bigger than state'); - for (let i = 0; i < outLen; i++) - oview.setUint32(4 * i, state[i], isLE); - } - digest() { - const { buffer, outputLen } = this; - this.digestInto(buffer); - const res = buffer.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to || (to = new this.constructor()); - to.set(...this.get()); - const { blockLen, buffer, length, finished, destroyed, pos } = this; - to.length = length; - to.pos = pos; - to.finished = finished; - to.destroyed = destroyed; - if (length % blockLen) - to.buffer.set(buffer); - return to; - } - } - - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - // https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf - const Rho = new Uint8Array([7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8]); - const Id = Uint8Array.from({ length: 16 }, (_, i) => i); - const Pi = Id.map((i) => (9 * i + 5) % 16); - let idxL = [Id]; - let idxR = [Pi]; - for (let i = 0; i < 4; i++) - for (let j of [idxL, idxR]) - j.push(j[i].map((k) => Rho[k])); - const shifts = [ - [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], - [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7], - [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9], - [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6], - [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5], - ].map((i) => new Uint8Array(i)); - const shiftsL = idxL.map((idx, i) => idx.map((j) => shifts[i][j])); - const shiftsR = idxR.map((idx, i) => idx.map((j) => shifts[i][j])); - const Kl = new Uint32Array([0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e]); - const Kr = new Uint32Array([0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000]); - // The rotate left (circular left shift) operation for uint32 - const rotl = (word, shift) => (word << shift) | (word >>> (32 - shift)); - // It's called f() in spec. - function f(group, x, y, z) { - if (group === 0) - return x ^ y ^ z; - else if (group === 1) - return (x & y) | (~x & z); - else if (group === 2) - return (x | ~y) ^ z; - else if (group === 3) - return (x & z) | (y & ~z); - else - return x ^ (y | ~z); - } - // Temporary buffer, not used to store anything between runs - const BUF = new Uint32Array(16); - class RIPEMD160 extends SHA2 { - constructor() { - super(64, 20, 8, true); - this.h0 = 0x67452301 | 0; - this.h1 = 0xefcdab89 | 0; - this.h2 = 0x98badcfe | 0; - this.h3 = 0x10325476 | 0; - this.h4 = 0xc3d2e1f0 | 0; - } - get() { - const { h0, h1, h2, h3, h4 } = this; - return [h0, h1, h2, h3, h4]; - } - set(h0, h1, h2, h3, h4) { - this.h0 = h0 | 0; - this.h1 = h1 | 0; - this.h2 = h2 | 0; - this.h3 = h3 | 0; - this.h4 = h4 | 0; - } - process(view, offset) { - for (let i = 0; i < 16; i++, offset += 4) - BUF[i] = view.getUint32(offset, true); - // prettier-ignore - let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el; - // Instead of iterating 0 to 80, we split it into 5 groups - // And use the groups in constants, functions, etc. Much simpler - for (let group = 0; group < 5; group++) { - const rGroup = 4 - group; - const hbl = Kl[group], hbr = Kr[group]; // prettier-ignore - const rl = idxL[group], rr = idxR[group]; // prettier-ignore - const sl = shiftsL[group], sr = shiftsR[group]; // prettier-ignore - for (let i = 0; i < 16; i++) { - const tl = (rotl(al + f(group, bl, cl, dl) + BUF[rl[i]] + hbl, sl[i]) + el) | 0; - al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore - } - // 2 loops are 10% faster - for (let i = 0; i < 16; i++) { - const tr = (rotl(ar + f(rGroup, br, cr, dr) + BUF[rr[i]] + hbr, sr[i]) + er) | 0; - ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore - } - } - // Add the compressed chunk to the current hash value - this.set((this.h1 + cl + dr) | 0, (this.h2 + dl + er) | 0, (this.h3 + el + ar) | 0, (this.h4 + al + br) | 0, (this.h0 + bl + cr) | 0); - } - roundClean() { - BUF.fill(0); - } - destroy() { - this.destroyed = true; - this.buffer.fill(0); - this.set(0, 0, 0, 0, 0); - } - } - /** - * RIPEMD-160 - a hash function from 1990s. - * @param message - msg that would be hashed - */ - const ripemd160 = wrapConstructor(() => new RIPEMD160()); - - // Choice: a ? b : c - const Chi = (a, b, c) => (a & b) ^ (~a & c); - // Majority function, true if any two inpust is true - const Maj = (a, b, c) => (a & b) ^ (a & c) ^ (b & c); - // Round constants: - // first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) - // prettier-ignore - const SHA256_K = new Uint32Array([ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - ]); - // Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): - // prettier-ignore - const IV = new Uint32Array([ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ]); - // Temporary buffer, not used to store anything between runs - // Named this way because it matches specification. - const SHA256_W = new Uint32Array(64); - class SHA256 extends SHA2 { - constructor() { - super(64, 32, 8, false); - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - this.A = IV[0] | 0; - this.B = IV[1] | 0; - this.C = IV[2] | 0; - this.D = IV[3] | 0; - this.E = IV[4] | 0; - this.F = IV[5] | 0; - this.G = IV[6] | 0; - this.H = IV[7] | 0; - } - get() { - const { A, B, C, D, E, F, G, H } = this; - return [A, B, C, D, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) - SHA256_W[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W[i - 15]; - const W2 = SHA256_W[i - 2]; - const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3); - const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10); - SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0; - } - // Compression function main loop, 64 rounds - let { A, B, C, D, E, F, G, H } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25); - const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0; - const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22); - const T2 = (sigma0 + Maj(A, B, C)) | 0; - H = G; - G = F; - F = E; - E = (D + T1) | 0; - D = C; - C = B; - B = A; - A = (T1 + T2) | 0; - } - // Add the compressed chunk to the current hash value - A = (A + this.A) | 0; - B = (B + this.B) | 0; - C = (C + this.C) | 0; - D = (D + this.D) | 0; - E = (E + this.E) | 0; - F = (F + this.F) | 0; - G = (G + this.G) | 0; - H = (H + this.H) | 0; - this.set(A, B, C, D, E, F, G, H); - } - roundClean() { - SHA256_W.fill(0); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - this.buffer.fill(0); - } - } - // Constants from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf - class SHA224 extends SHA256 { - constructor() { - super(); - this.A = 0xc1059ed8 | 0; - this.B = 0x367cd507 | 0; - this.C = 0x3070dd17 | 0; - this.D = 0xf70e5939 | 0; - this.E = 0xffc00b31 | 0; - this.F = 0x68581511 | 0; - this.G = 0x64f98fa7 | 0; - this.H = 0xbefa4fa4 | 0; - this.outputLen = 28; - } - } - /** - * SHA2-256 hash function - * @param message - data that would be hashed - */ - const sha256 = wrapConstructor(() => new SHA256()); - wrapConstructor(() => new SHA224()); - - const U32_MASK64 = BigInt(2 ** 32 - 1); - const _32n = BigInt(32); - // We are not using BigUint64Array, because they are extremely slow as per 2022 - function fromBig(n, le = false) { - if (le) - return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) }; - return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 }; - } - function split(lst, le = false) { - let Ah = new Uint32Array(lst.length); - let Al = new Uint32Array(lst.length); - for (let i = 0; i < lst.length; i++) { - const { h, l } = fromBig(lst[i], le); - [Ah[i], Al[i]] = [h, l]; - } - return [Ah, Al]; - } - const toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0); - // for Shift in [0, 32) - const shrSH = (h, l, s) => h >>> s; - const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s); - // Right rotate for Shift in [1, 32) - const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s)); - const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s); - // Right rotate for Shift in (32, 64), NOTE: 32 is special case. - const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32)); - const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s)); - // Right rotate for shift===32 (just swaps l&h) - const rotr32H = (h, l) => l; - const rotr32L = (h, l) => h; - // Left rotate for Shift in [1, 32) - const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s)); - const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s)); - // Left rotate for Shift in (32, 64), NOTE: 32 is special case. - const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s)); - const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s)); - // JS uses 32-bit signed integers for bitwise operations which means we cannot - // simple take carry out of low bit sum by shift, we need to use division. - // Removing "export" has 5% perf penalty -_- - function add(Ah, Al, Bh, Bl) { - const l = (Al >>> 0) + (Bl >>> 0); - return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 }; - } - // Addition with more than 2 elements - const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0); - const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0; - const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0); - const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0; - const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0); - const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0; - // prettier-ignore - const u64 = { - fromBig, split, toBig, - shrSH, shrSL, - rotrSH, rotrSL, rotrBH, rotrBL, - rotr32H, rotr32L, - rotlSH, rotlSL, rotlBH, rotlBL, - add, add3L, add3H, add4L, add4H, add5H, add5L, - }; - - // Round contants (first 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409): - // prettier-ignore - const [SHA512_Kh, SHA512_Kl] = u64.split([ - '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc', - '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118', - '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2', - '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694', - '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65', - '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5', - '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4', - '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70', - '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df', - '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b', - '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30', - '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8', - '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8', - '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3', - '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec', - '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b', - '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178', - '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b', - '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c', - '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817' - ].map(n => BigInt(n))); - // Temporary buffer, not used to store anything between runs - const SHA512_W_H = new Uint32Array(80); - const SHA512_W_L = new Uint32Array(80); - class SHA512 extends SHA2 { - constructor() { - super(128, 64, 16, false); - // We cannot use array here since array allows indexing by variable which means optimizer/compiler cannot use registers. - // Also looks cleaner and easier to verify with spec. - // Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0x6a09e667 | 0; - this.Al = 0xf3bcc908 | 0; - this.Bh = 0xbb67ae85 | 0; - this.Bl = 0x84caa73b | 0; - this.Ch = 0x3c6ef372 | 0; - this.Cl = 0xfe94f82b | 0; - this.Dh = 0xa54ff53a | 0; - this.Dl = 0x5f1d36f1 | 0; - this.Eh = 0x510e527f | 0; - this.El = 0xade682d1 | 0; - this.Fh = 0x9b05688c | 0; - this.Fl = 0x2b3e6c1f | 0; - this.Gh = 0x1f83d9ab | 0; - this.Gl = 0xfb41bd6b | 0; - this.Hh = 0x5be0cd19 | 0; - this.Hl = 0x137e2179 | 0; - } - // prettier-ignore - get() { - const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; - return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl]; - } - // prettier-ignore - set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) { - this.Ah = Ah | 0; - this.Al = Al | 0; - this.Bh = Bh | 0; - this.Bl = Bl | 0; - this.Ch = Ch | 0; - this.Cl = Cl | 0; - this.Dh = Dh | 0; - this.Dl = Dl | 0; - this.Eh = Eh | 0; - this.El = El | 0; - this.Fh = Fh | 0; - this.Fl = Fl | 0; - this.Gh = Gh | 0; - this.Gl = Gl | 0; - this.Hh = Hh | 0; - this.Hl = Hl | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) { - SHA512_W_H[i] = view.getUint32(offset); - SHA512_W_L[i] = view.getUint32((offset += 4)); - } - for (let i = 16; i < 80; i++) { - // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7) - const W15h = SHA512_W_H[i - 15] | 0; - const W15l = SHA512_W_L[i - 15] | 0; - const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7); - const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7); - // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6) - const W2h = SHA512_W_H[i - 2] | 0; - const W2l = SHA512_W_L[i - 2] | 0; - const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6); - const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6); - // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16]; - const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]); - const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]); - SHA512_W_H[i] = SUMh | 0; - SHA512_W_L[i] = SUMl | 0; - } - let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; - // Compression function main loop, 80 rounds - for (let i = 0; i < 80; i++) { - // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41) - const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41); - const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41); - //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0; - const CHIh = (Eh & Fh) ^ (~Eh & Gh); - const CHIl = (El & Fl) ^ (~El & Gl); - // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i] - // prettier-ignore - const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]); - const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]); - const T1l = T1ll | 0; - // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39) - const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39); - const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39); - const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch); - const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl); - Hh = Gh | 0; - Hl = Gl | 0; - Gh = Fh | 0; - Gl = Fl | 0; - Fh = Eh | 0; - Fl = El | 0; - ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0)); - Dh = Ch | 0; - Dl = Cl | 0; - Ch = Bh | 0; - Cl = Bl | 0; - Bh = Ah | 0; - Bl = Al | 0; - const All = u64.add3L(T1l, sigma0l, MAJl); - Ah = u64.add3H(All, T1h, sigma0h, MAJh); - Al = All | 0; - } - // Add the compressed chunk to the current hash value - ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0)); - ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0)); - ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0)); - ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0)); - ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0)); - ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0)); - ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0)); - ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0)); - this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl); - } - roundClean() { - SHA512_W_H.fill(0); - SHA512_W_L.fill(0); - } - destroy() { - this.buffer.fill(0); - this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - } - class SHA512_224 extends SHA512 { - constructor() { - super(); - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0x8c3d37c8 | 0; - this.Al = 0x19544da2 | 0; - this.Bh = 0x73e19966 | 0; - this.Bl = 0x89dcd4d6 | 0; - this.Ch = 0x1dfab7ae | 0; - this.Cl = 0x32ff9c82 | 0; - this.Dh = 0x679dd514 | 0; - this.Dl = 0x582f9fcf | 0; - this.Eh = 0x0f6d2b69 | 0; - this.El = 0x7bd44da8 | 0; - this.Fh = 0x77e36f73 | 0; - this.Fl = 0x04c48942 | 0; - this.Gh = 0x3f9d85a8 | 0; - this.Gl = 0x6a1d36c8 | 0; - this.Hh = 0x1112e6ad | 0; - this.Hl = 0x91d692a1 | 0; - this.outputLen = 28; - } - } - class SHA512_256 extends SHA512 { - constructor() { - super(); - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0x22312194 | 0; - this.Al = 0xfc2bf72c | 0; - this.Bh = 0x9f555fa3 | 0; - this.Bl = 0xc84c64c2 | 0; - this.Ch = 0x2393b86b | 0; - this.Cl = 0x6f53b151 | 0; - this.Dh = 0x96387719 | 0; - this.Dl = 0x5940eabd | 0; - this.Eh = 0x96283ee2 | 0; - this.El = 0xa88effe3 | 0; - this.Fh = 0xbe5e1e25 | 0; - this.Fl = 0x53863992 | 0; - this.Gh = 0x2b0199fc | 0; - this.Gl = 0x2c85b8aa | 0; - this.Hh = 0x0eb72ddc | 0; - this.Hl = 0x81c52ca2 | 0; - this.outputLen = 32; - } - } - class SHA384 extends SHA512 { - constructor() { - super(); - // h -- high 32 bits, l -- low 32 bits - this.Ah = 0xcbbb9d5d | 0; - this.Al = 0xc1059ed8 | 0; - this.Bh = 0x629a292a | 0; - this.Bl = 0x367cd507 | 0; - this.Ch = 0x9159015a | 0; - this.Cl = 0x3070dd17 | 0; - this.Dh = 0x152fecd8 | 0; - this.Dl = 0xf70e5939 | 0; - this.Eh = 0x67332667 | 0; - this.El = 0xffc00b31 | 0; - this.Fh = 0x8eb44a87 | 0; - this.Fl = 0x68581511 | 0; - this.Gh = 0xdb0c2e0d | 0; - this.Gl = 0x64f98fa7 | 0; - this.Hh = 0x47b5481d | 0; - this.Hl = 0xbefa4fa4 | 0; - this.outputLen = 48; - } - } - const sha512 = wrapConstructor(() => new SHA512()); - wrapConstructor(() => new SHA512_224()); - wrapConstructor(() => new SHA512_256()); - wrapConstructor(() => new SHA384()); - - utils$1.hmacSha256Sync = (key, ...msgs) => hmac$1(sha256, key, utils$1.concatBytes(...msgs)); - const base58check = base58check$1(sha256); - function bytesToNumber(bytes) { - return BigInt(`0x${bytesToHex(bytes)}`); - } - function numberToBytes(num) { - return hexToBytes(num.toString(16).padStart(64, '0')); - } - const MASTER_SECRET = utf8ToBytes('Bitcoin seed'); - const BITCOIN_VERSIONS = { private: 0x0488ade4, public: 0x0488b21e }; - const HARDENED_OFFSET = 0x80000000; - const hash160 = (data) => ripemd160(sha256(data)); - const fromU32 = (data) => createView(data).getUint32(0, false); - const toU32 = (n) => { - if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) { - throw new Error(`Invalid number=${n}. Should be from 0 to 2 ** 32 - 1`); - } - const buf = new Uint8Array(4); - createView(buf).setUint32(0, n, false); - return buf; - }; - class HDKey { - constructor(opt) { - this.depth = 0; - this.index = 0; - this.chainCode = null; - this.parentFingerprint = 0; - if (!opt || typeof opt !== 'object') { - throw new Error('HDKey.constructor must not be called directly'); - } - this.versions = opt.versions || BITCOIN_VERSIONS; - this.depth = opt.depth || 0; - this.chainCode = opt.chainCode; - this.index = opt.index || 0; - this.parentFingerprint = opt.parentFingerprint || 0; - if (!this.depth) { - if (this.parentFingerprint || this.index) { - throw new Error('HDKey: zero depth with non-zero index/parent fingerprint'); - } - } - if (opt.publicKey && opt.privateKey) { - throw new Error('HDKey: publicKey and privateKey at same time.'); - } - if (opt.privateKey) { - if (!utils$1.isValidPrivateKey(opt.privateKey)) { - throw new Error('Invalid private key'); - } - this.privKey = - typeof opt.privateKey === 'bigint' ? opt.privateKey : bytesToNumber(opt.privateKey); - this.privKeyBytes = numberToBytes(this.privKey); - this.pubKey = getPublicKey$1(opt.privateKey, true); - } - else if (opt.publicKey) { - this.pubKey = Point.fromHex(opt.publicKey).toRawBytes(true); - } - else { - throw new Error('HDKey: no public or private key provided'); - } - this.pubHash = hash160(this.pubKey); - } - get fingerprint() { - if (!this.pubHash) { - throw new Error('No publicKey set!'); - } - return fromU32(this.pubHash); - } - get identifier() { - return this.pubHash; - } - get pubKeyHash() { - return this.pubHash; - } - get privateKey() { - return this.privKeyBytes || null; - } - get publicKey() { - return this.pubKey || null; - } - get privateExtendedKey() { - const priv = this.privateKey; - if (!priv) { - throw new Error('No private key'); - } - return base58check.encode(this.serialize(this.versions.private, concatBytes(new Uint8Array([0]), priv))); - } - get publicExtendedKey() { - if (!this.pubKey) { - throw new Error('No public key'); - } - return base58check.encode(this.serialize(this.versions.public, this.pubKey)); - } - static fromMasterSeed(seed, versions = BITCOIN_VERSIONS) { - bytes(seed); - if (8 * seed.length < 128 || 8 * seed.length > 512) { - throw new Error(`HDKey: wrong seed length=${seed.length}. Should be between 128 and 512 bits; 256 bits is advised)`); - } - const I = hmac$1(sha512, MASTER_SECRET, seed); - return new HDKey({ - versions, - chainCode: I.slice(32), - privateKey: I.slice(0, 32), - }); - } - static fromExtendedKey(base58key, versions = BITCOIN_VERSIONS) { - const keyBuffer = base58check.decode(base58key); - const keyView = createView(keyBuffer); - const version = keyView.getUint32(0, false); - const opt = { - versions, - depth: keyBuffer[4], - parentFingerprint: keyView.getUint32(5, false), - index: keyView.getUint32(9, false), - chainCode: keyBuffer.slice(13, 45), - }; - const key = keyBuffer.slice(45); - const isPriv = key[0] === 0; - if (version !== versions[isPriv ? 'private' : 'public']) { - throw new Error('Version mismatch'); - } - if (isPriv) { - return new HDKey({ ...opt, privateKey: key.slice(1) }); - } - else { - return new HDKey({ ...opt, publicKey: key }); - } - } - static fromJSON(json) { - return HDKey.fromExtendedKey(json.xpriv); - } - derive(path) { - if (!/^[mM]'?/.test(path)) { - throw new Error('Path must start with "m" or "M"'); - } - if (/^[mM]'?$/.test(path)) { - return this; - } - const parts = path.replace(/^[mM]'?\//, '').split('/'); - let child = this; - for (const c of parts) { - const m = /^(\d+)('?)$/.exec(c); - if (!m || m.length !== 3) { - throw new Error(`Invalid child index: ${c}`); - } - let idx = +m[1]; - if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) { - throw new Error('Invalid index'); - } - if (m[2] === "'") { - idx += HARDENED_OFFSET; - } - child = child.deriveChild(idx); - } - return child; - } - deriveChild(index) { - if (!this.pubKey || !this.chainCode) { - throw new Error('No publicKey or chainCode set'); - } - let data = toU32(index); - if (index >= HARDENED_OFFSET) { - const priv = this.privateKey; - if (!priv) { - throw new Error('Could not derive hardened child key'); - } - data = concatBytes(new Uint8Array([0]), priv, data); - } - else { - data = concatBytes(this.pubKey, data); - } - const I = hmac$1(sha512, this.chainCode, data); - const childTweak = bytesToNumber(I.slice(0, 32)); - const chainCode = I.slice(32); - if (!utils$1.isValidPrivateKey(childTweak)) { - throw new Error('Tweak bigger than curve order'); - } - const opt = { - versions: this.versions, - chainCode, - depth: this.depth + 1, - parentFingerprint: this.fingerprint, - index, - }; - try { - if (this.privateKey) { - const added = utils$1.mod(this.privKey + childTweak, CURVE.n); - if (!utils$1.isValidPrivateKey(added)) { - throw new Error('The tweak was out of range or the resulted private key is invalid'); - } - opt.privateKey = added; - } - else { - const added = Point.fromHex(this.pubKey).add(Point.fromPrivateKey(childTweak)); - if (added.equals(Point.ZERO)) { - throw new Error('The tweak was equal to negative P, which made the result key invalid'); - } - opt.publicKey = added.toRawBytes(true); - } - return new HDKey(opt); - } - catch (err) { - return this.deriveChild(index + 1); - } - } - sign(hash) { - if (!this.privateKey) { - throw new Error('No privateKey set!'); - } - bytes(hash, 32); - return signSync(hash, this.privKey, { - canonical: true, - der: false, - }); - } - verify(hash, signature) { - bytes(hash, 32); - bytes(signature, 64); - if (!this.publicKey) { - throw new Error('No publicKey set!'); - } - let sig; - try { - sig = Signature.fromCompact(signature); - } - catch (error) { - return false; - } - return verify(sig, hash, this.publicKey); - } - wipePrivateData() { - this.privKey = undefined; - if (this.privKeyBytes) { - this.privKeyBytes.fill(0); - this.privKeyBytes = undefined; - } - return this; - } - toJSON() { - return { - xpriv: this.privateExtendedKey, - xpub: this.publicExtendedKey, - }; - } - serialize(version, key) { - if (!this.chainCode) { - throw new Error('No chainCode set'); - } - bytes(key, 33); - return concatBytes(toU32(version), new Uint8Array([this.depth]), toU32(this.parentFingerprint), toU32(this.index), this.chainCode, key); - } - } - - // HMAC (RFC 2104) - class HMAC extends Hash$1 { - constructor(hash, _key) { - super(); - this.finished = false; - this.destroyed = false; - assertHash(hash); - const key = toBytes$1(_key); - this.iHash = hash.create(); - if (!(this.iHash instanceof Hash$1)) - throw new TypeError('Expected instance of class which extends utils.Hash'); - const blockLen = (this.blockLen = this.iHash.blockLen); - this.outputLen = this.iHash.outputLen; - const pad = new Uint8Array(blockLen); - // blockLen can be bigger than outputLen - pad.set(key.length > this.iHash.blockLen ? hash.create().update(key).digest() : key); - for (let i = 0; i < pad.length; i++) - pad[i] ^= 0x36; - this.iHash.update(pad); - // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone - this.oHash = hash.create(); - // Undo internal XOR && apply outer XOR - for (let i = 0; i < pad.length; i++) - pad[i] ^= 0x36 ^ 0x5c; - this.oHash.update(pad); - pad.fill(0); - } - update(buf) { - if (this.destroyed) - throw new Error('instance is destroyed'); - this.iHash.update(buf); - return this; - } - digestInto(out) { - if (this.destroyed) - throw new Error('instance is destroyed'); - if (!(out instanceof Uint8Array) || out.length !== this.outputLen) - throw new Error('HMAC: Invalid output buffer'); - if (this.finished) - throw new Error('digest() was already called'); - this.finished = true; - this.iHash.digestInto(out); - this.oHash.update(out); - this.oHash.digestInto(out); - this.destroy(); - } - digest() { - const out = new Uint8Array(this.oHash.outputLen); - this.digestInto(out); - return out; - } - _cloneInto(to) { - // Create new instance without calling constructor since key already in state and we don't know it. - to || (to = Object.create(Object.getPrototypeOf(this), {})); - const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this; - to = to; - to.finished = finished; - to.destroyed = destroyed; - to.blockLen = blockLen; - to.outputLen = outputLen; - to.oHash = oHash._cloneInto(to.oHash); - to.iHash = iHash._cloneInto(to.iHash); - return to; - } - destroy() { - this.destroyed = true; - this.oHash.destroy(); - this.iHash.destroy(); - } - } - const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest(); - hmac.create = (hash, key) => new HMAC(hash, key); - hmac.init = hmac.create; - - var __defProp = Object.defineProperty; - var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); - }; - function generatePrivateKey() { - return utils$1.bytesToHex(utils$1.randomPrivateKey()); - } - function getPublicKey(privateKey) { - return utils$1.bytesToHex(schnorr.getPublicKey(privateKey)); - } - - // utils.ts - var utils_exports = {}; - __export(utils_exports, { - insertEventIntoAscendingList: () => insertEventIntoAscendingList, - insertEventIntoDescendingList: () => insertEventIntoDescendingList, - normalizeURL: () => normalizeURL, - utf8Decoder: () => utf8Decoder, - utf8Encoder: () => utf8Encoder - }); - var utf8Decoder = new TextDecoder("utf-8"); - var utf8Encoder = new TextEncoder(); - function normalizeURL(url) { - let p = new URL(url); - p.pathname = p.pathname.replace(/\/+/g, "/"); - if (p.pathname.endsWith("/")) - p.pathname = p.pathname.slice(0, -1); - if (p.port === "80" && p.protocol === "ws:" || p.port === "443" && p.protocol === "wss:") - p.port = ""; - p.searchParams.sort(); - p.hash = ""; - return p.toString(); - } - function insertEventIntoDescendingList(sortedArray, event) { - let start = 0; - let end = sortedArray.length - 1; - let midPoint; - let position = start; - if (end < 0) { - position = 0; - } else if (event.created_at < sortedArray[end].created_at) { - position = end + 1; - } else if (event.created_at >= sortedArray[start].created_at) { - position = start; - } else - while (true) { - if (end <= start + 1) { - position = end; - break; - } - midPoint = Math.floor(start + (end - start) / 2); - if (sortedArray[midPoint].created_at > event.created_at) { - start = midPoint; - } else if (sortedArray[midPoint].created_at < event.created_at) { - end = midPoint; - } else { - position = midPoint; - break; - } - } - if (sortedArray[position]?.id !== event.id) { - return [ - ...sortedArray.slice(0, position), - event, - ...sortedArray.slice(position) - ]; - } - return sortedArray; - } - function insertEventIntoAscendingList(sortedArray, event) { - let start = 0; - let end = sortedArray.length - 1; - let midPoint; - let position = start; - if (end < 0) { - position = 0; - } else if (event.created_at > sortedArray[end].created_at) { - position = end + 1; - } else if (event.created_at <= sortedArray[start].created_at) { - position = start; - } else - while (true) { - if (end <= start + 1) { - position = end; - break; - } - midPoint = Math.floor(start + (end - start) / 2); - if (sortedArray[midPoint].created_at < event.created_at) { - start = midPoint; - } else if (sortedArray[midPoint].created_at > event.created_at) { - end = midPoint; - } else { - position = midPoint; - break; - } - } - if (sortedArray[position]?.id !== event.id) { - return [ - ...sortedArray.slice(0, position), - event, - ...sortedArray.slice(position) - ]; - } - return sortedArray; - } - function serializeEvent(evt) { - if (!validateEvent(evt)) - throw new Error("can't serialize event with wrong or missing properties"); - return JSON.stringify([ - 0, - evt.pubkey, - evt.created_at, - evt.kind, - evt.tags, - evt.content - ]); - } - function getEventHash(event) { - let eventHash = sha256$2(utf8Encoder.encode(serializeEvent(event))); - return utils$1.bytesToHex(eventHash); - } - function validateEvent(event) { - if (typeof event.content !== "string") - return false; - if (typeof event.created_at !== "number") - return false; - if (typeof event.pubkey !== "string") - return false; - if (!event.pubkey.match(/^[a-f0-9]{64}$/)) - return false; - if (!Array.isArray(event.tags)) - return false; - for (let i = 0; i < event.tags.length; i++) { - let tag = event.tags[i]; - if (!Array.isArray(tag)) - return false; - for (let j = 0; j < tag.length; j++) { - if (typeof tag[j] === "object") - return false; - } - } - return true; - } - function verifySignature(event) { - return schnorr.verifySync( - event.sig, - getEventHash(event), - event.pubkey - ); - } - function signEvent(event, key) { - return utils$1.bytesToHex( - schnorr.signSync(getEventHash(event), key) - ); - } - - // filter.ts - function matchFilter(filter, event) { - if (filter.ids && filter.ids.indexOf(event.id) === -1) - return false; - if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) - return false; - if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) - return false; - for (let f in filter) { - if (f[0] === "#") { - let tagName = f.slice(1); - let values = filter[`#${tagName}`]; - if (values && !event.tags.find( - ([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1 - )) - return false; - } - } - if (filter.since && event.created_at < filter.since) - return false; - if (filter.until && event.created_at >= filter.until) - return false; - return true; - } - function matchFilters(filters, event) { - for (let i = 0; i < filters.length; i++) { - if (matchFilter(filters[i], event)) - return true; - } - return false; - } - - // fakejson.ts - var fakejson_exports = {}; - __export(fakejson_exports, { - getHex64: () => getHex64, - getInt: () => getInt, - getSubscriptionId: () => getSubscriptionId, - matchEventId: () => matchEventId, - matchEventKind: () => matchEventKind, - matchEventPubkey: () => matchEventPubkey - }); - function getHex64(json, field) { - let len = field.length + 3; - let idx = json.indexOf(`"${field}":`) + len; - let s = json.slice(idx).indexOf(`"`) + idx + 1; - return json.slice(s, s + 64); - } - function getInt(json, field) { - let len = field.length; - let idx = json.indexOf(`"${field}":`) + len + 3; - let sliced = json.slice(idx); - let end = Math.min(sliced.indexOf(","), sliced.indexOf("}")); - return parseInt(sliced.slice(0, end), 10); - } - function getSubscriptionId(json) { - let idx = json.slice(0, 22).indexOf(`"EVENT"`); - if (idx === -1) - return null; - let pstart = json.slice(idx + 7 + 1).indexOf(`"`); - if (pstart === -1) - return null; - let start = idx + 7 + 1 + pstart; - let pend = json.slice(start + 1, 80).indexOf(`"`); - if (pend === -1) - return null; - let end = start + 1 + pend; - return json.slice(start + 1, end); - } - function matchEventId(json, id) { - return id === getHex64(json, "id"); - } - function matchEventPubkey(json, pubkey) { - return pubkey === getHex64(json, "pubkey"); - } - function matchEventKind(json, kind) { - return kind === getInt(json, "kind"); - } - - // relay.ts - function relayInit(url) { - var ws; - var resolveClose; - var setOpen; - var untilOpen = new Promise((resolve) => { - setOpen = resolve; - }); - var openSubs = {}; - var listeners = { - connect: [], - disconnect: [], - error: [], - notice: [] - }; - var subListeners = {}; - var pubListeners = {}; - async function connectRelay() { - return new Promise((resolve, reject) => { - ws = new WebSocket(url); - ws.onopen = () => { - listeners.connect.forEach((cb) => cb()); - setOpen(); - resolve(); - }; - ws.onerror = () => { - listeners.error.forEach((cb) => cb()); - reject(); - }; - ws.onclose = async () => { - listeners.disconnect.forEach((cb) => cb()); - resolveClose && resolveClose(); - }; - let incomingMessageQueue = []; - let handleNextInterval; - ws.onmessage = (e) => { - incomingMessageQueue.push(e.data); - if (!handleNextInterval) { - handleNextInterval = setInterval(handleNext, 0); - } - }; - function handleNext() { - if (incomingMessageQueue.length === 0) { - clearInterval(handleNextInterval); - handleNextInterval = null; - return; - } - var json = incomingMessageQueue.shift(); - if (!json) - return; - let subid = getSubscriptionId(json); - if (subid) { - let { alreadyHaveEvent } = openSubs[subid]; - if (alreadyHaveEvent && alreadyHaveEvent(getHex64(json, "id"))) { - return; - } - } - try { - let data = JSON.parse(json); - switch (data[0]) { - case "EVENT": - let id = data[1]; - let event = data[2]; - if (validateEvent(event) && openSubs[id] && (openSubs[id].skipVerification || verifySignature(event)) && matchFilters(openSubs[id].filters, event)) { - openSubs[id]; - (subListeners[id]?.event || []).forEach((cb) => cb(event)); - } - return; - case "EOSE": { - let id2 = data[1]; - (subListeners[id2]?.eose || []).forEach((cb) => cb()); - return; - } - case "OK": { - let id2 = data[1]; - let ok = data[2]; - let reason = data[3] || ""; - if (ok) - pubListeners[id2]?.ok.forEach((cb) => cb()); - else - pubListeners[id2]?.failed.forEach((cb) => cb(reason)); - return; - } - case "NOTICE": - let notice = data[1]; - listeners.notice.forEach((cb) => cb(notice)); - return; - } - } catch (err) { - return; - } - } - }); - } - async function connect() { - if (ws?.readyState && ws.readyState === 1) - return; - await connectRelay(); - } - async function trySend(params) { - let msg = JSON.stringify(params); - await untilOpen; - try { - ws.send(msg); - } catch (err) { - console.log(err); - } - } - const sub = (filters, { - skipVerification = false, - alreadyHaveEvent = null, - id = Math.random().toString().slice(2) - } = {}) => { - let subid = id; - openSubs[subid] = { - id: subid, - filters, - skipVerification, - alreadyHaveEvent - }; - trySend(["REQ", subid, ...filters]); - return { - sub: (newFilters, newOpts = {}) => sub(newFilters || filters, { - skipVerification: newOpts.skipVerification || skipVerification, - alreadyHaveEvent: newOpts.alreadyHaveEvent || alreadyHaveEvent, - id: subid - }), - unsub: () => { - delete openSubs[subid]; - delete subListeners[subid]; - trySend(["CLOSE", subid]); - }, - on: (type, cb) => { - subListeners[subid] = subListeners[subid] || { - event: [], - eose: [] - }; - subListeners[subid][type].push(cb); - }, - off: (type, cb) => { - let listeners2 = subListeners[subid]; - let idx = listeners2[type].indexOf(cb); - if (idx >= 0) - listeners2[type].splice(idx, 1); - } - }; - }; - return { - url, - sub, - on: (type, cb) => { - listeners[type].push(cb); - if (type === "connect" && ws?.readyState === 1) { - cb(); - } - }, - off: (type, cb) => { - let index = listeners[type].indexOf(cb); - if (index !== -1) - listeners[type].splice(index, 1); - }, - list: (filters, opts) => new Promise((resolve) => { - let s = sub(filters, opts); - let events = []; - let timeout = setTimeout(() => { - s.unsub(); - resolve(events); - }, 1500); - s.on("eose", () => { - s.unsub(); - clearTimeout(timeout); - resolve(events); - }); - s.on("event", (event) => { - events.push(event); - }); - }), - get: (filter, opts) => new Promise((resolve) => { - let s = sub([filter], opts); - let timeout = setTimeout(() => { - s.unsub(); - resolve(null); - }, 1500); - s.on("event", (event) => { - s.unsub(); - clearTimeout(timeout); - resolve(event); - }); - }), - publish(event) { - if (!event.id) - throw new Error(`event ${event} has no id`); - let id = event.id; - var sent = false; - var mustMonitor = false; - trySend(["EVENT", event]).then(() => { - sent = true; - if (mustMonitor) { - startMonitoring(); - mustMonitor = false; - } - }).catch(() => { - }); - const startMonitoring = () => { - let monitor = sub([{ ids: [id] }], { - id: `monitor-${id.slice(0, 5)}` - }); - let willUnsub = setTimeout(() => { - (pubListeners[id]?.failed || []).forEach( - (cb) => cb("event not seen after 5 seconds") - ); - monitor.unsub(); - }, 5e3); - monitor.on("event", () => { - clearTimeout(willUnsub); - (pubListeners[id]?.seen || []).forEach((cb) => cb()); - }); - }; - return { - on: (type, cb) => { - pubListeners[id] = pubListeners[id] || { - ok: [], - seen: [], - failed: [] - }; - pubListeners[id][type].push(cb); - if (type === "seen") { - if (sent) - startMonitoring(); - else - mustMonitor = true; - } - }, - off: (type, cb) => { - let listeners2 = pubListeners[id]; - if (!listeners2) - return; - let idx = listeners2[type].indexOf(cb); - if (idx >= 0) - listeners2[type].splice(idx, 1); - } - }; - }, - connect, - close() { - ws.close(); - return new Promise((resolve) => { - resolveClose = resolve; - }); - }, - get status() { - return ws?.readyState ?? 3; - } - }; - } - - // nip04.ts - var nip04_exports = {}; - __export(nip04_exports, { - decrypt: () => decrypt, - encrypt: () => encrypt - }); - async function encrypt(privkey, pubkey, text) { - const key = getSharedSecret(privkey, "02" + pubkey); - const normalizedKey = getNormalizedX(key); - let iv = Uint8Array.from(randomBytes(16)); - let plaintext = utf8Encoder.encode(text); - let cryptoKey = await crypto.subtle.importKey( - "raw", - normalizedKey, - { name: "AES-CBC" }, - false, - ["encrypt"] - ); - let ciphertext = await crypto.subtle.encrypt( - { name: "AES-CBC", iv }, - cryptoKey, - plaintext - ); - let ctb64 = base64.encode(new Uint8Array(ciphertext)); - let ivb64 = base64.encode(new Uint8Array(iv.buffer)); - return `${ctb64}?iv=${ivb64}`; - } - async function decrypt(privkey, pubkey, data) { - let [ctb64, ivb64] = data.split("?iv="); - let key = getSharedSecret(privkey, "02" + pubkey); - let normalizedKey = getNormalizedX(key); - let cryptoKey = await crypto.subtle.importKey( - "raw", - normalizedKey, - { name: "AES-CBC" }, - false, - ["decrypt"] - ); - let ciphertext = base64.decode(ctb64); - let iv = base64.decode(ivb64); - let plaintext = await crypto.subtle.decrypt( - { name: "AES-CBC", iv }, - cryptoKey, - ciphertext - ); - let text = utf8Decoder.decode(plaintext); - return text; - } - function getNormalizedX(key) { - return key.slice(1, 33); - } - - // nip05.ts - var nip05_exports = {}; - __export(nip05_exports, { - queryProfile: () => queryProfile, - searchDomain: () => searchDomain, - useFetchImplementation: () => useFetchImplementation - }); - var _fetch; - try { - _fetch = fetch; - } catch { - } - function useFetchImplementation(fetchImplementation) { - _fetch = fetchImplementation; - } - async function searchDomain(domain, query = "") { - try { - let res = await (await _fetch(`https://${domain}/.well-known/nostr.json?name=${query}`)).json(); - return res.names; - } catch (_) { - return {}; - } - } - async function queryProfile(fullname) { - let [name, domain] = fullname.split("@"); - if (!domain) { - domain = name; - name = "_"; - } - if (!name.match(/^[A-Za-z0-9-_]+$/)) - return null; - let res = await (await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)).json(); - if (!res?.names?.[name]) - return null; - let pubkey = res.names[name]; - let relays = res.relays?.[pubkey] || []; - return { - pubkey, - relays - }; - } - - // nip06.ts - var nip06_exports = {}; - __export(nip06_exports, { - generateSeedWords: () => generateSeedWords, - privateKeyFromSeedWords: () => privateKeyFromSeedWords, - validateWords: () => validateWords - }); - function privateKeyFromSeedWords(mnemonic, passphrase) { - let root = HDKey.fromMasterSeed(mnemonicToSeedSync_1(mnemonic, passphrase)); - let privateKey = root.derive(`m/44'/1237'/0'/0/0`).privateKey; - if (!privateKey) - throw new Error("could not derive private key"); - return utils$1.bytesToHex(privateKey); - } - function generateSeedWords() { - return generateMnemonic_1(wordlist); - } - function validateWords(words) { - return validateMnemonic_1(words, wordlist); - } - - // nip19.ts - var nip19_exports = {}; - __export(nip19_exports, { - decode: () => decode, - neventEncode: () => neventEncode, - noteEncode: () => noteEncode, - nprofileEncode: () => nprofileEncode, - npubEncode: () => npubEncode, - nsecEncode: () => nsecEncode - }); - var Bech32MaxSize = 5e3; - function decode(nip19) { - let { prefix, words } = bech32.decode(nip19, Bech32MaxSize); - let data = new Uint8Array(bech32.fromWords(words)); - if (prefix === "nprofile") { - let tlv = parseTLV(data); - if (!tlv[0]?.[0]) - throw new Error("missing TLV 0 for nprofile"); - if (tlv[0][0].length !== 32) - throw new Error("TLV 0 should be 32 bytes"); - return { - type: "nprofile", - data: { - pubkey: utils$1.bytesToHex(tlv[0][0]), - relays: tlv[1].map((d) => utf8Decoder.decode(d)) - } - }; - } - if (prefix === "nevent") { - let tlv = parseTLV(data); - if (!tlv[0]?.[0]) - throw new Error("missing TLV 0 for nevent"); - if (tlv[0][0].length !== 32) - throw new Error("TLV 0 should be 32 bytes"); - return { - type: "nevent", - data: { - id: utils$1.bytesToHex(tlv[0][0]), - relays: tlv[1].map((d) => utf8Decoder.decode(d)) - } - }; - } - if (prefix === "nsec" || prefix === "npub" || prefix === "note") { - return { type: prefix, data: utils$1.bytesToHex(data) }; - } - throw new Error(`unknown prefix ${prefix}`); - } - function parseTLV(data) { - let result = {}; - let rest = data; - while (rest.length > 0) { - let t = rest[0]; - let l = rest[1]; - let v = rest.slice(2, 2 + l); - rest = rest.slice(2 + l); - if (v.length < l) - continue; - result[t] = result[t] || []; - result[t].push(v); - } - return result; - } - function nsecEncode(hex) { - return encodeBytes("nsec", hex); - } - function npubEncode(hex) { - return encodeBytes("npub", hex); - } - function noteEncode(hex) { - return encodeBytes("note", hex); - } - function encodeBytes(prefix, hex) { - let data = utils$1.hexToBytes(hex); - let words = bech32.toWords(data); - return bech32.encode(prefix, words, Bech32MaxSize); - } - function nprofileEncode(profile) { - let data = encodeTLV({ - 0: [utils$1.hexToBytes(profile.pubkey)], - 1: (profile.relays || []).map((url) => utf8Encoder.encode(url)) - }); - let words = bech32.toWords(data); - return bech32.encode("nprofile", words, Bech32MaxSize); - } - function neventEncode(event) { - let data = encodeTLV({ - 0: [utils$1.hexToBytes(event.id)], - 1: (event.relays || []).map((url) => utf8Encoder.encode(url)) - }); - let words = bech32.toWords(data); - return bech32.encode("nevent", words, Bech32MaxSize); - } - function encodeTLV(tlv) { - let entries = []; - Object.entries(tlv).forEach(([t, vs]) => { - vs.forEach((v) => { - let entry = new Uint8Array(v.length + 2); - entry.set([parseInt(t)], 0); - entry.set([v.length], 1); - entry.set(v, 2); - entries.push(entry); - }); - }); - return utils$1.concatBytes(...entries); - } - - // nip26.ts - var nip26_exports = {}; - __export(nip26_exports, { - createDelegation: () => createDelegation, - getDelegator: () => getDelegator - }); - function createDelegation(privateKey, parameters) { - let conditions = []; - if ((parameters.kind || -1) >= 0) - conditions.push(`kind=${parameters.kind}`); - if (parameters.until) - conditions.push(`created_at<${parameters.until}`); - if (parameters.since) - conditions.push(`created_at>${parameters.since}`); - let cond = conditions.join("&"); - if (cond === "") - throw new Error("refusing to create a delegation without any conditions"); - let sighash = sha256$2( - utf8Encoder.encode(`nostr:delegation:${parameters.pubkey}:${cond}`) - ); - let sig = utils$1.bytesToHex( - schnorr.signSync(sighash, privateKey) - ); - return { - from: getPublicKey(privateKey), - to: parameters.pubkey, - cond, - sig - }; - } - function getDelegator(event) { - let tag = event.tags.find((tag2) => tag2[0] === "delegation" && tag2.length >= 4); - if (!tag) - return null; - let pubkey = tag[1]; - let cond = tag[2]; - let sig = tag[3]; - let conditions = cond.split("&"); - for (let i = 0; i < conditions.length; i++) { - let [key, operator, value] = conditions[i].split(/\b/); - if (key === "kind" && operator === "=" && event.kind === parseInt(value)) - continue; - else if (key === "created_at" && operator === "<" && event.created_at < parseInt(value)) - continue; - else if (key === "created_at" && operator === ">" && event.created_at > parseInt(value)) - continue; - else - return null; - } - let sighash = sha256$2( - utf8Encoder.encode(`nostr:delegation:${event.pubkey}:${cond}`) - ); - if (!schnorr.verifySync(sig, sighash, pubkey)) - return null; - return pubkey; - } - utils$1.hmacSha256Sync = (key, ...msgs) => hmac(sha256$2, key, utils$1.concatBytes(...msgs)); - utils$1.sha256Sync = (...msgs) => sha256$2(utils$1.concatBytes(...msgs)); - - const WS = WebSocket;// typeof WebSocket !== 'undefined' ? WebSocket : require('ws') - - Relay$1.prototype.wait_connected = async function relay_wait_connected(data) { - let retry = 1000; - while (true) { - if (this.ws.readyState !== 1) { - await sleep(retry); - retry *= 1.5; - } - else { - return - } - } - }; - - - function Relay$1(relay, opts={}) - { - if (!(this instanceof Relay$1)) - return new Relay$1(relay, opts) - - this.url = relay; - this.opts = opts; - - if (opts.reconnect == null) - opts.reconnect = true; - - const me = this; - me.onfn = {}; - - init_websocket(me) - .catch(e => { - if (me.onfn.error) - me.onfn.error(e); - }); - - return this - } - - function init_websocket(me) { - return new Promise((resolve, reject) => { - const ws = me.ws = new WS(me.url); - - let resolved = false; - ws.onmessage = (m) => { - handle_nostr_message(me, m); - if (me.onfn.message) - me.onfn.message(m); - }; - ws.onclose = (e) => { - if (me.onfn.close) - me.onfn.close(e); - if (me.reconnecting) - return reject(new Error("close during reconnect")) - if (!me.manualClose && me.opts.reconnect) - reconnect(me); - }; - ws.onerror = (e) => { - if (me.onfn.error) - me.onfn.error(e); - if (me.reconnecting) - return reject(new Error("error during reconnect")) - if (me.opts.reconnect) - reconnect(me); - }; - ws.onopen = (e) => { - if (me.onfn.open) - me.onfn.open(e); - - if (resolved) return - - resolved = true; - resolve(me); - }; - }); - } - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - async function reconnect(me) - { - let n = 100; - try { - me.reconnecting = true; - await init_websocket(me); - me.reconnecting = false; - } catch { - //console.error(`error thrown during reconnect... trying again in ${n} ms`) - await sleep(n); - n *= 1.5; - } - } - - Relay$1.prototype.on = function relayOn(method, fn) { - this.onfn[method] = fn; - return this - }; - - Relay$1.prototype.close = function relayClose() { - if (this.ws) { - this.manualClose = true; - this.ws.close(); - } - }; - - Relay$1.prototype.subscribe = function relay_subscribe(sub_id, filters) { - if (Array.isArray(filters)) - this.send(["REQ", sub_id, ...filters]); - else - this.send(["REQ", sub_id, filters]); - }; - - Relay$1.prototype.unsubscribe = function relay_unsubscribe(sub_id) { - this.send(["CLOSE", sub_id]); - }; - - Relay$1.prototype.send = async function relay_send(data) { - await this.wait_connected(); - this.ws.send(JSON.stringify(data)); - }; - - function handle_nostr_message(relay, msg) - { - let data; - try { - data = JSON.parse(msg.data); - } catch (e) { - console.error("handle_nostr_message", e); - return - } - if (data.length >= 2) { - switch (data[0]) { - case "EVENT": - if (data.length < 3) - return - return relay.onfn.event && relay.onfn.event(data[1], data[2]) - case "EOSE": - return relay.onfn.eose && relay.onfn.eose(data[1]) - case "NOTICE": - return relay.onfn.notice && relay.onfn.notice(...data.slice(1)) - case "OK": - return relay.onfn.ok && relay.onfn.ok(...data.slice(1)) - } - } - } - - var relay = Relay$1; - - const Relay = relay; - - function RelayPool(relays, opts) - { - if (!(this instanceof RelayPool)) - return new RelayPool(relays, opts) - - this.onfn = {}; - this.relays = []; - this.opts = opts; - - for (const relay of relays) { - this.add(relay); - } - - return this - } - - RelayPool.prototype.close = function relayPoolClose() { - for (const relay of this.relays) { - relay.close(); - } - }; - - RelayPool.prototype.on = function relayPoolOn(method, fn) { - for (const relay of this.relays) { - this.onfn[method] = fn; - relay.onfn[method] = fn.bind(null, relay); - } - return this - }; - - RelayPool.prototype.has = function relayPoolHas(relayUrl) { - for (const relay of this.relays) { - if (relay.url === relayUrl) - return true - } - - return false - }; - - RelayPool.prototype.send = function relayPoolSend(payload, relay_ids) { - const relays = relay_ids ? this.find_relays(relay_ids) : this.relays; - for (const relay of relays) { - relay.send(payload); - } - }; - - RelayPool.prototype.setupHandlers = function relayPoolSetupHandlers() - { - // setup its message handlers with the ones we have already - const keys = Object.keys(this.onfn); - for (const handler of keys) { - for (const relay of this.relays) { - relay.onfn[handler] = this.onfn[handler].bind(null, relay); - } - } - }; - - RelayPool.prototype.remove = function relayPoolRemove(url) { - let i = 0; - - for (const relay of this.relays) { - if (relay.url === url) { - relay.ws && relay.ws.close(); - this.relays = this.replays.splice(i, 1); - return true - } - - i += 1; - } - - return false - }; - - RelayPool.prototype.subscribe = function relayPoolSubscribe(sub_id, filters, relay_ids) { - const relays = relay_ids ? this.find_relays(relay_ids) : this.relays; - for (const relay of relays) { - relay.subscribe(sub_id, filters); - } - }; - - RelayPool.prototype.unsubscribe = function relayPoolUnsubscibe(sub_id, relay_ids) { - const relays = relay_ids ? this.find_relays(relay_ids) : this.relays; - for (const relay of relays) { - relay.unsubscribe(sub_id); - } - }; - - - RelayPool.prototype.add = function relayPoolAdd(relay) { - if (relay instanceof Relay) { - if (this.has(relay.url)) - return false - - this.relays.push(relay); - this.setupHandlers(); - return true - } - - if (this.has(relay)) - return false - - const r = Relay(relay, this.opts); - this.relays.push(r); - this.setupHandlers(); - return true - }; - - RelayPool.prototype.find_relays = function relayPoolFindRelays(relay_ids) { - if (relay_ids instanceof Relay) - return [relay_ids] - - if (relay_ids.length === 0) - return [] - - if (!relay_ids[0]) - throw new Error("what!?") - - if (relay_ids[0] instanceof Relay) - return relay_ids - - return this.relays.reduce((acc, relay) => { - if (relay_ids.some((rid) => relay.url === rid)) - acc.push(relay); - return acc - }, []) - }; - - var relayPool = RelayPool; - - var eventsExports = {}; - var events = { - get exports(){ return eventsExports; }, - set exports(v){ eventsExports = v; }, - }; - - var R = typeof Reflect === 'object' ? Reflect : null; - var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - - var ReflectOwnKeys; - if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; - } - - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - - var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; - }; - - function EventEmitter() { - EventEmitter.init.call(this); - } - events.exports = EventEmitter; - eventsExports.once = once; - - // Backwards-compat with node 0.10.x - EventEmitter.EventEmitter = EventEmitter; - - EventEmitter.prototype._events = undefined; - EventEmitter.prototype._eventsCount = 0; - EventEmitter.prototype._maxListeners = undefined; - - // By default EventEmitters will print a warning if more than 10 listeners are - // added to it. This is a useful default which helps finding memory leaks. - var defaultMaxListeners = 10; - - function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - - Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } - }); - - EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; - }; - - // Obviously not all Emitters should be limited to 10. This function allows - // that to be increased. Set to zero for unlimited. - EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; - }; - - function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; - } - - EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - - EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; - }; - - function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; - } - - EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - - EventEmitter.prototype.on = EventEmitter.prototype.addListener; - - EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - - EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - - EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - - // Emits a 'removeListener' event if and only if the listener was removed. - EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - - EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - - EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - - function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - - EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - - EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - - EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - - EventEmitter.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; - } - - EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - - function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - } - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } - } - - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - - // Unique ID creation requires a high quality random # generator. In the browser we therefore - // require the crypto API and do not support built-in fallback to lower quality random number - // generators (like Math.random()). - let getRandomValues; - const rnds8 = new Uint8Array(16); - function rng() { - // lazy load so that environments that need to polyfill have a chance to do so - if (!getRandomValues) { - // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. - getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); - - if (!getRandomValues) { - throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); - } - } - - return getRandomValues(rnds8); - } - - /** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - */ - - const byteToHex = []; - - for (let i = 0; i < 256; ++i) { - byteToHex.push((i + 0x100).toString(16).slice(1)); - } - - function unsafeStringify(arr, offset = 0) { - // Note: Be careful editing this code! It's been tuned for performance - // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 - return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); - } - - const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto); - var native = { - randomUUID - }; - - function v4(options, buf, offset) { - if (native.randomUUID && !buf && !options) { - return native.randomUUID(); - } - - options = options || {}; - const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - - rnds[6] = rnds[6] & 0x0f | 0x40; - rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided - - if (buf) { - offset = offset || 0; - - for (let i = 0; i < 16; ++i) { - buf[offset + i] = rnds[i]; - } - - return buf; - } - - return unsafeStringify(rnds); - } - - var browserExports = {}; - var browser = { - get exports(){ return browserExports; }, - set exports(v){ browserExports = v; }, - }; - - /** - * Helpers. - */ - - var ms; - var hasRequiredMs; - - function requireMs () { - if (hasRequiredMs) return ms; - hasRequiredMs = 1; - var s = 1000; - var m = s * 60; - var h = m * 60; - var d = h * 24; - var w = d * 7; - var y = d * 365.25; - - /** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - - ms = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); - }; - - /** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - - function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'weeks': - case 'week': - case 'w': - return n * w; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } - } - - /** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - - function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; - } - - /** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - - function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - return ms + ' ms'; - } - - /** - * Pluralization helper. - */ - - function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); - } - return ms; - } - - /** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - */ - - function setup(env) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = requireMs(); - createDebug.destroy = destroy; - - Object.keys(env).forEach(key => { - createDebug[key] = env[key]; - }); - - /** - * The currently active debug mode names, and names to skip. - */ - - createDebug.names = []; - createDebug.skips = []; - - /** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - createDebug.formatters = {}; - - /** - * Selects a color for a debug namespace - * @param {String} namespace The namespace string for the debug instance to be colored - * @return {Number|String} An ANSI color code for the given namespace - * @api private - */ - function selectColor(namespace) { - let hash = 0; - - for (let i = 0; i < namespace.length; i++) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - createDebug.selectColor = selectColor; - - /** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - function createDebug(namespace) { - let prevTime; - let enableOverride = null; - let namespacesCache; - let enabledCache; - - function debug(...args) { - // Disabled? - if (!debug.enabled) { - return; - } - - const self = debug; - - // Set `diff` timestamp - const curr = Number(new Date()); - const ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - args[0] = createDebug.coerce(args[0]); - - if (typeof args[0] !== 'string') { - // Anything else let's inspect with %O - args.unshift('%O'); - } - - // Apply any `formatters` transformations - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - // If we encounter an escaped % then don't increase the array index - if (match === '%%') { - return '%'; - } - index++; - const formatter = createDebug.formatters[format]; - if (typeof formatter === 'function') { - const val = args[index]; - match = formatter.call(self, val); - - // Now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // Apply env-specific formatting (colors, etc.) - createDebug.formatArgs.call(self, args); - - const logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.useColors = createDebug.useColors(); - debug.color = createDebug.selectColor(namespace); - debug.extend = extend; - debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. - - Object.defineProperty(debug, 'enabled', { - enumerable: true, - configurable: false, - get: () => { - if (enableOverride !== null) { - return enableOverride; - } - if (namespacesCache !== createDebug.namespaces) { - namespacesCache = createDebug.namespaces; - enabledCache = createDebug.enabled(namespace); - } - - return enabledCache; - }, - set: v => { - enableOverride = v; - } - }); - - // Env-specific initialization logic for debug instances - if (typeof createDebug.init === 'function') { - createDebug.init(debug); - } - - return debug; - } - - function extend(namespace, delimiter) { - const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); - newDebug.log = this.log; - return newDebug; - } - - /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - function enable(namespaces) { - createDebug.save(namespaces); - createDebug.namespaces = namespaces; - - createDebug.names = []; - createDebug.skips = []; - - let i; - const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - const len = split.length; - - for (i = 0; i < len; i++) { - if (!split[i]) { - // ignore empty strings - continue; - } - - namespaces = split[i].replace(/\*/g, '.*?'); - - if (namespaces[0] === '-') { - createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$')); - } else { - createDebug.names.push(new RegExp('^' + namespaces + '$')); - } - } - } - - /** - * Disable debug output. - * - * @return {String} namespaces - * @api public - */ - function disable() { - const namespaces = [ - ...createDebug.names.map(toNamespace), - ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) - ].join(','); - createDebug.enable(''); - return namespaces; - } - - /** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - - let i; - let len; - - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { - return false; - } - } - - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { - return true; - } - } - - return false; - } - - /** - * Convert regexp to namespace - * - * @param {RegExp} regxep - * @return {String} namespace - * @api private - */ - function toNamespace(regexp) { - return regexp.toString() - .substring(2, regexp.toString().length - 2) - .replace(/\.\*\?$/, '*'); - } - - /** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - return val; - } - - /** - * XXX DO NOT USE. This is a temporary stub function. - * XXX It WILL be removed in the next major release. - */ - function destroy() { - console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); - } - - createDebug.enable(createDebug.load()); - - return createDebug; - } - - var common = setup; - - /* eslint-env browser */ - - (function (module, exports) { - /** - * This is the web browser implementation of `debug()`. - */ - - exports.formatArgs = formatArgs; - exports.save = save; - exports.load = load; - exports.useColors = useColors; - exports.storage = localstorage(); - exports.destroy = (() => { - let warned = false; - - return () => { - if (!warned) { - warned = true; - console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); - } - }; - })(); - - /** - * Colors. - */ - - exports.colors = [ - '#0000CC', - '#0000FF', - '#0033CC', - '#0033FF', - '#0066CC', - '#0066FF', - '#0099CC', - '#0099FF', - '#00CC00', - '#00CC33', - '#00CC66', - '#00CC99', - '#00CCCC', - '#00CCFF', - '#3300CC', - '#3300FF', - '#3333CC', - '#3333FF', - '#3366CC', - '#3366FF', - '#3399CC', - '#3399FF', - '#33CC00', - '#33CC33', - '#33CC66', - '#33CC99', - '#33CCCC', - '#33CCFF', - '#6600CC', - '#6600FF', - '#6633CC', - '#6633FF', - '#66CC00', - '#66CC33', - '#9900CC', - '#9900FF', - '#9933CC', - '#9933FF', - '#99CC00', - '#99CC33', - '#CC0000', - '#CC0033', - '#CC0066', - '#CC0099', - '#CC00CC', - '#CC00FF', - '#CC3300', - '#CC3333', - '#CC3366', - '#CC3399', - '#CC33CC', - '#CC33FF', - '#CC6600', - '#CC6633', - '#CC9900', - '#CC9933', - '#CCCC00', - '#CCCC33', - '#FF0000', - '#FF0033', - '#FF0066', - '#FF0099', - '#FF00CC', - '#FF00FF', - '#FF3300', - '#FF3333', - '#FF3366', - '#FF3399', - '#FF33CC', - '#FF33FF', - '#FF6600', - '#FF6633', - '#FF9900', - '#FF9933', - '#FFCC00', - '#FFCC33' - ]; - - /** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - - // eslint-disable-next-line complexity - function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { - return true; - } - - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } - - // Is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // Is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // Double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); - } - - /** - * Colorize log arguments if enabled. - * - * @api public - */ - - function formatArgs(args) { - args[0] = (this.useColors ? '%c' : '') + - this.namespace + - (this.useColors ? ' %c' : ' ') + - args[0] + - (this.useColors ? '%c ' : ' ') + - '+' + module.exports.humanize(this.diff); - - if (!this.useColors) { - return; - } - - const c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit'); - - // The final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - let index = 0; - let lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, match => { - if (match === '%%') { - return; - } - index++; - if (match === '%c') { - // We only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - } - - /** - * Invokes `console.debug()` when available. - * No-op when `console.debug` is not a "function". - * If `console.debug` is not available, falls back - * to `console.log`. - * - * @api public - */ - exports.log = console.debug || console.log || (() => {}); - - /** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - function save(namespaces) { - try { - if (namespaces) { - exports.storage.setItem('debug', namespaces); - } else { - exports.storage.removeItem('debug'); - } - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } - } - - /** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - function load() { - let r; - try { - r = exports.storage.getItem('debug'); - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; - } - - /** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - - function localstorage() { - try { - // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context - // The Browser also has localStorage in the global context. - return localStorage; - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } - } - - module.exports = common(exports); - - const {formatters} = module.exports; - - /** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - - formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return '[UnexpectedJSONParseError]: ' + error.message; - } - }; - } (browser, browserExports)); - - var debug = browserExports; - - const log = new debug('nostr:adapter'); - const profilesLog = new debug('nostr:adapter:profiles'); - const writeLog = new debug('nostr:adapter:write'); - - class NstrAdapter { - relayStatus = {}; - #pool = null; - #messages = {}; - #eventEmitter = new eventsExports(); - #handlers = {} - tags; - referenceTags; - type; - #websiteOwnerPubkey; - relayUrls = []; - - #profileRequestQueue = []; - #requestedProfiles = []; - #profileRequestTimer; - - constructor(clientPubkey, {tags, referenceTags, type='DM', websiteOwnerPubkey, relays} = {}) { - this.pubkey = clientPubkey; - this.#websiteOwnerPubkey = websiteOwnerPubkey; - this.relayUrls = relays; - - if (type) { - this.setChatConfiguration(type, tags, referenceTags); - } - } - - setChatConfiguration(type, tags, referenceTags) { - log('chatConfiguration', {type, tags, referenceTags}); - this.type = type; - this.tags = tags; - this.referenceTags = referenceTags; - - // handle connection - if (this.#pool) { this.#disconnect(); } - this.#connect(); - - let filters = []; - - console.log('this.tags', this.tags); - console.log('this.referenceTags', this.referenceTags); - - // handle subscriptions - // if this is DM type then subscribe to chats with this website owner - switch (this.type) { - case 'DM': - filters.push({ - kinds: [4], - '#p': [this.pubkey, this.#websiteOwnerPubkey], - 'authors': [this.pubkey, this.#websiteOwnerPubkey] - }); - break; - case 'GLOBAL': - if (this.tags && this.tags.length > 0) { - filters.push({kinds: [1], '#t': this.tags, limit: 20}); - } - if (this.referenceTags && this.referenceTags.length > 0) { - filters.push({kinds: [1], '#r': this.referenceTags, limit: 20}); - } - - break; - } - - console.log('filters', filters); - - if (filters && filters.length > 0) { - this.subscribe(filters, (e) => { this.#emitMessage(e); }); - } - } - - async getPubKey() { - return this.pubkey; - } - - on(event, callback) { - this.#eventEmitter.on(event, callback); - } - - /** - * Send a message to the relay - * @param {String} message - The message to send - */ - async send(message, {tagPubKeys, tags} = {}) { - let event; - - if (!tags) { tags = [];} - - if (this.type === 'DM') { - event = await this.sendKind4(message, {tagPubKeys, tags}); - } else { - event = await this.sendKind1(message, {tagPubKeys, tags}); - } - - event.id = getEventHash(event); - const signedEvent = await this.signEvent(event); - - this.#_publish(signedEvent); - - return event.id; - } - - async sendKind4(message, {tagPubKeys, tags} = {}) { - let ciphertext = await this.encrypt(this.#websiteOwnerPubkey, message); - let event = { - kind: 4, - pubkey: this.pubkey, - created_at: Math.floor(Date.now() / 1000), - content: ciphertext, - tags: [ - ['p', this.#websiteOwnerPubkey], - ...tags - ], - }; - - return event; - } - - async sendKind1(message, {tagPubKeys, tags} = {}) { - if (!tags) { tags = []; } - - if (this.tags) { - this.tags.forEach((t) => tags.push(['t', t])); - } - - if (this.referenceTags) { - this.referenceTags.forEach((t) => tags.push(['r', t])); - } - - let event = { - kind: 1, - created_at: Math.floor(Date.now() / 1000), - tags, - content: message, - pubkey: this.pubkey, - }; - - if (tagPubKeys) { - for (let pubkey of tagPubKeys) { - event.tags.push(['p', pubkey]); - } - } - - event.id = getEventHash(event); - this.subscribeToEventAndResponses(event.id); - - return event; - } - - async #_publish(event) { - writeLog('publish', event); - this.#pool.send([ 'EVENT', event ]); - } - - async onEvent(event, messageCallback) { - this.#addProfileRequest(event.pubkey); - - messageCallback(event); - } - - async subscribe(filters, messageCallback=null) { - if (!messageCallback) { messageCallback = (e) => { this.#emitMessage(e); }; } - return this.#_subscribe(filters, messageCallback) - } - - async #_subscribe(filters, messageCallback) { - const subId = v4(); - this.#handlers[subId] = messageCallback; - if (!Array.isArray(filters)) { filters = [filters]; } - this.#pool.subscribe(subId, filters); - this.#pool.on('event', (relay, recSubId, e) => { - this.onEvent(e, this.#handlers[recSubId]); - }); - - return subId; - } - - async #emitMessage(event) { - // has already been emitted - if (this.#messages[event.id]) { - return; - } - - this.#messages[event.id] = true; - - // decrypt - if (event.kind === 4) { - event.content = await this.decrypt(this.#websiteOwnerPubkey, event.content); - } - - // if we have tags we were filtering for, filter here in case the relay doesn't support filtering - if (this.tags && this.tags.length > 0) { - if (!event.tags.find(t => t[0] === 't' && this.tags.includes(t[1]))) { - console.log(`discarded event not tagged with [${this.tags.join(', ')}], tags: ${event.tags.filter(t => t[0] === 't').map(t => t[1]).join(', ')}`); - return; - } - } - - if (event.kind === 1) { - if (!event.tags.find(t => t[0] === 'e')) { - // a top level message that we should subscribe to since responses won't tag the url - this.subscribe({ kinds: [1], '#e': [event.id] }); - } - } - - let deletedEvents = []; - if (event.kind === 5) { - deletedEvents = event.tags.filter(tag => tag[0] === 'e').map(tag => tag[1]); - } - - switch (event.kind) { - case 1: this.#eventEmitter.emit('message', event); break; - case 4: this.#eventEmitter.emit('message', event); break; - case 5: this.#eventEmitter.emit('deleted', deletedEvents); break; - case 7: this.#eventEmitter.emit('reaction', event); break; - default: - // alert('unknown event kind ' + event.kind) - console.log('unknown event kind', event.kind, event); - } - - } - - subscribeToEventAndResponses(eventId) { - this.subscribe([ - {ids: [eventId]}, - {'#e': [eventId]}, - ], (e) => { - this.#emitMessage(e); - // this.subscribeToResponses(e) - }); - } - - subscribeToResponses(event) { - this.subscribe([ - {'#e': [event.id]}, - ], (e) => { - this.#emitMessage(e); - this.subscribeToResponses(e); - }); - } - - /** - * Connect to the relay - */ - #connect() { - this.relayUrls.forEach((url) => { - this.relayStatus[url] = 'disconnected'; - }); - this.#eventEmitter.emit('connectivity', this.relayStatus); - - // console.log('connecting to relay', this.relayUrls); - this.#pool = new relayPool(this.relayUrls); - this.#pool.on('open', (relay) => { - // console.log(`connected to ${relay.url}`, new Date()) - this.relayStatus[relay.url] = 'connected'; - this.#eventEmitter.emit('connectivity', this.relayStatus); - }); - - this.#pool.on('error', (relay, r, e) => { - this.relayStatus[relay.url] = 'error'; - this.#eventEmitter.emit('connectivity', this.relayStatus); - console.log('error from relay', relay.url, r, e); - }); - - this.#pool.on('close', (relay, r) => { - this.relayStatus[relay.url] = 'closed'; - this.#eventEmitter.emit('connectivity', this.relayStatus); - console.log('error from relay', relay.url, r); - }); - - this.#pool.on('notice', (relay, r) => { - console.log('notice', relay.url, r); - }); - } - - #disconnect() { - this.relayUrls.forEach((url) => { - this.relayStatus[url] = 'disconnected'; - }); - this.#eventEmitter.emit('connectivity', this.relayStatus); - this.#pool.close(); - this.#pool = null; - } - - // - // - // Profiles - // - // - #addProfileRequest(pubkey, event=null) { - if (this.#profileRequestQueue.includes(pubkey)) { return; } - if (this.#requestedProfiles.includes(pubkey)) { return; } - this.#profileRequestQueue.push(pubkey); - this.#requestedProfiles.push(pubkey); - - if (!this.#profileRequestTimer) { - this.#profileRequestTimer = setTimeout(() => { - this.#profileRequestTimer = null; - this.#requestProfiles(); - }, 500); - } - } - - /** - * Send request for all queued profiles - */ - async #requestProfiles() { - if (this.#profileRequestQueue.length > 0) { - profilesLog('requesting profiles', this.#profileRequestQueue); - - // send request - const subId = await this.subscribe({ kinds: [0], authors: this.#profileRequestQueue }, (e) => { - this.#processReceivedProfile(e); - }); - profilesLog('subscribed to request', {subId}); - this.#profileRequestQueue = []; - - setTimeout(() => { - profilesLog('unsubscribing from request', {subId}); - this.#pool.unsubscribe(subId); - }, 5000); - } - } - - #processReceivedProfile(event) { - profilesLog('received profile', event); - let profile; - try { - profile = JSON.parse(event.content); - } catch (e) { - profilesLog('failed to parse profile', event); - return; - } - this.#eventEmitter.emit('profile', {pubkey: event.pubkey, profile}); - } - } - - class NstrAdapterNip07 extends NstrAdapter { - constructor(pubkey, adapterConfig={}) { - super(pubkey, adapterConfig); - } - - async signEvent(event) { - return await window.nostr.signEvent(event); - } - - async encrypt(destPubkey, message) { - return await window.nostr.nip04.encrypt(destPubkey, message); - } - - async decrypt(destPubkey, message) { - return await window.nostr.nip04.decrypt(destPubkey, message); - } - } - - function _regeneratorRuntime() { - _regeneratorRuntime = function () { - return exports; - }; - var exports = {}, - Op = Object.prototype, - hasOwn = Op.hasOwnProperty, - defineProperty = Object.defineProperty || function (obj, key, desc) { - obj[key] = desc.value; - }, - $Symbol = "function" == typeof Symbol ? Symbol : {}, - iteratorSymbol = $Symbol.iterator || "@@iterator", - asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", - toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - function define(obj, key, value) { - return Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }), obj[key]; - } - try { - define({}, ""); - } catch (err) { - define = function (obj, key, value) { - return obj[key] = value; - }; - } - function wrap(innerFn, outerFn, self, tryLocsList) { - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, - generator = Object.create(protoGenerator.prototype), - context = new Context(tryLocsList || []); - return defineProperty(generator, "_invoke", { - value: makeInvokeMethod(innerFn, self, context) - }), generator; - } - function tryCatch(fn, obj, arg) { - try { - return { - type: "normal", - arg: fn.call(obj, arg) - }; - } catch (err) { - return { - type: "throw", - arg: err - }; - } - } - exports.wrap = wrap; - var ContinueSentinel = {}; - function Generator() {} - function GeneratorFunction() {} - function GeneratorFunctionPrototype() {} - var IteratorPrototype = {}; - define(IteratorPrototype, iteratorSymbol, function () { - return this; - }); - var getProto = Object.getPrototypeOf, - NativeIteratorPrototype = getProto && getProto(getProto(values([]))); - NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); - var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function (method) { - define(prototype, method, function (arg) { - return this._invoke(method, arg); - }); - }); - } - function AsyncIterator(generator, PromiseImpl) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); - if ("throw" !== record.type) { - var result = record.arg, - value = result.value; - return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { - invoke("next", value, resolve, reject); - }, function (err) { - invoke("throw", err, resolve, reject); - }) : PromiseImpl.resolve(value).then(function (unwrapped) { - result.value = unwrapped, resolve(result); - }, function (error) { - return invoke("throw", error, resolve, reject); - }); - } - reject(record.arg); - } - var previousPromise; - defineProperty(this, "_invoke", { - value: function (method, arg) { - function callInvokeWithMethodAndArg() { - return new PromiseImpl(function (resolve, reject) { - invoke(method, arg, resolve, reject); - }); - } - return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); - } - }); - } - function makeInvokeMethod(innerFn, self, context) { - var state = "suspendedStart"; - return function (method, arg) { - if ("executing" === state) throw new Error("Generator is already running"); - if ("completed" === state) { - if ("throw" === method) throw arg; - return doneResult(); - } - for (context.method = method, context.arg = arg;;) { - var delegate = context.delegate; - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { - if ("suspendedStart" === state) throw state = "completed", context.arg; - context.dispatchException(context.arg); - } else "return" === context.method && context.abrupt("return", context.arg); - state = "executing"; - var record = tryCatch(innerFn, self, context); - if ("normal" === record.type) { - if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; - return { - value: record.arg, - done: context.done - }; - } - "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); - } - }; - } - function maybeInvokeDelegate(delegate, context) { - var methodName = context.method, - method = delegate.iterator[methodName]; - if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; - var record = tryCatch(method, delegate.iterator, context.arg); - if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; - var info = record.arg; - return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); - } - function pushTryEntry(locs) { - var entry = { - tryLoc: locs[0] - }; - 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); - } - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal", delete record.arg, entry.completion = record; - } - function Context(tryLocsList) { - this.tryEntries = [{ - tryLoc: "root" - }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); - } - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - if (iteratorMethod) return iteratorMethod.call(iterable); - if ("function" == typeof iterable.next) return iterable; - if (!isNaN(iterable.length)) { - var i = -1, - next = function next() { - for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; - return next.value = undefined, next.done = !0, next; - }; - return next.next = next; - } - } - return { - next: doneResult - }; - } - function doneResult() { - return { - value: undefined, - done: !0 - }; - } - return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { - value: GeneratorFunctionPrototype, - configurable: !0 - }), defineProperty(GeneratorFunctionPrototype, "constructor", { - value: GeneratorFunction, - configurable: !0 - }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { - var ctor = "function" == typeof genFun && genFun.constructor; - return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); - }, exports.mark = function (genFun) { - return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; - }, exports.awrap = function (arg) { - return { - __await: arg - }; - }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { - return this; - }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { - void 0 === PromiseImpl && (PromiseImpl = Promise); - var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); - return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { - return result.done ? result.value : iter.next(); - }); - }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { - return this; - }), define(Gp, "toString", function () { - return "[object Generator]"; - }), exports.keys = function (val) { - var object = Object(val), - keys = []; - for (var key in object) keys.push(key); - return keys.reverse(), function next() { - for (; keys.length;) { - var key = keys.pop(); - if (key in object) return next.value = key, next.done = !1, next; - } - return next.done = !0, next; - }; - }, exports.values = values, Context.prototype = { - constructor: Context, - reset: function (skipTempReset) { - if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); - }, - stop: function () { - this.done = !0; - var rootRecord = this.tryEntries[0].completion; - if ("throw" === rootRecord.type) throw rootRecord.arg; - return this.rval; - }, - dispatchException: function (exception) { - if (this.done) throw exception; - var context = this; - function handle(loc, caught) { - return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; - } - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i], - record = entry.completion; - if ("root" === entry.tryLoc) return handle("end"); - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"), - hasFinally = hasOwn.call(entry, "finallyLoc"); - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); - if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); - } else if (hasCatch) { - if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); - } else { - if (!hasFinally) throw new Error("try statement without catch or finally"); - if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); - } - } - } - }, - abrupt: function (type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); - var record = finallyEntry ? finallyEntry.completion : {}; - return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); - }, - complete: function (record, afterLoc) { - if ("throw" === record.type) throw record.arg; - return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; - }, - finish: function (finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; - } - }, - catch: function (tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - if ("throw" === record.type) { - var thrown = record.arg; - resetTryEntry(entry); - } - return thrown; - } - } - throw new Error("illegal catch attempt"); - }, - delegateYield: function (iterable, resultName, nextLoc) { - return this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }, "next" === this.method && (this.arg = undefined), ContinueSentinel; - } - }, exports; - } - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - _next(undefined); - }); - }; - } - function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); - } - - var NostrRPC = /*#__PURE__*/function () { - function NostrRPC(opts) { - // events - this.events = new eventsExports(); - this.relay = opts.relay || 'wss://nostr.vulpem.com'; - this.self = { - pubkey: getPublicKey(opts.secretKey), - secret: opts.secretKey - }; - } - var _proto = NostrRPC.prototype; - _proto.call = /*#__PURE__*/function () { - var _call = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref, opts) { - var _this = this; - var target, _ref$request, _ref$request$id, id, method, _ref$request$params, params, relay, request, event; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) switch (_context3.prev = _context3.next) { - case 0: - target = _ref.target, _ref$request = _ref.request, _ref$request$id = _ref$request.id, id = _ref$request$id === void 0 ? /*#__PURE__*/randomID() : _ref$request$id, method = _ref$request.method, _ref$request$params = _ref$request.params, params = _ref$request$params === void 0 ? [] : _ref$request$params; - _context3.next = 3; - return connectToRelay(this.relay); - case 3: - relay = _context3.sent; - // prepare request to be sent - request = prepareRequest(id, method, params); - _context3.next = 7; - return prepareEvent(this.self.secret, target, request); - case 7: - event = _context3.sent; - return _context3.abrupt("return", new Promise( /*#__PURE__*/function () { - var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(resolve, reject) { - var sub; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - sub = relay.sub([{ - kinds: [24133], - authors: [target], - '#p': [_this.self.pubkey], - limit: 1 - }]); - _context2.next = 3; - return broadcastToRelay(relay, event, true); - case 3: - // skip waiting for response from remote - if (opts && opts.skipResponse === true) resolve(); - sub.on('event', /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) { - var payload, plaintext; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _context.prev = 0; - _context.next = 3; - return nip04_exports.decrypt(_this.self.secret, event.pubkey, event.content); - case 3: - plaintext = _context.sent; - if (plaintext) { - _context.next = 6; - break; - } - throw new Error('failed to decrypt event'); - case 6: - payload = JSON.parse(plaintext); - _context.next = 12; - break; - case 9: - _context.prev = 9; - _context.t0 = _context["catch"](0); - return _context.abrupt("return"); - case 12: - if (isValidResponse(payload)) { - _context.next = 14; - break; - } - return _context.abrupt("return"); - case 14: - if (!(payload.id !== id)) { - _context.next = 16; - break; - } - return _context.abrupt("return"); - case 16: - // if the response is an error, reject the promise - if (payload.error) { - reject(payload.error); - } - // if the response is a result, resolve the promise - if (payload.result) { - resolve(payload.result); - } - case 18: - case "end": - return _context.stop(); - } - }, _callee, null, [[0, 9]]); - })); - return function (_x5) { - return _ref3.apply(this, arguments); - }; - }()); - case 5: - case "end": - return _context2.stop(); - } - }, _callee2); - })); - return function (_x3, _x4) { - return _ref2.apply(this, arguments); - }; - }())); - case 9: - case "end": - return _context3.stop(); - } - }, _callee3, this); - })); - function call(_x, _x2) { - return _call.apply(this, arguments); - } - return call; - }(); - _proto.listen = /*#__PURE__*/function () { - var _listen = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { - var _this2 = this; - var relay, sub; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) switch (_context5.prev = _context5.next) { - case 0: - _context5.next = 2; - return connectToRelay(this.relay); - case 2: - relay = _context5.sent; - sub = relay.sub([{ - kinds: [24133], - '#p': [this.self.pubkey], - since: now() - }]); - sub.on('event', /*#__PURE__*/function () { - var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(event) { - var payload, plaintext, response, body, responseEvent; - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) switch (_context4.prev = _context4.next) { - case 0: - _context4.prev = 0; - _context4.next = 3; - return nip04_exports.decrypt(_this2.self.secret, event.pubkey, event.content); - case 3: - plaintext = _context4.sent; - if (plaintext) { - _context4.next = 6; - break; - } - throw new Error('failed to decrypt event'); - case 6: - payload = JSON.parse(plaintext); - _context4.next = 12; - break; - case 9: - _context4.prev = 9; - _context4.t0 = _context4["catch"](0); - return _context4.abrupt("return"); - case 12: - if (isValidRequest(payload)) { - _context4.next = 14; - break; - } - return _context4.abrupt("return"); - case 14: - _context4.next = 17; - return _this2.handleRequest(payload, event); - case 17: - response = _context4.sent; - body = prepareResponse(response.id, response.result, response.error); - _context4.next = 21; - return prepareEvent(_this2.self.secret, event.pubkey, body); - case 21: - responseEvent = _context4.sent; - // send response via relay - relay.publish(responseEvent); - case 23: - case "end": - return _context4.stop(); - } - }, _callee4, null, [[0, 9]]); - })); - return function (_x6) { - return _ref4.apply(this, arguments); - }; - }()); - return _context5.abrupt("return", sub); - case 6: - case "end": - return _context5.stop(); - } - }, _callee5, this); - })); - function listen() { - return _listen.apply(this, arguments); - } - return listen; - }(); - _proto.handleRequest = /*#__PURE__*/function () { - var _handleRequest = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(request, event) { - var id, method, params, result, error; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) switch (_context6.prev = _context6.next) { - case 0: - id = request.id, method = request.method, params = request.params; - result = null; - error = null; - _context6.prev = 3; - this.event = event; - _context6.next = 7; - return this[method].apply(this, params); - case 7: - result = _context6.sent; - this.event = undefined; - _context6.next = 14; - break; - case 11: - _context6.prev = 11; - _context6.t0 = _context6["catch"](3); - if (_context6.t0 instanceof Error) { - error = _context6.t0.message; - } else { - error = 'unknown error'; - } - case 14: - return _context6.abrupt("return", { - id: id, - result: result, - error: error - }); - case 15: - case "end": - return _context6.stop(); - } - }, _callee6, this, [[3, 11]]); - })); - function handleRequest(_x7, _x8) { - return _handleRequest.apply(this, arguments); - } - return handleRequest; - }(); - return NostrRPC; - }(); - function now() { - return Math.floor(Date.now() / 1000); - } - function randomID() { - return Math.random().toString().slice(2); - } - function prepareRequest(id, method, params) { - return JSON.stringify({ - id: id, - method: method, - params: params - }); - } - function prepareResponse(id, result, error) { - return JSON.stringify({ - id: id, - result: result, - error: error - }); - } - function prepareEvent(_x9, _x10, _x11) { - return _prepareEvent.apply(this, arguments); - } - function _prepareEvent() { - _prepareEvent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(secretKey, pubkey, content) { - var cipherText, event, id, sig, signedEvent, ok, veryOk; - return _regeneratorRuntime().wrap(function _callee7$(_context7) { - while (1) switch (_context7.prev = _context7.next) { - case 0: - _context7.next = 2; - return nip04_exports.encrypt(secretKey, pubkey, content); - case 2: - cipherText = _context7.sent; - event = { - kind: 24133, - created_at: now(), - pubkey: getPublicKey(secretKey), - tags: [['p', pubkey]], - content: cipherText - }; - id = getEventHash(event); - sig = signEvent(event, secretKey); - signedEvent = _extends({}, event, { - id: id, - sig: sig - }); - ok = validateEvent(signedEvent); - veryOk = verifySignature(signedEvent); - if (!(!ok || !veryOk)) { - _context7.next = 11; - break; - } - throw new Error('Event is not valid'); - case 11: - return _context7.abrupt("return", signedEvent); - case 12: - case "end": - return _context7.stop(); - } - }, _callee7); - })); - return _prepareEvent.apply(this, arguments); - } - function isValidRequest(payload) { - if (!payload) return false; - var keys = Object.keys(payload); - if (!keys.includes('id') || !keys.includes('method') || !keys.includes('params')) return false; - return true; - } - function isValidResponse(payload) { - if (!payload) return false; - var keys = Object.keys(payload); - if (!keys.includes('id') || !keys.includes('result') || !keys.includes('error')) return false; - return true; - } - function connectToRelay(_x12) { - return _connectToRelay.apply(this, arguments); - } - function _connectToRelay() { - _connectToRelay = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(realayURL) { - var relay; - return _regeneratorRuntime().wrap(function _callee8$(_context8) { - while (1) switch (_context8.prev = _context8.next) { - case 0: - relay = relayInit(realayURL); - _context8.next = 3; - return relay.connect(); - case 3: - _context8.next = 5; - return new Promise(function (resolve, reject) { - relay.on('connect', function () { - resolve(); - }); - relay.on('error', function () { - reject(new Error("not possible to connect to " + relay.url)); - }); - }); - case 5: - return _context8.abrupt("return", relay); - case 6: - case "end": - return _context8.stop(); - } - }, _callee8); - })); - return _connectToRelay.apply(this, arguments); - } - function broadcastToRelay(_x13, _x14, _x15) { - return _broadcastToRelay.apply(this, arguments); - } - function _broadcastToRelay() { - _broadcastToRelay = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(relay, event, skipSeen) { - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) switch (_context9.prev = _context9.next) { - case 0: - if (skipSeen === void 0) { - skipSeen = false; - } - _context9.next = 3; - return new Promise(function (resolve, reject) { - relay.on('error', function () { - reject(new Error("failed to connect to " + relay.url)); - }); - var pub = relay.publish(event); - if (skipSeen) resolve(); - pub.on('failed', function (reason) { - reject(reason); - }); - pub.on('seen', function () { - resolve(); - }); - }); - case 3: - return _context9.abrupt("return", _context9.sent); - case 4: - case "end": - return _context9.stop(); - } - }, _callee9); - })); - return _broadcastToRelay.apply(this, arguments); - } - - var ConnectURI = /*#__PURE__*/function () { - function ConnectURI(_ref) { - var target = _ref.target, - metadata = _ref.metadata, - relay = _ref.relay; - this.target = target; - this.metadata = metadata; - this.relay = relay; - } - ConnectURI.fromURI = function fromURI(uri) { - var url = new URL(uri); - var target = url.hostname || url.pathname.substring(2); - if (!target) throw new Error('Invalid connect URI: missing target'); - var relay = url.searchParams.get('relay'); - if (!relay) { - throw new Error('Invalid connect URI: missing relay'); - } - var metadata = url.searchParams.get('metadata'); - if (!metadata) { - throw new Error('Invalid connect URI: missing metadata'); - } - /* eslint-disable @typescript-eslint/no-unused-vars */ - try { - var md = JSON.parse(metadata); - return new ConnectURI({ - target: target, - metadata: md, - relay: relay - }); - } catch (ignore) { - throw new Error('Invalid connect URI: metadata is not valid JSON'); - } - }; - var _proto = ConnectURI.prototype; - _proto.toString = function toString() { - return "nostrconnect://" + this.target + "?metadata=" + encodeURIComponent(JSON.stringify(this.metadata)) + "&relay=" + encodeURIComponent(this.relay); - }; - _proto.approve = /*#__PURE__*/function () { - var _approve = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(secretKey) { - var rpc; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - rpc = new NostrRPC({ - relay: this.relay, - secretKey: secretKey - }); - _context.next = 3; - return rpc.call({ - target: this.target, - request: { - method: 'connect', - params: [getPublicKey(secretKey)] - } - }, { - skipResponse: true - }); - case 3: - case "end": - return _context.stop(); - } - }, _callee, this); - })); - function approve(_x) { - return _approve.apply(this, arguments); - } - return approve; - }(); - _proto.reject = /*#__PURE__*/function () { - var _reject = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(secretKey) { - var rpc; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - rpc = new NostrRPC({ - relay: this.relay, - secretKey: secretKey - }); - _context2.next = 3; - return rpc.call({ - target: this.target, - request: { - method: 'disconnect', - params: [] - } - }, { - skipResponse: true - }); - case 3: - case "end": - return _context2.stop(); - } - }, _callee2, this); - })); - function reject(_x2) { - return _reject.apply(this, arguments); - } - return reject; - }(); - return ConnectURI; - }(); - var Connect = /*#__PURE__*/function () { - function Connect(_ref2) { - var target = _ref2.target, - relay = _ref2.relay, - secretKey = _ref2.secretKey; - this.events = new eventsExports(); - this.nip04 = { - encrypt: function () { - var _encrypt = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_pubkey, _plaintext) { - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) switch (_context3.prev = _context3.next) { - case 0: - throw new Error('Not implemented'); - case 1: - case "end": - return _context3.stop(); - } - }, _callee3); - })); - function encrypt(_x3, _x4) { - return _encrypt.apply(this, arguments); - } - return encrypt; - }(), - decrypt: function () { - var _decrypt = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_pubkey, _ciphertext) { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) switch (_context4.prev = _context4.next) { - case 0: - throw new Error('Not implemented'); - case 1: - case "end": - return _context4.stop(); - } - }, _callee4); - })); - function decrypt(_x5, _x6) { - return _decrypt.apply(this, arguments); - } - return decrypt; - }() - }; - this.rpc = new NostrRPC({ - relay: relay, - secretKey: secretKey - }); - if (target) { - this.target = target; - } - } - var _proto2 = Connect.prototype; - _proto2.init = /*#__PURE__*/function () { - var _init = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { - var _this = this; - var sub; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) switch (_context6.prev = _context6.next) { - case 0: - _context6.next = 2; - return this.rpc.listen(); - case 2: - sub = _context6.sent; - sub.on('event', /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(event) { - var payload, plaintext, _payload$params, pubkey; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) switch (_context5.prev = _context5.next) { - case 0: - _context5.prev = 0; - _context5.next = 3; - return nip04_exports.decrypt(_this.rpc.self.secret, event.pubkey, event.content); - case 3: - plaintext = _context5.sent; - if (plaintext) { - _context5.next = 6; - break; - } - throw new Error('failed to decrypt event'); - case 6: - payload = JSON.parse(plaintext); - _context5.next = 12; - break; - case 9: - _context5.prev = 9; - _context5.t0 = _context5["catch"](0); - return _context5.abrupt("return"); - case 12: - if (isValidRequest(payload)) { - _context5.next = 14; - break; - } - return _context5.abrupt("return"); - case 14: - _context5.t1 = payload.method; - _context5.next = _context5.t1 === 'connect' ? 17 : _context5.t1 === 'disconnect' ? 23 : 26; - break; - case 17: - if (!(!payload.params || payload.params.length !== 1)) { - _context5.next = 19; - break; - } - throw new Error('connect: missing pubkey'); - case 19: - _payload$params = payload.params, pubkey = _payload$params[0]; - _this.target = pubkey; - _this.events.emit('connect', pubkey); - return _context5.abrupt("break", 26); - case 23: - _this.target = undefined; - _this.events.emit('disconnect'); - return _context5.abrupt("break", 26); - case 26: - case "end": - return _context5.stop(); - } - }, _callee5, null, [[0, 9]]); - })); - return function (_x7) { - return _ref3.apply(this, arguments); - }; - }()); - case 4: - case "end": - return _context6.stop(); - } - }, _callee6, this); - })); - function init() { - return _init.apply(this, arguments); - } - return init; - }(); - _proto2.on = function on(evt, cb) { - this.events.on(evt, cb); - }; - _proto2.off = function off(evt, cb) { - this.events.off(evt, cb); - }; - _proto2.disconnect = /*#__PURE__*/function () { - var _disconnect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { - return _regeneratorRuntime().wrap(function _callee7$(_context7) { - while (1) switch (_context7.prev = _context7.next) { - case 0: - if (this.target) { - _context7.next = 2; - break; - } - throw new Error('Not connected'); - case 2: - // notify the UI that we are disconnecting - this.events.emit('disconnect'); - _context7.prev = 3; - _context7.next = 6; - return this.rpc.call({ - target: this.target, - request: { - method: 'disconnect', - params: [] - } - }, { - skipResponse: true - }); - case 6: - _context7.next = 11; - break; - case 8: - _context7.prev = 8; - _context7.t0 = _context7["catch"](3); - throw new Error('Failed to disconnect'); - case 11: - this.target = undefined; - case 12: - case "end": - return _context7.stop(); - } - }, _callee7, this, [[3, 8]]); - })); - function disconnect() { - return _disconnect.apply(this, arguments); - } - return disconnect; - }(); - _proto2.getPublicKey = /*#__PURE__*/function () { - var _getPublicKey = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() { - var response; - return _regeneratorRuntime().wrap(function _callee8$(_context8) { - while (1) switch (_context8.prev = _context8.next) { - case 0: - if (this.target) { - _context8.next = 2; - break; - } - throw new Error('Not connected'); - case 2: - _context8.next = 4; - return this.rpc.call({ - target: this.target, - request: { - method: 'get_public_key', - params: [] - } - }); - case 4: - response = _context8.sent; - return _context8.abrupt("return", response); - case 6: - case "end": - return _context8.stop(); - } - }, _callee8, this); - })); - function getPublicKey() { - return _getPublicKey.apply(this, arguments); - } - return getPublicKey; - }(); - _proto2.signEvent = /*#__PURE__*/function () { - var _signEvent = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(event) { - var signature; - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) switch (_context9.prev = _context9.next) { - case 0: - if (this.target) { - _context9.next = 2; - break; - } - throw new Error('Not connected'); - case 2: - _context9.next = 4; - return this.rpc.call({ - target: this.target, - request: { - method: 'sign_event', - params: [event] - } - }); - case 4: - signature = _context9.sent; - return _context9.abrupt("return", signature); - case 6: - case "end": - return _context9.stop(); - } - }, _callee9, this); - })); - function signEvent(_x8) { - return _signEvent.apply(this, arguments); - } - return signEvent; - }(); - _proto2.getRelays = /*#__PURE__*/function () { - var _getRelays = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { - return _regeneratorRuntime().wrap(function _callee10$(_context10) { - while (1) switch (_context10.prev = _context10.next) { - case 0: - throw new Error('Not implemented'); - case 1: - case "end": - return _context10.stop(); - } - }, _callee10); - })); - function getRelays() { - return _getRelays.apply(this, arguments); - } - return getRelays; - }(); - return Connect; - }(); - - class NstrAdapterNip46 extends NstrAdapter { - #secretKey = null; - - constructor(pubkey, secretKey, adapterConfig = {}) { - super(pubkey, adapterConfig); - this.#secretKey = secretKey; - } - - async signEvent(event) { - const connect = new Connect({ - secretKey: this.#secretKey, - target: this.pubkey, - }); - await connect.init(); - - event.sig = await connect.signEvent('12323423434'); - return event; - } - } - - class NstrAdapterDiscadableKeys extends NstrAdapter { - #privateKey; - - constructor(adapterConfig={}) { - let key = localStorage.getItem('nostrichat-discardable-key'); - let publicKey = localStorage.getItem('nostrichat-discardable-public-key'); - - if (!key) { - key = generatePrivateKey(); - console.log('generated key', key); - publicKey = getPublicKey(key); - } - - localStorage.setItem('nostrichat-discardable-key', key); - localStorage.setItem('nostrichat-discardable-public-key', publicKey); - - super(publicKey, adapterConfig); - - this.#privateKey = key; - console.log(key); - } - - async signEvent(event) { - event.sig = await signEvent(event, this.#privateKey); - return event; - } - - async encrypt(destPubkey, message) { - console.log(this.#privateKey); - return await nip04_exports.encrypt(this.#privateKey, destPubkey, message); - } - - async decrypt(destPubkey, message) { - return await nip04_exports.decrypt(this.#privateKey, destPubkey, message); - } - } - - /* src/KeyPrompt.svelte generated by Svelte v3.55.1 */ - - // (136:21) - function create_if_block_1$3(ctx) { - let div; - let t0; - let button0; - let t2; - let button1; - let mounted; - let dispose; - let if_block = create_if_block_2$1(ctx); - - return { - c() { - div = element("div"); - if (if_block) if_block.c(); - t0 = space(); - button0 = element("button"); - button0.textContent = "Nostr Connect (NIP-46)"; - t2 = space(); - button1 = element("button"); - - button1.innerHTML = `Anonymous - (Ephemeral Keys)`; - - attr(button0, "class", "bg-purple-900 hover:bg-purple-700 w-full p-4 rounded-xl text-center font-regular text-gray-200 svelte-8015tc"); - attr(button1, "class", "bg-purple-900 hover:bg-purple-700 w-full p-4 rounded-xl text-center font-regular text-gray-200 svelte-8015tc"); - attr(div, "class", "flex flex-col gap-1 svelte-8015tc"); - }, - m(target, anchor) { - insert(target, div, anchor); - if (if_block) if_block.m(div, null); - append(div, t0); - append(div, button0); - append(div, t2); - append(div, button1); - - if (!mounted) { - dispose = [ - listen(button0, "click", prevent_default(/*useNip46*/ ctx[3])), - listen(button1, "click", prevent_default(/*useDiscardableKeys*/ ctx[2])) - ]; - - mounted = true; - } - }, - p(ctx, dirty) { - }, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(div); - if (if_block) if_block.d(); - mounted = false; - run_all(dispose); - } - }; - } - - // (114:0) {#if nip46URI} - function create_if_block$4(ctx) { - let p; - let t1; - let div; - let qr; - let t2; - let button; - let current; - let mounted; - let dispose; - qr = new QR({ props: { text: /*nip46URI*/ ctx[0] } }); - - return { - c() { - p = element("p"); - p.textContent = "Scan this with your Nostr Connect (click to copy to clipboard)"; - t1 = space(); - div = element("div"); - create_component(qr.$$.fragment); - t2 = space(); - button = element("button"); - button.textContent = "Cancel"; - attr(p, "class", "text-gray-600 mb-3 svelte-8015tc"); - attr(div, "class", "bg-white w-full p-3 svelte-8015tc"); - attr(button, "class", "bg-purple-900 hover:bg-purple-700 w-full p-2 rounded-xl text-center font-regular text-white svelte-8015tc"); - }, - m(target, anchor) { - insert(target, p, anchor); - insert(target, t1, anchor); - insert(target, div, anchor); - mount_component(qr, div, null); - insert(target, t2, anchor); - insert(target, button, anchor); - current = true; - - if (!mounted) { - dispose = [ - listen(div, "click", prevent_default(/*Nip46Copy*/ ctx[4])), - listen(button, "click", prevent_default(/*click_handler*/ ctx[8])) - ]; - - mounted = true; - } - }, - p(ctx, dirty) { - const qr_changes = {}; - if (dirty & /*nip46URI*/ 1) qr_changes.text = /*nip46URI*/ ctx[0]; - qr.$set(qr_changes); - }, - i(local) { - if (current) return; - transition_in(qr.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(qr.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach(p); - if (detaching) detach(t1); - if (detaching) detach(div); - destroy_component(qr); - if (detaching) detach(t2); - if (detaching) detach(button); - mounted = false; - run_all(dispose); - } - }; - } - - // (138:8) {#if hasNostrNip07} - function create_if_block_2$1(ctx) { - let button; - let mounted; - let dispose; - - return { - c() { - button = element("button"); - button.textContent = "Browser Extension (NIP-07)"; - attr(button, "class", "bg-purple-900 hover:bg-purple-700 w-full p-4 rounded-xl text-center font-regular text-gray-200 svelte-8015tc"); - }, - m(target, anchor) { - insert(target, button, anchor); - - if (!mounted) { - dispose = listen(button, "click", prevent_default(/*useNip07*/ ctx[1])); - mounted = true; - } - }, - p: noop, - d(detaching) { - if (detaching) detach(button); - mounted = false; - dispose(); - } - }; - } - - function create_fragment$4(ctx) { - let h1; - let t1; - let t2; - let current_block_type_index; - let if_block1; - let if_block1_anchor; - let current; - const if_block_creators = [create_if_block$4, create_if_block_1$3]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (/*nip46URI*/ ctx[0]) return 0; - return 1; - } - - if (~(current_block_type_index = select_block_type(ctx))) { - if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - } - - return { - c() { - h1 = element("h1"); - h1.textContent = "How would you like to connect?"; - t1 = space(); - t2 = space(); - if (if_block1) if_block1.c(); - if_block1_anchor = empty(); - attr(h1, "class", "font-bold text-xl mb-3 svelte-8015tc"); - }, - m(target, anchor) { - insert(target, h1, anchor); - insert(target, t1, anchor); - insert(target, t2, anchor); - - if (~current_block_type_index) { - if_blocks[current_block_type_index].m(target, anchor); - } - - insert(target, if_block1_anchor, anchor); - current = true; - }, - p(ctx, [dirty]) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); - - if (current_block_type_index === previous_block_index) { - if (~current_block_type_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } - } else { - if (if_block1) { - group_outros(); - - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros(); - } - - if (~current_block_type_index) { - if_block1 = if_blocks[current_block_type_index]; - - if (!if_block1) { - if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block1.c(); - } else { - if_block1.p(ctx, dirty); - } - - transition_in(if_block1, 1); - if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); - } else { - if_block1 = null; - } - } - }, - i(local) { - if (current) return; - transition_in(if_block1); - current = true; - }, - o(local) { - transition_out(if_block1); - current = false; - }, - d(detaching) { - if (detaching) detach(h1); - if (detaching) detach(t1); - if (detaching) detach(t2); - - if (~current_block_type_index) { - if_blocks[current_block_type_index].d(detaching); - } - - if (detaching) detach(if_block1_anchor); - } - }; - } - - function instance$4($$self, $$props, $$invalidate) { - let { websiteOwnerPubkey } = $$props; - let { chatConfiguration } = $$props; - let { relays } = $$props; - let nip46URI; - let adapterConfig; - - onMount(() => { - // hasNostrNip07 = !!window.nostr; - const type = localStorage.getItem('nostrichat-type'); - - if (type === 'nip07') { - useNip07(); - } else if (type === 'nip-46') { - useNip46(); - } - - adapterConfig = { - type: chatConfiguration.chatType, - tags: chatConfiguration.chatTags, - referenceTags: chatConfiguration.chatReferenceTags, - websiteOwnerPubkey, - relays - }; - }); - - function useNip07() { - window.nostr.getPublicKey().then(pubkey => { - localStorage.setItem('nostrichat-type', 'nip07'); - chatAdapter.set(new NstrAdapterNip07(pubkey, adapterConfig)); - }); - } - - async function useDiscardableKeys() { - chatAdapter.set(new NstrAdapterDiscadableKeys(adapterConfig)); - } - - async function useNip46() { - let key = localStorage.getItem('nostrichat-nostr-connect-key'); - let publicKey = localStorage.getItem('nostrichat-nostr-connect-public-key'); - - if (key) { - chatAdapter.set(new NstrAdapterNip46(publicKey, key, adapterConfig)); - return; - } - - key = generatePrivateKey(); - - const connect = new Connect({ - secretKey: key, - relay: 'wss://nostr.vulpem.com' - }); - - connect.events.on('connect', connectedPubKey => { - localStorage.setItem('nostrichat-nostr-connect-key', key); - localStorage.setItem('nostrichat-nostr-connect-public-key', connectedPubKey); - localStorage.setItem('nostrichat-type', 'nip-46'); - console.log('connected to nostr connect relay'); - publicKey = connectedPubKey; - chatAdapter.set(new NstrAdapterNip46(publicKey, key)); - $$invalidate(0, nip46URI = null); - }); - - connect.events.on('disconnect', () => { - console.log('disconnected from nostr connect relay'); - }); - - await connect.init(); - - const connectURI = new ConnectURI({ - target: getPublicKey(key), - relay: 'wss://nostr.vulpem.com', - metadata: { - name: 'PSBT.io', - description: '🔉🔉🔉', - url: 'https://psbt.io', - icons: ['https://example.com/icon.png'] - } - }); - - $$invalidate(0, nip46URI = connectURI.toString()); - } - - function Nip46Copy() { - navigator.clipboard.writeText(nip46URI); - } - - const click_handler = () => { - $$invalidate(0, nip46URI = null); - }; - - $$self.$$set = $$props => { - if ('websiteOwnerPubkey' in $$props) $$invalidate(5, websiteOwnerPubkey = $$props.websiteOwnerPubkey); - if ('chatConfiguration' in $$props) $$invalidate(6, chatConfiguration = $$props.chatConfiguration); - if ('relays' in $$props) $$invalidate(7, relays = $$props.relays); - }; - - return [ - nip46URI, - useNip07, - useDiscardableKeys, - useNip46, - Nip46Copy, - websiteOwnerPubkey, - chatConfiguration, - relays, - click_handler - ]; - } - - class KeyPrompt extends SvelteComponent { - constructor(options) { - super(); - - init(this, options, instance$4, create_fragment$4, safe_not_equal, { - websiteOwnerPubkey: 5, - chatConfiguration: 6, - relays: 7 - }); - } - } - - /* src/NostrNote.svelte generated by Svelte v3.55.1 */ - - function get_each_context$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[14] = list[i]; - return child_ctx; - } - - // (75:16) {:else} - function create_else_block$3(ctx) { - let div; - let t; - - return { - c() { - div = element("div"); - t = text(/*displayName*/ ctx[4]); - attr(div, "class", "text-xs text-gray-400 svelte-r5bhj7"); - }, - m(target, anchor) { - insert(target, div, anchor); - append(div, t); - }, - p(ctx, dirty) { - if (dirty & /*displayName*/ 16) set_data(t, /*displayName*/ ctx[4]); - }, - d(detaching) { - if (detaching) detach(div); - } - }; - } - - // (71:16) {#if byWebsiteOwner} - function create_if_block_1$2(ctx) { - let div; - - return { - c() { - div = element("div"); - div.textContent = "Website owner"; - attr(div, "class", "text-purple-500 text-xs svelte-r5bhj7"); - }, - m(target, anchor) { - insert(target, div, anchor); - }, - p: noop, - d(detaching) { - if (detaching) detach(div); - } - }; - } - - // (85:0) {#if responses[event.id].length > 0} - function create_if_block$3(ctx) { - let div; - let current; - let each_value = /*responses*/ ctx[1][/*event*/ ctx[0].id]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); - } - - const out = i => transition_out(each_blocks[i], 1, 1, () => { - each_blocks[i] = null; - }); - - return { - c() { - div = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(div, "class", "pl-5 border-l border-l-gray-400 mb-10 svelte-r5bhj7"); - }, - m(target, anchor) { - insert(target, div, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div, null); - } - - current = true; - }, - p(ctx, dirty) { - if (dirty & /*websiteOwnerPubkey, responses, event*/ 7) { - each_value = /*responses*/ ctx[1][/*event*/ ctx[0].id]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$1(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - transition_in(each_blocks[i], 1); - } else { - each_blocks[i] = create_each_block$1(child_ctx); - each_blocks[i].c(); - transition_in(each_blocks[i], 1); - each_blocks[i].m(div, null); - } - } - - group_outros(); - - for (i = each_value.length; i < each_blocks.length; i += 1) { - out(i); - } - - check_outros(); - } - }, - i(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o(local) { - each_blocks = each_blocks.filter(Boolean); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d(detaching) { - if (detaching) detach(div); - destroy_each(each_blocks, detaching); - } - }; - } - - // (87:8) {#each responses[event.id] as response} - function create_each_block$1(ctx) { - let nostrnote; - let current; - - nostrnote = new NostrNote({ - props: { - websiteOwnerPubkey: /*websiteOwnerPubkey*/ ctx[2], - event: /*response*/ ctx[14], - responses: /*responses*/ ctx[1] - } - }); - - return { - c() { - create_component(nostrnote.$$.fragment); - }, - m(target, anchor) { - mount_component(nostrnote, target, anchor); - current = true; - }, - p(ctx, dirty) { - const nostrnote_changes = {}; - if (dirty & /*websiteOwnerPubkey*/ 4) nostrnote_changes.websiteOwnerPubkey = /*websiteOwnerPubkey*/ ctx[2]; - if (dirty & /*responses, event*/ 3) nostrnote_changes.event = /*response*/ ctx[14]; - if (dirty & /*responses*/ 2) nostrnote_changes.responses = /*responses*/ ctx[1]; - nostrnote.$set(nostrnote_changes); - }, - i(local) { - if (current) return; - transition_in(nostrnote.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(nostrnote.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(nostrnote, detaching); - } - }; - } - - function create_fragment$3(ctx) { - let div7; - let div6; - let div0; - let img; - let img_src_value; - let t0; - let div5; - let div1; - let t1; - let div2; - let t2_value = /*event*/ ctx[0].content + ""; - let t2; - let div2_class_value; - let t3; - let div4; - let div3; - let span; - let t5; - let t6; - let if_block1_anchor; - let current; - let mounted; - let dispose; - - function select_block_type(ctx, dirty) { - if (/*byWebsiteOwner*/ ctx[7]) return create_if_block_1$2; - return create_else_block$3; - } - - let current_block_type = select_block_type(ctx); - let if_block0 = current_block_type(ctx); - let if_block1 = /*responses*/ ctx[1][/*event*/ ctx[0].id].length > 0 && create_if_block$3(ctx); - - return { - c() { - div7 = element("div"); - div6 = element("div"); - div0 = element("div"); - img = element("img"); - t0 = space(); - div5 = element("div"); - div1 = element("div"); - t1 = space(); - div2 = element("div"); - t2 = text(t2_value); - t3 = space(); - div4 = element("div"); - div3 = element("div"); - span = element("span"); - span.textContent = `${/*timestamp*/ ctx[8].toLocaleString()}`; - t5 = space(); - if_block0.c(); - t6 = space(); - if (if_block1) if_block1.c(); - if_block1_anchor = empty(); - if (!src_url_equal(img.src, img_src_value = /*profilePicture*/ ctx[3])) attr(img, "src", img_src_value); - - attr(img, "class", "block w-10 h-10 rounded-full " + (/*byWebsiteOwner*/ ctx[7] - ? 'ring-purple-700 ring-4' - : 'ring-gray-300 ring-2') + "" + " svelte-r5bhj7"); - - attr(img, "alt", ""); - attr(div0, "class", "min-w-fit svelte-r5bhj7"); - attr(div1, "class", "flex flex-row justify-between text-center overflow-clip text-clip w-full svelte-r5bhj7"); - - attr(div2, "class", div2_class_value = "max-h-64 text-base cursor-pointer border border-slate-200 " + (/*$selectedMessage*/ ctx[5] === /*event*/ ctx[0].id - ? 'bg-purple-700 text-white' - : 'bg-slate-50 text-gray-500 hover:bg-slate-100') + " p-4 py-2 overflow-scroll rounded-2xl" + " svelte-r5bhj7"); - - attr(span, "class", "py-2 svelte-r5bhj7"); - attr(div3, "class", "text-xs text-gray-400 text-ellipsis overflow-clip whitespace-nowrap svelte-r5bhj7"); - attr(div4, "class", "flex flex-row-reverse justify-between mt-1 overflow-clip items-center svelte-r5bhj7"); - attr(div5, "class", "w-full overflow-hidden svelte-r5bhj7"); - attr(div6, "class", "flex flex-row gap-4 svelte-r5bhj7"); - attr(div7, "class", "block p-2-lg mb-3 text-wrap svelte-r5bhj7"); - }, - m(target, anchor) { - insert(target, div7, anchor); - append(div7, div6); - append(div6, div0); - append(div0, img); - append(div6, t0); - append(div6, div5); - append(div5, div1); - append(div5, t1); - append(div5, div2); - append(div2, t2); - append(div5, t3); - append(div5, div4); - append(div4, div3); - append(div3, span); - append(div4, t5); - if_block0.m(div4, null); - insert(target, t6, anchor); - if (if_block1) if_block1.m(target, anchor); - insert(target, if_block1_anchor, anchor); - current = true; - - if (!mounted) { - dispose = listen(div2, "click", prevent_default(/*click_handler*/ ctx[11])); - mounted = true; - } - }, - p(ctx, [dirty]) { - if (!current || dirty & /*profilePicture*/ 8 && !src_url_equal(img.src, img_src_value = /*profilePicture*/ ctx[3])) { - attr(img, "src", img_src_value); - } - - if ((!current || dirty & /*event*/ 1) && t2_value !== (t2_value = /*event*/ ctx[0].content + "")) set_data(t2, t2_value); - - if (!current || dirty & /*$selectedMessage, event*/ 33 && div2_class_value !== (div2_class_value = "max-h-64 text-base cursor-pointer border border-slate-200 " + (/*$selectedMessage*/ ctx[5] === /*event*/ ctx[0].id - ? 'bg-purple-700 text-white' - : 'bg-slate-50 text-gray-500 hover:bg-slate-100') + " p-4 py-2 overflow-scroll rounded-2xl" + " svelte-r5bhj7")) { - attr(div2, "class", div2_class_value); - } - - if_block0.p(ctx, dirty); - - if (/*responses*/ ctx[1][/*event*/ ctx[0].id].length > 0) { - if (if_block1) { - if_block1.p(ctx, dirty); - - if (dirty & /*responses, event*/ 3) { - transition_in(if_block1, 1); - } - } else { - if_block1 = create_if_block$3(ctx); - if_block1.c(); - transition_in(if_block1, 1); - if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); - } - } else if (if_block1) { - group_outros(); - - transition_out(if_block1, 1, 1, () => { - if_block1 = null; - }); - - check_outros(); - } - }, - i(local) { - if (current) return; - transition_in(if_block1); - current = true; - }, - o(local) { - transition_out(if_block1); - current = false; - }, - d(detaching) { - if (detaching) detach(div7); - if_block0.d(); - if (detaching) detach(t6); - if (if_block1) if_block1.d(detaching); - if (detaching) detach(if_block1_anchor); - mounted = false; - dispose(); - } - }; - } - - function instance$3($$self, $$props, $$invalidate) { - let displayName; - let $chatData; - let $selectedMessage; - component_subscribe($$self, chatData, $$value => $$invalidate(10, $chatData = $$value)); - component_subscribe($$self, selectedMessage, $$value => $$invalidate(5, $selectedMessage = $$value)); - let { event } = $$props; - let { responses } = $$props; - let { websiteOwnerPubkey } = $$props; - let profiles = {}; - let profilePicture; - - function selectMessage() { - if ($selectedMessage === event.id) { - set_store_value(selectedMessage, $selectedMessage = null, $selectedMessage); - } else { - set_store_value(selectedMessage, $selectedMessage = event.id, $selectedMessage); - } - } - - const byWebsiteOwner = !!websiteOwnerPubkey === event.pubkey; - event.tags.filter(e => e[0] === 'e').map(e => e[1]); - let timestamp = new Date(event.created_at * 1000); - - const click_handler = () => { - selectMessage(event.id); - }; - - $$self.$$set = $$props => { - if ('event' in $$props) $$invalidate(0, event = $$props.event); - if ('responses' in $$props) $$invalidate(1, responses = $$props.responses); - if ('websiteOwnerPubkey' in $$props) $$invalidate(2, websiteOwnerPubkey = $$props.websiteOwnerPubkey); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*$chatData*/ 1024) { - $$invalidate(9, profiles = $chatData.profiles); - } - - if ($$self.$$.dirty & /*profiles, event*/ 513) { - $$invalidate(4, displayName = profiles[event.pubkey] && profiles[event.pubkey].display_name || event.pubkey); - } - - if ($$self.$$.dirty & /*profiles, event*/ 513) { - profiles[event.pubkey] && profiles[event.pubkey].nip05; - } - - if ($$self.$$.dirty & /*profiles, event*/ 513) { - $$invalidate(3, profilePicture = profiles[event.pubkey] && profiles[event.pubkey].picture || `https://robohash.org/${event.pubkey}.png?set=set1`); - } - }; - - return [ - event, - responses, - websiteOwnerPubkey, - profilePicture, - displayName, - $selectedMessage, - selectMessage, - byWebsiteOwner, - timestamp, - profiles, - $chatData, - click_handler - ]; - } - - class NostrNote extends SvelteComponent { - constructor(options) { - super(); - - init(this, options, instance$3, create_fragment$3, safe_not_equal, { - event: 0, - responses: 1, - websiteOwnerPubkey: 2 - }); - } - } - - function cubicInOut(t) { - return t < 0.5 ? 4.0 * t * t * t : 0.5 * Math.pow(2.0 * t - 2.0, 3.0) + 1.0; - } - - var _ = { - $(selector) { - if (typeof selector === "string") { - return document.querySelector(selector); - } - return selector; - }, - extend(...args) { - return Object.assign(...args); - }, - cumulativeOffset(element) { - let top = 0; - let left = 0; - - do { - top += element.offsetTop || 0; - left += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - - return { - top: top, - left: left - }; - }, - directScroll(element) { - return element && element !== document && element !== document.body; - }, - scrollTop(element, value) { - let inSetter = value !== undefined; - if (this.directScroll(element)) { - return inSetter ? (element.scrollTop = value) : element.scrollTop; - } else { - return inSetter - ? (document.documentElement.scrollTop = document.body.scrollTop = value) - : window.pageYOffset || - document.documentElement.scrollTop || - document.body.scrollTop || - 0; - } - }, - scrollLeft(element, value) { - let inSetter = value !== undefined; - if (this.directScroll(element)) { - return inSetter ? (element.scrollLeft = value) : element.scrollLeft; - } else { - return inSetter - ? (document.documentElement.scrollLeft = document.body.scrollLeft = value) - : window.pageXOffset || - document.documentElement.scrollLeft || - document.body.scrollLeft || - 0; - } - } - }; - - const defaultOptions = { - container: "body", - duration: 500, - delay: 0, - offset: 0, - easing: cubicInOut, - onStart: noop, - onDone: noop, - onAborting: noop, - scrollX: false, - scrollY: true - }; - - const _scrollTo = options => { - let { - offset, - duration, - delay, - easing, - x=0, - y=0, - scrollX, - scrollY, - onStart, - onDone, - container, - onAborting, - element - } = options; - - if (typeof offset === "function") { - offset = offset(); - } - - var cumulativeOffsetContainer = _.cumulativeOffset(container); - var cumulativeOffsetTarget = element - ? _.cumulativeOffset(element) - : { top: y, left: x }; - - var initialX = _.scrollLeft(container); - var initialY = _.scrollTop(container); - - var targetX = - cumulativeOffsetTarget.left - cumulativeOffsetContainer.left + offset; - var targetY = - cumulativeOffsetTarget.top - cumulativeOffsetContainer.top + offset; - - var diffX = targetX - initialX; - var diffY = targetY - initialY; - - let scrolling = true; - let started = false; - let start_time = now$1() + delay; - let end_time = start_time + duration; - - function scrollToTopLeft(element, top, left) { - if (scrollX) _.scrollLeft(element, left); - if (scrollY) _.scrollTop(element, top); - } - - function start(delayStart) { - if (!delayStart) { - started = true; - onStart(element, {x, y}); - } - } - - function tick(progress) { - scrollToTopLeft( - container, - initialY + diffY * progress, - initialX + diffX * progress - ); - } - - function stop() { - scrolling = false; - } - - loop(now => { - if (!started && now >= start_time) { - start(false); - } - - if (started && now >= end_time) { - tick(1); - stop(); - onDone(element, {x, y}); - } - - if (!scrolling) { - onAborting(element, {x, y}); - return false; - } - if (started) { - const p = now - start_time; - const t = 0 + 1 * easing(p / duration); - tick(t); - } - - return true; - }); - - start(delay); - - tick(0); - - return stop; - }; - - const proceedOptions = options => { - let opts = _.extend({}, defaultOptions, options); - opts.container = _.$(opts.container); - opts.element = _.$(opts.element); - return opts; - }; - - const scrollContainerHeight = containerElement => { - if ( - containerElement && - containerElement !== document && - containerElement !== document.body - ) { - return containerElement.scrollHeight - containerElement.offsetHeight; - } else { - let body = document.body; - let html = document.documentElement; - - return Math.max( - body.scrollHeight, - body.offsetHeight, - html.clientHeight, - html.scrollHeight, - html.offsetHeight - ); - } - }; - - const scrollToBottom = options => { - options = proceedOptions(options); - - return _scrollTo( - _.extend(options, { - element: null, - y: scrollContainerHeight(options.container) - }) - ); - }; - - /* src/ConnectedWidget.svelte generated by Svelte v3.55.1 */ - - function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[21] = list[i]; - return child_ctx; - } - - function get_each_context_1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[24] = list[i]; - child_ctx[26] = i; - return child_ctx; - } - - // (196:8) {#if $chatAdapter?.pubkey} - function create_if_block_5(ctx) { - let t_value = (/*profiles*/ ctx[5][/*$chatAdapter*/ ctx[2].pubkey]?.display_name || /*$chatAdapter*/ ctx[2].pubkey) + ""; - let t; - - return { - c() { - t = text(t_value); - }, - m(target, anchor) { - insert(target, t, anchor); - }, - p(ctx, dirty) { - if (dirty & /*profiles, $chatAdapter*/ 36 && t_value !== (t_value = (/*profiles*/ ctx[5][/*$chatAdapter*/ ctx[2].pubkey]?.display_name || /*$chatAdapter*/ ctx[2].pubkey) + "")) set_data(t, t_value); - }, - d(detaching) { - if (detaching) detach(t); - } - }; - } - - // (203:12) {#each Array(totalRelays) as _, i} - function create_each_block_1(ctx) { - let span; - let span_class_value; - - return { - c() { - span = element("span"); - - attr(span, "class", span_class_value = "inline-block rounded-full " + (/*connectedRelays*/ ctx[6] > /*i*/ ctx[26] - ? 'bg-green-500' - : 'bg-gray-300') + " w-2 h-2" + " svelte-v3rae1"); - }, - m(target, anchor) { - insert(target, span, anchor); - }, - p(ctx, dirty) { - if (dirty & /*connectedRelays*/ 64 && span_class_value !== (span_class_value = "inline-block rounded-full " + (/*connectedRelays*/ ctx[6] > /*i*/ ctx[26] - ? 'bg-green-500' - : 'bg-gray-300') + " w-2 h-2" + " svelte-v3rae1")) { - attr(span, "class", span_class_value); - } - }, - d(detaching) { - if (detaching) detach(span); - } - }; - } - - // (217:0) {#if $selectedMessage} - function create_if_block_3(ctx) { - let show_if; - let if_block_anchor; - - function select_block_type(ctx, dirty) { - if (dirty & /*$selectedMessage*/ 256) show_if = null; - if (show_if == null) show_if = !!!/*getEventById*/ ctx[9](/*$selectedMessage*/ ctx[8]); - if (show_if) return create_if_block_4; - return create_else_block_2; - } - - let current_block_type = select_block_type(ctx, -1); - let if_block = current_block_type(ctx); - - return { - c() { - if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - if_block.m(target, anchor); - insert(target, if_block_anchor, anchor); - }, - p(ctx, dirty) { - if (current_block_type === (current_block_type = select_block_type(ctx, dirty)) && if_block) { - if_block.p(ctx, dirty); - } else { - if_block.d(1); - if_block = current_block_type(ctx); - - if (if_block) { - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } - }, - d(detaching) { - if_block.d(detaching); - if (detaching) detach(if_block_anchor); - } - }; - } - - // (220:4) {:else} - function create_else_block_2(ctx) { - let div1; - let a; - let t0; - let div0; - let span; - let t1_value = /*getEventById*/ ctx[9](/*$selectedMessage*/ ctx[8]).content + ""; - let t1; - let mounted; - let dispose; - - return { - c() { - div1 = element("div"); - a = element("a"); - a.innerHTML = ``; - t0 = space(); - div0 = element("div"); - span = element("span"); - t1 = text(t1_value); - attr(a, "href", "#"); - attr(a, "class", "svelte-v3rae1"); - attr(span, "class", "text-lg text-black overflow-hidden whitespace-nowrap text-ellipsis svelte-v3rae1"); - attr(div0, "class", "flex flex-col ml-2 svelte-v3rae1"); - attr(div1, "class", "flex flex-row mb-3 svelte-v3rae1"); - }, - m(target, anchor) { - insert(target, div1, anchor); - append(div1, a); - append(div1, t0); - append(div1, div0); - append(div0, span); - append(span, t1); - - if (!mounted) { - dispose = listen(a, "click", prevent_default(/*selectParent*/ ctx[12])); - mounted = true; - } - }, - p(ctx, dirty) { - if (dirty & /*$selectedMessage*/ 256 && t1_value !== (t1_value = /*getEventById*/ ctx[9](/*$selectedMessage*/ ctx[8]).content + "")) set_data(t1, t1_value); - }, - d(detaching) { - if (detaching) detach(div1); - mounted = false; - dispose(); - } - }; - } - - // (218:4) {#if !getEventById($selectedMessage)} - function create_if_block_4(ctx) { - let h1; - let t0; - let t1; - - return { - c() { - h1 = element("h1"); - t0 = text("Couldn't find event with ID "); - t1 = text(/*$selectedMessage*/ ctx[8]); - attr(h1, "class", "svelte-v3rae1"); - }, - m(target, anchor) { - insert(target, h1, anchor); - append(h1, t0); - append(h1, t1); - }, - p(ctx, dirty) { - if (dirty & /*$selectedMessage*/ 256) set_data(t1, /*$selectedMessage*/ ctx[8]); - }, - d(detaching) { - if (detaching) detach(h1); - } - }; - } - - // (240:4) {:else} - function create_else_block_1(ctx) { - let each_1_anchor; - let current; - let each_value = /*events*/ ctx[3]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); - } - - const out = i => transition_out(each_blocks[i], 1, 1, () => { - each_blocks[i] = null; - }); - - return { - c() { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - each_1_anchor = empty(); - }, - m(target, anchor) { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(target, anchor); - } - - insert(target, each_1_anchor, anchor); - current = true; - }, - p(ctx, dirty) { - if (dirty & /*events, responses, websiteOwnerPubkey*/ 25) { - each_value = /*events*/ ctx[3]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - transition_in(each_blocks[i], 1); - } else { - each_blocks[i] = create_each_block(child_ctx); - each_blocks[i].c(); - transition_in(each_blocks[i], 1); - each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); - } - } - - group_outros(); - - for (i = each_value.length; i < each_blocks.length; i += 1) { - out(i); - } - - check_outros(); - } - }, - i(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o(local) { - each_blocks = each_blocks.filter(Boolean); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d(detaching) { - destroy_each(each_blocks, detaching); - if (detaching) detach(each_1_anchor); - } - }; - } - - // (238:4) {#if $selectedMessage} - function create_if_block_1$1(ctx) { - let nostrnote; - let current; - - nostrnote = new NostrNote({ - props: { - event: /*getEventById*/ ctx[9](/*$selectedMessage*/ ctx[8]), - responses: /*responses*/ ctx[4], - websiteOwnerPubkey: /*websiteOwnerPubkey*/ ctx[0] - } - }); - - return { - c() { - create_component(nostrnote.$$.fragment); - }, - m(target, anchor) { - mount_component(nostrnote, target, anchor); - current = true; - }, - p(ctx, dirty) { - const nostrnote_changes = {}; - if (dirty & /*$selectedMessage*/ 256) nostrnote_changes.event = /*getEventById*/ ctx[9](/*$selectedMessage*/ ctx[8]); - if (dirty & /*responses*/ 16) nostrnote_changes.responses = /*responses*/ ctx[4]; - if (dirty & /*websiteOwnerPubkey*/ 1) nostrnote_changes.websiteOwnerPubkey = /*websiteOwnerPubkey*/ ctx[0]; - nostrnote.$set(nostrnote_changes); - }, - i(local) { - if (current) return; - transition_in(nostrnote.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(nostrnote.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(nostrnote, detaching); - } - }; - } - - // (243:12) {#if event.deleted} - function create_if_block_2(ctx) { - let t; - - return { - c() { - t = text("👆 deleted"); - }, - m(target, anchor) { - insert(target, t, anchor); - }, - d(detaching) { - if (detaching) detach(t); - } - }; - } - - // (241:8) {#each events as event} - function create_each_block(ctx) { - let nostrnote; - let t; - let if_block_anchor; - let current; - - nostrnote = new NostrNote({ - props: { - event: /*event*/ ctx[21], - responses: /*responses*/ ctx[4], - websiteOwnerPubkey: /*websiteOwnerPubkey*/ ctx[0] - } - }); - - let if_block = /*event*/ ctx[21].deleted && create_if_block_2(); - - return { - c() { - create_component(nostrnote.$$.fragment); - t = space(); - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - mount_component(nostrnote, target, anchor); - insert(target, t, anchor); - if (if_block) if_block.m(target, anchor); - insert(target, if_block_anchor, anchor); - current = true; - }, - p(ctx, dirty) { - const nostrnote_changes = {}; - if (dirty & /*events*/ 8) nostrnote_changes.event = /*event*/ ctx[21]; - if (dirty & /*responses*/ 16) nostrnote_changes.responses = /*responses*/ ctx[4]; - if (dirty & /*websiteOwnerPubkey*/ 1) nostrnote_changes.websiteOwnerPubkey = /*websiteOwnerPubkey*/ ctx[0]; - nostrnote.$set(nostrnote_changes); - - if (/*event*/ ctx[21].deleted) { - if (if_block) ; else { - if_block = create_if_block_2(); - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - i(local) { - if (current) return; - transition_in(nostrnote.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(nostrnote.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(nostrnote, detaching); - if (detaching) detach(t); - if (if_block) if_block.d(detaching); - if (detaching) detach(if_block_anchor); - } - }; - } - - // (260:8) {:else} - function create_else_block$2(ctx) { - let b; - let t1; - - return { - c() { - b = element("b"); - b.textContent = "Public chat:"; - t1 = text("\n anyone can see these messages."); - attr(b, "class", "svelte-v3rae1"); - }, - m(target, anchor) { - insert(target, b, anchor); - insert(target, t1, anchor); - }, - d(detaching) { - if (detaching) detach(b); - if (detaching) detach(t1); - } - }; - } - - // (257:8) {#if chatConfiguration.chatType === 'DM'} - function create_if_block$2(ctx) { - let b; - let t1; - - return { - c() { - b = element("b"); - b.textContent = "Encrypted chat:"; - t1 = text("\n only your chat partner can see these messages."); - attr(b, "class", "svelte-v3rae1"); - }, - m(target, anchor) { - insert(target, b, anchor); - insert(target, t1, anchor); - }, - d(detaching) { - if (detaching) detach(b); - if (detaching) detach(t1); - } - }; - } - - function create_fragment$2(ctx) { - let div2; - let div0; - let t0; - let span; - let div1; - let t1; - let t2; - let t3; - let t4; - let t5; - let t6; - let t7; - let div3; - let current_block_type_index; - let if_block2; - let t8; - let div6; - let div4; - let t9; - let div5; - let textarea; - let t10; - let button; - let current; - let mounted; - let dispose; - let if_block0 = /*$chatAdapter*/ ctx[2]?.pubkey && create_if_block_5(ctx); - let each_value_1 = Array(/*totalRelays*/ ctx[7]); - let each_blocks = []; - - for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); - } - - let if_block1 = /*$selectedMessage*/ ctx[8] && create_if_block_3(ctx); - const if_block_creators = [create_if_block_1$1, create_else_block_1]; - const if_blocks = []; - - function select_block_type_1(ctx, dirty) { - if (/*$selectedMessage*/ ctx[8]) return 0; - return 1; - } - - current_block_type_index = select_block_type_1(ctx); - if_block2 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - - function select_block_type_2(ctx, dirty) { - if (/*chatConfiguration*/ ctx[1].chatType === 'DM') return create_if_block$2; - return create_else_block$2; - } - - let current_block_type = select_block_type_2(ctx); - let if_block3 = current_block_type(ctx); - - return { - c() { - div2 = element("div"); - div0 = element("div"); - if (if_block0) if_block0.c(); - t0 = space(); - span = element("span"); - div1 = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - t1 = space(); - t2 = text(/*connectedRelays*/ ctx[6]); - t3 = text("/"); - t4 = text(/*totalRelays*/ ctx[7]); - t5 = text(" relays"); - t6 = space(); - if (if_block1) if_block1.c(); - t7 = space(); - div3 = element("div"); - if_block2.c(); - t8 = space(); - div6 = element("div"); - div4 = element("div"); - if_block3.c(); - t9 = space(); - div5 = element("div"); - textarea = element("textarea"); - t10 = space(); - button = element("button"); - button.innerHTML = ``; - attr(div0, "class", "text-lg font-semibold svelte-v3rae1"); - attr(div1, "class", "flex flex-row gap-1 overflow-clip svelte-v3rae1"); - attr(span, "class", "text-xs flex flex-col items-end mt-2 text-gray-200 gap-1 svelte-v3rae1"); - attr(div2, "class", "bg-purple-700 text-white -m-5 mb-3 px-5 py-3 overflow-clip flex flex-row justify-between items-center svelte-v3rae1"); - attr(div3, "id", "messages-container"); - attr(div3, "class", "overflow-scroll svelte-v3rae1"); - attr(div4, "class", "border-y border-y-slate-200 -mx-5 my-2 bg-slate-100 text-black text-sm px-5 py-2 svelte-v3rae1"); - attr(textarea, "type", "text"); - attr(textarea, "id", "message-input"); - attr(textarea, "class", "-mb-2 p-2 w-full resize-none rounded-xl text-gray-600 border svelte-v3rae1"); - attr(textarea, "placeholder", "Say hello!"); - attr(textarea, "rows", "1"); - attr(button, "type", "button"); - attr(button, "class", "inline-flex items-center rounded-full border border-transparent bg-purple-700 p-3 text-white shadow-sm hover:bg-purple-600 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 svelte-v3rae1"); - attr(div5, "class", "flex flex-row gap-2 -mx-1 svelte-v3rae1"); - attr(div6, "class", "flex flex-col svelte-v3rae1"); - }, - m(target, anchor) { - insert(target, div2, anchor); - append(div2, div0); - if (if_block0) if_block0.m(div0, null); - append(div2, t0); - append(div2, span); - append(span, div1); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div1, null); - } - - append(span, t1); - append(span, t2); - append(span, t3); - append(span, t4); - append(span, t5); - insert(target, t6, anchor); - if (if_block1) if_block1.m(target, anchor); - insert(target, t7, anchor); - insert(target, div3, anchor); - if_blocks[current_block_type_index].m(div3, null); - insert(target, t8, anchor); - insert(target, div6, anchor); - append(div6, div4); - if_block3.m(div4, null); - append(div6, t9); - append(div6, div5); - append(div5, textarea); - append(div5, t10); - append(div5, button); - current = true; - - if (!mounted) { - dispose = [ - listen(textarea, "keydown", /*inputKeyDown*/ ctx[11]), - listen(button, "click", prevent_default(/*sendMessage*/ ctx[10])) - ]; - - mounted = true; - } - }, - p(ctx, [dirty]) { - if (/*$chatAdapter*/ ctx[2]?.pubkey) { - if (if_block0) { - if_block0.p(ctx, dirty); - } else { - if_block0 = create_if_block_5(ctx); - if_block0.c(); - if_block0.m(div0, null); - } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; - } - - if (dirty & /*connectedRelays, totalRelays*/ 192) { - each_value_1 = Array(/*totalRelays*/ ctx[7]); - let i; - - for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1(ctx, each_value_1, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_1(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(div1, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_1.length; - } - - if (!current || dirty & /*connectedRelays*/ 64) set_data(t2, /*connectedRelays*/ ctx[6]); - if (!current || dirty & /*totalRelays*/ 128) set_data(t4, /*totalRelays*/ ctx[7]); - - if (/*$selectedMessage*/ ctx[8]) { - if (if_block1) { - if_block1.p(ctx, dirty); - } else { - if_block1 = create_if_block_3(ctx); - if_block1.c(); - if_block1.m(t7.parentNode, t7); - } - } else if (if_block1) { - if_block1.d(1); - if_block1 = null; - } - - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type_1(ctx); - - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros(); - - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros(); - if_block2 = if_blocks[current_block_type_index]; - - if (!if_block2) { - if_block2 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block2.c(); - } else { - if_block2.p(ctx, dirty); - } - - transition_in(if_block2, 1); - if_block2.m(div3, null); - } - - if (current_block_type !== (current_block_type = select_block_type_2(ctx))) { - if_block3.d(1); - if_block3 = current_block_type(ctx); - - if (if_block3) { - if_block3.c(); - if_block3.m(div4, null); - } - } - }, - i(local) { - if (current) return; - transition_in(if_block2); - current = true; - }, - o(local) { - transition_out(if_block2); - current = false; - }, - d(detaching) { - if (detaching) detach(div2); - if (if_block0) if_block0.d(); - destroy_each(each_blocks, detaching); - if (detaching) detach(t6); - if (if_block1) if_block1.d(detaching); - if (detaching) detach(t7); - if (detaching) detach(div3); - if_blocks[current_block_type_index].d(); - if (detaching) detach(t8); - if (detaching) detach(div6); - if_block3.d(); - mounted = false; - run_all(dispose); - } - }; - } - - function instance$2($$self, $$props, $$invalidate) { - let $selectedMessage; - let $chatData; - let $chatAdapter; - component_subscribe($$self, selectedMessage, $$value => $$invalidate(8, $selectedMessage = $$value)); - component_subscribe($$self, chatData, $$value => $$invalidate(15, $chatData = $$value)); - component_subscribe($$self, chatAdapter, $$value => $$invalidate(2, $chatAdapter = $$value)); - let events = []; - let responseEvents = []; - let responses = {}; - let profiles = {}; - let { websiteOwnerPubkey } = $$props; - let { chatConfiguration } = $$props; - let prevChatConfiguration; - - function getEventById(eventId) { - let event = events.find(e => e.id === eventId); - event = event || responseEvents.find(e => e.id === eventId); - return event; - } - - async function sendMessage() { - const input = document.getElementById('message-input'); - let message = input.value; - input.value = ''; - let extraParams = { tags: [] }; - - // if this is the rootLevel we want to tag the owner of the site's pubkey - if (!rootNoteId) { - extraParams.tagPubKeys = [websiteOwnerPubkey]; - } - - // if we are responding to an event, we want to tag the event and the pubkey - if ($selectedMessage) { - extraParams.tags.push(['e', $selectedMessage]); - extraParams.tagPubKeys.push(getEventById($selectedMessage).pubkey); - } else { - message = message + '\n\n' + chatConfiguration.chatTags.join(' ') + '\n\n' + document.location.href; - } - - // if (rootNoteId) { - // // mark it as a response to the most recent event - // const mostRecentEvent = events[events.length - 1]; - // // go through all the tags and add them to the new message - // if (mostRecentEvent) { - // mostRecentEvent.tags.forEach(tag => { - // if (tag[0] === 'e') { - // extraParams.tags.push(tag); - // } - // }) - // extraParams.tags.push(['e', mostRecentEvent.id]); - // extraParams.tags.push(['p', mostRecentEvent.pubkey]); - // } - // } - const noteId = await $chatAdapter.send(message, extraParams); - - if (!rootNoteId) { - rootNoteId = noteId; - localStorage.setItem('rootNoteId', rootNoteId); - } - } - - async function inputKeyDown(event) { - if (event.key === 'Enter') { - sendMessage(); - event.preventDefault(); - } - } - - function messageReceived(message) { - message.tags.filter(tag => tag[0] === 'e').pop(); - let isThread; - - if (chatConfiguration.chatType === 'GLOBAL') { - isThread = message.tags.filter(tag => tag[0] === 'e').length >= 1; - } else { - const pubkeysTagged = message.tags.filter(tag => tag[0] === 'p').map(tag => tag[1]); - isThread = new Set(pubkeysTagged).size >= 2; - } - - $$invalidate(4, responses[message.id] = [], responses); - - if (isThread) { - const lastETag = message.tags.filter(tag => tag[0] === 'e').pop(); - - if (lastETag && lastETag[1] && responses[lastETag[1]]) { - responses[lastETag[1]].push(message); - } - - responseEvents.push(message); - responseEvents = responseEvents; - } else { - // insert message so that it's chronologically ordered by created_at - let index = 0; - - while (index < events.length && events[index].created_at < message.created_at) { - index++; - } - - events.splice(index, 0, message); - ((($$invalidate(3, events), $$invalidate(1, chatConfiguration)), $$invalidate(13, prevChatConfiguration)), $$invalidate(2, $chatAdapter)); - } - - ((($$invalidate(4, responses), $$invalidate(1, chatConfiguration)), $$invalidate(13, prevChatConfiguration)), $$invalidate(2, $chatAdapter)); - scrollDown(); - } - - function scrollDown() { - scrollToBottom({ - container: document.getElementById('messages-container'), - offset: 500, - duration: 50 - }); - } - - function reactionReceived(reaction) { - const event = events.find(event => event.id === reaction.id); - - if (!event) { - return; - } - - event.reactions = event.reactions || []; - event.reactions.push(reaction); - ((($$invalidate(3, events), $$invalidate(1, chatConfiguration)), $$invalidate(13, prevChatConfiguration)), $$invalidate(2, $chatAdapter)); - } - - let rootNoteId; - - onMount(() => { - $chatAdapter.on('message', messageReceived); - - $chatAdapter.on('connectivity', e => { - $$invalidate(14, connectivityStatus = e); - }); - - $chatAdapter.on('reaction', reactionReceived); - - $chatAdapter.on('deleted', deletedEvents => { - deletedEvents.forEach(deletedEventId => { - const index = events.findIndex(event => event.id === deletedEventId); - - if (index !== -1) { - $$invalidate(3, events[index].deleted = true, events); - ((($$invalidate(3, events), $$invalidate(1, chatConfiguration)), $$invalidate(13, prevChatConfiguration)), $$invalidate(2, $chatAdapter)); - } - }); - }); - - $chatAdapter.on('profile', ({ pubkey, profile }) => { - let profiles = $chatData.profiles; - profiles[pubkey] = profile; - chatData.set({ profiles, ...$chatData }); - }); - }); - - let connectivityStatus = {}; - let connectedRelays = 0; - let totalRelays = 0; - - function selectParent() { - // get the last tagged event in the tags array of the current $selectedMessage - const lastETag = getEventById($selectedMessage).tags.filter(tag => tag[0] === 'e').pop(); - - const lastETagId = lastETag && lastETag[1]; - set_store_value(selectedMessage, $selectedMessage = lastETagId, $selectedMessage); - scrollDown(); - } - - $$self.$$set = $$props => { - if ('websiteOwnerPubkey' in $$props) $$invalidate(0, websiteOwnerPubkey = $$props.websiteOwnerPubkey); - if ('chatConfiguration' in $$props) $$invalidate(1, chatConfiguration = $$props.chatConfiguration); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*chatConfiguration, prevChatConfiguration, $chatAdapter*/ 8198) { - { - if (chatConfiguration !== prevChatConfiguration && prevChatConfiguration && $chatAdapter) { - $chatAdapter.setChatConfiguration(chatConfiguration.chatType, chatConfiguration.chatTags, chatConfiguration.chatReferenceTags); - $$invalidate(3, events = []); - $$invalidate(4, responses = {}); - rootNoteId = null; - localStorage.removeItem('rootNoteId'); - } // rootNoteId = localStorage.getItem('rootNoteId'); - // if (rootNoteId) { - - // $chatAdapter.subscribeToEventAndResponses(rootNoteId); - // } - $$invalidate(13, prevChatConfiguration = chatConfiguration); - } - } - - if ($$self.$$.dirty & /*connectivityStatus*/ 16384) { - { - $$invalidate(6, connectedRelays = Object.values(connectivityStatus).filter(status => status === 'connected').length); - $$invalidate(7, totalRelays = Object.values(connectivityStatus).length); - } - } - - if ($$self.$$.dirty & /*$chatData*/ 32768) { - $$invalidate(5, profiles = $chatData.profiles); - } - }; - - return [ - websiteOwnerPubkey, - chatConfiguration, - $chatAdapter, - events, - responses, - profiles, - connectedRelays, - totalRelays, - $selectedMessage, - getEventById, - sendMessage, - inputKeyDown, - selectParent, - prevChatConfiguration, - connectivityStatus, - $chatData - ]; - } - - class ConnectedWidget extends SvelteComponent { - constructor(options) { - super(); - - init(this, options, instance$2, create_fragment$2, safe_not_equal, { - websiteOwnerPubkey: 0, - chatConfiguration: 1 - }); - } - } - - /* src/Container.svelte generated by Svelte v3.55.1 */ - - function create_else_block$1(ctx) { - let connectedwidget; - let current; - - connectedwidget = new ConnectedWidget({ - props: { - websiteOwnerPubkey: /*websiteOwnerPubkey*/ ctx[1], - chatConfiguration: /*chatConfiguration*/ ctx[2], - relays: /*relays*/ ctx[3] - } - }); - - return { - c() { - create_component(connectedwidget.$$.fragment); - }, - m(target, anchor) { - mount_component(connectedwidget, target, anchor); - current = true; - }, - p(ctx, dirty) { - const connectedwidget_changes = {}; - if (dirty & /*websiteOwnerPubkey*/ 2) connectedwidget_changes.websiteOwnerPubkey = /*websiteOwnerPubkey*/ ctx[1]; - if (dirty & /*chatConfiguration*/ 4) connectedwidget_changes.chatConfiguration = /*chatConfiguration*/ ctx[2]; - if (dirty & /*relays*/ 8) connectedwidget_changes.relays = /*relays*/ ctx[3]; - connectedwidget.$set(connectedwidget_changes); - }, - i(local) { - if (current) return; - transition_in(connectedwidget.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(connectedwidget.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(connectedwidget, detaching); - } - }; - } - - // (14:0) {#if !chatStarted} - function create_if_block$1(ctx) { - let keyprompt; - let current; - - keyprompt = new KeyPrompt({ - props: { - websiteOwnerPubkey: /*websiteOwnerPubkey*/ ctx[1], - chatConfiguration: /*chatConfiguration*/ ctx[2], - relays: /*relays*/ ctx[3] - } - }); - - return { - c() { - create_component(keyprompt.$$.fragment); - }, - m(target, anchor) { - mount_component(keyprompt, target, anchor); - current = true; - }, - p(ctx, dirty) { - const keyprompt_changes = {}; - if (dirty & /*websiteOwnerPubkey*/ 2) keyprompt_changes.websiteOwnerPubkey = /*websiteOwnerPubkey*/ ctx[1]; - if (dirty & /*chatConfiguration*/ 4) keyprompt_changes.chatConfiguration = /*chatConfiguration*/ ctx[2]; - if (dirty & /*relays*/ 8) keyprompt_changes.relays = /*relays*/ ctx[3]; - keyprompt.$set(keyprompt_changes); - }, - i(local) { - if (current) return; - transition_in(keyprompt.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(keyprompt.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(keyprompt, detaching); - } - }; - } - - function create_fragment$1(ctx) { - let current_block_type_index; - let if_block; - let if_block_anchor; - let current; - const if_block_creators = [create_if_block$1, create_else_block$1]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (!/*chatStarted*/ ctx[0]) return 0; - return 1; - } - - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - - return { - c() { - if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - if_blocks[current_block_type_index].m(target, anchor); - insert(target, if_block_anchor, anchor); - current = true; - }, - p(ctx, [dirty]) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); - - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros(); - - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros(); - if_block = if_blocks[current_block_type_index]; - - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); - } else { - if_block.p(ctx, dirty); - } - - transition_in(if_block, 1); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - }, - i(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o(local) { - transition_out(if_block); - current = false; - }, - d(detaching) { - if_blocks[current_block_type_index].d(detaching); - if (detaching) detach(if_block_anchor); - } - }; - } - - function instance$1($$self, $$props, $$invalidate) { - let $chatAdapter; - component_subscribe($$self, chatAdapter, $$value => $$invalidate(4, $chatAdapter = $$value)); - let { websiteOwnerPubkey } = $$props; - let { chatStarted } = $$props; - let { chatConfiguration } = $$props; - let { relays } = $$props; - - $$self.$$set = $$props => { - if ('websiteOwnerPubkey' in $$props) $$invalidate(1, websiteOwnerPubkey = $$props.websiteOwnerPubkey); - if ('chatStarted' in $$props) $$invalidate(0, chatStarted = $$props.chatStarted); - if ('chatConfiguration' in $$props) $$invalidate(2, chatConfiguration = $$props.chatConfiguration); - if ('relays' in $$props) $$invalidate(3, relays = $$props.relays); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*$chatAdapter*/ 16) { - $$invalidate(0, chatStarted = !!$chatAdapter); - } - }; - - return [chatStarted, websiteOwnerPubkey, chatConfiguration, relays, $chatAdapter]; - } - - class Container extends SvelteComponent { - constructor(options) { - super(); - - init(this, options, instance$1, create_fragment$1, safe_not_equal, { - websiteOwnerPubkey: 1, - chatStarted: 0, - chatConfiguration: 2, - relays: 3 - }); - } - } - - /* src/Widget.svelte generated by Svelte v3.55.1 */ - - function create_if_block(ctx) { - let div; - let current_block_type_index; - let if_block; - let div_class_value; - let current; - const if_block_creators = [create_if_block_1, create_else_block]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (!/*dismissedIntro*/ ctx[6]) return 0; - return 1; - } - - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - - return { - c() { - div = element("div"); - if_block.c(); - attr(div, "class", div_class_value = "shadow-2xl bg-white mb-5 w-96 max-w-screen-sm text-black rounded-xl p-5 overflow-scroll " + (/*minimizeChat*/ ctx[7] ? 'hidden' : '') + "" + " svelte-h3q7vr"); - set_style(div, "max-height", "80vh"); - }, - m(target, anchor) { - insert(target, div, anchor); - if_blocks[current_block_type_index].m(div, null); - current = true; - }, - p(ctx, dirty) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); - - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros(); - - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros(); - if_block = if_blocks[current_block_type_index]; - - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); - } else { - if_block.p(ctx, dirty); - } - - transition_in(if_block, 1); - if_block.m(div, null); - } - - if (!current || dirty & /*minimizeChat*/ 128 && div_class_value !== (div_class_value = "shadow-2xl bg-white mb-5 w-96 max-w-screen-sm text-black rounded-xl p-5 overflow-scroll " + (/*minimizeChat*/ ctx[7] ? 'hidden' : '') + "" + " svelte-h3q7vr")) { - attr(div, "class", div_class_value); - } - }, - i(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o(local) { - transition_out(if_block); - current = false; - }, - d(detaching) { - if (detaching) detach(div); - if_blocks[current_block_type_index].d(); - } - }; - } - - // (80:12) {:else} - function create_else_block(ctx) { - let container; - let current; - - container = new Container({ - props: { - websiteOwnerPubkey: /*websiteOwnerPubkey*/ ctx[0], - chatConfiguration: { - chatType: /*chatType*/ ctx[1], - chatTags: /*chatTags*/ ctx[2], - chatReferenceTags: /*chatReferenceTags*/ ctx[3] - }, - relays: /*relays*/ ctx[4] - } - }); - - return { - c() { - create_component(container.$$.fragment); - }, - m(target, anchor) { - mount_component(container, target, anchor); - current = true; - }, - p(ctx, dirty) { - const container_changes = {}; - if (dirty & /*websiteOwnerPubkey*/ 1) container_changes.websiteOwnerPubkey = /*websiteOwnerPubkey*/ ctx[0]; - - if (dirty & /*chatType, chatTags, chatReferenceTags*/ 14) container_changes.chatConfiguration = { - chatType: /*chatType*/ ctx[1], - chatTags: /*chatTags*/ ctx[2], - chatReferenceTags: /*chatReferenceTags*/ ctx[3] - }; - - if (dirty & /*relays*/ 16) container_changes.relays = /*relays*/ ctx[4]; - container.$set(container_changes); - }, - i(local) { - if (current) return; - transition_in(container.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(container.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(container, detaching); - } - }; - } - - // (34:12) {#if !dismissedIntro} - function create_if_block_1(ctx) { - let h1; - let t1; - let p0; - let t3; - let p1; - let t5; - let p2; - let t9; - let p3; - let t11; - let button; - let mounted; - let dispose; - - return { - c() { - h1 = element("h1"); - h1.textContent = "EinundzwanzigNostr"; - t1 = space(); - p0 = element("p"); - p0.textContent = "This is a FOSS chat app built on top of the Nostr protocol."; - t3 = space(); - p1 = element("p"); - p1.textContent = "Choose how you would like to chat:"; - t5 = space(); - p2 = element("p"); - - p2.innerHTML = `You can use it to ask for help - PSBT.io - to the creators of this site or to - anyone willing to help.`; - - t9 = space(); - p3 = element("p"); - p3.textContent = "Keep in mind that this chat is public,\n anyone can read it, so don't exchange\n private information and use common-sense."; - t11 = space(); - button = element("button"); - button.textContent = "Continue"; - attr(h1, "class", "font-bold text-2xl text-purple-700 svelte-h3q7vr"); - attr(p0, "class", "text-gray-700 mb-3 svelte-h3q7vr"); - attr(p1, "class", "text-gray-700 mb-3 svelte-h3q7vr"); - attr(p2, "class", "text-gray-700 mb-3 svelte-h3q7vr"); - attr(p3, "class", "text-gray-700 mb-3 svelte-h3q7vr"); - attr(button, "class", "bg-purple-900 hover:bg-purple-700 w-full p-2 py-4 text-xl mt-3 rounded-xl text-center font-semibold tracking-wide uppercase text-white svelte-h3q7vr"); - }, - m(target, anchor) { - insert(target, h1, anchor); - insert(target, t1, anchor); - insert(target, p0, anchor); - insert(target, t3, anchor); - insert(target, p1, anchor); - insert(target, t5, anchor); - insert(target, p2, anchor); - insert(target, t9, anchor); - insert(target, p3, anchor); - insert(target, t11, anchor); - insert(target, button, anchor); - - if (!mounted) { - dispose = listen(button, "click", /*dismissIntro*/ ctx[9]); - mounted = true; - } - }, - p: noop, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(h1); - if (detaching) detach(t1); - if (detaching) detach(p0); - if (detaching) detach(t3); - if (detaching) detach(p1); - if (detaching) detach(t5); - if (detaching) detach(p2); - if (detaching) detach(t9); - if (detaching) detach(p3); - if (detaching) detach(t11); - if (detaching) detach(button); - mounted = false; - dispose(); - } - }; - } - - function create_fragment(ctx) { - let div1; - let t0; - let div0; - let a; - let current; - let mounted; - let dispose; - let if_block = /*showChat*/ ctx[5] && create_if_block(ctx); - - return { - c() { - div1 = element("div"); - if (if_block) if_block.c(); - t0 = space(); - div0 = element("div"); - a = element("a"); - - a.innerHTML = `Einundzwanzig.Nostr - - -\t -\t\t -\t - -`; - - attr(a, "href", "#"); - attr(a, "class", "text-white bg-purple-900 hover:bg-purple-700 w-full p-5 rounded-full flex-shrink-1 text-center font-semibold flex flex-row items-center gap-4 svelte-h3q7vr"); - attr(div0, "class", "self-end svelte-h3q7vr"); - attr(div1, "class", "fixed bottom-5 right-5 mb-5 flex flex-col item-end font-sans svelte-h3q7vr"); - }, - m(target, anchor) { - insert(target, div1, anchor); - if (if_block) if_block.m(div1, null); - append(div1, t0); - append(div1, div0); - append(div0, a); - current = true; - - if (!mounted) { - dispose = listen(a, "click", prevent_default(/*toggleChat*/ ctx[8])); - mounted = true; - } - }, - p(ctx, [dirty]) { - if (/*showChat*/ ctx[5]) { - if (if_block) { - if_block.p(ctx, dirty); - - if (dirty & /*showChat*/ 32) { - transition_in(if_block, 1); - } - } else { - if_block = create_if_block(ctx); - if_block.c(); - transition_in(if_block, 1); - if_block.m(div1, t0); - } - } else if (if_block) { - group_outros(); - - transition_out(if_block, 1, 1, () => { - if_block = null; - }); - - check_outros(); - } - }, - i(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o(local) { - transition_out(if_block); - current = false; - }, - d(detaching) { - if (detaching) detach(div1); - if (if_block) if_block.d(); - mounted = false; - dispose(); - } - }; - } - - function instance($$self, $$props, $$invalidate) { - let { websiteOwnerPubkey } = $$props; - let { chatType } = $$props; - let { chatTags } = $$props; - let { chatReferenceTags } = $$props; - let { relays } = $$props; - let showChat = false; - let dismissedIntro = true; - let minimizeChat = false; - - function toggleChat() { - if (showChat) { - $$invalidate(7, minimizeChat = !minimizeChat); - } else { - $$invalidate(5, showChat = !showChat); - } - } - - function dismissIntro() { - $$invalidate(6, dismissedIntro = true); - } - - $$self.$$set = $$props => { - if ('websiteOwnerPubkey' in $$props) $$invalidate(0, websiteOwnerPubkey = $$props.websiteOwnerPubkey); - if ('chatType' in $$props) $$invalidate(1, chatType = $$props.chatType); - if ('chatTags' in $$props) $$invalidate(2, chatTags = $$props.chatTags); - if ('chatReferenceTags' in $$props) $$invalidate(3, chatReferenceTags = $$props.chatReferenceTags); - if ('relays' in $$props) $$invalidate(4, relays = $$props.relays); - }; - - return [ - websiteOwnerPubkey, - chatType, - chatTags, - chatReferenceTags, - relays, - showChat, - dismissedIntro, - minimizeChat, - toggleChat, - dismissIntro - ]; - } - - class Widget extends SvelteComponent { - constructor(options) { - super(); - - init(this, options, instance, create_fragment, safe_not_equal, { - websiteOwnerPubkey: 0, - chatType: 1, - chatTags: 2, - chatReferenceTags: 3, - relays: 4 - }); - } - } - - var div = document.createElement('DIV'); - var script = document.currentScript; - const websiteOwnerPubkey = script.getAttribute('data-website-owner-pubkey'); - const chatType = script.getAttribute('data-chat-type'); - let chatTags = script.getAttribute('data-chat-tags'); - let chatReferenceTags = script.getAttribute('data-chat-reference-tags'); - let relays = script.getAttribute('data-relays'); - script.parentNode.insertBefore(div, script); - - if (!relays) { - relays = 'wss://relay.f7z.io,wss://nos.lol,wss://relay.nostr.info,wss://nostr-pub.wellorder.net,wss://relay.current.fyi,wss://relay.nostr.band'; - } - - relays = relays.split(','); - chatTags = chatTags ? chatTags.split(',') : []; - chatReferenceTags = chatReferenceTags ? chatReferenceTags.split(',') : []; - - new Widget({ - target: div, - props: { - websiteOwnerPubkey, - chatType, - chatTags, - chatReferenceTags, - relays - }, - }); - -})(); -//# sourceMappingURL=bundle.js.map diff --git a/public/dist/filepond-plugin-image-edit.css b/public/dist/filepond-plugin-image-edit.css deleted file mode 100644 index 52ffb6d..0000000 --- a/public/dist/filepond-plugin-image-edit.css +++ /dev/null @@ -1,47 +0,0 @@ -/*! - * FilePondPluginImageEdit 1.6.3 - * Licensed under MIT, https://opensource.org/licenses/MIT/ - * Please visit https://pqina.nl/filepond/ for details. - */ - -/* eslint-disable */ -.filepond--action-edit-item.filepond--action-edit-item { - width: 2em; - height: 2em; - padding: 0.1875em; -} - -.filepond--action-edit-item.filepond--action-edit-item[data-align*='center'] { - margin-left: -0.1875em; -} - -.filepond--action-edit-item.filepond--action-edit-item[data-align*='bottom'] { - margin-bottom: -0.1875em; -} - -.filepond--action-edit-item-alt { - border: none; - line-height: inherit; - background: transparent; - font-family: inherit; - color: inherit; - outline: none; - padding: 0; - margin: 0 0 0 0.25em; - pointer-events: all; - position: absolute; -} - -.filepond--action-edit-item-alt svg { - width: 1.3125em; - height: 1.3125em; -} - -.filepond--action-edit-item-alt span { - font-size: 0; - opacity: 0; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--action-edit-item { - opacity: 1 !important; - visibility: visible !important; -} diff --git a/public/dist/filepond.css b/public/dist/filepond.css deleted file mode 100644 index a53b54e..0000000 --- a/public/dist/filepond.css +++ /dev/null @@ -1,1047 +0,0 @@ -/*! - * FilePond 4.30.4 - * Licensed under MIT, https://opensource.org/licenses/MIT/ - * Please visit https://pqina.nl/filepond/ for details. - */ - -/* eslint-disable */ -.filepond--assistant { - position: absolute; - overflow: hidden; - height: 1px; - width: 1px; - padding: 0; - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - white-space: nowrap; -} -/* Hard to override styles */ -.filepond--browser.filepond--browser { - /* is positioned absolute so it is focusable for form validation errors */ - position: absolute; - margin: 0; - padding: 0; - - /* is positioned ~behind drop label */ - left: 1em; - top: 1.75em; - width: calc(100% - 2em); - - /* hide visually */ - opacity: 0; - font-size: 0; /* removes text cursor in Internet Explorer 11 */ -} -.filepond--data { - position: absolute; - width: 0; - height: 0; - padding: 0; - margin: 0; - border: none; - visibility: hidden; - pointer-events: none; - contain: strict; -} -.filepond--drip { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - opacity: 0.1; - - /* can't interact with this element */ - pointer-events: none; - - /* inherit border radius from parent (needed for drip-blob cut of) */ - border-radius: 0.5em; - - /* this seems to prevent Chrome from redrawing this layer constantly */ - background: rgba(0, 0, 0, 0.01); -} -.filepond--drip-blob { - position: absolute; - -webkit-transform-origin: center center; - transform-origin: center center; - top: 0; - left: 0; - width: 8em; - height: 8em; - margin-left: -4em; - margin-top: -4em; - background: #292625; - border-radius: 50%; - - /* will be animated */ - will-change: transform, opacity; -} -.filepond--drop-label { - position: absolute; - left: 0; - right: 0; - top: 0; - margin: 0; - color: #4f4f4f; - - /* center contents */ - display: flex; - justify-content: center; - align-items: center; - - /* fixes IE11 centering problems (is overruled by label min-height) */ - height: 0px; - - /* dont allow selection */ - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* will be animated */ - will-change: transform, opacity; -} -/* Hard to override styles on purpose */ -.filepond--drop-label.filepond--drop-label label { - display: block; - margin: 0; - padding: 0.5em; /* use padding instead of margin so click area is not impacted */ -} -.filepond--drop-label label { - cursor: default; - font-size: 0.875em; - font-weight: normal; - text-align: center; - line-height: 1.5; -} -.filepond--label-action { - text-decoration: underline; - -webkit-text-decoration-skip: ink; - text-decoration-skip-ink: auto; - -webkit-text-decoration-color: #a7a4a4; - text-decoration-color: #a7a4a4; - cursor: pointer; -} -.filepond--root[data-disabled] .filepond--drop-label label { - opacity: 0.5; -} -/* Hard to override styles */ -.filepond--file-action-button.filepond--file-action-button { - font-size: 1em; - width: 1.625em; - height: 1.625em; - - font-family: inherit; - line-height: inherit; - - margin: 0; - padding: 0; - border: none; - outline: none; - - will-change: transform, opacity; - - /* hidden label */ -} -.filepond--file-action-button.filepond--file-action-button span { - position: absolute; - overflow: hidden; - height: 1px; - width: 1px; - padding: 0; - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - white-space: nowrap; -} -.filepond--file-action-button.filepond--file-action-button { - /* scale SVG to fill button */ -} -.filepond--file-action-button.filepond--file-action-button svg { - width: 100%; - height: 100%; -} -.filepond--file-action-button.filepond--file-action-button { - /* bigger touch area */ -} -.filepond--file-action-button.filepond--file-action-button::after { - position: absolute; - left: -0.75em; - right: -0.75em; - top: -0.75em; - bottom: -0.75em; - content: ''; -} -/* Soft styles */ -.filepond--file-action-button { - /* use default arrow cursor */ - cursor: auto; - - /* reset default button styles */ - color: #fff; - - /* set default look n feel */ - border-radius: 50%; - background-color: rgba(0, 0, 0, 0.5); - background-image: none; - - /* we animate box shadow on focus */ - /* it's only slightly slower than animating */ - /* a pseudo-element with transforms and renders */ - /* a lot better on chrome */ - box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); - transition: box-shadow 0.25s ease-in; -} -.filepond--file-action-button:hover, -.filepond--file-action-button:focus { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.9); -} -.filepond--file-action-button[disabled] { - color: rgba(255, 255, 255, 0.5); - background-color: rgba(0, 0, 0, 0.25); -} -.filepond--file-action-button[hidden] { - display: none; -} -/* edit button */ -.filepond--action-edit-item.filepond--action-edit-item { - width: 2em; - height: 2em; - padding: 0.1875em; -} -.filepond--action-edit-item.filepond--action-edit-item[data-align*='center'] { - margin-left: -0.1875em; -} -.filepond--action-edit-item.filepond--action-edit-item[data-align*='bottom'] { - margin-bottom: -0.1875em; -} -.filepond--action-edit-item-alt { - border: none; - line-height: inherit; - background: transparent; - font-family: inherit; - color: inherit; - outline: none; - padding: 0; - margin: 0 0 0 0.25em; - pointer-events: all; - position: absolute; -} -.filepond--action-edit-item-alt svg { - width: 1.3125em; - height: 1.3125em; -} -.filepond--action-edit-item-alt span { - font-size: 0; - opacity: 0; -} -.filepond--file-info { - position: static; - display: flex; - flex-direction: column; - align-items: flex-start; - flex: 1; - margin: 0 0.5em 0 0; - min-width: 0; - - /* will be animated */ - will-change: transform, opacity; - - /* can't do anything with this info */ - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* no margins on children */ -} -.filepond--file-info * { - margin: 0; -} -.filepond--file-info { - /* we don't want to have these overrules so these selectors are a bit more specific */ -} -.filepond--file-info .filepond--file-info-main { - font-size: 0.75em; - line-height: 1.2; - - /* we want ellipsis if this bar gets too wide */ - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - width: 100%; -} -.filepond--file-info .filepond--file-info-sub { - font-size: 0.625em; - opacity: 0.5; - transition: opacity 0.25s ease-in-out; - white-space: nowrap; -} -.filepond--file-info .filepond--file-info-sub:empty { - display: none; -} -.filepond--file-status { - position: static; - display: flex; - flex-direction: column; - align-items: flex-end; - flex-grow: 0; - flex-shrink: 0; - - margin: 0; - min-width: 2.25em; - text-align: right; - - /* will be animated */ - will-change: transform, opacity; - - /* can't do anything with this info */ - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* no margins on children */ -} -.filepond--file-status * { - margin: 0; - white-space: nowrap; -} -.filepond--file-status { - /* font sizes */ -} -.filepond--file-status .filepond--file-status-main { - font-size: 0.75em; - line-height: 1.2; -} -.filepond--file-status .filepond--file-status-sub { - font-size: 0.625em; - opacity: 0.5; - transition: opacity 0.25s ease-in-out; -} -/* Hard to override styles */ -.filepond--file-wrapper.filepond--file-wrapper { - border: none; - margin: 0; - padding: 0; - min-width: 0; - height: 100%; - - /* hide legend for visual users */ -} -.filepond--file-wrapper.filepond--file-wrapper > legend { - position: absolute; - overflow: hidden; - height: 1px; - width: 1px; - padding: 0; - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - white-space: nowrap; -} -.filepond--file { - position: static; - display: flex; - height: 100%; - align-items: flex-start; - - padding: 0.5625em 0.5625em; - - color: #fff; - border-radius: 0.5em; - - /* control positions */ -} -.filepond--file .filepond--file-status { - margin-left: auto; - margin-right: 2.25em; -} -.filepond--file .filepond--processing-complete-indicator { - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - z-index: 3; -} -.filepond--file .filepond--processing-complete-indicator, -.filepond--file .filepond--progress-indicator, -.filepond--file .filepond--file-action-button { - position: absolute; -} -.filepond--file { - /* .filepond--file-action-button */ -} -.filepond--file [data-align*='left'] { - left: 0.5625em; -} -.filepond--file [data-align*='right'] { - right: 0.5625em; -} -.filepond--file [data-align*='center'] { - left: calc(50% - 0.8125em); /* .8125 is half of button width */ -} -.filepond--file [data-align*='bottom'] { - bottom: 1.125em; -} -.filepond--file [data-align='center'] { - top: calc(50% - 0.8125em); -} -.filepond--file .filepond--progress-indicator { - margin-top: 0.1875em; -} -.filepond--file .filepond--progress-indicator[data-align*='right'] { - margin-right: 0.1875em; -} -.filepond--file .filepond--progress-indicator[data-align*='left'] { - margin-left: 0.1875em; -} -/* make sure text does not overlap */ -[data-filepond-item-state='cancelled'] .filepond--file-info, -[data-filepond-item-state*='invalid'] .filepond--file-info, -[data-filepond-item-state*='error'] .filepond--file-info { - margin-right: 2.25em; -} -[data-filepond-item-state~='processing'] .filepond--file-status-sub { - opacity: 0; -} -[data-filepond-item-state~='processing'] - .filepond--action-abort-item-processing - ~ .filepond--file-status - .filepond--file-status-sub { - opacity: 0.5; -} -[data-filepond-item-state='processing-error'] .filepond--file-status-sub { - opacity: 0; -} -[data-filepond-item-state='processing-error'] - .filepond--action-retry-item-processing - ~ .filepond--file-status - .filepond--file-status-sub { - opacity: 0.5; -} -[data-filepond-item-state='processing-complete'] { - /* busy state */ -} -[data-filepond-item-state='processing-complete'] .filepond--action-revert-item-processing svg { - -webkit-animation: fall 0.5s 0.125s linear both; - animation: fall 0.5s 0.125s linear both; -} -[data-filepond-item-state='processing-complete'] { - /* hide details by default, only show when can revert */ -} -[data-filepond-item-state='processing-complete'] .filepond--file-status-sub { - opacity: 0.5; -} -[data-filepond-item-state='processing-complete'] - .filepond--processing-complete-indicator:not([style*='hidden']) - ~ .filepond--file-status - .filepond--file-status-sub { - opacity: 0; -} -[data-filepond-item-state='processing-complete'] .filepond--file-info-sub { - opacity: 0; -} -[data-filepond-item-state='processing-complete'] - .filepond--action-revert-item-processing - ~ .filepond--file-info - .filepond--file-info-sub { - opacity: 0.5; -} -/* file state can be invalid or error, both are visually similar but */ -/* having them as separate states might be useful */ -[data-filepond-item-state*='invalid'] .filepond--panel, -[data-filepond-item-state*='invalid'] .filepond--file-wrapper, -[data-filepond-item-state*='error'] .filepond--panel, -[data-filepond-item-state*='error'] .filepond--file-wrapper { - -webkit-animation: shake 0.65s linear both; - animation: shake 0.65s linear both; -} -/* spins progress indicator when file is marked as busy */ -[data-filepond-item-state*='busy'] .filepond--progress-indicator svg { - -webkit-animation: spin 1s linear infinite; - animation: spin 1s linear infinite; -} -/** - * States - */ -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - - 100% { - -webkit-transform: rotateZ(360deg); - transform: rotateZ(360deg); - } -} -@keyframes spin { - 0% { - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - - 100% { - -webkit-transform: rotateZ(360deg); - transform: rotateZ(360deg); - } -} -@-webkit-keyframes shake { - 10%, - 90% { - -webkit-transform: translateX(-0.0625em); - transform: translateX(-0.0625em); - } - - 20%, - 80% { - -webkit-transform: translateX(0.125em); - transform: translateX(0.125em); - } - - 30%, - 50%, - 70% { - -webkit-transform: translateX(-0.25em); - transform: translateX(-0.25em); - } - - 40%, - 60% { - -webkit-transform: translateX(0.25em); - transform: translateX(0.25em); - } -} -@keyframes shake { - 10%, - 90% { - -webkit-transform: translateX(-0.0625em); - transform: translateX(-0.0625em); - } - - 20%, - 80% { - -webkit-transform: translateX(0.125em); - transform: translateX(0.125em); - } - - 30%, - 50%, - 70% { - -webkit-transform: translateX(-0.25em); - transform: translateX(-0.25em); - } - - 40%, - 60% { - -webkit-transform: translateX(0.25em); - transform: translateX(0.25em); - } -} -@-webkit-keyframes fall { - 0% { - opacity: 0; - -webkit-transform: scale(0.5); - transform: scale(0.5); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 70% { - opacity: 1; - -webkit-transform: scale(1.1); - transform: scale(1.1); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -@keyframes fall { - 0% { - opacity: 0; - -webkit-transform: scale(0.5); - transform: scale(0.5); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 70% { - opacity: 1; - -webkit-transform: scale(1.1); - transform: scale(1.1); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -/* ignore all other interaction elements while dragging a file */ -.filepond--hopper[data-hopper-state='drag-over'] > * { - pointer-events: none; -} -/* capture all hit tests using a hidden layer, this speeds up the event flow */ -.filepond--hopper[data-hopper-state='drag-over']::after { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - z-index: 100; -} -.filepond--progress-indicator { - z-index: 103; -} -.filepond--file-action-button { - z-index: 102; -} -.filepond--file-status { - z-index: 101; -} -.filepond--file-info { - z-index: 100; -} -.filepond--item { - position: absolute; - top: 0; - left: 0; - right: 0; - z-index: 1; - - padding: 0; - margin: 0.25em; - - will-change: transform, opacity; - - /* item children order */ -} -.filepond--item > .filepond--panel { - z-index: -1; -} -/* has a slight shadow */ -.filepond--item > .filepond--panel .filepond--panel-bottom { - box-shadow: 0 0.0625em 0.125em -0.0625em rgba(0, 0, 0, 0.25); -} -.filepond--item { - /* drag related */ -} -.filepond--item > .filepond--file-wrapper, -.filepond--item > .filepond--panel { - transition: opacity 0.15s ease-out; -} -.filepond--item[data-drag-state] { - cursor: -webkit-grab; - cursor: grab; -} -.filepond--item[data-drag-state] > .filepond--panel { - transition: box-shadow 0.125s ease-in-out; - box-shadow: 0 0 0 rgba(0, 0, 0, 0); -} -.filepond--item[data-drag-state='drag'] { - cursor: -webkit-grabbing; - cursor: grabbing; -} -.filepond--item[data-drag-state='drag'] > .filepond--panel { - box-shadow: 0 0.125em 0.3125em rgba(0, 0, 0, 0.325); -} -.filepond--item[data-drag-state]:not([data-drag-state='idle']) { - z-index: 2; -} -/* states */ -.filepond--item-panel { - background-color: #64605e; -} -[data-filepond-item-state='processing-complete'] .filepond--item-panel { - background-color: #369763; -} -[data-filepond-item-state*='invalid'] .filepond--item-panel, -[data-filepond-item-state*='error'] .filepond--item-panel { - background-color: #c44e47; -} -/* style of item panel */ -.filepond--item-panel { - border-radius: 0.5em; - transition: background-color 0.25s; -} -/* normal mode */ -.filepond--list-scroller { - position: absolute; - top: 0; - left: 0; - right: 0; - margin: 0; - will-change: transform; -} -/* scroll mode */ -.filepond--list-scroller[data-state='overflow'] .filepond--list { - bottom: 0; - right: 0; -} -.filepond--list-scroller[data-state='overflow'] { - overflow-y: scroll; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - -webkit-mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%); - mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%); -} -/* style scrollbar */ -.filepond--list-scroller::-webkit-scrollbar { - background: transparent; -} -.filepond--list-scroller::-webkit-scrollbar:vertical { - width: 1em; -} -.filepond--list-scroller::-webkit-scrollbar:horizontal { - height: 0; -} -.filepond--list-scroller::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.3); - border-radius: 99999px; - border: 0.3125em solid transparent; - background-clip: content-box; -} -/* hard to overide styles on purpose */ -.filepond--list.filepond--list { - position: absolute; - top: 0; - margin: 0; - padding: 0; - list-style-type: none; - - /* prevents endless paint calls on filepond--list-scroller */ - will-change: transform; -} -/* used for padding so allowed to be restyled */ -.filepond--list { - left: 0.75em; - right: 0.75em; -} -.filepond--root[data-style-panel-layout~='integrated'] { - width: 100%; - height: 100%; - max-width: none; - margin: 0; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root { - border-radius: 0; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root > *, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root > * { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--drop-label, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label { - bottom: 0; - height: auto; - display: flex; - justify-content: center; - align-items: center; - z-index: 7; -} -.filepond--root[data-style-panel-layout~='circle'], -.filepond--root[data-style-panel-layout~='integrated'] { - /* we're only loading one item, this makes the intro animation a bit nicer */ -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--item-panel, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--item-panel { - display: none; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--list-scroller, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--list-scroller { - overflow: hidden; - height: 100%; - margin-top: 0; - margin-bottom: 0; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--list, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--list { - left: 0; - right: 0; - height: 100%; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--item, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--item { - margin: 0; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--file-wrapper, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--file-wrapper { - height: 100%; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--drop-label, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label { - z-index: 7; -} -.filepond--root[data-style-panel-layout~='circle'] { - border-radius: 99999rem; - overflow: hidden; -} -.filepond--root[data-style-panel-layout~='circle'] > .filepond--panel { - border-radius: inherit; -} -.filepond--root[data-style-panel-layout~='circle'] > .filepond--panel > * { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] { - /* circle cuts of this info, so best to hide it */ -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--file-info { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--file-status { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--action-edit-item { - opacity: 1 !important; - visibility: visible !important; -} -/* dirfty way to fix circular overflow issue on safari 11+ */ -@media not all and (min-resolution: 0.001dpcm) { - @supports (-webkit-appearance: none) and (stroke-color: transparent) { - .filepond--root[data-style-panel-layout~='circle'] { - will-change: transform; - } - } -} -.filepond--panel-root { - border-radius: 0.5em; - background-color: #f1f0ef; -} -.filepond--panel { - position: absolute; - left: 0; - top: 0; - right: 0; - margin: 0; - - /* defaults to 100% height (fixed height mode) this fixes problem with panel height in IE11 */ - height: 100% !important; - - /* no interaction possible with panel */ - pointer-events: none; -} -.filepond-panel:not([data-scalable='false']) { - height: auto !important; -} -.filepond--panel[data-scalable='false'] > div { - display: none; -} -.filepond--panel[data-scalable='true'] { - /* this seems to fix Chrome performance issues */ - /* - when box-shadow is enabled */ - /* - when multiple ponds are active on the same page */ - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - - /* prevent borders and backgrounds */ - background-color: transparent !important; - border: none !important; -} -.filepond--panel-top, -.filepond--panel-bottom, -.filepond--panel-center { - position: absolute; - left: 0; - top: 0; - right: 0; - margin: 0; - padding: 0; -} -.filepond--panel-top, -.filepond--panel-bottom { - height: 0.5em; -} -.filepond--panel-top { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; - border-bottom: none !important; - - /* fixes tiny transparant line between top and center panel */ -} -.filepond--panel-top::after { - content: ''; - position: absolute; - height: 2px; - left: 0; - right: 0; - bottom: -1px; - background-color: inherit; -} -.filepond--panel-center, -.filepond--panel-bottom { - will-change: transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transform-origin: left top; - transform-origin: left top; - -webkit-transform: translate3d(0, 0.5em, 0); - transform: translate3d(0, 0.5em, 0); -} -.filepond--panel-bottom { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; - border-top: none !important; - - /* fixes tiny transparant line between bottom and center of panel */ -} -.filepond--panel-bottom::before { - content: ''; - position: absolute; - height: 2px; - left: 0; - right: 0; - top: -1px; - background-color: inherit; -} -.filepond--panel-center { - /* the center panel is scaled using scale3d to fit the correct height */ - /* we use 100px instead of 1px as scaling 1px to a huge height is really laggy on chrome */ - height: 100px !important; - border-top: none !important; - border-bottom: none !important; - border-radius: 0 !important; - - /* hide if not transformed, prevents a little flash when the panel is at 100px height while attached for first time */ -} -.filepond--panel-center:not([style]) { - visibility: hidden; -} -.filepond--progress-indicator { - position: static; - width: 1.25em; - height: 1.25em; - - color: #fff; - - /* can't have margins */ - margin: 0; - - /* no interaction possible with progress indicator */ - pointer-events: none; - - /* will be animated */ - will-change: transform, opacity; -} -.filepond--progress-indicator svg { - width: 100%; - height: 100%; - vertical-align: top; - transform-box: fill-box; /* should center the animation correctly when zoomed in */ -} -.filepond--progress-indicator path { - fill: none; - stroke: currentColor; -} -.filepond--list-scroller { - z-index: 6; -} -.filepond--drop-label { - z-index: 5; -} -.filepond--drip { - z-index: 3; -} -.filepond--root > .filepond--panel { - z-index: 2; -} -.filepond--browser { - z-index: 1; -} -.filepond--root { - /* layout*/ - box-sizing: border-box; - position: relative; - margin-bottom: 1em; - - /* base font size for whole component */ - font-size: 1rem; - - /* base line height */ - line-height: normal; - - /* up uses default system font family */ - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - - /* will increase font weight a bit on Safari */ - font-weight: 450; - - /* default text alignment */ - text-align: left; - - /* better text rendering on Safari */ - text-rendering: optimizeLegibility; - - /* text direction is ltr for now */ - direction: ltr; - - /* optimize rendering */ - /* https://developer.mozilla.org/en-US/docs/Web/CSS/contain */ - contain: layout style size; - - /* correct box sizing, line-height and positioning on child elements */ -} -.filepond--root * { - box-sizing: inherit; - line-height: inherit; -} -.filepond--root *:not(text) { - font-size: inherit; -} -.filepond--root { - /* block everything */ -} -.filepond--root[data-disabled] { - pointer-events: none; -} -.filepond--root[data-disabled] .filepond--list-scroller { - pointer-events: all; -} -.filepond--root[data-disabled] .filepond--list { - pointer-events: none; -} -/** - * Root element children layout - */ -.filepond--root .filepond--drop-label { - min-height: 4.75em; -} -.filepond--root .filepond--list-scroller { - margin-top: 1em; - margin-bottom: 1em; -} -.filepond--root .filepond--credits { - position: absolute; - right: 0; - opacity: 0.175; - line-height: 0.85; - font-size: 11px; - color: inherit; - text-decoration: none; - z-index: 3; - bottom: -14px; -} -.filepond--root .filepond--credits[style] { - top: 0; - bottom: auto; - margin-top: 14px; -} diff --git a/public/img/meetup_saarland.jpg b/public/img/meetup_saarland.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21fe5c4516efca5ec60f526b0a35c5a25eb61d6d GIT binary patch literal 264638 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

98~f|py`?KDqTHF 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 z
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

~X1rR+t0Trbuo8jVLg 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 KnO}qZKmXaT`B63i literal 0 HcmV?d00001 diff --git a/resources/css/app.css b/resources/css/app.css index efdf270..5693dd3 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,3 +1,6 @@ +@import 'utility-patterns.css'; +@import 'flatpickr.css'; + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/resources/css/flatpickr.css b/resources/css/flatpickr.css new file mode 100644 index 0000000..909665e --- /dev/null +++ b/resources/css/flatpickr.css @@ -0,0 +1,237 @@ +/* Customise flatpickr */ +* { + --calendarPadding: 24px; + --daySize: 36px; + --daysWidth: calc(var(--daySize)*7); +} + +@keyframes fpFadeInDown { + from { + opacity: 0; + transform: translate3d(0, -8px, 0); + } + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +.flatpickr-calendar { + border: inherit; + @apply bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700/60 left-1/2; + margin-left: calc(calc(var(--daysWidth) + calc(var(--calendarPadding)*2))*0.5*-1); + padding: var(--calendarPadding); + width: calc(var(--daysWidth) + calc(var(--calendarPadding)*2)); +} + +@screen lg { + .flatpickr-calendar { + @apply left-0 right-auto; + margin-left: 0; + } +} + +.flatpickr-right.flatpickr-calendar { + @apply right-0 left-auto; + margin-left: 0; +} + +.flatpickr-calendar.animate.open { + animation: fpFadeInDown 200ms ease-out; +} + +.flatpickr-calendar.static { + position: absolute; + top: calc(100% + 4px); +} + +.flatpickr-calendar.static.open { + z-index: 20; +} + +.flatpickr-days { + width: var(--daysWidth); +} + +.dayContainer { + width: var(--daysWidth); + min-width: var(--daysWidth); + max-width: var(--daysWidth); +} + +.flatpickr-day { + @apply bg-gray-50 dark:bg-gray-700/20 text-sm font-medium text-gray-600 dark:text-gray-100; + max-width: var(--daySize); + height: var(--daySize); + line-height: var(--daySize); +} + +.flatpickr-day, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay { + border: none; +} + +.flatpickr-day.flatpickr-disabled, +.flatpickr-day.flatpickr-disabled:hover, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay, +.flatpickr-day.notAllowed, +.flatpickr-day.notAllowed.prevMonthDay, +.flatpickr-day.notAllowed.nextMonthDay { + @apply bg-transparent; +} + +.flatpickr-day, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay, +.flatpickr-day.selected.startRange, +.flatpickr-day.startRange.startRange, +.flatpickr-day.endRange.startRange, +.flatpickr-day.selected.endRange, +.flatpickr-day.startRange.endRange, +.flatpickr-day.endRange.endRange, +.flatpickr-day.selected.startRange.endRange, +.flatpickr-day.startRange.startRange.endRange, +.flatpickr-day.endRange.startRange.endRange { + border-radius: 0; +} + +.flatpickr-day.flatpickr-disabled, +.flatpickr-day.flatpickr-disabled:hover, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay, +.flatpickr-day.notAllowed, +.flatpickr-day.notAllowed.prevMonthDay, +.flatpickr-day.notAllowed.nextMonthDay { + @apply text-gray-400 dark:text-gray-500; +} + +.rangeMode .flatpickr-day { + margin: 0; +} + +.flatpickr-day.selected, +.flatpickr-day.startRange, +.flatpickr-day.endRange, +.flatpickr-day.selected.inRange, +.flatpickr-day.startRange.inRange, +.flatpickr-day.endRange.inRange, +.flatpickr-day.selected:focus, +.flatpickr-day.startRange:focus, +.flatpickr-day.endRange:focus, +.flatpickr-day.selected:hover, +.flatpickr-day.startRange:hover, +.flatpickr-day.endRange:hover, +.flatpickr-day.selected.prevMonthDay, +.flatpickr-day.startRange.prevMonthDay, +.flatpickr-day.endRange.prevMonthDay, +.flatpickr-day.selected.nextMonthDay, +.flatpickr-day.startRange.nextMonthDay, +.flatpickr-day.endRange.nextMonthDay { + @apply bg-violet-600 text-violet-50; +} + +.flatpickr-day.inRange, +.flatpickr-day.prevMonthDay.inRange, +.flatpickr-day.nextMonthDay.inRange, +.flatpickr-day.today.inRange, +.flatpickr-day.prevMonthDay.today.inRange, +.flatpickr-day.nextMonthDay.today.inRange, +.flatpickr-day:hover, +.flatpickr-day.prevMonthDay:hover, +.flatpickr-day.nextMonthDay:hover, +.flatpickr-day:focus, +.flatpickr-day.prevMonthDay:focus, +.flatpickr-day.nextMonthDay:focus, +.flatpickr-day.today:hover, +.flatpickr-day.today:focus { + @apply bg-violet-500 text-violet-50; +} + +.flatpickr-day.inRange, +.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)), +.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)), +.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)) { + box-shadow: none; +} + +.flatpickr-months { + align-items: center; + margin-top: -8px; + margin-bottom: 6px; +} + +.flatpickr-months .flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month { + position: static; + height: auto; + @apply text-gray-400 hover:text-gray-900 dark:text-gray-500 dark:hover:text-gray-300; +} + +.flatpickr-months .flatpickr-prev-month svg, +.flatpickr-months .flatpickr-next-month svg { + width: 7px; + height: 11px; + fill: currentColor; +} + +.flatpickr-months .flatpickr-prev-month:hover svg, +.flatpickr-months .flatpickr-next-month:hover svg { + @apply fill-current; +} + +.flatpickr-months .flatpickr-prev-month { + margin-left: -10px; +} + +.flatpickr-months .flatpickr-next-month { + margin-right: -10px; +} + +.flatpickr-months .flatpickr-month { + @apply text-gray-800 dark:text-gray-100; + height: auto; + line-height: inherit; +} + +.flatpickr-current-month { + @apply text-sm font-medium; + position: static; + height: auto; + width: auto; + left: auto; + padding: 0; +} + +.flatpickr-current-month span.cur-month { + @apply font-medium m-0; +} + +.flatpickr-current-month span.cur-month:hover { + background: none; +} + +.flatpickr-current-month input.cur-year { + font-weight: inherit; + box-shadow: none !important; +} + +.numInputWrapper:hover { + background: none; +} + +.numInputWrapper span { + display: none; +} + +span.flatpickr-weekday { + @apply text-gray-400 dark:text-gray-500 font-medium text-xs; +} + +.flatpickr-calendar.arrowTop::before, +.flatpickr-calendar.arrowTop::after, +.flatpickr-calendar.arrowBottom::before, +.flatpickr-calendar.arrowBottom::after { + display: none; +} \ No newline at end of file diff --git a/resources/css/utility-patterns.css b/resources/css/utility-patterns.css new file mode 100644 index 0000000..0fc3503 --- /dev/null +++ b/resources/css/utility-patterns.css @@ -0,0 +1,138 @@ +/* Typography */ +.h1 { + @apply text-4xl font-extrabold tracking-tighter; +} + +.h2 { + @apply text-3xl font-extrabold tracking-tighter; +} + +.h3 { + @apply text-3xl font-extrabold; +} + +.h4 { + @apply text-2xl font-extrabold tracking-tight; +} + +@screen md { + .h1 { + @apply text-5xl; + } + + .h2 { + @apply text-4xl; + } +} + +/* Buttons */ +.btn, +.btn-lg, +.btn-sm, +.btn-xs { + @apply font-medium text-sm inline-flex items-center justify-center border border-transparent rounded-lg leading-5 shadow-sm transition; +} + +.btn { + @apply px-3 py-2; +} + +.btn-lg { + @apply px-4 py-3; +} + +.btn-sm { + @apply px-2 py-1; +} + +.btn-xs { + @apply px-2 py-0.5; +} + +/* Forms */ +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + -webkit-appearance: none; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select, +.form-checkbox, +.form-radio { + @apply bg-white dark:bg-gray-900/30 border focus:ring-0 focus:ring-offset-0 dark:disabled:bg-gray-700/30 dark:disabled:border-gray-700 dark:disabled:hover:border-gray-700; +} + +.form-checkbox { + @apply rounded; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select { + @apply text-sm text-gray-800 dark:text-gray-100 leading-5 py-2 px-3 border-gray-200 hover:border-gray-300 focus:border-gray-300 dark:border-gray-700/60 dark:hover:border-gray-600 dark:focus:border-gray-600 shadow-sm rounded-lg; +} + +.form-input, +.form-textarea { + @apply placeholder-gray-400 dark:placeholder-gray-500; +} + +.form-select { + @apply pr-10; +} + +.form-checkbox, +.form-radio { + @apply text-violet-500 checked:bg-violet-500 dark:checked:border-transparent border border-gray-300 focus:border-violet-300 dark:border-gray-700/60 dark:focus:border-violet-500/50; +} + +/* Switch element */ +.form-switch { + @apply relative select-none; + width: 44px; +} + +.form-switch label { + @apply block overflow-hidden cursor-pointer h-6 rounded-full; +} + +.form-switch label > span:first-child { + @apply absolute block rounded-full; + width: 20px; + height: 20px; + top: 2px; + left: 2px; + right: 50%; + transition: all .15s ease-out; +} + +.form-switch input[type="checkbox"]:checked + label { + @apply bg-violet-500; +} + +.form-switch input[type="checkbox"]:checked + label > span:first-child { + left: 22px; +} + +.form-switch input[type="checkbox"]:disabled + label { + @apply cursor-not-allowed bg-gray-100 dark:bg-gray-700/20 border border-gray-200 dark:border-gray-700/60; +} + +.form-switch input[type="checkbox"]:disabled + label > span:first-child { + @apply bg-gray-400 dark:bg-gray-600; +} + +/* Chrome, Safari and Opera */ +.no-scrollbar::-webkit-scrollbar { + display: none; +} + +.no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} \ No newline at end of file diff --git a/resources/js/app.js b/resources/js/app.js index 3640d29..1f7bb6e 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,3 +1,8 @@ +import {Alpine, Livewire} from '../../vendor/livewire/livewire/dist/livewire.esm'; + +import nostrApp from "./nostrApp.js"; +import nostrLogin from "./nostrLogin.js"; + import './bootstrap'; // Light switcher @@ -6,3 +11,12 @@ document.documentElement.classList.add('dark'); document.querySelector('html').style.colorScheme = 'dark'; localStorage.setItem('dark-mode', true); document.dispatchEvent(new CustomEvent('darkMode', { detail: { mode: 'on' } })); + +Alpine.store('nostr', { + user: null, +}); + +Alpine.data('nostrApp', nostrApp); +Alpine.data('nostrLogin', nostrLogin); + +Livewire.start(); diff --git a/resources/js/nostrApp.js b/resources/js/nostrApp.js new file mode 100644 index 0000000..0161073 --- /dev/null +++ b/resources/js/nostrApp.js @@ -0,0 +1,15 @@ +export default (livewireComponent) => ({ + + signThisEvent: livewireComponent.entangle('signThisEvent'), + + init() { + // on change of signThisEvent, call the method + this.$watch('signThisEvent', async () => { + const toBeSigned = JSON.parse(this.signThisEvent); + console.log(toBeSigned); + const signedEvent = await window.nostr.signEvent(toBeSigned); + this.$wire.call('signEvent', signedEvent); + }); + }, + +}); diff --git a/resources/js/nostrLogin.js b/resources/js/nostrLogin.js new file mode 100644 index 0000000..518eebe --- /dev/null +++ b/resources/js/nostrLogin.js @@ -0,0 +1,29 @@ +export default () => ({ + + openNostrLogin() { + window.nostr.getPublicKey(); + }, + + init() { + // listen for nostr auth events + document.addEventListener('nlAuth', (e) => { + // type is login, signup or logout + if (e.detail.type === 'login' || e.detail.type === 'signup') { + console.log('User logged in'); + // fetch profile from /api/nostr/profile/{publicKey} + fetch('/api/nostr/profile/' + e.detail.pubkey) + .then(response => response.json()) + .then(data => { + console.log('Profile fetched', data); + // store the profile in AlpineJS store + Alpine.store('nostr', { user: data }); + this.$dispatch('nostrLoggedIn', {pubkey: data.pubkey}); + }); + } else { + console.log('User logged out') + Alpine.store('nostr', { user: null }); + } + }) + }, + +}); diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index 9ad8d28..85e7f40 100644 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -5,17 +5,19 @@ {{ $title ?? 'Page Title' }} + @livewireStyles @vite(['resources/js/app.js','resources/css/app.css']) @googlefonts + @wireUiScripts @stack('scripts') -

- @include('components.layouts.sidebar') -
+
+ +
@@ -125,11 +129,10 @@
-
- {{ $slot }} -
+ {{ $slot }}
+@livewireScriptConfig diff --git a/resources/views/components/layouts/navigation/association.blade.php b/resources/views/components/layouts/navigation/association.blade.php new file mode 100644 index 0000000..71d5631 --- /dev/null +++ b/resources/views/components/layouts/navigation/association.blade.php @@ -0,0 +1,34 @@ + +
diff --git a/resources/views/components/layouts/navigation/meetups.blade.php b/resources/views/components/layouts/navigation/meetups.blade.php index 30857aa..cc293f3 100644 --- a/resources/views/components/layouts/navigation/meetups.blade.php +++ b/resources/views/components/layouts/navigation/meetups.blade.php @@ -15,7 +15,7 @@
  • - +
    Alle Meetups diff --git a/resources/views/components/layouts/sidebar.blade.php b/resources/views/components/layouts/sidebar.blade.php index 90ecd62..2eca9d8 100644 --- a/resources/views/components/layouts/sidebar.blade.php +++ b/resources/views/components/layouts/sidebar.blade.php @@ -1,4 +1,11 @@
    + @php + $isCurrentRouteClass = 'pl-4 pr-3 py-2 rounded-lg mb-0.5 last:mb-0 bg-[linear-gradient(135deg,var(--tw-gradient-stops))] from-violet-500/[0.12] dark:from-violet-500/[0.24] to-violet-500/[0.04]'; + $isNotCurrentRouteClass = 'pl-4 pr-3 py-2 rounded-lg mb-0.5 last:mb-0'; + $isCurrentSubItem = 'block text-violet-500 transition truncate'; + $isNotCurrentSubItem = 'block text-gray-500/90 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition truncate'; + @endphp +