From 71dd8f8b056b25597a05adb0dbafb0600eaaf802 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 21 Mar 2023 12:27:28 +0000 Subject: [PATCH 001/103] st --- Gemfile.lock | 6 ++++++ app/helpers/application_helper.rb | 1 + db/schema.rb | 3 --- tmp/.keep | 0 4 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 tmp/.keep diff --git a/Gemfile.lock b/Gemfile.lock index f6347fbf79..b82436293c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -437,3 +437,9 @@ DEPENDENCIES web-console webdrivers webmock + +RUBY VERSION + ruby 3.1.0p0 + +BUNDLED WITH + 2.3.3 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c7de6b3bcd..0397818245 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -20,5 +20,6 @@ module ApplicationHelper def branding_image asset_path = SettingGetter.new(setting_name: 'BrandingImage', provider: current_provider).call asset_url(asset_path) + #"https://jobs.secunet.com/templates/secunet/images/secunet_logo.png" end end diff --git a/db/schema.rb b/db/schema.rb index f457967418..eb1f766966 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -43,9 +43,6 @@ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end - create_table "data_migrations", primary_key: "version", id: :string, force: :cascade do |t| - end - create_table "formats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "recording_id" t.string "recording_type", null: false diff --git a/tmp/.keep b/tmp/.keep deleted file mode 100644 index e69de29bb2..0000000000 From 2b915baa47de30cafc1970842222ee3a19ec9195 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 09:30:46 +0000 Subject: [PATCH 002/103] Static SIP --- app/assets/locales/de.json | 4 +++- app/assets/locales/en.json | 4 +++- app/controllers/api/v1/meetings_controller.rb | 4 ++-- app/controllers/api/v1/rooms_controller.rb | 4 ++-- app/javascript/components/rooms/RoomCard.jsx | 15 ++++++++++++++- app/javascript/components/rooms/room/Room.jsx | 18 +++++++++++++++++- app/models/room.rb | 15 ++++++++++++++- app/serializers/current_room_serializer.rb | 7 +++++++ app/serializers/room_serializer.rb | 6 ++++++ app/services/meeting_starter.rb | 2 +- app/services/room_settings_getter.rb | 11 ++++++++++- config/application.rb | 2 ++ .../20230321125010_add_voice_brige_to_romms.rb | 6 ++++++ db/schema.rb | 4 +++- greenlight-v3.nginx | 4 ++-- 15 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 db/migrate/20230321125010_add_voice_brige_to_romms.rb diff --git a/app/assets/locales/de.json b/app/assets/locales/de.json index a5936bdc0a..bfa8ae4b5d 100644 --- a/app/assets/locales/de.json +++ b/app/assets/locales/de.json @@ -17,6 +17,7 @@ "close": "Schließen", "delete": "Löschen", "copy": "Einladungslink kopieren", + "copy_voice_bridge": "Telefoneinwahl kopieren", "or": "oder", "online": "Online", "help_center": "Hilfezentrum", @@ -376,7 +377,8 @@ "access_code_copied": "Zugangscode kopiert.", "access_code_generated": "Zugangscode generiert.", "access_code_deleted": "Zugriffcode wurde gelöscht.", - "copied_meeting_url": "Die URL der Konferenz wurde kopiert. Der Link kann verwendet werden, um an der Konferenz teilzunehmen." + "copied_meeting_url": "Die URL der Konferenz wurde kopiert. Der Link kann verwendet werden, um an der Konferenz teilzunehmen.", + "copied_voice_bridge": "Die Telefonnummer und der Pin wurden kopiert. Diese können genutzt werden um an der Konferenz teilzunehmen." }, "site_settings": { "site_setting_updated": "Grundeinstellungen aktualisiert.", diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index 29f095eccf..9cf4506b8a 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -17,6 +17,7 @@ "close": "Close", "delete": "Delete", "copy": "Copy Join Link", + "copy_voice_bridge": "Copy phone dialup", "or": "Or", "online": "Online", "help_center": "Help Center", @@ -376,7 +377,8 @@ "access_code_copied": "The access code has been copied.", "access_code_generated": "A new access code has been generated.", "access_code_deleted": "The access code has been deleted.", - "copied_meeting_url": "The meeting URL has been copied. The link can be used to join the meeting." + "copied_meeting_url": "The meeting URL has been copied. The link can be used to join the meeting.", + "copied_voice_bridge": "The phone number and pin have been copied. They can be used to join the conference." }, "site_settings": { "site_setting_updated": "The site setting has been updated.", diff --git a/app/controllers/api/v1/meetings_controller.rb b/app/controllers/api/v1/meetings_controller.rb index 15e02f2936..0f5b10e751 100644 --- a/app/controllers/api/v1/meetings_controller.rb +++ b/app/controllers/api/v1/meetings_controller.rb @@ -30,8 +30,8 @@ class MeetingsController < ApiController def start begin MeetingStarter.new(room: @room, base_url: root_url, current_user:).call - rescue BigBlueButton::BigBlueButtonException => e - return render_error status: :bad_request unless e.key == 'idNotUnique' + #rescue BigBlueButton::BigBlueButtonException => e + # return render_error status: :bad_request unless e.key == 'idNotUnique' end render_data data: BigBlueButtonApi.new.join_meeting( diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb index 8714f18dc6..06c05877dd 100644 --- a/app/controllers/api/v1/rooms_controller.rb +++ b/app/controllers/api/v1/rooms_controller.rb @@ -92,7 +92,7 @@ def create room = Room.new(name: room_params[:name], user_id: room_params[:user_id]) if room.save - logger.info "room(friendly_id):#{room.friendly_id} created for user(id):#{room.user_id}" + logger.info "room(friendly_id):#{room.friendly_id} created for user(id):#{room.user_id} with voice brige: #{room.voice_bridge}" render_data status: :created else render_error errors: room.errors.to_a, status: :bad_request @@ -149,7 +149,7 @@ def find_room end def room_params - params.require(:room).permit(:name, :user_id, :presentation) + params.require(:room).permit(:name, :user_id, :voice_bridge, :presentation) end end end diff --git a/app/javascript/components/rooms/RoomCard.jsx b/app/javascript/components/rooms/RoomCard.jsx index 63790698b8..5993612a75 100644 --- a/app/javascript/components/rooms/RoomCard.jsx +++ b/app/javascript/components/rooms/RoomCard.jsx @@ -18,7 +18,7 @@ import React, { useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { Button, Card, Stack } from 'react-bootstrap'; import PropTypes from 'prop-types'; -import { DocumentDuplicateIcon, LinkIcon } from '@heroicons/react/24/outline'; +import { DocumentDuplicateIcon, LinkIcon, PhoneIcon } from '@heroicons/react/24/outline'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; import { useAuth } from '../../contexts/auth/AuthProvider'; @@ -41,6 +41,11 @@ export default function RoomCard({ room }) { toast.success(t('toast.success.room.copied_meeting_url')); } + function copyVoiceBridge(voice_bridge, voice_bridge_phone_number) { + navigator.clipboard.writeText(`Tel.: ${voice_bridge_phone_number} Pin: ${voice_bridge}`); + toast.success(t('toast.success.room.copied_voice_bridge')); + } + return ( @@ -73,6 +78,12 @@ export default function RoomCard({ room }) { > + {typeof room.voice_bridge_phone_number !== 'undefined' && } + { typeof room.voice_bridge_phone_number !== 'undefined' && }) +} diff --git a/app/models/room.rb b/app/models/room.rb index 37bb3b480e..1626268c3a 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -30,6 +30,7 @@ class Room < ApplicationRecord validates :name, presence: true validates :friendly_id, presence: true, uniqueness: true validates :meeting_id, presence: true, uniqueness: true + validates :voice_bridge, uniqueness: true validates :presentation, content_type: %i[.doc .docx .ppt .pptx .pdf .xls .xlsx .txt .rtf .odt .ods .odp .odg .odc .odi .jpg .jpeg .png], size: { less_than: 30.megabytes } @@ -37,7 +38,7 @@ class Room < ApplicationRecord validates :name, length: { minimum: 2, maximum: 255 } validates :recordings_processing, numericality: { only_integer: true, greater_than_or_equal_to: 0 } - before_validation :set_friendly_id, :set_meeting_id, on: :create + before_validation :set_friendly_id, :set_meeting_id, :set_voice_brige, on: :create after_create :create_meeting_options attr_accessor :shared, :active, :participants @@ -95,4 +96,16 @@ def set_meeting_id rescue StandardError retry end + + # Create unique pin for voice brige max 10^6 - 1000 unique ids + def set_voice_brige + if Rails.application.config.voice_bridge_phone_number != nil + id = SecureRandom.random_number((10.pow(5)) - 1) + raise if Room.exists?(voice_bridge: id) || id < 10000 + + self.voice_bridge = id + end + rescue StandardError + retry + end end diff --git a/app/serializers/current_room_serializer.rb b/app/serializers/current_room_serializer.rb index d4e8e98785..515747c704 100644 --- a/app/serializers/current_room_serializer.rb +++ b/app/serializers/current_room_serializer.rb @@ -23,6 +23,9 @@ class CurrentRoomSerializer < ApplicationSerializer attribute :last_session, if: -> { object.last_session } + attribute :voice_bridge, if: -> { Rails.application.config.voice_bridge_phone_number } + attribute :voice_bridge_phone_number, if: -> { Rails.application.config.voice_bridge_phone_number } + def presentation_name presentation_file_name(object) end @@ -34,4 +37,8 @@ def thumbnail def owner_name object.user.name end + + def voice_bridge_phone_number + Rails.application.config.voice_bridge_phone_number + end end diff --git a/app/serializers/room_serializer.rb b/app/serializers/room_serializer.rb index c236a94ed8..6f5adddb1b 100644 --- a/app/serializers/room_serializer.rb +++ b/app/serializers/room_serializer.rb @@ -20,8 +20,14 @@ class RoomSerializer < ApplicationSerializer attributes :id, :name, :friendly_id, :online, :participants, :last_session attribute :shared_owner, if: -> { object.shared } + attribute :voice_bridge, if: -> { Rails.application.config.voice_bridge_phone_number } + attribute :voice_bridge_phone_number, if: -> { Rails.application.config.voice_bridge_phone_number } def shared_owner object.user.name end + + def voice_bridge_phone_number + Rails.application.config.voice_bridge_phone_number + end end diff --git a/app/services/meeting_starter.rb b/app/services/meeting_starter.rb index ecd0674d82..0f10f3abd9 100644 --- a/app/services/meeting_starter.rb +++ b/app/services/meeting_starter.rb @@ -27,7 +27,7 @@ def initialize(room:, base_url:, current_user:) def call # TODO: amir - Check the legitimately of the action. - options = RoomSettingsGetter.new(room_id: @room.id, provider: @room.user.provider, current_user: @current_user, only_bbb_options: true).call + options = RoomSettingsGetter.new(room_id: @room.id, provider: @room.user.provider, current_user: @current_user, only_bbb_options: true, voice_bridge: @room.voice_bridge).call viewer_code = RoomSettingsGetter.new( room_id: @room.id, provider: @room.user.provider, diff --git a/app/services/room_settings_getter.rb b/app/services/room_settings_getter.rb index 1d033d41aa..52b85666d0 100644 --- a/app/services/room_settings_getter.rb +++ b/app/services/room_settings_getter.rb @@ -23,13 +23,14 @@ class RoomSettingsGetter # Hash(` => {'true' => , 'false' => })` SPECIAL_OPTIONS = { 'guestPolicy' => { 'true' => 'ASK_MODERATOR', 'false' => 'ALWAYS_ACCEPT' } }.freeze - def initialize(room_id:, provider:, current_user:, settings: [], show_codes: false, only_enabled: false, only_bbb_options: false) + def initialize(room_id:, provider:, current_user:, settings: [], show_codes: false, only_enabled: false, only_bbb_options: false, voice_bridge: nil) @current_user = current_user @room_id = room_id @only_bbb_options = only_bbb_options # When used only BBB options (not prefixed with 'gl') will be returned. @only_enabled = only_enabled # When used only optional and force enabled options will be returned. @show_codes = show_codes # When used access code values will be returned. @settings = settings # When given only the settings contained in the Array will be returned. + @voice_bridge = voice_bridge # Fetching only rooms configs that are not optional to overwrite the settings values. @rooms_configs = MeetingOption.joins(:rooms_configurations) @@ -55,6 +56,8 @@ def call infer_codes(room_settings:, access_codes:) # Access codes should map their forced values as intended. infer_can_record(room_settings:) if room_settings['record'] && @rooms_configs['record'].nil? + set_voice_brige(room_settings:) + room_settings end @@ -98,4 +101,10 @@ def infer_can_record(room_settings:) room_settings['record'] = 'false' end + + def set_voice_brige(room_settings:) + if @voice_bridge != nil + room_settings['voiceBridge'] = "#{@voice_bridge}" + end + end end diff --git a/config/application.rb b/config/application.rb index 288ba39971..0079fa0e7d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -62,5 +62,7 @@ class Application < Rails::Application config.bigbluebutton_endpoint = File.join(config.bigbluebutton_endpoint, '/api/') unless config.bigbluebutton_endpoint.end_with?('api', 'api/') config.bigbluebutton_secret = ENV.fetch('BIGBLUEBUTTON_SECRET', '8cd8ef52e8e101574e400365b55e11a6') + + config.voice_bridge_phone_number = ENV.fetch('VOICE_BRIDGE_PHONE_NUMBER', nil) end end diff --git a/db/migrate/20230321125010_add_voice_brige_to_romms.rb b/db/migrate/20230321125010_add_voice_brige_to_romms.rb new file mode 100644 index 0000000000..42fac35f2a --- /dev/null +++ b/db/migrate/20230321125010_add_voice_brige_to_romms.rb @@ -0,0 +1,6 @@ +class AddVoiceBrigeToRomms < ActiveRecord::Migration[7.0] + def change + add_column :rooms, :voice_bridge, :integer, null: true, default: nil + add_index :rooms, :voice_bridge + end +end diff --git a/db/schema.rb b/db/schema.rb index fc646ce713..bc89aa2e7c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_02_27_213252) do +ActiveRecord::Schema[7.0].define(version: 2023_03_21_125010) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -132,9 +132,11 @@ t.datetime "updated_at", null: false t.integer "recordings_processing", default: 0 t.boolean "online", default: false + t.integer "voice_bridge" t.index ["friendly_id"], name: "index_rooms_on_friendly_id", unique: true t.index ["meeting_id"], name: "index_rooms_on_meeting_id", unique: true t.index ["user_id"], name: "index_rooms_on_user_id" + t.index ["voice_bridge"], name: "index_rooms_on_voice_bridge" end create_table "rooms_configurations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| diff --git a/greenlight-v3.nginx b/greenlight-v3.nginx index c0331915fb..1840bfc28a 100644 --- a/greenlight-v3.nginx +++ b/greenlight-v3.nginx @@ -1,7 +1,7 @@ ### Greenlight version 3: location /cable { - proxy_pass http://127.0.0.1:5050; + proxy_pass http://127.0.0.1:3000; proxy_redirect off; proxy_set_header Host $http_host; @@ -20,7 +20,7 @@ location /cable { location @bbb-fe { - proxy_pass http://127.0.0.1:5050; + proxy_pass http://127.0.0.1:3000; proxy_read_timeout 60s; proxy_redirect off; From d55c30fcced8c0cec26b83d190f488b8f523d18a Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 10:40:50 +0000 Subject: [PATCH 003/103] revert locale dev change --- greenlight-v3.nginx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/greenlight-v3.nginx b/greenlight-v3.nginx index 1840bfc28a..c0331915fb 100644 --- a/greenlight-v3.nginx +++ b/greenlight-v3.nginx @@ -1,7 +1,7 @@ ### Greenlight version 3: location /cable { - proxy_pass http://127.0.0.1:3000; + proxy_pass http://127.0.0.1:5050; proxy_redirect off; proxy_set_header Host $http_host; @@ -20,7 +20,7 @@ location /cable { location @bbb-fe { - proxy_pass http://127.0.0.1:3000; + proxy_pass http://127.0.0.1:5050; proxy_read_timeout 60s; proxy_redirect off; From 7fab7affff0e10dc99133d630388514d23bf11e3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 10:43:47 +0000 Subject: [PATCH 004/103] revert locale dev change --- app/controllers/api/v1/meetings_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/meetings_controller.rb b/app/controllers/api/v1/meetings_controller.rb index 0f5b10e751..15e02f2936 100644 --- a/app/controllers/api/v1/meetings_controller.rb +++ b/app/controllers/api/v1/meetings_controller.rb @@ -30,8 +30,8 @@ class MeetingsController < ApiController def start begin MeetingStarter.new(room: @room, base_url: root_url, current_user:).call - #rescue BigBlueButton::BigBlueButtonException => e - # return render_error status: :bad_request unless e.key == 'idNotUnique' + rescue BigBlueButton::BigBlueButtonException => e + return render_error status: :bad_request unless e.key == 'idNotUnique' end render_data data: BigBlueButtonApi.new.join_meeting( From af1c240f1cdfba6b639c296cf5ac47c22d3746db Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 11:07:09 +0000 Subject: [PATCH 005/103] sample.env update with VoiceBrige config --- sample.env | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sample.env b/sample.env index b9f0036d21..cae7a006bd 100644 --- a/sample.env +++ b/sample.env @@ -61,3 +61,7 @@ REDIS_URL= # [en, ar, fr, es] #DEFAULT_LOCALE=en +# Define the phone number for the voice bridge. +# This number is not sent to bbb and is only displayed in the greenlight UI, but it should match the number in the bbb instance to avoid user confusion. +# If this number is defined, each newly created room will be assigned a static voiceBridge pin. +#VOICE_BRIDGE_PHONE_NUMBER= \ No newline at end of file From ebc4a87a54bc2a3f10876c7c13754d165714c178 Mon Sep 17 00:00:00 2001 From: SebastianAppDev <128802341+SebastianAppDev@users.noreply.github.com> Date: Mon, 27 Mar 2023 08:25:11 +0200 Subject: [PATCH 006/103] Update room.rb, mistake in comment --- app/models/room.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/room.rb b/app/models/room.rb index 1626268c3a..380a18e666 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -97,7 +97,7 @@ def set_meeting_id retry end - # Create unique pin for voice brige max 10^6 - 1000 unique ids + # Create unique pin for voice brige max 10^5 - 10000 unique ids def set_voice_brige if Rails.application.config.voice_bridge_phone_number != nil id = SecureRandom.random_number((10.pow(5)) - 1) From 7940467a66ef070ddc97138773a462787abdc5e0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Mar 2023 11:01:47 +0000 Subject: [PATCH 007/103] Improved room sharing --- app/assets/locales/de.json | 10 +- app/assets/locales/en.json | 10 +- app/javascript/components/rooms/RoomCard.jsx | 48 +- app/javascript/components/rooms/room/Room.jsx | 68 +- .../rooms/room/forms/ShareRoomForm.jsx | 126 + app/javascript/helpers/ICSDownloadHelper.jsx | 144 + db/schema.rb | 4 +- package-lock.json | 6937 +---------------- package.json | 2 + sample.env | 1 - yarn.lock | 22 +- 11 files changed, 402 insertions(+), 6970 deletions(-) create mode 100644 app/javascript/components/rooms/room/forms/ShareRoomForm.jsx create mode 100644 app/javascript/helpers/ICSDownloadHelper.jsx diff --git a/app/assets/locales/de.json b/app/assets/locales/de.json index a5936bdc0a..e295109f42 100644 --- a/app/assets/locales/de.json +++ b/app/assets/locales/de.json @@ -120,7 +120,12 @@ "meeting_invitation": "Du wurdest zur Teilnahme eingeladen", "meeting_not_started": "Die Konferenz hat noch nicht begonnen", "join_meeting_automatically": "Beitritt erfolgt automatisch, sobald die Konferenz beginnt", - "recording_consent": "Ich nehme zur Kenntnis, dass die Sitzung aufgezeichnet werden kann. Dies wird meine Stimme und mein Bild einschließen, wenn dies aktiviert ist." + "recording_consent": "Ich nehme zur Kenntnis, dass die Sitzung aufgezeichnet werden kann. Dies wird meine Stimme und mein Bild einschließen, wenn dies aktiviert ist.", + "invite_to_meeting": "{{ name }} lädt Sie ein, an einem Meeting teilzunehmen.", + "join_by_url": "An Besprechung per URL teilnehmen", + "alternative_options": "Alternative Optionen zur Teilnahme", + "download_ics": ".ics-Kalenderdatei herunterladen", + "share_meeting": "Raum teilen" }, "presentation": { "presentation": "Präsentation", @@ -376,7 +381,8 @@ "access_code_copied": "Zugangscode kopiert.", "access_code_generated": "Zugangscode generiert.", "access_code_deleted": "Zugriffcode wurde gelöscht.", - "copied_meeting_url": "Die URL der Konferenz wurde kopiert. Der Link kann verwendet werden, um an der Konferenz teilzunehmen." + "copied_meeting_url": "Die URL der Konferenz wurde kopiert. Der Link kann verwendet werden, um an der Konferenz teilzunehmen.", + "download_ics": "Die .ics-Datei wurde erstellt. Öffnen Sie sie, um sie zu bearbeiten und zu versenden, um Personen zu Ihrem Meeting einzuladen." }, "site_settings": { "site_setting_updated": "Grundeinstellungen aktualisiert.", diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index 29f095eccf..1bfe998505 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -120,7 +120,12 @@ "meeting_invitation": "You have been invited to join", "meeting_not_started": "The meeting has not started yet", "join_meeting_automatically": "You will automatically join when the meeting starts", - "recording_consent": "I acknowledge that this session may be recorded. This may include my voice and video if enabled." + "recording_consent": "I acknowledge that this session may be recorded. This may include my voice and video if enabled.", + "invite_to_meeting": "{{ name }} invites you to join a meeting.", + "join_by_url": "Join room by URL", + "alternative_options": "Alternative options to join", + "download_ics": "Download .ics calender file", + "share_meeting": "Share Room" }, "presentation": { "presentation": "Presentation", @@ -376,7 +381,8 @@ "access_code_copied": "The access code has been copied.", "access_code_generated": "A new access code has been generated.", "access_code_deleted": "The access code has been deleted.", - "copied_meeting_url": "The meeting URL has been copied. The link can be used to join the meeting." + "copied_meeting_url": "The meeting URL has been copied. The link can be used to join the meeting.", + "download_ics": "The .ics file has been created. Open it to edit and send it, to invite people to your Meeting." }, "site_settings": { "site_setting_updated": "The site setting has been updated.", diff --git a/app/javascript/components/rooms/RoomCard.jsx b/app/javascript/components/rooms/RoomCard.jsx index 63790698b8..95673c63d8 100644 --- a/app/javascript/components/rooms/RoomCard.jsx +++ b/app/javascript/components/rooms/RoomCard.jsx @@ -18,7 +18,7 @@ import React, { useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { Button, Card, Stack } from 'react-bootstrap'; import PropTypes from 'prop-types'; -import { DocumentDuplicateIcon, LinkIcon } from '@heroicons/react/24/outline'; +import { DocumentDuplicateIcon, LinkIcon, ShareIcon } from '@heroicons/react/24/outline'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; import { useAuth } from '../../contexts/auth/AuthProvider'; @@ -27,6 +27,9 @@ import Spinner from '../shared_components/utilities/Spinner'; import useStartMeeting from '../../hooks/mutations/rooms/useStartMeeting'; import MeetingBadges from './MeetingBadges'; import UserBoardIcon from './UserBoardIcon'; +import { downloadICS } from '../../helpers/ICSDownloadHelper'; +import Modal from '../shared_components/modals/Modal'; +import ShareRoomForm from './room/forms/ShareRoomForm'; export default function RoomCard({ room }) { const { t } = useTranslation(); @@ -36,46 +39,49 @@ export default function RoomCard({ room }) { const currentUser = useAuth(); const localizedTime = localizeDateTimeString(room?.last_session, currentUser?.language); - function copyInvite(friendlyId) { - navigator.clipboard.writeText(`${window.location}/${friendlyId}/join`); - toast.success(t('toast.success.room.copied_meeting_url')); - } - return (
- { room?.shared_owner + {room?.shared_owner ? : }
- { room?.online + {room?.online && }
- { room.name } - { room.shared_owner && ( - { t('room.shared_by') } { room.shared_owner } + {room.name} + {room.shared_owner && ( + {t('room.shared_by')} {room.shared_owner} )} - { room.last_session ? ( - { t('room.last_session', { localizedTime }) } + {room.last_session ? ( + {t('room.last_session', { localizedTime })} ) : ( - { t('room.no_last_session') } + {t('room.no_last_session')} )}
- + + + + )} + title={t('room.meeting.share_meeting')} + body={} + /> + + - + + + {t('room.meeting.share_meeting')} + + )} + title={t('room.meeting.share_meeting')} + body={} + /> diff --git a/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx b/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx new file mode 100644 index 0000000000..fe2edbd1bf --- /dev/null +++ b/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx @@ -0,0 +1,126 @@ +// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +// +// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +// +// This program is free software; you can redistribute it and/or modify it under the +// terms of the GNU Lesser General Public License as published by the Free Software +// Foundation; either version 3.0 of the License, or (at your option) any later +// version. +// +// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with Greenlight; if not, see . + +import React from 'react'; +import PropTypes from 'prop-types'; +import { useTranslation } from 'react-i18next'; +import { DocumentDuplicateIcon, CalendarIcon } from '@heroicons/react/24/outline'; +import { useAuth } from '../../../../contexts/auth/AuthProvider'; +import { Form, InputGroup, Button } from 'react-bootstrap'; +import { toast } from 'react-toastify'; +import { downloadICS } from '../../../../helpers/ICSDownloadHelper'; + + + +export default function ShareRoomForm({ room, handleClose }) { + const { t } = useTranslation(); + const currentUser = useAuth(); + + function roomJoinUrl(){ + return `https://${window.location.hostname}/rooms/${room.friendly_id}/join`; + } + + + function copyInvite() { + console.log(roomJoinUrl()); + navigator.clipboard.writeText(roomJoinUrl()); + toast.success(t('toast.success.room.copied_meeting_url')); + } + + function downloadICSFile(){ + downloadICS(currentUser.name, room.name, roomJoinUrl(), room.voice_bridge, room.voice_bridge_phone_number, t); + toast.success(t('toast.success.room.download_ics')); + } + + return ( +
+ + {t('copy')} + + + + + + + {typeof room.voice_bridge_phone_number !== 'undefined' && typeof room.voice_bridge !== 'undefined' && + {t('copy_number')} + + + + + } + + + {t('room.meeting.download_ics')} + + + + + +
+ ); +} + +ShareRoomForm.defaulProps = { + room: PropTypes.shape({ + last_session: '', + }), +}; + +ShareRoomForm.propTypes = { + room: PropTypes.shape({ + id: PropTypes.string.isRequired, + friendly_id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + last_session: PropTypes.string, + shared_owner: PropTypes.string, + online: PropTypes.bool, + participants: PropTypes.number, + }).isRequired, +}; \ No newline at end of file diff --git a/app/javascript/helpers/ICSDownloadHelper.jsx b/app/javascript/helpers/ICSDownloadHelper.jsx new file mode 100644 index 0000000000..ff1dd0d2e0 --- /dev/null +++ b/app/javascript/helpers/ICSDownloadHelper.jsx @@ -0,0 +1,144 @@ +// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +// +// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +// +// This program is free software; you can redistribute it and/or modify it under the +// terms of the GNU Lesser General Public License as published by the Free Software +// Foundation; either version 3.0 of the License, or (at your option) any later +// version. +// +// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with Greenlight; if not, see . + +import { createEvent } from "ics"; +import { saveAs } from "file-saver"; + + +export const createICSContent = (name, url, voice_bridge, voice_bridge_phone_number, t, use_html=false) => { + if (use_html) { + return createICSWithHtml(name,url,voice_bridge,voice_bridge_phone_number, t); + } + + + description = `\n\n${t('room.meeting.invite_to_meeting', {name})}\n\n${t('room.meeting.join_by_url')}:\n${url}`; + + if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { + description += `\n${t('or')} ${('room.meeting.phone')}:\n${voice_bridge_phone_number}, ${voice_bridge}`; + } + + const date = new Date(); + + return eventContent = { + start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], + title: t('room.meeting.join_meeting'), + location: 'BBB: ' + url, + url: url, + description: description, + }; +} + +const createICSWithHtml = (name, url, voice_bridge, voice_bridge_phone_number) => { + phone_data = ""; + + if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { + phone_data = `
${t('or')} ${t('room.meeting.phone')}:
+

${voice_bridge_phone_number},,,,${voice_bridge}

`; + } + + const HTML = ` + + + + + + + + + + + + + + + + `; + + const date = new Date(); + + return eventContent = { + start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], + title: t('room.meeting.join_meeting'), + location: 'BBB: ' + url, + url: url, + htmlContent: HTML + }; +} + +export const downloadICS = (name, room, url, voice_bridge, voice_bridge_phone_number, t) => { + createEvent(createICSContent(name, url, voice_bridge, voice_bridge_phone_number, t), (error, value) => { + console.log(error); + const blob = new Blob([value], { type: "text/plain;charset=utf-8" }); + saveAs(blob, `bbb-meeting-${room.replace(/[/\\?%*:|"<>]/g, '')}.ics`); + }); +}; \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index fc646ce713..bc89aa2e7c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_02_27_213252) do +ActiveRecord::Schema[7.0].define(version: 2023_03_21_125010) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -132,9 +132,11 @@ t.datetime "updated_at", null: false t.integer "recordings_processing", default: 0 t.boolean "online", default: false + t.integer "voice_bridge" t.index ["friendly_id"], name: "index_rooms_on_friendly_id", unique: true t.index ["meeting_id"], name: "index_rooms_on_meeting_id", unique: true t.index ["user_id"], name: "index_rooms_on_user_id" + t.index ["voice_bridge"], name: "index_rooms_on_voice_bridge" end create_table "rooms_configurations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| diff --git a/package-lock.json b/package-lock.json index 600c0a5e96..fe6f8a4da8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6834 +1,8 @@ { "name": "app", - "lockfileVersion": 2, "requires": true, - "packages": { - "": { - "name": "app", - "dependencies": { - "@babel/preset-env": "^7.16.11", - "@babel/preset-react": "^7.16.7", - "@hcaptcha/react-hcaptcha": "^1.3.0", - "@heroicons/react": "^2.0.11", - "@hookform/resolvers": "^2.8.8", - "@popperjs/core": "^2.11.5", - "@rails/actioncable": "^7.0.2", - "axios": "^0.26.1", - "bootstrap": "5.1.3", - "bootstrap-icons": "^1.8.3", - "esbuild": "^0.14.42", - "esbuild-plugin-import-glob": "^0.1.1", - "esbuild-sass-plugin": "^2.2.6", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-avatar-editor": "^13.0.0", - "react-bootstrap": "^2.2.0", - "react-colorful": "^5.6.1", - "react-dom": "^17.0.2", - "react-hook-form": "^7.28.0", - "react-i18next": "^11.18.5", - "react-query": "^3.34.16", - "react-router-dom": "^6.4.3", - "react-test-renderer": "^17.0.2", - "react-toastify": "^9.1.1", - "sass": "^1.52.1", - "semantic-ui-css": "^2.4.1", - "semantic-ui-react": "^2.1.3", - "tinycolor2": "^1.4.2", - "yup": "^0.32.11" - }, - "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", - "eslint": "^8.12.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.4.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", - "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", - "dependencies": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", - "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", - "dependencies": { - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "peer": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", - "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", - "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz", - "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", - "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", - "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", - "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@fluentui/react-component-event-listener": { - "version": "0.63.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.1.tgz", - "integrity": "sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==", - "dependencies": { - "@babel/runtime": "^7.10.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/@fluentui/react-component-ref": { - "version": "0.63.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.63.1.tgz", - "integrity": "sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw==", - "dependencies": { - "@babel/runtime": "^7.10.4", - "react-is": "^16.6.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/@hcaptcha/react-hcaptcha": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@hcaptcha/react-hcaptcha/-/react-hcaptcha-1.4.4.tgz", - "integrity": "sha512-Aen217LDnf5ywbPSwBG5CsoqBLIHIAS9lhj3zQjXJuO13doQ6/ubkCWNuY8jmwYLefoFt3V3MrZmCdKDaFoTuQ==", - "dependencies": { - "@babel/runtime": "^7.17.9" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, - "node_modules/@heroicons/react": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.15.tgz", - "integrity": "sha512-CZ2dGWgWG3/z5LEoD5D3MEr1syn45JM/OB2aDpw531Ryecgkz2V7TWQ808P0lva7zP003PVW6WlwbofsYyga3A==", - "peerDependencies": { - "react": ">= 16" - } - }, - "node_modules/@hookform/resolvers": { - "version": "2.9.11", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz", - "integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "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==", - "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==", - "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==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rails/actioncable": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.0.4.tgz", - "integrity": "sha512-tz4oM+Zn9CYsvtyicsa/AwzKZKL+ITHWkhiu7x+xF77clh2b4Rm+s6xnOgY/sGDWoFWZmtKsE95hxBPkgQQNnQ==" - }, - "node_modules/@react-aria/ssr": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.1.tgz", - "integrity": "sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA==", - "dependencies": { - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@remix-run/router": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", - "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@restart/hooks": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.8.tgz", - "integrity": "sha512-Ivvp1FZ0Lja80iUTYAhbzy+stxwO7FbPHP95ypCtIh0wyOLiayQywXhVJ2ZYP5S1AjW2GmKHeRU4UglMwTG2sA==", - "dependencies": { - "dequal": "^2.0.2" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.5.4.tgz", - "integrity": "sha512-ziNtXY2PrjXrRUfR1D/ry1v1i5IF+kfMcH9d1kIcU2lOELfmDsVb+fzbyEDz3yKvKuqkphTunVDuLdYRJ0YsAg==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "@popperjs/core": "^2.11.6", - "@react-aria/ssr": "^3.4.1", - "@restart/hooks": "^0.4.7", - "@types/warning": "^3.0.0", - "dequal": "^2.0.3", - "dom-helpers": "^5.2.0", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/@semantic-ui-react/event-stack": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz", - "integrity": "sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==", - "dependencies": { - "exenv": "^1.2.2", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/react": { - "version": "18.0.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz", - "integrity": "sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.51.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-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==" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bootstrap": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", - "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, - "peerDependencies": { - "@popperjs/core": "^2.10.2" - } - }, - "node_modules/bootstrap-icons": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", - "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/broadcast-channel": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", - "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "detect-node": "^2.1.0", - "js-sha3": "0.8.0", - "microseconds": "0.2.0", - "nano-time": "1.0.0", - "oblivious-set": "1.0.0", - "rimraf": "3.0.2", - "unload": "2.2.0" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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" - }, - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "peer": true - }, - "node_modules/core-js-compat": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", - "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", - "dependencies": { - "browserslist": "^4.21.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.292", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.292.tgz", - "integrity": "sha512-ESWOSyJy5odDlE8wvh5NNAMORv4r6assPwIPGHEMWrWD0SONXcG/xT+9aD9CQyeRwyYDPo6dJT4Bbeg5uevVQQ==" - }, - "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 - }, - "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-plugin-import-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-import-glob/-/esbuild-plugin-import-glob-0.1.1.tgz", - "integrity": "sha512-yAFH+9AoIcsQkODSx0KUPRv1FeJUN6Tef8vkPQMcuVkc2vXYneYKsHhOiFS/yIsg5bQ70HHtAlXVA1uTjgoJXg==", - "dependencies": { - "fast-glob": "^3.2.5" - } - }, - "node_modules/esbuild-sass-plugin": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.4.5.tgz", - "integrity": "sha512-di2hLaIwhRXe513uaPPxv+5bjynxAgrS8R+u38lbBfvp1g1xOki4ACXV2aXip2CRPGTbAVDySSxujd9iArFV0w==", - "dependencies": { - "esbuild": "^0.15.17", - "resolve": "^1.22.1", - "sass": "^1.56.1" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sass-plugin/node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/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 - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "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, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "dependencies": { - "void-elements": "3.1.0" - } - }, - "node_modules/i18next": { - "version": "21.10.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", - "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.17.2" - } - }, - "node_modules/i18next-http-backend": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-1.4.5.tgz", - "integrity": "sha512-tLuHWuLWl6CmS07o+UB6EcQCaUjrZ1yhdseIN7sfq0u7phsMePJ8pqlGhIAdRDPF/q7ooyo5MID5DRFBCH+x5w==", - "dependencies": { - "cross-fetch": "3.1.5" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" - }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyboard-key": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz", - "integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==" - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/match-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", - "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "remove-accents": "0.4.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/microseconds": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nano-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", - "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", - "dependencies": { - "big-integer": "^1.6.16" - } - }, - "node_modules/nanoclone": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", - "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "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==", - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oblivious-set": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.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, - "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==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/property-expr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", - "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-avatar-editor": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/react-avatar-editor/-/react-avatar-editor-13.0.0.tgz", - "integrity": "sha512-0xw63MbRRQdDy7YI1IXU9+7tTFxYEFLV8CABvryYOGjZmXRTH2/UA0mafe57ns62uaEFX181kA4XlGlxCaeXKA==", - "dependencies": { - "@babel/plugin-transform-runtime": "^7.12.1", - "@babel/runtime": "^7.12.5", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^0.14.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.14.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-bootstrap": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.7.0.tgz", - "integrity": "sha512-Jcrn6aUuRVBeSB6dzKODKZU1TONOdhAxu0IDm4Sv74SJUm98dMdhSotF2SNvFEADANoR+stV+7TK6SNX1wWu5w==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@restart/hooks": "^0.4.6", - "@restart/ui": "^1.4.1", - "@types/react-transition-group": "^4.4.4", - "classnames": "^2.3.1", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.8.1", - "prop-types-extra": "^1.1.0", - "react-transition-group": "^4.4.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "@types/react": ">=16.14.8", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "node_modules/react-hook-form": { - "version": "7.43.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.1.tgz", - "integrity": "sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg==", - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-i18next": { - "version": "11.18.6", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz", - "integrity": "sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==", - "dependencies": { - "@babel/runtime": "^7.14.5", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 19.0.0", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-query": { - "version": "3.39.3", - "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", - "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "broadcast-channel": "^3.4.1", - "match-sorter": "^6.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", - "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", - "dependencies": { - "@remix-run/router": "1.3.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", - "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", - "dependencies": { - "@remix-run/router": "1.3.2", - "react-router": "6.8.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-test-renderer": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz", - "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==", - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^17.0.2", - "react-shallow-renderer": "^16.13.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-test-renderer/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-toastify": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.1.tgz", - "integrity": "sha512-pkFCla1z3ve045qvjEmn2xOJOy4ZciwRXm1oMPULVkELi5aJdHCN/FHnuqXq8IwGDLB7PPk2/J6uP9D8ejuiRw==", - "dependencies": { - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz", - "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-accents": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", - "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.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/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sass": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.0.tgz", - "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/semantic-ui-css": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.5.0.tgz", - "integrity": "sha512-jIWn3WXXE2uSaWCcB+gVJVRG3masIKtTMNEP2X8Aw909H2rHpXGneYOxzO3hT8TpyvB5/dEEo9mBFCitGwoj1A==", - "dependencies": { - "jquery": "x.*" - } - }, - "node_modules/semantic-ui-react": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-2.1.4.tgz", - "integrity": "sha512-7CxjBoFUfH7fUvtn+SPkkIocthUD9kV3niF1mUMa9TbeyPAf2brtRCZBlT2OpHaXmkscFzGjEfhbJo9gKfotzQ==", - "dependencies": { - "@babel/runtime": "^7.10.5", - "@fluentui/react-component-event-listener": "~0.63.0", - "@fluentui/react-component-ref": "~0.63.0", - "@popperjs/core": "^2.6.0", - "@semantic-ui-react/event-stack": "^3.1.3", - "clsx": "^1.1.1", - "keyboard-key": "^1.1.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "prop-types": "^15.7.2", - "react-is": "^16.8.6 || ^17.0.0 || ^18.0.0", - "react-popper": "^2.3.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "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, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unload": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", - "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", - "dependencies": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yup": { - "version": "0.32.11", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", - "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/lodash": "^4.14.175", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "nanoclone": "^0.2.1", - "property-expr": "^2.0.4", - "toposort": "^2.0.2" - }, - "engines": { - "node": ">=10" - } - } - }, + "lockfileVersion": 1, "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -6842,29 +16,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==" }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "peer": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, "@babel/generator": { "version": "7.20.14", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", @@ -7101,17 +252,6 @@ "@babel/types": "^7.20.5" } }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "peer": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - } - }, "@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", @@ -7975,14 +1115,12 @@ "@heroicons/react": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.15.tgz", - "integrity": "sha512-CZ2dGWgWG3/z5LEoD5D3MEr1syn45JM/OB2aDpw531Ryecgkz2V7TWQ808P0lva7zP003PVW6WlwbofsYyga3A==", - "requires": {} + "integrity": "sha512-CZ2dGWgWG3/z5LEoD5D3MEr1syn45JM/OB2aDpw531Ryecgkz2V7TWQ808P0lva7zP003PVW6WlwbofsYyga3A==" }, "@hookform/resolvers": { "version": "2.9.11", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz", - "integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==", - "requires": {} + "integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==" }, "@humanwhocodes/config-array": { "version": "0.11.8", @@ -8007,16 +1145,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "peer": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -8371,8 +1499,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "6.12.6", @@ -8560,8 +1687,7 @@ "bootstrap": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", - "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", - "requires": {} + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==" }, "bootstrap-icons": { "version": "1.10.3", @@ -8701,12 +1827,6 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "peer": true - }, "core-js-compat": { "version": "3.27.2", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", @@ -9568,8 +2688,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -9714,6 +2833,11 @@ "flat-cache": "^3.0.4" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -9796,12 +2920,6 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true - }, "get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -9961,6 +3079,15 @@ "cross-fetch": "3.1.5" } }, + "ics": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ics/-/ics-3.1.0.tgz", + "integrity": "sha512-O48TZKyLYagLlXoZwDmjetXc6SoT54wFkTu2MEYe7zse8kL+C/dgSynYCjRG1OTAv3iHtGtG0PWKG81LbcrKFA==", + "requires": { + "nanoid": "^3.1.23", + "yup": "^0.32.9" + } + }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -10277,12 +3404,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "peer": true - }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -10429,6 +3550,11 @@ "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -10715,8 +3841,7 @@ "react-colorful": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "requires": {} + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==" }, "react-dom": { "version": "17.0.2", @@ -10736,8 +3861,7 @@ "react-hook-form": { "version": "7.43.1", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.1.tgz", - "integrity": "sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg==", - "requires": {} + "integrity": "sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg==" }, "react-i18next": { "version": "11.18.6", @@ -11252,13 +4376,6 @@ "is-typed-array": "^1.1.9" } }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "peer": true - }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index 5acf7f49fa..c23237524c 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,10 @@ "esbuild": "^0.14.42", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-sass-plugin": "^2.2.6", + "file-saver": "^2.0.5", "i18next": "^21.9.1", "i18next-http-backend": "^1.4.1", + "ics": "^3.1.0", "lodash.debounce": "^4.0.8", "prop-types": "^15.8.1", "react": "^17.0.2", diff --git a/sample.env b/sample.env index b9f0036d21..a351734011 100644 --- a/sample.env +++ b/sample.env @@ -60,4 +60,3 @@ REDIS_URL= # Define the default locale language code (i.e. 'en' for English) from the following list: # [en, ar, fr, es] #DEFAULT_LOCALE=en - diff --git a/yarn.lock b/yarn.lock index 6febbe5231..9eec6497f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2342,6 +2342,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -2565,6 +2570,14 @@ i18next@^21.9.1: dependencies: "@babel/runtime" "^7.17.2" +ics@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ics/-/ics-3.1.0.tgz#ea3e369d69a53c5cd70a33e2b790cfc483b9b7b7" + integrity sha512-O48TZKyLYagLlXoZwDmjetXc6SoT54wFkTu2MEYe7zse8kL+C/dgSynYCjRG1OTAv3iHtGtG0PWKG81LbcrKFA== + dependencies: + nanoid "^3.1.23" + yup "^0.32.9" + ignore@^5.2.0: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" @@ -2979,6 +2992,11 @@ nanoclone@^0.2.1: resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== +nanoid@^3.1.23: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" @@ -3862,9 +3880,9 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yup@^0.32.11: +yup@^0.32.11, yup@^0.32.9: version "0.32.11" - resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== dependencies: "@babel/runtime" "^7.15.4" From 96df717c3bc6b20531ae3dbaf016bde1fe538dac Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Mar 2023 06:20:13 +0000 Subject: [PATCH 008/103] Voice Brige database migration for existing rooms --- ...populate_voice_brige_for_existing_rooms.rb | 21 +++++++++++++++++++ db/data_schema.rb | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb diff --git a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb new file mode 100644 index 0000000000..b5b2823344 --- /dev/null +++ b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class PopulateVoiceBrigeForExistingRooms < ActiveRecord::Migration[7.0] + def up + i = 0 + Room.where(voice_bridge: nil).each do |room| + while Room.where(voice_bridge: 10000+i).length > 0 + i = i + 1 + if i >= 99999 + raise "The db contains to many rooms to assign each one a unique voice_brige" + end + end + room.update(voice_bridge: 10000 + i) + i = i + 1 + end + end + + def down + Room.update_all(voice_bridge: nil) + end +end diff --git a/db/data_schema.rb b/db/data_schema.rb index 4013193075..157472de8b 100644 --- a/db/data_schema.rb +++ b/db/data_schema.rb @@ -1 +1 @@ -DataMigrate::Data.define(version: 20230228193705) +DataMigrate::Data.define(version: 20230328124724) From 32efa9132e2b5ed9c46a5a8f4e14c137d85f3cbf Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Mar 2023 09:15:23 +0000 Subject: [PATCH 009/103] Improved data migration --- .../20230328124724_populate_voice_brige_for_existing_rooms.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb index b5b2823344..b6d1a9b568 100644 --- a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb +++ b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb @@ -2,6 +2,9 @@ class PopulateVoiceBrigeForExistingRooms < ActiveRecord::Migration[7.0] def up + if Rails.application.config.voice_bridge_phone_number == nil + return + end i = 0 Room.where(voice_bridge: nil).each do |room| while Room.where(voice_bridge: 10000+i).length > 0 From 359640573edd3f35f68cac1563a35ff614ede0f4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Mar 2023 09:50:13 +0000 Subject: [PATCH 010/103] improved database voice_brige population --- ...populate_voice_brige_for_existing_rooms.rb | 24 +++++++++++++------ db/schema.rb | 8 +++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb index b6d1a9b568..acdb99b8a8 100644 --- a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb +++ b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb @@ -5,16 +5,26 @@ def up if Rails.application.config.voice_bridge_phone_number == nil return end - i = 0 + + if Room.all.length > 89999 + raise "The db contains to many rooms to assign each one a unique voice_brige" + end + Room.where(voice_bridge: nil).each do |room| - while Room.where(voice_bridge: 10000+i).length > 0 - i = i + 1 - if i >= 99999 - raise "The db contains to many rooms to assign each one a unique voice_brige" + id = SecureRandom.random_number((10.pow(5)) - 1) + + if id < 10000 + id = id + 10000 + end + + while Room.exists?(voice_bridge: id) + id = id + 1 + if id >= 99999 + id = 10000 end end - room.update(voice_bridge: 10000 + i) - i = i + 1 + + room.update(voice_bridge: id) end end diff --git a/db/schema.rb b/db/schema.rb index bc89aa2e7c..0d4cc3b862 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -175,6 +175,14 @@ t.index ["setting_id"], name: "index_site_settings_on_setting_id" end + create_table "tenants", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.string "name", null: false + t.string "client_secret", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["name"], name: "index_tenants_on_name", unique: true + end + create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.string "name", null: false t.string "email", null: false From 24aed75eed2fceff88038963659b6d674903e6f7 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Mon, 23 Oct 2023 08:14:35 +0000 Subject: [PATCH 011/103] Fixed mixup with the ICS branch. --- app/helpers/application_helper.rb | 1 - app/javascript/components/rooms/room/Room.jsx | 69 ++++----- .../rooms/room/forms/ShareRoomForm.jsx | 130 ---------------- app/javascript/helpers/ICSDownloadHelper.jsx | 140 ------------------ 4 files changed, 32 insertions(+), 308 deletions(-) delete mode 100644 app/javascript/components/rooms/room/forms/ShareRoomForm.jsx delete mode 100644 app/javascript/helpers/ICSDownloadHelper.jsx diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e01dfa4485..0fa721f729 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -20,7 +20,6 @@ module ApplicationHelper def branding_image asset_path = SettingGetter.new(setting_name: 'BrandingImage', provider: current_provider).call asset_url(asset_path) - #"https://jobs.secunet.com/templates/secunet/images/secunet_logo.png" end def page_title diff --git a/app/javascript/components/rooms/room/Room.jsx b/app/javascript/components/rooms/room/Room.jsx index 2eb0114598..e89cd62f2c 100644 --- a/app/javascript/components/rooms/room/Room.jsx +++ b/app/javascript/components/rooms/room/Room.jsx @@ -21,7 +21,7 @@ import { import { Link, Navigate, useLocation, useParams, } from 'react-router-dom'; -import { HomeIcon, Square2StackIcon, PhoneIcon} from '@heroicons/react/24/outline'; +import { HomeIcon, Square2StackIcon, PhoneIcon } from '@heroicons/react/24/outline'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; import { useAuth } from '../../../contexts/auth/AuthProvider'; @@ -33,9 +33,6 @@ import useStartMeeting from '../../../hooks/mutations/rooms/useStartMeeting'; import MeetingBadges from '../MeetingBadges'; import SharedBadge from './SharedBadge'; import RoomNamePlaceHolder from './RoomNamePlaceHolder'; -import Modal from '../../shared_components/modals/Modal'; -import ShareRoomForm from './forms/ShareRoomForm'; -import Title from '../../shared_components/utilities/Title'; export default function Room() { const { t } = useTranslation(); @@ -47,9 +44,14 @@ export default function Room() { const currentUser = useAuth(); const localizedTime = localizeDayDateTimeString(room?.last_session, currentUser?.language); - // Custom logic to redirect from Rooms page to join page if this isnt the users room and they're not allowed to view it - if (isError && error.response.status === 403) { - return ; + function copyInvite() { + navigator.clipboard.writeText(`${window.location}/join`); + toast.success(t('toast.success.room.copied_meeting_url')); + } + + function copyVoiceBridge(voice_bridge, voice_bridge_phone_number) { + navigator.clipboard.writeText(`Tel.: ${voice_bridge_phone_number} Pin: ${voice_bridge}`); + toast.success(t('toast.success.room.copied_voice_bridge')); } return ( @@ -89,36 +91,29 @@ export default function Room() { } - { - isRoomLoading - ? ( - - ) : ( - <> - - - - {t('room.meeting.share_meeting')} - - )} - title={t('room.meeting.share_meeting')} - body={} - /> - - )} + { + isRoomLoading + ? ( + + ) : ( + <> + + + {typeof room.voice_bridge_phone_number !== 'undefined' && }) + } diff --git a/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx b/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx deleted file mode 100644 index 51318d0877..0000000000 --- a/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx +++ /dev/null @@ -1,130 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). -// -// This program is free software; you can redistribute it and/or modify it under the -// terms of the GNU Lesser General Public License as published by the Free Software -// Foundation; either version 3.0 of the License, or (at your option) any later -// version. -// -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License along -// with Greenlight; if not, see . - -import React from 'react'; -import PropTypes from 'prop-types'; -import { useTranslation } from 'react-i18next'; -import { DocumentDuplicateIcon, CalendarIcon } from '@heroicons/react/24/outline'; -import { useAuth } from '../../../../contexts/auth/AuthProvider'; -import { Form, InputGroup, Button } from 'react-bootstrap'; -import { toast } from 'react-toastify'; -import { downloadICS } from '../../../../helpers/ICSDownloadHelper'; - - - -export default function ShareRoomForm({ room, handleClose }) { - const { t } = useTranslation(); - const currentUser = useAuth(); - - function roomJoinUrl(){ - return `https://${window.location.hostname}/rooms/${room.friendly_id}/join`; - } - - - function copyInvite() { - navigator.clipboard.writeText(roomJoinUrl()); - toast.success(t('toast.success.room.copied_meeting_url')); - } - - function copyPhoneNumber() { - navigator.clipboard.writeText(`${room.voice_bridge_phone_number},,${room.voice_bridge}`); - toast.success(t('toast.success.room.copied_voice_bridge')); - } - - function downloadICSFile(){ - downloadICS(currentUser.name, room.name, roomJoinUrl(), room.voice_bridge, room.voice_bridge_phone_number, t); - toast.success(t('toast.success.room.download_ics')); - } - - return ( -
- - {t('copy')} - - - - - - - {typeof room.voice_bridge_phone_number !== 'undefined' && typeof room.voice_bridge !== 'undefined' && - {t('copy_voice_bridge')} - - - - - } - - - {t('room.meeting.download_ics')} - - - - - -
- ); -} - -ShareRoomForm.defaulProps = { - room: PropTypes.shape({ - last_session: '', - }), -}; - -ShareRoomForm.propTypes = { - room: PropTypes.shape({ - id: PropTypes.string.isRequired, - friendly_id: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - last_session: PropTypes.string, - shared_owner: PropTypes.string, - online: PropTypes.bool, - participants: PropTypes.number, - }).isRequired, -}; \ No newline at end of file diff --git a/app/javascript/helpers/ICSDownloadHelper.jsx b/app/javascript/helpers/ICSDownloadHelper.jsx deleted file mode 100644 index 3e739f7d7a..0000000000 --- a/app/javascript/helpers/ICSDownloadHelper.jsx +++ /dev/null @@ -1,140 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). -// -// This program is free software; you can redistribute it and/or modify it under the -// terms of the GNU Lesser General Public License as published by the Free Software -// Foundation; either version 3.0 of the License, or (at your option) any later -// version. -// -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License along -// with Greenlight; if not, see . - -import { createEvent } from "ics"; -import { saveAs } from "file-saver"; - - -export const createICSContent = (name, url, voice_bridge, voice_bridge_phone_number, t, use_html=false) => { - if (use_html) { - return createICSWithHtml(name,url,voice_bridge,voice_bridge_phone_number, t); - } - - - description = `\n\n${t('room.meeting.invite_to_meeting', {name})}\n\n${t('room.meeting.join_by_url')}:\n${url}\n`; - - if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { - description += `\n${t('or')} ${t('room.meeting.join_by_phone')}:\n${voice_bridge_phone_number},,${voice_bridge}`; - } - - const date = new Date(); - - return eventContent = { - start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], - url: url, - description: description, - }; -} - -const createICSWithHtml = (name, url, voice_bridge, voice_bridge_phone_number) => { - phone_data = ""; - - if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { - phone_data = `
${t('or')} ${t('room.meeting.join_by_phone')}:
-

${voice_bridge_phone_number},,${voice_bridge}

`; - } - - const HTML = ` - - - - - - - - - - - - - - - - `; - - const date = new Date(); - - return eventContent = { - start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], - url: url, - htmlContent: HTML - }; -} - -export const downloadICS = (name, room, url, voice_bridge, voice_bridge_phone_number, t) => { - createEvent(createICSContent(name, url, voice_bridge, voice_bridge_phone_number, t), (error, value) => { - console.log(error); - const blob = new Blob([value], { type: "text/plain;charset=utf-8" }); - saveAs(blob, `bbb-meeting-${room.replace(/[/\\?%*:|"<>]/g, '')}.ics`); - }); -}; \ No newline at end of file From 9d534b608dc86127ec19d2f63f84ed80abc7d3f0 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Mon, 23 Oct 2023 08:42:29 +0000 Subject: [PATCH 012/103] Fixed missing import --- app/assets/builds/.keep | 0 app/javascript/components/rooms/room/Room.jsx | 5 ++--- db/schema.rb | 5 ++++- 3 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 app/assets/builds/.keep diff --git a/app/assets/builds/.keep b/app/assets/builds/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/javascript/components/rooms/room/Room.jsx b/app/javascript/components/rooms/room/Room.jsx index e89cd62f2c..ddb66b5135 100644 --- a/app/javascript/components/rooms/room/Room.jsx +++ b/app/javascript/components/rooms/room/Room.jsx @@ -18,9 +18,7 @@ import React from 'react'; import { Stack, Button, Col, Row, } from 'react-bootstrap'; -import { - Link, Navigate, useLocation, useParams, -} from 'react-router-dom'; +import { Link, useParams } from 'react-router-dom'; import { HomeIcon, Square2StackIcon, PhoneIcon } from '@heroicons/react/24/outline'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; @@ -33,6 +31,7 @@ import useStartMeeting from '../../../hooks/mutations/rooms/useStartMeeting'; import MeetingBadges from '../MeetingBadges'; import SharedBadge from './SharedBadge'; import RoomNamePlaceHolder from './RoomNamePlaceHolder'; +import Title from '../../shared_components/utilities/Title'; export default function Room() { const { t } = useTranslation(); diff --git a/db/schema.rb b/db/schema.rb index 6f5e0badd2..ee6ce85a16 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_07_05_183747) do +ActiveRecord::Schema[7.1].define(version: 2023_07_05_183747) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -43,6 +43,9 @@ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end + create_table "data_migrations", primary_key: "version", id: :string, force: :cascade do |t| + end + create_table "formats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "recording_id" t.string "recording_type", null: false From fab69d8d753920911ba90b870b51ed5fd913e285 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Mon, 30 Oct 2023 14:52:47 +0100 Subject: [PATCH 013/103] Add env EXTERNAL_AUTH and replace checks for OPENID_CONNECT with checks for EXTERNAL_AUTH where applicable (#5480) * add env EXTERNAL_AUTH and replace env OPENID_CONNECT with it where applicable * remove OPENID_CONNECT from envAPI --- app/controllers/api/v1/api_controller.rb | 2 +- app/controllers/api/v1/env_controller.rb | 2 +- app/javascript/components/admin/manage_users/ManageUsers.jsx | 2 +- .../admin/site_settings/registration/Registration.jsx | 2 +- app/javascript/components/home/AuthButtons.jsx | 2 +- app/javascript/components/rooms/room/join/JoinCard.jsx | 2 +- .../components/rooms/room/join/RequireAuthentication.jsx | 2 +- app/javascript/components/users/authentication/Signup.jsx | 2 +- esbuild.dev.mjs | 2 +- esbuild.mjs | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/v1/api_controller.rb b/app/controllers/api/v1/api_controller.rb index 502124b701..92b27351bf 100644 --- a/app/controllers/api/v1/api_controller.rb +++ b/app/controllers/api/v1/api_controller.rb @@ -89,7 +89,7 @@ def config_sorting(allowed_columns: []) { sort_column => sort_direction } end - # Checks if external authentication is enabled + # Checks if external authentication is enabled (currently only OIDC is implemented) def external_authn_enabled? ENV['OPENID_CONNECT_ISSUER'].present? end diff --git a/app/controllers/api/v1/env_controller.rb b/app/controllers/api/v1/env_controller.rb index 2541f5ed19..946e261c2f 100644 --- a/app/controllers/api/v1/env_controller.rb +++ b/app/controllers/api/v1/env_controller.rb @@ -25,7 +25,7 @@ class EnvController < ApiController # Returns basic NON-CONFIDENTIAL information on the environment variables def index render_data data: { - OPENID_CONNECT: ENV['OPENID_CONNECT_ISSUER'].present?, + EXTERNAL_AUTH: ENV['OPENID_CONNECT_ISSUER'].present?, # currently only OIDC is implemented HCAPTCHA_KEY: ENV.fetch('HCAPTCHA_SITE_KEY', nil), VERSION_TAG: ENV.fetch('VERSION_TAG', ''), CURRENT_PROVIDER: current_provider, diff --git a/app/javascript/components/admin/manage_users/ManageUsers.jsx b/app/javascript/components/admin/manage_users/ManageUsers.jsx index c72d9eef3b..b8269617b1 100644 --- a/app/javascript/components/admin/manage_users/ManageUsers.jsx +++ b/app/javascript/components/admin/manage_users/ManageUsers.jsx @@ -81,7 +81,7 @@ export default function ManageUsers() { /> )} { - (!envAPI.isLoading && !envAPI.data?.OPENID_CONNECT) + (!envAPI.isLoading && !envAPI.data?.EXTERNAL_AUTH) && ( - { env?.OPENID_CONNECT && ( + { env?.EXTERNAL_AUTH && ( diff --git a/app/javascript/components/rooms/room/join/JoinCard.jsx b/app/javascript/components/rooms/room/join/JoinCard.jsx index 41ac6ac491..73fc255feb 100644 --- a/app/javascript/components/rooms/room/join/JoinCard.jsx +++ b/app/javascript/components/rooms/room/join/JoinCard.jsx @@ -252,7 +252,7 @@ export default function JoinCard() { {!currentUser?.signed_in && ( - env?.OPENID_CONNECT ? ( + env?.EXTERNAL_AUTH ? ( {t('authentication.already_have_account')} diff --git a/app/javascript/components/rooms/room/join/RequireAuthentication.jsx b/app/javascript/components/rooms/room/join/RequireAuthentication.jsx index 98ed8676e0..88908ddcf0 100644 --- a/app/javascript/components/rooms/room/join/RequireAuthentication.jsx +++ b/app/javascript/components/rooms/room/join/RequireAuthentication.jsx @@ -38,7 +38,7 @@ export default function RequireAuthentication({ path }) {
{ - env?.OPENID_CONNECT ? ( + env?.EXTERNAL_AUTH ? (
diff --git a/app/javascript/components/users/authentication/Signup.jsx b/app/javascript/components/users/authentication/Signup.jsx index b5306175dc..7cbe8b3aa6 100644 --- a/app/javascript/components/users/authentication/Signup.jsx +++ b/app/javascript/components/users/authentication/Signup.jsx @@ -32,7 +32,7 @@ export default function Signup() { const envAPI = useEnv(); const isLoading = envAPI.isLoading || registrationMethodSettingAPI.isLoading; - if (envAPI.data?.OPENID_CONNECT) { + if (envAPI.data?.EXTERNAL_AUTH) { return ; } diff --git a/esbuild.dev.mjs b/esbuild.dev.mjs index 1bd3839ca4..3ff7311405 100644 --- a/esbuild.dev.mjs +++ b/esbuild.dev.mjs @@ -20,7 +20,7 @@ await esbuild.build({ }, define: { 'process.env.RELATIVE_URL_ROOT': `"${relativeUrlRoot}"`, - 'process.env.OMNIAUTH_PATH': `"${relativeUrlRoot}/auth/openid_connect"`, + 'process.env.OMNIAUTH_PATH': `"${relativeUrlRoot}/auth/openid_connect"`, // currently, only OIDC is implemented }, }); diff --git a/esbuild.mjs b/esbuild.mjs index 6330cbc21d..e9aa8a45e1 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -14,7 +14,7 @@ await esbuild.build({ }, define: { 'process.env.RELATIVE_URL_ROOT': `"${relativeUrlRoot}"`, - 'process.env.OMNIAUTH_PATH': `"${relativeUrlRoot}/auth/openid_connect"`, + 'process.env.OMNIAUTH_PATH': `"${relativeUrlRoot}/auth/openid_connect"`, // currently, only OIDC is implemented }, }); From 9db6db24b4a86dac38f73a12db73c28cd7a92d97 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 09:48:13 -0400 Subject: [PATCH 014/103] Make server recordings rake a bit smarter (#5484) * Make server recordings rake a bit smarter * Rubocop --- lib/tasks/server_recordings_sync.rake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/tasks/server_recordings_sync.rake b/lib/tasks/server_recordings_sync.rake index c8621a3f3d..c74260742d 100644 --- a/lib/tasks/server_recordings_sync.rake +++ b/lib/tasks/server_recordings_sync.rake @@ -25,7 +25,15 @@ task :server_recordings_sync, %i[provider] => :environment do |_task, args| meeting_ids = rooms.pluck(:meeting_id) recordings = BigBlueButtonApi.new(provider: args[:provider]).get_recordings(meeting_ids:) + + # Skip the entire batch if the first and last recordings exist + if Recording.exists?(record_id: recordings[:recordings][0][:recordID]) && Recording.exists?(record_id: recordings[:recordings][-1][:recordID]) + next + end + recordings[:recordings].each do |recording| + next if Recording.exists?(record_id: recording[:recordID]) + RecordingCreator.new(recording:).call success 'Successfully migrated Recording:' info "RecordID: #{recording[:recordID]}" From 7ada110ea673a0f727dbd06d72383b396e842d51 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 09:48:25 -0400 Subject: [PATCH 015/103] Fix case sensitive emails (#5485) * case sensitive emails * Update schema.rb --- .../api/v1/admin/invitations_controller.rb | 2 +- .../api/v1/migrations/external_controller.rb | 2 +- .../api/v1/reset_password_controller.rb | 2 +- app/controllers/api/v1/sessions_controller.rb | 3 ++- app/controllers/api/v1/users_controller.rb | 3 ++- app/controllers/external_controller.rb | 2 +- app/services/recordings_sync.rb | 6 +++--- db/data/20231030185844_lowercase_emails.rb | 16 ++++++++++++++++ 8 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 db/data/20231030185844_lowercase_emails.rb diff --git a/app/controllers/api/v1/admin/invitations_controller.rb b/app/controllers/api/v1/admin/invitations_controller.rb index 5d022e8330..6aab95298c 100644 --- a/app/controllers/api/v1/admin/invitations_controller.rb +++ b/app/controllers/api/v1/admin/invitations_controller.rb @@ -39,7 +39,7 @@ def index # Creates an invitation for the specified emails (comma separated) and sends them an email def create params[:invitations][:emails].split(',').each do |email| - invitation = Invitation.find_or_initialize_by(email:, provider: current_provider).tap do |i| + invitation = Invitation.find_or_initialize_by(email: email.downcase, provider: current_provider).tap do |i| i.updated_at = Time.zone.now i.save! end diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index f9d39c1537..9a68ab20c8 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -91,7 +91,7 @@ def create_user return render_error(status: :bad_request, errors: 'Provider does not exist') end - return render_data status: :created if User.exists?(email: user_hash[:email], provider: user_hash[:provider]) + return render_data status: :created if User.exists?(email: user_hash[:email].downcase, provider: user_hash[:provider]) user_hash[:language] = I18n.default_locale if user_hash[:language].blank? || user_hash[:language] == 'default' diff --git a/app/controllers/api/v1/reset_password_controller.rb b/app/controllers/api/v1/reset_password_controller.rb index 99c7a8d30f..feea5ec0f0 100644 --- a/app/controllers/api/v1/reset_password_controller.rb +++ b/app/controllers/api/v1/reset_password_controller.rb @@ -30,7 +30,7 @@ def create # TODO: Log events. return render_error unless params[:user] - user = User.find_by email: params[:user][:email] + user = User.find_by email: params[:user][:email].downcase # Silently fail for unfound or external users. return render_data status: :ok unless user && !user.external_id? diff --git a/app/controllers/api/v1/sessions_controller.rb b/app/controllers/api/v1/sessions_controller.rb index d764ad97f0..65a07e9125 100644 --- a/app/controllers/api/v1/sessions_controller.rb +++ b/app/controllers/api/v1/sessions_controller.rb @@ -36,7 +36,8 @@ def create return render_error if hcaptcha_enabled? && !verify_hcaptcha(response: params[:token]) # Search for a user within the current provider and, if not found, search for a super admin within bn provider - user = User.find_by(email: session_params[:email], provider: current_provider) || User.find_by(email: session_params[:email], provider: 'bn') + user = User.find_by(email: session_params[:email].downcase, provider: current_provider) || + User.find_by(email: session_params[:email].downcase, provider: 'bn') # Return an error if the user is not found return render_error if user.blank? diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index 95b7a69e72..f00dd0e31d 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -169,7 +169,8 @@ def valid_invite_token return false if create_user_params[:invite_token].blank? # Try to delete the invitation and return true if it succeeds - Invitation.destroy_by(email: create_user_params[:email], provider: current_provider, token: create_user_params[:invite_token]).present? + Invitation.destroy_by(email: create_user_params[:email].downcase, provider: current_provider, + token: create_user_params[:invite_token]).present? end end end diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb index b7f7a4d141..7e91680566 100644 --- a/app/controllers/external_controller.rb +++ b/app/controllers/external_controller.rb @@ -129,7 +129,7 @@ def valid_invite_token(email:) return false if token.blank? # Try to delete the invitation and return true if it succeeds - Invitation.destroy_by(email:, provider: current_provider, token:).present? + Invitation.destroy_by(email: email.downcase, provider: current_provider, token:).present? end def build_user_info(credentials) diff --git a/app/services/recordings_sync.rb b/app/services/recordings_sync.rb index af50e10bdf..bacdfd19fb 100644 --- a/app/services/recordings_sync.rb +++ b/app/services/recordings_sync.rb @@ -23,9 +23,9 @@ def initialize(room:, provider:) end def call - recordings = @room.recordings - Format.where(recordings:).delete_all - recordings.delete_all + room_recordings = @room.recordings + Format.where(recording: room_recordings).delete_all + room_recordings.delete_all recordings = BigBlueButtonApi.new(provider: @provider).get_recordings(meeting_ids: @room.meeting_id) recordings[:recordings].each do |recording| diff --git a/db/data/20231030185844_lowercase_emails.rb b/db/data/20231030185844_lowercase_emails.rb new file mode 100644 index 0000000000..fbe41a00bb --- /dev/null +++ b/db/data/20231030185844_lowercase_emails.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class LowercaseEmails < ActiveRecord::Migration[7.1] + def up + User.all.find_each(batch_size: 250) do |user| + downcase = user.email.downcase + next if user.email == downcase + + user.update(email: downcase) + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end From 6c600dfd804cec02b6b3c686d76597a5e9be53bb Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 10:01:57 -0400 Subject: [PATCH 016/103] Fixed various issues with users and providers (#5488) --- app/controllers/api/v1/admin/role_permissions_controller.rb | 5 ++++- app/controllers/api/v1/reset_password_controller.rb | 2 +- app/controllers/api/v1/shared_accesses_controller.rb | 1 + app/controllers/api/v1/verify_account_controller.rb | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/admin/role_permissions_controller.rb b/app/controllers/api/v1/admin/role_permissions_controller.rb index 4b15af3767..b694807ca1 100644 --- a/app/controllers/api/v1/admin/role_permissions_controller.rb +++ b/app/controllers/api/v1/admin/role_permissions_controller.rb @@ -56,7 +56,10 @@ def role_params def create_default_room return unless role_params[:name] == 'CreateRoom' && role_params[:value] == true - User.includes(:rooms).where(role_id: role_params[:role_id]).where(rooms: { id: nil }).find_in_batches do |group| + User.includes(:rooms) + .with_provider(current_provider) + .where(role_id: role_params[:role_id]) + .where(rooms: { id: nil }).find_in_batches do |group| group.each do |user| Room.create(name: t('room.new_room_name', username: user.name, locale: user.language), user_id: user.id) end diff --git a/app/controllers/api/v1/reset_password_controller.rb b/app/controllers/api/v1/reset_password_controller.rb index feea5ec0f0..2384fd832d 100644 --- a/app/controllers/api/v1/reset_password_controller.rb +++ b/app/controllers/api/v1/reset_password_controller.rb @@ -30,7 +30,7 @@ def create # TODO: Log events. return render_error unless params[:user] - user = User.find_by email: params[:user][:email].downcase + user = User.find_by email: params[:user][:email].downcase, provider: current_provider # Silently fail for unfound or external users. return render_data status: :ok unless user && !user.external_id? diff --git a/app/controllers/api/v1/shared_accesses_controller.rb b/app/controllers/api/v1/shared_accesses_controller.rb index 864478dd1c..f8a3340a35 100644 --- a/app/controllers/api/v1/shared_accesses_controller.rb +++ b/app/controllers/api/v1/shared_accesses_controller.rb @@ -73,6 +73,7 @@ def shareable_users # Can't share the room if it's already shared or it's the room owner shareable_users = User.with_attached_avatar + .with_provider(current_provider) .where.not(id: [@room.shared_users.pluck(:id) << @room.user_id]) .where(role_id: [role_ids]) .name_search(params[:search]) diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb index a0e4430ad5..8e508fc059 100644 --- a/app/controllers/api/v1/verify_account_controller.rb +++ b/app/controllers/api/v1/verify_account_controller.rb @@ -61,7 +61,7 @@ def activate def find_user_and_authorize return render_error status: :bad_request unless params[:user] - @user = User.find_by id: params[:user][:id] + @user = User.find_by id: params[:user][:id], provider: current_provider render_data status: :ok unless @user && !@user.verified? end end From da113a88fb98ba864d0be920e20658eaeb3a357b Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 11:31:08 -0400 Subject: [PATCH 017/103] Changes to local accounts (#5489) * Changes to local accounts * rspec * esf --- app/assets/locales/en.json | 2 ++ app/controllers/api/v1/api_controller.rb | 6 ++++-- app/controllers/api/v1/env_controller.rb | 2 +- app/controllers/api/v1/sessions_controller.rb | 6 ++++++ app/controllers/api/v1/users_controller.rb | 2 +- .../users/password_management/ResetPassword.jsx | 3 +++ .../hooks/mutations/sessions/useCreateSession.jsx | 2 ++ app/javascript/hooks/mutations/users/useResetPwd.jsx | 2 +- spec/controllers/users_controller_spec.rb | 12 ++++++------ 9 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index d7f341f902..8318749647 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -82,6 +82,7 @@ "account_info": "Account Info", "delete_account": "Delete Account", "change_password": "Change Password", + "set_password": "Set Your New Password", "reset_password": "Reset Password", "update_account_info": "Update Account Info", "current_password": "Current Password", @@ -365,6 +366,7 @@ "user_updated": "The user has been updated.", "user_deleted": "The user has been deleted.", "avatar_updated": "The avatar has been updated.", + "password_changed": "Successfully updated your password. Please sign in again.", "password_updated": "The password has been updated.", "account_activated": "Your account has been activated.", "activation_email_sent": "An email that contains the instructions to activate your account has been sent.", diff --git a/app/controllers/api/v1/api_controller.rb b/app/controllers/api/v1/api_controller.rb index 92b27351bf..0ebbe53fa1 100644 --- a/app/controllers/api/v1/api_controller.rb +++ b/app/controllers/api/v1/api_controller.rb @@ -90,8 +90,10 @@ def config_sorting(allowed_columns: []) end # Checks if external authentication is enabled (currently only OIDC is implemented) - def external_authn_enabled? - ENV['OPENID_CONNECT_ISSUER'].present? + def external_auth? + return ENV['OPENID_CONNECT_ISSUER'].present? if ENV['LOADBALANCER_ENDPOINT'].blank? + + !Tenant.exists?(name: current_provider, client_secret: 'local') end end end diff --git a/app/controllers/api/v1/env_controller.rb b/app/controllers/api/v1/env_controller.rb index 946e261c2f..4982b208e0 100644 --- a/app/controllers/api/v1/env_controller.rb +++ b/app/controllers/api/v1/env_controller.rb @@ -25,7 +25,7 @@ class EnvController < ApiController # Returns basic NON-CONFIDENTIAL information on the environment variables def index render_data data: { - EXTERNAL_AUTH: ENV['OPENID_CONNECT_ISSUER'].present?, # currently only OIDC is implemented + EXTERNAL_AUTH: external_auth?, HCAPTCHA_KEY: ENV.fetch('HCAPTCHA_SITE_KEY', nil), VERSION_TAG: ENV.fetch('VERSION_TAG', ''), CURRENT_PROVIDER: current_provider, diff --git a/app/controllers/api/v1/sessions_controller.rb b/app/controllers/api/v1/sessions_controller.rb index 65a07e9125..41eb19cbe6 100644 --- a/app/controllers/api/v1/sessions_controller.rb +++ b/app/controllers/api/v1/sessions_controller.rb @@ -45,6 +45,12 @@ def create # Will return an error if the user is NOT from the current provider and if the user is NOT a super admin return render_error if user.provider != current_provider && !user.super_admin? + # Password is not set (local user migrated from v2) + if user.external_id.blank? && user.password_digest.blank? + token = user.generate_reset_token! + return render_error data: token, errors: 'PasswordNotSet' + end + # TODO: Add proper error logging for non-verified token hcaptcha if user.authenticate(session_params[:password]) return render_error data: user.id, errors: Rails.configuration.custom_error_msgs[:unverified_user] unless user.verified? diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index f00dd0e31d..98b5202494 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -39,7 +39,7 @@ def show # POST /api/v1/users.json # Creates and saves a new user record in the database with the provided parameters def create - return render_error status: :forbidden if external_authn_enabled? + return render_error status: :forbidden if external_auth? # Check if this is an admin creating a user admin_create = current_user && PermissionsChecker.new(current_user:, permission_names: 'ManageUsers', current_provider:).call diff --git a/app/javascript/components/users/password_management/ResetPassword.jsx b/app/javascript/components/users/password_management/ResetPassword.jsx index b3ace1a9e2..56c35ab543 100644 --- a/app/javascript/components/users/password_management/ResetPassword.jsx +++ b/app/javascript/components/users/password_management/ResetPassword.jsx @@ -17,11 +17,13 @@ import React, { useEffect } from 'react'; import Card from 'react-bootstrap/Card'; import { useParams } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; import useVerifyToken from '../../../hooks/mutations/users/useVerifyToken'; import ResetPwdForm from './forms/ResetPwdForm'; import Logo from '../../shared_components/Logo'; export default function ResetPassword() { + const { t } = useTranslation(); const { token } = useParams(); const verifyTokenAPI = useVerifyToken(token); @@ -37,6 +39,7 @@ export default function ResetPassword() { + { t('user.account.set_password') } diff --git a/app/javascript/hooks/mutations/sessions/useCreateSession.jsx b/app/javascript/hooks/mutations/sessions/useCreateSession.jsx index 8018654916..10fef82ec0 100644 --- a/app/javascript/hooks/mutations/sessions/useCreateSession.jsx +++ b/app/javascript/hooks/mutations/sessions/useCreateSession.jsx @@ -49,6 +49,8 @@ export default function useCreateSession() { toast.error(t('toast.error.users.banned')); } else if (err.response.data.errors === 'UnverifiedUser') { navigate(`/verify?id=${err.response.data.data}`); + } else if (err.response.data.errors === 'PasswordNotSet') { + navigate(`/reset_password/${err.response.data.data}`); } else { toast.error(t('toast.error.session.invalid_credentials')); } diff --git a/app/javascript/hooks/mutations/users/useResetPwd.jsx b/app/javascript/hooks/mutations/users/useResetPwd.jsx index d2aae13349..8ff67d4684 100644 --- a/app/javascript/hooks/mutations/users/useResetPwd.jsx +++ b/app/javascript/hooks/mutations/users/useResetPwd.jsx @@ -28,7 +28,7 @@ export default function useResetPwd() { (user) => axios.post('/reset_password/reset.json', { user }), { onSuccess: () => { - toast.success(t('toast.success.user.password_updated')); + toast.success(t('toast.success.user.password_changed')); navigate('/signin'); }, onError: () => { diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 7c61036e82..e7f59cde50 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -25,7 +25,7 @@ before do ENV['SMTP_SERVER'] = 'test.com' - allow(controller).to receive(:external_authn_enabled?).and_return(false) + allow(controller).to receive(:external_auth?).and_return(false) request.headers['ACCEPT'] = 'application/json' end @@ -280,7 +280,7 @@ context 'External AuthN enabled' do before do - allow(controller).to receive(:external_authn_enabled?).and_return(true) + allow(controller).to receive(:external_auth?).and_return(true) end it 'returns :forbidden without creating the user account' do @@ -472,9 +472,9 @@ end context 'private methods' do - describe '#external_authn_enabled?' do + describe '#external_auth??' do before do - allow(controller).to receive(:external_authn_enabled?).and_call_original + allow(controller).to receive(:external_auth?).and_call_original end context 'OPENID_CONNECT_ISSUER is present?' do @@ -483,7 +483,7 @@ end it 'returns true' do - expect(controller).to be_external_authn_enabled + expect(controller).to be_external_auth end end @@ -493,7 +493,7 @@ end it 'returns false' do - expect(controller).not_to be_external_authn_enabled + expect(controller).not_to be_external_auth end end end From 878ee23504a9fb42c7d3fa211100689213a242ce Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 11:57:41 -0400 Subject: [PATCH 018/103] Fix double logo on require authentication view (#5490) * Fix double logo on require authentication view * eslint --- .../rooms/room/join/RequireAuthentication.jsx | 52 ++++++++----------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/app/javascript/components/rooms/room/join/RequireAuthentication.jsx b/app/javascript/components/rooms/room/join/RequireAuthentication.jsx index 88908ddcf0..7e16a351aa 100644 --- a/app/javascript/components/rooms/room/join/RequireAuthentication.jsx +++ b/app/javascript/components/rooms/room/join/RequireAuthentication.jsx @@ -19,7 +19,6 @@ import { Button, Form } from 'react-bootstrap'; import Card from 'react-bootstrap/Card'; import { useTranslation } from 'react-i18next'; import PropTypes from 'prop-types'; -import Logo from '../../../shared_components/Logo'; import useEnv from '../../../../hooks/queries/env/useEnv'; import ButtonLink from '../../../shared_components/utilities/ButtonLink'; @@ -28,34 +27,29 @@ export default function RequireAuthentication({ path }) { const { data: env } = useEnv(); return ( -
-
- -
- - -

{ t('room.settings.require_signed_in_message') }

-
- - { - env?.EXTERNAL_AUTH ? ( - - - - - - ) : ( - <> - - {t('authentication.sign_up')} - - {t('authentication.sign_in')} - - ) - } - -
-
+ + +

{ t('room.settings.require_signed_in_message') }

+
+ + { + env?.EXTERNAL_AUTH ? ( +
+ + + +
+ ) : ( + <> + + {t('authentication.sign_up')} + + {t('authentication.sign_in')} + + ) + } +
+
); } From cbbf36110c7e872e050ac5f99e073331a049e33a Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 14:46:57 -0400 Subject: [PATCH 019/103] More fixes for local migrations (#5491) * More fixes for local migrations * fix tests --- .../api/v1/migrations/external_controller.rb | 7 ++++- app/services/meeting_starter.rb | 2 +- .../admin/server_rooms_controller_spec.rb | 2 +- .../migrations/external_controller_spec.rb | 30 ++++++++++++++++--- spec/services/meeting_starter_spec.rb | 2 +- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index 9a68ab20c8..b398e241e5 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -105,6 +105,11 @@ def create_user return render_error(status: :bad_request, errors: user&.errors&.to_a) unless user.save + if user_hash[:provider] != 'greenlight' + user.password_digest = nil + user.save(validations: false) + end + render_data status: :created end @@ -250,7 +255,7 @@ def decrypted_params raise ActiveSupport::MessageEncryptor::InvalidMessage unless encrypted_params.is_a? String - crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31], cipher: 'aes-256-gcm', serializer: Marshal) + crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secret_key_base[0..31], cipher: 'aes-256-gcm', serializer: Marshal) decrypted_params = crypt.decrypt_and_verify(encrypted_params) || {} raise ActiveSupport::MessageEncryptor::InvalidMessage unless decrypted_params.is_a? Hash diff --git a/app/services/meeting_starter.rb b/app/services/meeting_starter.rb index b3bb782c6d..b91884d50b 100644 --- a/app/services/meeting_starter.rb +++ b/app/services/meeting_starter.rb @@ -64,7 +64,7 @@ def computed_options(access_code:) logoutURL: room_url, meta_endCallbackUrl: meeting_ended_url(host: @base_url), 'meta_bbb-recording-ready-url': recording_ready_url(host: @base_url), - 'meta_bbb-origin-version': 3, + 'meta_bbb-origin-version': ENV.fetch('VERSION_TAG', 'v3'), 'meta_bbb-origin': 'greenlight' } end diff --git a/spec/controllers/admin/server_rooms_controller_spec.rb b/spec/controllers/admin/server_rooms_controller_spec.rb index b6d135b3be..10b2de3a77 100644 --- a/spec/controllers/admin/server_rooms_controller_spec.rb +++ b/spec/controllers/admin/server_rooms_controller_spec.rb @@ -154,7 +154,7 @@ def bbb_meetings hasJoinedVoice: 'false', hasVideo: 'false', clientType: 'HTML5' } }, - metadata: { 'bbb-origin-version': '3', + metadata: { 'bbb-origin-version': 'v3', 'bbb-recording-ready-url': 'http://localhost:3000/recording_ready', 'bbb-origin': 'greenlight', endcallbackurl: 'http://localhost:3000/meeting_ended' }, diff --git a/spec/controllers/migrations/external_controller_spec.rb b/spec/controllers/migrations/external_controller_spec.rb index e2cf4c2229..f15c602782 100644 --- a/spec/controllers/migrations/external_controller_spec.rb +++ b/spec/controllers/migrations/external_controller_spec.rb @@ -133,7 +133,7 @@ describe 'because the ciphertext was not generated with the same configuration' do it 'returns :bad_request without creating a role' do - key = Rails.application.secrets.secret_key_base[1..32] + key = Rails.application.secret_key_base[1..32] encrypted_params = encrypt_params({ role: { name: 'CrazyRole', role_permissions: {} } }, key:, expires_in: 10.seconds) expect { post :create_role, params: { v2: { encrypted_params: } } }.not_to change(Role, :count) @@ -188,6 +188,28 @@ expect(response).to have_http_status(:created) expect(user.password_digest).to be_present end + + it 'creates the user without a password if provider is not greenlight' do + tenant = create(:tenant) + role = create(:role, name: valid_user_role.name, provider: tenant.name) + valid_user_params[:provider] = tenant.name + + encrypted_params = encrypt_params({ user: valid_user_params }, expires_in: 10.seconds) + + expect_any_instance_of(described_class).to receive(:generate_secure_pwd).and_call_original + expect { post :create_user, params: { v2: { encrypted_params: } } }.to change(User, :count).from(0).to(1) + expect(ActionMailer::MailDeliveryJob).not_to have_been_enqueued + + user = User.take + expect(user.name).to eq(valid_user_params[:name]) + expect(user.email).to eq(valid_user_params[:email]) + expect(user.language).to eq(valid_user_params[:language]) + expect(user.role).to eq(role) + expect(user.session_token).to be_present + expect(user.provider).to eq(tenant.name) + expect(response).to have_http_status(:created) + expect(user.password_digest).not_to be_present + end end context 'when the provider does not exists' do @@ -429,7 +451,7 @@ describe 'because the ciphertext was not generated with the same configuration' do it 'returns :bad_request without creating a user' do - key = Rails.application.secrets.secret_key_base[1..32] + key = Rails.application.secret_key_base[1..32] encrypted_params = encrypt_params({ user: valid_user_params }, key:, expires_in: 10.seconds) expect_any_instance_of(described_class).not_to receive(:generate_secure_pwd) @@ -547,7 +569,7 @@ describe 'because the ciphertext was not generated with the same configuration' do it 'returns :bad_request without creating a room' do - key = Rails.application.secrets.secret_key_base[1..32] + key = Rails.application.secret_key_base[1..32] encrypted_params = encrypt_params({ room: valid_room_params }, key:, expires_in: 10.seconds) expect { post :create_room, params: { v2: { encrypted_params: } } }.not_to change(Room, :count) expect(response).to have_http_status(:bad_request) @@ -647,7 +669,7 @@ private def encrypt_params(params, key: nil, expires_at: nil, expires_in: nil, purpose: nil) - key = Rails.application.secrets.secret_key_base[0..31] if key.nil? + key = Rails.application.secret_key_base[0..31] if key.nil? crypt = ActiveSupport::MessageEncryptor.new(key, cipher: 'aes-256-gcm', serializer: Marshal) crypt.encrypt_and_sign(params, expires_at:, expires_in:, purpose:) end diff --git a/spec/services/meeting_starter_spec.rb b/spec/services/meeting_starter_spec.rb index 8877c3eb1e..275f606f64 100644 --- a/spec/services/meeting_starter_spec.rb +++ b/spec/services/meeting_starter_spec.rb @@ -41,7 +41,7 @@ logoutURL: url, meta_endCallbackUrl: File.join(base_url, '/meeting_ended'), 'meta_bbb-recording-ready-url': File.join(base_url, '/recording_ready'), - 'meta_bbb-origin-version': 3, + 'meta_bbb-origin-version': 'v3', 'meta_bbb-origin': 'greenlight', setting: 'value' } From ac9d4202c9109a850493de4e8c2effbec6eeb6d0 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 15:22:00 -0400 Subject: [PATCH 020/103] Hotfix for local accounts (#5492) --- app/services/user_creator.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/services/user_creator.rb b/app/services/user_creator.rb index 7a6ad286bc..79f22712bf 100644 --- a/app/services/user_creator.rb +++ b/app/services/user_creator.rb @@ -25,6 +25,7 @@ def initialize(user_params:, provider:, role:) end def call + @user_params[:email] = @user_params[:email].downcase email_role = infer_role_from_email(@user_params[:email]) User.new({ From bf939e6392dd95afc3781d596dd62ac3d9f7e9d3 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 1 Nov 2023 17:17:45 -0400 Subject: [PATCH 021/103] Fix joining interval (#5494) --- app/javascript/components/rooms/room/join/JoinCard.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/components/rooms/room/join/JoinCard.jsx b/app/javascript/components/rooms/room/join/JoinCard.jsx index 73fc255feb..58521b86f5 100644 --- a/app/javascript/components/rooms/room/join/JoinCard.jsx +++ b/app/javascript/components/rooms/room/join/JoinCard.jsx @@ -77,7 +77,7 @@ export default function JoinCard() { } roomStatusAPI.mutate(data); - const interval = setInterval(() => roomStatusAPI.mutate(data), 5000); + const interval = setInterval(() => roomStatusAPI.mutate(data), 30000); setJoinInterval(interval); }; const reset = () => { setHasStarted(false); };// Reset pipeline; From eba4122c7a2e7f553c9a58f0cf4972bd771bee99 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Fri, 3 Nov 2023 10:43:26 -0400 Subject: [PATCH 022/103] Recording view improvements (#5497) * Added pagination to recording tables * Make dropdown go up for last item in list * rspec --- .../stylesheets/application.bootstrap.scss | 4 +--- app/assets/stylesheets/helpers.scss | 6 +++--- app/assets/stylesheets/recordings.scss | 9 +++++++-- .../api/v1/recordings_controller.rb | 2 +- app/controllers/api/v1/rooms_controller.rb | 2 +- .../components/admin/manage_users/EditUser.jsx | 2 +- .../admin/manage_users/ManageUsers.jsx | 2 +- .../components/admin/roles/EditRole.jsx | 2 +- .../components/admin/roles/Roles.jsx | 2 +- .../admin/room_configuration/RoomConfig.jsx | 2 +- .../server_recordings/ServerRecordings.jsx | 2 +- .../admin/server_rooms/ServerRooms.jsx | 2 +- .../admin/site_settings/SiteSettings.jsx | 2 +- .../components/admin/tenants/Tenants.jsx | 2 +- .../components/recordings/RecordingRow.jsx | 5 ++++- .../components/recordings/RecordingsList.jsx | 18 +++++++++++++----- .../components/recordings/UserRecordings.jsx | 1 + .../room_recordings/RoomRecordings.jsx | 1 + .../room_recordings/RoomsRecordingRow.jsx | 5 ++++- .../utilities/SimpleSelect.jsx | 6 ++++-- spec/controllers/rooms_controller_spec.rb | 6 +++--- 21 files changed, 52 insertions(+), 31 deletions(-) diff --git a/app/assets/stylesheets/application.bootstrap.scss b/app/assets/stylesheets/application.bootstrap.scss index 2446bd5bf4..8339867fcf 100644 --- a/app/assets/stylesheets/application.bootstrap.scss +++ b/app/assets/stylesheets/application.bootstrap.scss @@ -197,8 +197,6 @@ input.search-bar { } #footer { - margin-top: $footer-buffer-height; - #footer-container { border-top: 1px solid #d0d5dd; } @@ -464,7 +462,7 @@ input.search-bar { box-shadow: 0 0 0 0.25rem var(--brand-color-light) !important; } &::after { - display: none; + display: none !important; } } diff --git a/app/assets/stylesheets/helpers.scss b/app/assets/stylesheets/helpers.scss index 107604e6ea..9a30d9c17e 100644 --- a/app/assets/stylesheets/helpers.scss +++ b/app/assets/stylesheets/helpers.scss @@ -34,14 +34,14 @@ } .no-header-height { - min-height: calc(100vh - $footer-height - $footer-buffer-height); + min-height: calc(100vh - $footer-height); } .regular-height { - min-height: calc(100vh - $header-height - $footer-height - $footer-buffer-height); + min-height: calc(100vh - $header-height - $footer-height); .vertical-center { - min-height: calc(100vh - $header-height - $header-height - $footer-height - $footer-buffer-height); + min-height: calc(100vh - $header-height - $header-height - $footer-height); } } diff --git a/app/assets/stylesheets/recordings.scss b/app/assets/stylesheets/recordings.scss index 9b770871cd..6d401795fb 100644 --- a/app/assets/stylesheets/recordings.scss +++ b/app/assets/stylesheets/recordings.scss @@ -13,10 +13,15 @@ // // You should have received a copy of the GNU Lesser General Public License along // with Greenlight; if not, see . +#user-recordings { + min-height: 699px; +} -#user-recordings, #room-recordings { - min-height: 400px; +#room-recordings { + min-height: 491px; +} +#user-recordings, #room-recordings { table { border-top-right-radius: $border-radius-lg; border-top-left-radius: $border-radius-lg; diff --git a/app/controllers/api/v1/recordings_controller.rb b/app/controllers/api/v1/recordings_controller.rb index 6138fafe38..09262909c0 100644 --- a/app/controllers/api/v1/recordings_controller.rb +++ b/app/controllers/api/v1/recordings_controller.rb @@ -37,7 +37,7 @@ class RecordingsController < ApiController def index sort_config = config_sorting(allowed_columns: %w[name length visibility]) - pagy, recordings = pagy(current_user.recordings&.order(sort_config, recorded_at: :desc)&.search(params[:search])) + pagy, recordings = pagy(current_user.recordings&.order(sort_config, recorded_at: :desc)&.search(params[:search]), items: 5) render_data data: recordings, meta: pagy_metadata(pagy), status: :ok end diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb index 585c96a4c5..89df5e2b34 100644 --- a/app/controllers/api/v1/rooms_controller.rb +++ b/app/controllers/api/v1/rooms_controller.rb @@ -133,7 +133,7 @@ def purge_presentation def recordings sort_config = config_sorting(allowed_columns: %w[name length visibility]) - pagy, room_recordings = pagy(@room.recordings&.order(sort_config, recorded_at: :desc)&.search(params[:q])) + pagy, room_recordings = pagy(@room.recordings&.order(sort_config, recorded_at: :desc)&.search(params[:q]), items: 3) render_data data: room_recordings, meta: pagy_metadata(pagy), status: :ok end diff --git a/app/javascript/components/admin/manage_users/EditUser.jsx b/app/javascript/components/admin/manage_users/EditUser.jsx index 364c48c87e..fa85878b47 100644 --- a/app/javascript/components/admin/manage_users/EditUser.jsx +++ b/app/javascript/components/admin/manage_users/EditUser.jsx @@ -39,7 +39,7 @@ export default function EditUser() { } return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/admin/manage_users/ManageUsers.jsx b/app/javascript/components/admin/manage_users/ManageUsers.jsx index b8269617b1..f256c9c47b 100644 --- a/app/javascript/components/admin/manage_users/ManageUsers.jsx +++ b/app/javascript/components/admin/manage_users/ManageUsers.jsx @@ -47,7 +47,7 @@ export default function ManageUsers() { } return ( -
+

{t('admin.admin_panel')}

diff --git a/app/javascript/components/admin/roles/EditRole.jsx b/app/javascript/components/admin/roles/EditRole.jsx index a546a7e9c9..883e765bf6 100644 --- a/app/javascript/components/admin/roles/EditRole.jsx +++ b/app/javascript/components/admin/roles/EditRole.jsx @@ -44,7 +44,7 @@ export default function EditRole() { if (isLoading) return null; return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/admin/roles/Roles.jsx b/app/javascript/components/admin/roles/Roles.jsx index 78175a7087..d8ed915a7d 100644 --- a/app/javascript/components/admin/roles/Roles.jsx +++ b/app/javascript/components/admin/roles/Roles.jsx @@ -39,7 +39,7 @@ export default function Roles() { } return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/admin/room_configuration/RoomConfig.jsx b/app/javascript/components/admin/room_configuration/RoomConfig.jsx index 3741539b66..696a5e1d91 100644 --- a/app/javascript/components/admin/room_configuration/RoomConfig.jsx +++ b/app/javascript/components/admin/room_configuration/RoomConfig.jsx @@ -37,7 +37,7 @@ export default function RoomConfig() { } return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/admin/server_recordings/ServerRecordings.jsx b/app/javascript/components/admin/server_recordings/ServerRecordings.jsx index f51593b8ca..2b1ad378c5 100644 --- a/app/javascript/components/admin/server_recordings/ServerRecordings.jsx +++ b/app/javascript/components/admin/server_recordings/ServerRecordings.jsx @@ -38,7 +38,7 @@ export default function ServerRecordings() { } return ( -
+

{t('admin.admin_panel')}

diff --git a/app/javascript/components/admin/server_rooms/ServerRooms.jsx b/app/javascript/components/admin/server_rooms/ServerRooms.jsx index c0a69c1551..cde5c2e192 100644 --- a/app/javascript/components/admin/server_rooms/ServerRooms.jsx +++ b/app/javascript/components/admin/server_rooms/ServerRooms.jsx @@ -44,7 +44,7 @@ export default function ServerRooms() { } return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/admin/site_settings/SiteSettings.jsx b/app/javascript/components/admin/site_settings/SiteSettings.jsx index f082194540..a8081e94ec 100644 --- a/app/javascript/components/admin/site_settings/SiteSettings.jsx +++ b/app/javascript/components/admin/site_settings/SiteSettings.jsx @@ -37,7 +37,7 @@ export default function SiteSettings() { } return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/admin/tenants/Tenants.jsx b/app/javascript/components/admin/tenants/Tenants.jsx index 70a1630e0c..095239f172 100644 --- a/app/javascript/components/admin/tenants/Tenants.jsx +++ b/app/javascript/components/admin/tenants/Tenants.jsx @@ -45,7 +45,7 @@ export default function Tenants() { const { data: tenants, isLoading } = useTenants({ search: searchInput, page }); return ( -
+

{ t('admin.admin_panel') }

diff --git a/app/javascript/components/recordings/RecordingRow.jsx b/app/javascript/components/recordings/RecordingRow.jsx index a465a27ded..e6497890f0 100644 --- a/app/javascript/components/recordings/RecordingRow.jsx +++ b/app/javascript/components/recordings/RecordingRow.jsx @@ -35,7 +35,7 @@ import SimpleSelect from '../shared_components/utilities/SimpleSelect'; // TODO: Amir - Refactor this. export default function RecordingRow({ - recording, visibilityMutation: useVisibilityAPI, deleteMutation: useDeleteAPI, adminTable, + recording, visibilityMutation: useVisibilityAPI, deleteMutation: useDeleteAPI, adminTable, dropUp, }) { const { t } = useTranslation(); @@ -104,6 +104,7 @@ export default function RecordingRow({ {[...Array(recordingsProcessing)].map(() => )} { - (isLoading && [...Array(7)].map((val, idx) => ( + (isLoading && [...Array(numPlaceholders)].map((val, idx) => ( // eslint-disable-next-line react/no-array-index-key ))) } { - (recordings?.data?.length > 0 && recordings?.data?.map((recording) => ( - + (recordings?.data?.length > 0 && recordings?.data?.map((recording, idx) => ( + ))) } @@ -99,10 +104,11 @@ export default function RecordingsList({ } RecordingsList.defaultProps = { - recordings: { data: [], meta: { page: 1, pages: 1 } }, + recordings: { data: [], meta: { page: 1, pages: 1, items: 3 } }, recordingsProcessing: 0, searchInput: '', adminTable: false, + numPlaceholders: 7, }; RecordingsList.propTypes = { @@ -124,6 +130,7 @@ RecordingsList.propTypes = { meta: PropTypes.shape({ page: PropTypes.number, pages: PropTypes.number, + items: PropTypes.number, }), }), isLoading: PropTypes.bool.isRequired, @@ -132,4 +139,5 @@ RecordingsList.propTypes = { setSearchInput: PropTypes.func.isRequired, recordingsProcessing: PropTypes.number, adminTable: PropTypes.bool, + numPlaceholders: PropTypes.number, }; diff --git a/app/javascript/components/recordings/UserRecordings.jsx b/app/javascript/components/recordings/UserRecordings.jsx index ff8afc6579..cf43a52033 100644 --- a/app/javascript/components/recordings/UserRecordings.jsx +++ b/app/javascript/components/recordings/UserRecordings.jsx @@ -31,6 +31,7 @@ export default function UserRecordings() { setPage={setPage} setSearchInput={setSearchInput} searchInput={searchInput} + numPlaceholders={5} />
); diff --git a/app/javascript/components/recordings/room_recordings/RoomRecordings.jsx b/app/javascript/components/recordings/room_recordings/RoomRecordings.jsx index 687d2390e4..4de37a6934 100644 --- a/app/javascript/components/recordings/room_recordings/RoomRecordings.jsx +++ b/app/javascript/components/recordings/room_recordings/RoomRecordings.jsx @@ -36,6 +36,7 @@ export default function RoomRecordings() { setSearchInput={setSearchInput} searchInput={searchInput} recordingsProcessing={roomRecordingsProcessing.data} + numPlaceholders={3} />
); diff --git a/app/javascript/components/recordings/room_recordings/RoomsRecordingRow.jsx b/app/javascript/components/recordings/room_recordings/RoomsRecordingRow.jsx index 7a2b3d35a9..40ecc5e914 100644 --- a/app/javascript/components/recordings/room_recordings/RoomsRecordingRow.jsx +++ b/app/javascript/components/recordings/room_recordings/RoomsRecordingRow.jsx @@ -20,19 +20,21 @@ import useUpdateRecordingVisibility from '../../../hooks/mutations/recordings/us import useDeleteRecording from '../../../hooks/mutations/recordings/useDeleteRecording'; import RecordingRow from '../RecordingRow'; -export default function RoomsRecordingRow({ recording, adminTable }) { +export default function RoomsRecordingRow({ recording, adminTable, dropUp }) { return ( ); } RoomsRecordingRow.defaultProps = { adminTable: false, + dropUp: false, }; RoomsRecordingRow.propTypes = { @@ -51,4 +53,5 @@ RoomsRecordingRow.propTypes = { map: PropTypes.func, }).isRequired, adminTable: PropTypes.bool, + dropUp: PropTypes.bool, }; diff --git a/app/javascript/components/shared_components/utilities/SimpleSelect.jsx b/app/javascript/components/shared_components/utilities/SimpleSelect.jsx index 7ec44282de..6fd162fc97 100644 --- a/app/javascript/components/shared_components/utilities/SimpleSelect.jsx +++ b/app/javascript/components/shared_components/utilities/SimpleSelect.jsx @@ -19,12 +19,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { ChevronDownIcon } from '@heroicons/react/20/solid'; -export default function SimpleSelect({ defaultValue, children }) { +export default function SimpleSelect({ defaultValue, dropUp, children }) { // Get the currently selected option and set the dropdown toggle to that value const defaultString = children?.filter((item) => item.props.value === defaultValue)[0]; return ( - + { defaultString?.props?.children } @@ -38,10 +38,12 @@ export default function SimpleSelect({ defaultValue, children }) { SimpleSelect.defaultProps = { defaultValue: '', + dropUp: false, children: undefined, }; SimpleSelect.propTypes = { defaultValue: PropTypes.string, + dropUp: PropTypes.bool, children: PropTypes.arrayOf(PropTypes.element), }; diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb index 469cbc0740..db67b94329 100644 --- a/spec/controllers/rooms_controller_spec.rb +++ b/spec/controllers/rooms_controller_spec.rb @@ -298,8 +298,8 @@ it 'returns recordings belonging to the room' do room1 = create(:room, user:, friendly_id: 'friendly_id_1') room2 = create(:room, user:, friendly_id: 'friendly_id_2') - recordings = create_list(:recording, 5, room: room1) - create_list(:recording, 5, room: room2) + recordings = create_list(:recording, 3, room: room1) + create_list(:recording, 3, room: room2) get :recordings, params: { friendly_id: room1.friendly_id } recording_ids = response.parsed_body['data'].pluck('id') expect(response).to have_http_status(:ok) @@ -320,7 +320,7 @@ create(:shared_access, user_id: shared_user.id, room_id: room.id) sign_in_user(shared_user) - recordings = create_list(:recording, 5, room:) + recordings = create_list(:recording, 3, room:) get :recordings, params: { friendly_id: room.friendly_id } From b2f49d5343e389f1d2e74b0e81b71d30b809a7fa Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Fri, 3 Nov 2023 11:33:47 -0400 Subject: [PATCH 023/103] Fix recordings processing to work with pagination (#5498) --- app/assets/locales/en.json | 1 + .../stylesheets/application.bootstrap.scss | 8 ++++ .../recordings/ProcessingRecordingRow.jsx | 42 ------------------- .../components/recordings/RecordingsList.jsx | 16 +++++-- 4 files changed, 22 insertions(+), 45 deletions(-) delete mode 100644 app/javascript/components/recordings/ProcessingRecordingRow.jsx diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index 8318749647..ac9de36d15 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -173,6 +173,7 @@ "recording": { "recording": "Recording", "recordings": "Recordings", + "processing": "Recordings Processing...", "name": "Name", "length": "Length", "users": "Users", diff --git a/app/assets/stylesheets/application.bootstrap.scss b/app/assets/stylesheets/application.bootstrap.scss index 8339867fcf..9254303d88 100644 --- a/app/assets/stylesheets/application.bootstrap.scss +++ b/app/assets/stylesheets/application.bootstrap.scss @@ -421,6 +421,14 @@ input.search-bar { } } +.badge-brand-outline { + font-size: 0.8rem; + border: 2px solid gainsboro; + color: var(--brand-color); + background-color: white !important; + box-shadow: var(--brand-color-light); +} + .setting-select { button { background: white !important; diff --git a/app/javascript/components/recordings/ProcessingRecordingRow.jsx b/app/javascript/components/recordings/ProcessingRecordingRow.jsx deleted file mode 100644 index 4414b744c0..0000000000 --- a/app/javascript/components/recordings/ProcessingRecordingRow.jsx +++ /dev/null @@ -1,42 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). -// -// This program is free software; you can redistribute it and/or modify it under the -// terms of the GNU Lesser General Public License as published by the Free Software -// Foundation; either version 3.0 of the License, or (at your option) any later -// version. -// -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License along -// with Greenlight; if not, see . - -import { VideoCameraIcon } from '@heroicons/react/24/outline'; -import React from 'react'; -import { Stack } from 'react-bootstrap'; -import { useTranslation } from 'react-i18next'; - -export default function ProcessingRecordingRow() { - const { t } = useTranslation(); - - return ( - - - -
- -
- { t('recording.processing_recording') } -
- - - - - - - - ); -} diff --git a/app/javascript/components/recordings/RecordingsList.jsx b/app/javascript/components/recordings/RecordingsList.jsx index 0dde058ea4..c43e08658c 100644 --- a/app/javascript/components/recordings/RecordingsList.jsx +++ b/app/javascript/components/recordings/RecordingsList.jsx @@ -16,7 +16,9 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Card, Stack, Table } from 'react-bootstrap'; +import { + Badge, Card, Stack, Table, +} from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; import SortBy from '../shared_components/search/SortBy'; import RecordingsListRowPlaceHolder from './RecordingsListRowPlaceHolder'; @@ -25,7 +27,6 @@ import RoomsRecordingRow from './room_recordings/RoomsRecordingRow'; import Pagination from '../shared_components/Pagination'; import EmptyRecordingsList from './EmptyRecordingsList'; import SearchBar from '../shared_components/search/SearchBar'; -import ProcessingRecordingRow from './ProcessingRecordingRow'; export default function RecordingsList({ recordings, isLoading, setPage, searchInput, setSearchInput, recordingsProcessing, adminTable, numPlaceholders, @@ -42,6 +43,16 @@ export default function RecordingsList({
+ { recordingsProcessing > 0 && ( + + + + { recordingsProcessing } + + { t('recording.processing') } + + + )} { (searchInput && recordings?.data.length === 0) @@ -63,7 +74,6 @@ export default function RecordingsList({ - {[...Array(recordingsProcessing)].map(() => )} { (isLoading && [...Array(numPlaceholders)].map((val, idx) => ( // eslint-disable-next-line react/no-array-index-key From a311475f17c88be1b08921301dd1bff4623ae38a Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Mon, 13 Nov 2023 10:07:03 -0500 Subject: [PATCH 024/103] added delete presentation string to en.json and delete presentation form (#5510) --- app/assets/locales/en.json | 1 + .../rooms/room/presentation/forms/DeletePresentationForm.jsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index ac9de36d15..1b07ac149c 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -137,6 +137,7 @@ "click_to_upload": "Click to Upload", "drag_and_drop": " or drag and drop", "upload_description": "Upload any office document or PDF file (not larger than {{size}}). Depending on the size of the file, it may require additional time to upload before it can be used", + "delete_presentation": "Delete Presentation", "are_you_sure_delete_presentation": "Are you sure you want to delete this presentation?" }, "shared_access": { diff --git a/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx b/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx index 0ea7414b8e..1646a1422c 100644 --- a/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx +++ b/app/javascript/components/rooms/room/presentation/forms/DeletePresentationForm.jsx @@ -37,7 +37,7 @@ export default function DeletePresentationForm({ handleClose }) { -

{ t('recording.delete_recording') }

+

{ t('room.presentation.delete_presentation') }

{ t('room.presentation.are_you_sure_delete_presentation') }

{ t('action_permanent') }

From b4c8a9f3cb77e6d5c0d56435a433fededcf6aa9d Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 14 Nov 2023 13:19:05 -0500 Subject: [PATCH 025/103] removed last 2 instances of recordings showing up when recordings disabled (#5518) * added delete presentation string to en.json and delete presentation form * removed last 2 instances of recordings that show up when recordings are disabled * only checking for sitewide recordings disable to remove the recording elements * removed unnecessary .jsx in import statement --- .../api/v1/rooms_configurations_controller.rb | 3 ++- app/javascript/components/home/HomePage.jsx | 18 +++++++++++------- .../components/rooms/room/join/JoinCard.jsx | 18 +++++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/app/controllers/api/v1/rooms_configurations_controller.rb b/app/controllers/api/v1/rooms_configurations_controller.rb index 1b20935426..10266f5c9c 100644 --- a/app/controllers/api/v1/rooms_configurations_controller.rb +++ b/app/controllers/api/v1/rooms_configurations_controller.rb @@ -19,9 +19,10 @@ module Api module V1 class RoomsConfigurationsController < ApiController - before_action only: %i[index show] do + before_action only: %i[index] do ensure_authorized(%w[CreateRoom ManageSiteSettings ManageRoles ManageRooms], friendly_id: params[:friendly_id]) end + skip_before_action :ensure_authenticated, only: %i[show] # GET /api/v1/rooms_configurations.json # Fetches and returns all rooms configurations. diff --git a/app/javascript/components/home/HomePage.jsx b/app/javascript/components/home/HomePage.jsx index c131b589b2..2501bc5a74 100644 --- a/app/javascript/components/home/HomePage.jsx +++ b/app/javascript/components/home/HomePage.jsx @@ -26,6 +26,7 @@ import { import { toast } from 'react-toastify'; import { useAuth } from '../../contexts/auth/AuthProvider'; import HomepageFeatureCard from './HomepageFeatureCard'; +import useRoomConfigValue from '../../hooks/queries/rooms/useRoomConfigValue'; export default function HomePage() { const { t } = useTranslation(); @@ -33,6 +34,7 @@ export default function HomePage() { const navigate = useNavigate(); const [searchParams, setSearchParams] = useSearchParams(); const error = searchParams.get('error'); + const { data: recordValue } = useRoomConfigValue('record'); // Redirects the user to the proper page based on signed in status and CreateRoom permission useEffect( @@ -88,13 +90,15 @@ export default function HomePage() { icon={} /> - - } - /> - + { (recordValue !== 'false') && ( + + } + /> + + )} {publicRoom?.data.name} - - {t('view_recordings')} - + { (recordValue !== 'false') && ( + + {t('view_recordings')} + + )} From d7758292dea1a67a13baafaa5348a93473f4d74b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 13:34:55 -0500 Subject: [PATCH 026/103] Translate app/assets/locales/en.json in el (#5511) 100% translated source file: 'app/assets/locales/en.json' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/el.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/locales/el.json b/app/assets/locales/el.json index 2f4a8dda91..3590b585ba 100644 --- a/app/assets/locales/el.json +++ b/app/assets/locales/el.json @@ -81,6 +81,7 @@ "account_info": "Πληροφορίες λογαριασμού", "delete_account": "Διαγραφή λογαριασμού", "change_password": "Αλλαγή κωδικού πρόσβασης", + "set_password": "Ορίστε τον νέο κωδικό πρόσβασής σας", "reset_password": "Επαναφορά κωδικού πρόσβασης", "update_account_info": "Ενημέρωση πληροφοριών λογαριασμού", "current_password": "Τρέχων κωδικός πρόσβασης", @@ -129,6 +130,7 @@ "click_to_upload": "Κάντε κλικ για μεταφόρτωση ", "drag_and_drop": "ή σύρετε και αποθέστε το αρχείο", "upload_description": "Μεταφόρτωση εγγράφου ή αρχείου PDF (έως {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", + "delete_presentation": "Διαγραφή παρουσίασης", "are_you_sure_delete_presentation": "Θέλετε σίγουρα να διαγράψετε αυτή την παρουσίαση;" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Καταγραφή", "recordings": "Καταγραφές", + "processing": "Επεξεργασία καταγραφών... ", "name": "Όνομα", "length": "Μήκος", "users": "Χρήστες", @@ -358,6 +361,7 @@ "user_updated": "Ο χρήστης ενημερώθηκε.", "user_deleted": "Ο χρήστης διαγράφηκε.", "avatar_updated": "Το άβαταρ ενημερώθηκε.", + "password_changed": "Επιτυχής ενημέρωση του κωδικού πρόσβασής σας. Παρακαλούμε συνδεθείτε ξανά.", "password_updated": "Ο κωδικός πρόσβασης ενημερώθηκε.", "account_activated": "Ο λογαριασμός ενεργοποιήθηκε επιτυχώς. Παρακαλούμε συνδεθείτε στον λογαριασμό σας.", "activation_email_sent": "Το email επιβεβαίωσης στάλθηκε.", From 782e082c912864f228e2c1405d149cc6df1a4ea6 Mon Sep 17 00:00:00 2001 From: Jesus Federico Date: Tue, 14 Nov 2023 15:07:45 -0500 Subject: [PATCH 027/103] [Snyk] Security upgrade active_storage_validations from 1.0.4 to 1.1.0 (#5481) * fix: Gemfile & Gemfile.lock to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-RACK-1061917 * Update Gemfile.lock --------- Co-authored-by: snyk-bot Co-authored-by: Ahmad Farhat --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 58d2376371..b467b484e5 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '>= 3.0' gem 'active_model_serializers', '>= 0.10.14' -gem 'active_storage_validations', '>= 1.0.4' +gem 'active_storage_validations', '>= 1.1.0' gem 'aws-sdk-s3', require: false gem 'bcrypt', '~> 3.1.7' gem 'bigbluebutton-api-ruby', '1.9.1' diff --git a/Gemfile.lock b/Gemfile.lock index efff185711..b8af14e8d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -54,7 +54,7 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - active_storage_validations (1.0.4) + active_storage_validations (1.1.0) activejob (>= 5.2.0) activemodel (>= 5.2.0) activestorage (>= 5.2.0) @@ -257,7 +257,7 @@ GEM memoist (0.16.2) mini_magick (4.12.0) mini_mime (1.1.5) - mini_portile2 (2.8.4) + mini_portile2 (2.8.5) minitest (5.20.0) msgpack (1.6.0) multi_json (1.15.0) @@ -489,7 +489,7 @@ PLATFORMS DEPENDENCIES active_model_serializers (>= 0.10.14) - active_storage_validations (>= 1.0.4) + active_storage_validations (>= 1.1.0) aws-sdk-s3 bcrypt (~> 3.1.7) bigbluebutton-api-ruby (= 1.9.1) From 51a8e52667c54a3f922bdeba26fcc2430af69651 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Tue, 14 Nov 2023 15:20:37 -0500 Subject: [PATCH 028/103] Fix failing rspecs (#5519) --- app/controllers/health_checks_controller.rb | 2 +- spec/models/site_setting_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb index 465e3bc209..970f6c0e1b 100644 --- a/app/controllers/health_checks_controller.rb +++ b/app/controllers/health_checks_controller.rb @@ -39,7 +39,7 @@ def check def check_database raise 'Unable to connect to Database' unless ActiveRecord::Base.connection.active? - raise 'Unable to connect to Database - pending migrations' unless ActiveRecord::Migration.check_pending!.nil? + raise 'Unable to connect to Database - pending migrations' unless ActiveRecord::Migration.check_all_pending!.nil? rescue StandardError => e raise "Unable to connect to Database - #{e}" end diff --git a/spec/models/site_setting_spec.rb b/spec/models/site_setting_spec.rb index 0328dc8b8f..f9b1806943 100644 --- a/spec/models/site_setting_spec.rb +++ b/spec/models/site_setting_spec.rb @@ -48,7 +48,7 @@ it 'fails if the attachement is too large' do site_setting = build(:site_setting, image: fixture_file_upload(file_fixture('large-avatar.jpg'), 'image/jpeg')) expect(site_setting).to be_invalid - expect(site_setting.errors).to be_of_kind(:image, :file_size_out_of_range) + expect(site_setting.errors).to be_of_kind(:image, :file_size_not_less_than) end end end From b8b6b51e0c542fa584a5bb4ebaa86c4c6833dc5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 15:26:56 -0500 Subject: [PATCH 029/103] Bump @babel/traverse from 7.20.13 to 7.23.2 (#5471) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.20.13 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- package-lock.json | 248 +++++++++++++++++++++++----------------------- yarn.lock | 116 ++++++++++++++++++---- 2 files changed, 225 insertions(+), 139 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6a15242171..68e4819df7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,11 +65,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -114,12 +115,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -233,9 +235,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } @@ -252,23 +254,23 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -389,28 +391,28 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -452,12 +454,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -465,9 +467,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1624,31 +1626,31 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1657,12 +1659,12 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -6852,11 +6854,12 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { @@ -6865,12 +6868,13 @@ "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==" }, "@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "requires": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -6953,9 +6957,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" }, "@babel/helper-explode-assignable-expression": { "version": "7.18.6", @@ -6966,20 +6970,20 @@ } }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { @@ -7067,22 +7071,22 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.18.6", @@ -7101,19 +7105,19 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==" + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -7859,39 +7863,39 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, diff --git a/yarn.lock b/yarn.lock index e68f6fc03f..300f66d20c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,16 +8,24 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.14" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz" -"@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -78,6 +86,10 @@ version "7.18.9" resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" @@ -91,12 +103,25 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz" @@ -170,14 +195,28 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" @@ -199,10 +238,22 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.7": version "7.20.15" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz" +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" @@ -805,18 +856,26 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.13" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -828,6 +887,14 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@esbuild/android-arm@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" @@ -909,6 +976,10 @@ version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" @@ -917,6 +988,17 @@ version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" @@ -1318,7 +1400,7 @@ caniuse-lite@^1.0.30001449: version "1.0.30001451" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz" -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" dependencies: From af8692c8195b4646b6844c6f781480d323780948 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 15:29:54 -0500 Subject: [PATCH 030/103] Bump axios from 0.26.1 to 1.6.0 (#5508) Bumps [axios](https://github.com/axios/axios) from 0.26.1 to 1.6.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.26.1...v1.6.0) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- package-lock.json | 129 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- yarn.lock | 52 ++++++++++++++++--- 3 files changed, 166 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68e4819df7..8711c7efff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@hookform/resolvers": "^2.8.8", "@popperjs/core": "^2.11.5", "@rails/actioncable": "^7.0.2", - "axios": "^0.26.1", + "axios": "^1.6.0", "bootstrap": "5.1.3", "bootstrap-icons": "^1.8.3", "esbuild": "^0.14.42", @@ -2495,6 +2495,11 @@ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -2517,11 +2522,13 @@ } }, "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dependencies": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { @@ -2782,6 +2789,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2910,6 +2928,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -4455,6 +4481,19 @@ "is-callable": "^1.1.3" } }, + "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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5346,6 +5385,25 @@ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" }, + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5713,6 +5771,11 @@ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" }, + "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==" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -8465,6 +8528,11 @@ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -8478,11 +8546,13 @@ "dev": true }, "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "requires": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "axobject-query": { @@ -8668,6 +8738,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8766,6 +8844,11 @@ "object-keys": "^1.1.1" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -9738,6 +9821,16 @@ "is-callable": "^1.1.3" } }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10370,6 +10463,19 @@ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10641,6 +10747,11 @@ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" }, + "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==" + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", diff --git a/package.json b/package.json index 6b41e52396..7fb419bdee 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "@hookform/resolvers": "^2.8.8", "@popperjs/core": "^2.11.5", "@rails/actioncable": "^7.0.2", - "axios": "^0.26.1", + "axios": "^1.6.0", "bootstrap": "5.1.3", "bootstrap-icons": "^1.8.3", "esbuild": "^0.14.42", diff --git a/yarn.lock b/yarn.lock index 300f66d20c..a05b082b0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1289,6 +1289,10 @@ ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -1297,11 +1301,13 @@ axe-core@^4.6.2: version "4.6.3" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" +axios@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" dependencies: - follow-redirects "^1.14.8" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" axobject-query@^3.1.1: version "3.1.1" @@ -1457,6 +1463,12 @@ color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -1538,6 +1550,10 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" @@ -2159,9 +2175,9 @@ flatted@^3.1.0: version "3.2.7" resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" -follow-redirects@^1.14.8: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" for-each@^0.3.3: version "0.3.3" @@ -2169,6 +2185,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" @@ -2657,6 +2681,16 @@ microseconds@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + dependencies: + mime-db "1.52.0" + minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -2857,6 +2891,10 @@ property-expr@^2.0.4: version "2.0.5" resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + punycode@^2.1.0: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" From c96ec6ac905eb7063b39401f3c8a2c3bbcd72a71 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Tue, 14 Nov 2023 15:41:59 -0500 Subject: [PATCH 031/103] fix: Gemfile & Gemfile.lock to reduce vulnerabilities (#5455) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-RACK-1061917 Co-authored-by: snyk-bot Co-authored-by: Ahmad Farhat --- Gemfile | 2 +- Gemfile.lock | 120 +++++++++++++++++++++++++++------------------------ 2 files changed, 64 insertions(+), 58 deletions(-) diff --git a/Gemfile b/Gemfile index b467b484e5..729ef2f790 100644 --- a/Gemfile +++ b/Gemfile @@ -29,7 +29,7 @@ gem 'omniauth-rails_csrf_protection', '~> 1.0.1' gem 'pagy', '~> 6.0', '>= 6.0.0' gem 'pg' gem 'puma', '~> 5.6' -gem 'rails', '~> 7.1.0' +gem 'rails', '~> 7.1.1' gem 'redis', '~> 4.0' gem 'sprockets-rails' gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] diff --git a/Gemfile.lock b/Gemfile.lock index b8af14e8d9..a303005170 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,50 +1,50 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.0) - actionpack (= 7.1.0) - activesupport (= 7.1.0) + actioncable (7.1.1) + actionpack (= 7.1.1) + activesupport (= 7.1.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.0) - actionpack (= 7.1.0) - activejob (= 7.1.0) - activerecord (= 7.1.0) - activestorage (= 7.1.0) - activesupport (= 7.1.0) + actionmailbox (7.1.1) + actionpack (= 7.1.1) + activejob (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.0) - actionpack (= 7.1.0) - actionview (= 7.1.0) - activejob (= 7.1.0) - activesupport (= 7.1.0) + actionmailer (7.1.1) + actionpack (= 7.1.1) + actionview (= 7.1.1) + activejob (= 7.1.1) + activesupport (= 7.1.1) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.0) - actionview (= 7.1.0) - activesupport (= 7.1.0) + actionpack (7.1.1) + actionview (= 7.1.1) + activesupport (= 7.1.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.0) - actionpack (= 7.1.0) - activerecord (= 7.1.0) - activestorage (= 7.1.0) - activesupport (= 7.1.0) + actiontext (7.1.1) + actionpack (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.0) - activesupport (= 7.1.0) + actionview (7.1.1) + activesupport (= 7.1.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -59,22 +59,22 @@ GEM activemodel (>= 5.2.0) activestorage (>= 5.2.0) activesupport (>= 5.2.0) - activejob (7.1.0) - activesupport (= 7.1.0) + activejob (7.1.1) + activesupport (= 7.1.1) globalid (>= 0.3.6) - activemodel (7.1.0) - activesupport (= 7.1.0) - activerecord (7.1.0) - activemodel (= 7.1.0) - activesupport (= 7.1.0) + activemodel (7.1.1) + activesupport (= 7.1.1) + activerecord (7.1.1) + activemodel (= 7.1.1) + activesupport (= 7.1.1) timeout (>= 0.4.0) - activestorage (7.1.0) - actionpack (= 7.1.0) - activejob (= 7.1.0) - activerecord (= 7.1.0) - activesupport (= 7.1.0) + activestorage (7.1.1) + actionpack (= 7.1.1) + activejob (= 7.1.1) + activerecord (= 7.1.1) + activesupport (= 7.1.1) marcel (~> 1.0) - activesupport (7.1.0) + activesupport (7.1.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -221,8 +221,9 @@ GEM mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) io-console (0.6.0) - irb (1.6.2) - reline (>= 0.3.0) + irb (1.8.1) + rdoc + reline (>= 0.3.8) jbuilder (2.11.5) actionview (>= 5.0.0) activesupport (>= 5.0.0) @@ -307,6 +308,8 @@ GEM ast (~> 2.4.1) racc pg (1.4.5) + psych (5.1.1) + stringio public_suffix (5.0.3) puma (5.6.7) nio4r (~> 2.0) @@ -328,20 +331,20 @@ GEM rackup (1.0.0) rack (< 3) webrick - rails (7.1.0) - actioncable (= 7.1.0) - actionmailbox (= 7.1.0) - actionmailer (= 7.1.0) - actionpack (= 7.1.0) - actiontext (= 7.1.0) - actionview (= 7.1.0) - activejob (= 7.1.0) - activemodel (= 7.1.0) - activerecord (= 7.1.0) - activestorage (= 7.1.0) - activesupport (= 7.1.0) + rails (7.1.1) + actioncable (= 7.1.1) + actionmailbox (= 7.1.1) + actionmailer (= 7.1.1) + actionpack (= 7.1.1) + actiontext (= 7.1.1) + actionview (= 7.1.1) + activejob (= 7.1.1) + activemodel (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) bundler (>= 1.15.0) - railties (= 7.1.0) + railties (= 7.1.1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -349,9 +352,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.0) - actionpack (= 7.1.0) - activesupport (= 7.1.0) + railties (7.1.1) + actionpack (= 7.1.1) + activesupport (= 7.1.1) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -359,9 +362,11 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.0.6) + rdoc (6.5.0) + psych (>= 4.0.0) redis (4.8.0) regexp_parser (2.8.1) - reline (0.3.2) + reline (0.3.9) io-console (~> 0.5) remote_syslog_logger (1.0.4) syslog_protocol @@ -436,6 +441,7 @@ GEM actionpack (>= 5.2) activesupport (>= 5.2) sprockets (>= 3.0.0) + stringio (3.0.8) swd (2.0.2) activesupport (>= 3) attr_required (>= 0.0.5) @@ -517,7 +523,7 @@ DEPENDENCIES pagy (~> 6.0, >= 6.0.0) pg puma (~> 5.6) - rails (~> 7.1.0) + rails (~> 7.1.1) redis (~> 4.0) remote_syslog_logger rspec-rails (>= 6.0.2) From 0be624900c8efc1c12c6c6f60e21b872115e0378 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Tue, 14 Nov 2023 22:39:14 +0100 Subject: [PATCH 032/103] Use exec to let the container runtime send signals straight to rails (#5505) This is recommended practice. See the docker documentation at https://docs.docker.com/develop/develop-images/instructions/#entrypoint for more information. Co-authored-by: Ahmad Farhat --- bin/start | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/start b/bin/start index a6838250a9..0952481fd7 100755 --- a/bin/start +++ b/bin/start @@ -28,4 +28,4 @@ rails assets:precompile rails db:create rails db:migrate:with_data -rails s -b 0.0.0.0 -p $PORT +exec rails s -b 0.0.0.0 -p $PORT From b39d14ad2fe794a2160714f6cb3425dc20d0b88d Mon Sep 17 00:00:00 2001 From: jdr00t <50315879+jdr00t@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:50:06 +0100 Subject: [PATCH 033/103] Remove Sign Up button when using OIDC (#5431) * Remove Sign Up button when using OIDC * Remove SignUp Button on Join with OIDC --------- Co-authored-by: Ahmad Farhat --- app/javascript/components/home/AuthButtons.jsx | 1 - .../components/rooms/room/join/RequireAuthentication.jsx | 1 - 2 files changed, 2 deletions(-) diff --git a/app/javascript/components/home/AuthButtons.jsx b/app/javascript/components/home/AuthButtons.jsx index b088fb64a2..bb2e86e441 100644 --- a/app/javascript/components/home/AuthButtons.jsx +++ b/app/javascript/components/home/AuthButtons.jsx @@ -46,7 +46,6 @@ export default function AuthButtons({ direction }) { - diff --git a/app/javascript/components/rooms/room/join/RequireAuthentication.jsx b/app/javascript/components/rooms/room/join/RequireAuthentication.jsx index 7e16a351aa..456788f51b 100644 --- a/app/javascript/components/rooms/room/join/RequireAuthentication.jsx +++ b/app/javascript/components/rooms/room/join/RequireAuthentication.jsx @@ -36,7 +36,6 @@ export default function RequireAuthentication({ path }) { env?.EXTERNAL_AUTH ? (
-
) : ( From 1f42f0181e90e23d5e649191d942026b1945ba4e Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 15 Nov 2023 11:36:32 -0500 Subject: [PATCH 034/103] Remove active_record_serializer logs in prod (#5520) --- config/environments/production.rb | 10 +++------- .../initializers/active_model_serializers.rb | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 config/initializers/active_model_serializers.rb diff --git a/config/environments/production.rb b/config/environments/production.rb index 9e785e5097..9f91ad5db7 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -135,17 +135,13 @@ # require "syslog/logger" # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name") - if ENV['RAILS_LOG_TO_STDOUT'].present? - $stdout.sync = true - logger = ActiveSupport::Logger.new($stdout) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - if ENV['RAILS_LOG_REMOTE_NAME'] && ENV['RAILS_LOG_REMOTE_PORT'] require 'remote_syslog_logger' logger_program = ENV['RAILS_LOG_REMOTE_TAG'] || "greenlight-v3-#{ENV.fetch('RAILS_ENV', nil)}" logger = RemoteSyslogLogger.new(ENV['RAILS_LOG_REMOTE_NAME'], ENV['RAILS_LOG_REMOTE_PORT'], program: logger_program) + else + $stdout.sync = true + logger = ActiveSupport::Logger.new($stdout) end logger.formatter = config.log_formatter diff --git a/config/initializers/active_model_serializers.rb b/config/initializers/active_model_serializers.rb new file mode 100644 index 0000000000..4b0fa59890 --- /dev/null +++ b/config/initializers/active_model_serializers.rb @@ -0,0 +1,19 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with Greenlight; if not, see . + +# frozen_string_literal: true + +ActiveModelSerializers.logger = Logger.new(IO::NULL) if Rails.env.production? From bbbdd04ac18688cd87b133c829e1a16418c515d3 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 15 Nov 2023 11:50:29 -0500 Subject: [PATCH 035/103] fix error with trailing slash (#5522) * fix error with trailing slash * eslint * eslint again --- app/javascript/routes/AuthenticatedOnly.jsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/javascript/routes/AuthenticatedOnly.jsx b/app/javascript/routes/AuthenticatedOnly.jsx index f8fde5ed10..c8997407b4 100644 --- a/app/javascript/routes/AuthenticatedOnly.jsx +++ b/app/javascript/routes/AuthenticatedOnly.jsx @@ -15,9 +15,7 @@ // with Greenlight; if not, see . import React from 'react'; -import { - Navigate, Outlet, useLocation, useMatch, -} from 'react-router-dom'; +import { Navigate, Outlet, useMatch } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { toast } from 'react-toastify'; import { useAuth } from '../contexts/auth/AuthProvider'; @@ -26,7 +24,6 @@ import useDeleteSession from '../hooks/mutations/sessions/useDeleteSession'; export default function AuthenticatedOnly() { const { t } = useTranslation(); const currentUser = useAuth(); - const location = useLocation(); const roomsMatch = useMatch('/rooms/:friendlyId'); const superAdminMatch = useMatch('/admin/*'); const deleteSession = useDeleteSession({ showToast: false }); @@ -46,7 +43,7 @@ export default function AuthenticatedOnly() { // Custom logic to redirect from Rooms page to join page if the user isn't signed in if (!currentUser.signed_in && roomsMatch) { - return ; + return ; } if (currentUser.signed_in && currentUser.isSuperAdmin && !superAdminMatch) { From 7e164e41063fc34ea02e579f46dce8fa3533b4c9 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 11:25:16 -0500 Subject: [PATCH 036/103] Increased room limit max to 10000 (#5530) --- app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js b/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js index 347c2ac433..8f7583fc57 100644 --- a/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js +++ b/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js @@ -25,7 +25,7 @@ export function useEditRoleLimitFormValidation() { value: yup.number().required('forms.validations.role.limit.required') .typeError('forms.validations.role.type.error') .min(0, 'forms.validations.role.limit.min') - .max(100, 'forms.validations.role.limit.max'), + .max(10000, 'forms.validations.role.limit.max'), })), []); } From ce3ea2580dc8ec2fd7b7078330e15bceeddcc3fd Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Mon, 20 Nov 2023 11:26:13 -0500 Subject: [PATCH 037/103] extended join url to accept joinFormName to autofill join name (#5526) * extended join url to accept joinFormName to autofill join name * updated existing useEffect joinFormName --- .../components/rooms/room/join/JoinCard.jsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/javascript/components/rooms/room/join/JoinCard.jsx b/app/javascript/components/rooms/room/join/JoinCard.jsx index e24a2b8462..dc7a5a10d7 100644 --- a/app/javascript/components/rooms/room/join/JoinCard.jsx +++ b/app/javascript/components/rooms/room/join/JoinCard.jsx @@ -18,7 +18,7 @@ import React, { useState, useEffect } from 'react'; import Card from 'react-bootstrap/Card'; import { - Navigate, Link, useParams, + Navigate, Link, useParams, useLocation, } from 'react-router-dom'; import { Button, Col, Row, Stack, Form as RegularForm, @@ -61,6 +61,11 @@ export default function JoinCard() { const path = encodeURIComponent(document.location.pathname); + // get queryParams for JoinFormName + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const joinFormName = queryParams.get('joinFormName'); + useEffect(() => { // set cookie to return to if needed const date = new Date(); date.setTime(date.getTime() + (60 * 1000)); // expire the cookie in 1min @@ -86,10 +91,12 @@ export default function JoinCard() { useEffect(() => { // Default Join name to authenticated user full name. - if (currentUser?.name) { + if (joinFormName) { + methods.setValue('name', joinFormName); + } else if (currentUser?.name) { methods.setValue('name', currentUser.name); } - }, [currentUser?.name]); + }, [joinFormName, currentUser?.name]); useEffect(() => { // Room channel subscription: From 73112a258fbfb17a94b19cb97ceeda9b4d592c93 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 11:26:58 -0500 Subject: [PATCH 038/103] Add a new role permission for receiving an email on user signup (#5529) * Add a new role permission for receiving an email on user signup * Fix text email * rubo --- app/assets/locales/en.json | 3 +- app/controllers/api/v1/users_controller.rb | 3 ++ app/controllers/concerns/client_routable.rb | 4 +++ .../admin/roles/forms/EditRoleForm.jsx | 7 ++++ app/mailers/user_mailer.rb | 21 ++++++++++- .../new_user_signup_email.html.erb | 30 ++++++++++++++++ .../new_user_signup_email.text.erb | 26 ++++++++++++++ config/locales/en.yml | 7 ++++ ...7151542_add_email_on_sign_up_permission.rb | 36 +++++++++++++++++++ spec/controllers/users_controller_spec.rb | 10 ++++++ test/mailers/previews/user_mailer_preview.rb | 6 ++++ 11 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 app/views/user_mailer/new_user_signup_email.html.erb create mode 100644 app/views/user_mailer/new_user_signup_email.text.erb create mode 100644 db/data/20231117151542_add_email_on_sign_up_permission.rb diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index 1b07ac149c..dc38c66ceb 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -357,7 +357,8 @@ "manage_site_settings": "Allow users with this role to manage site settings", "manage_roles": "Allow users with this role to edit other roles", "shared_list": "Include users with this role in the dropdown for sharing rooms", - "room_limit": "Room Limit" + "room_limit": "Room Limit", + "email_on_signup": "Receive an email when a new user signs up" } } }, diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index 98b5202494..a99129ccfa 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -76,6 +76,9 @@ def create UserMailer.with(user:, activation_url: activate_account_url(token), base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later + + UserMailer.with(user:, admin_panel_url:, provider: current_provider) + .new_user_signup_email.deliver_later end create_default_room(user) diff --git a/app/controllers/concerns/client_routable.rb b/app/controllers/concerns/client_routable.rb index 32321642da..f9fc4f3bbd 100644 --- a/app/controllers/concerns/client_routable.rb +++ b/app/controllers/concerns/client_routable.rb @@ -33,4 +33,8 @@ def reset_password_url(token) def pending_path "#{root_path}pending" end + + def admin_panel_url + "#{root_url}admin/users" + end end diff --git a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx index 08101684c0..5e90df42c1 100644 --- a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx +++ b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx @@ -130,6 +130,13 @@ export default function EditRoleForm({ role }) { defaultValue={rolePermissions?.SharedList === 'true'} /> + +
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 3e00b6fc02..fb530613de 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -42,11 +42,20 @@ def invitation_email @email = params[:email] @name = params[:name] @signup_url = params[:signup_url] - @email = params[:email] mail(to: @email, subject: t('email.invitation.invitation_to_join')) end + def new_user_signup_email + @user = params[:user] + @admin_panel_url = params[:admin_panel_url] + emails = admin_emails + + return if emails.blank? # Dont send anything if no-one has EmailOnSignup enabled + + mail(to: emails, subject: t('email.new_user_signup.new_user')) + end + private def preset @@ -59,4 +68,14 @@ def branding @brand_image = ActionController::Base.helpers.image_url(branding_hash['BrandingImage'], host: @base_url) @brand_color = branding_hash['PrimaryColor'] end + + def admin_emails + # Find all the roles that have EmailOnSignup enabled + role_ids = Role.joins(role_permissions: :permission) + .with_provider(@provider) + .where(role_permissions: { value: 'true' }, permission: { name: 'EmailOnSignup' }) + .pluck(:id) + + User.where(role_id: role_ids).pluck(:email) + end end diff --git a/app/views/user_mailer/new_user_signup_email.html.erb b/app/views/user_mailer/new_user_signup_email.html.erb new file mode 100644 index 0000000000..acdff87f88 --- /dev/null +++ b/app/views/user_mailer/new_user_signup_email.html.erb @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + +
+

<%= t('email.new_user_signup.new_user') %>

+ +

<%= t('email.new_user_signup.new_user_description') %>

+ +

<%= t('email.new_user_signup.name', name: @user.name) %>

+

<%= t('email.new_user_signup.email', email: @user.email) %>

+ +

<%= t('email.new_user_signup.take_action') %>

+ + + <%= t('email.new_user_signup.admin_panel') %> + +
diff --git a/app/views/user_mailer/new_user_signup_email.text.erb b/app/views/user_mailer/new_user_signup_email.text.erb new file mode 100644 index 0000000000..bf3f123789 --- /dev/null +++ b/app/views/user_mailer/new_user_signup_email.text.erb @@ -0,0 +1,26 @@ +<%# + BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. + + Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). + + This program is free software; you can redistribute it and/or modify it under the + terms of the GNU Lesser General Public License as published by the Free Software + Foundation; either version 3.0 of the License, or (at your option) any later + version. + + Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License along + with Greenlight; if not, see http://www.gnu.org/licenses/. +%> + +--- +<%= t('email.new_user_signup.new_user') %> +<%= t('email.new_user_signup.new_user_description' %> +<%= t('email.new_user_signup.name', name: @user.name) %> +<%= t('email.new_user_signup.email', email: @user.email) %> +<%= t('email.new_user_signup.take_action') %> +<%= @signup_url %> +--- diff --git a/config/locales/en.yml b/config/locales/en.yml index 983931086f..ba04fe59fc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -65,6 +65,13 @@ en: get_started: To sign up, please click the button below and follow the steps. valid_invitation: The invitation is valid for 24 hours. sign_up: Sign Up + new_user_signup: + new_user: New User Signup + new_user_description: A new user has signed up to use BigBlueButton. + name: "Name: %{name}" + email: "Email: %{email}" + admin_panel: "Administrator Panel" + take_action: "To view the new user or to take the necessary action, visit the Administrator Panel" reset: password_reset: Reset Password password_reset_requested: A password reset has been requested for %{email}. diff --git a/db/data/20231117151542_add_email_on_sign_up_permission.rb b/db/data/20231117151542_add_email_on_sign_up_permission.rb new file mode 100644 index 0000000000..d2bd13e1a4 --- /dev/null +++ b/db/data/20231117151542_add_email_on_sign_up_permission.rb @@ -0,0 +1,36 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with Greenlight; if not, see . + +# frozen_string_literal: true + +class AddEmailOnSignUpPermission < ActiveRecord::Migration[7.1] + def up + email_permission = Permission.create!(name: 'EmailOnSignup') + admin = Role.find_by(name: 'Administrator') + + values = [{ role: admin, permission: email_permission, value: 'true' }] + + Role.where.not(name: 'Administrator').each do |role| + values.push({ role:, permission: email_permission, value: 'false' }) + end + + RolePermission.create! values + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index e7f59cde50..81a9d594ec 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -66,6 +66,16 @@ expect(User.find_by(email: user_params[:user][:email]).role.name).to eq('User') end + context 'EmailOnSignup' do + it 'emails all admins that a new user has signed up' do + post :create, params: user_params + + expect(ActionMailer::MailDeliveryJob).to have_been_enqueued + .at(:no_wait).exactly(:once) + .with('UserMailer', 'new_user_signup_email', 'deliver_now', Hash) + end + end + context 'User language' do it 'Persists the user language in the user record' do post :create, params: user_params diff --git a/test/mailers/previews/user_mailer_preview.rb b/test/mailers/previews/user_mailer_preview.rb index 5872673442..f7161ee067 100644 --- a/test/mailers/previews/user_mailer_preview.rb +++ b/test/mailers/previews/user_mailer_preview.rb @@ -38,4 +38,10 @@ def invitation_email UserMailer.with(user: fake_user.new('user', 'user@users'), invitation_url: 'https://example.com/invite').invitation_email end + + def new_user_signup_email + fake_user = Struct.new(:name, :email) + + UserMailer.with(user: fake_user.new('user', 'user@users')).new_user_signup_email + end end From 68dce64e61be11358d4a1845aa27986bf7816c14 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 11:43:32 -0500 Subject: [PATCH 039/103] Fix issue with recordings resync when no recordings are returned (#5538) --- lib/tasks/server_recordings_sync.rake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/tasks/server_recordings_sync.rake b/lib/tasks/server_recordings_sync.rake index c74260742d..5046b5ebac 100644 --- a/lib/tasks/server_recordings_sync.rake +++ b/lib/tasks/server_recordings_sync.rake @@ -26,6 +26,8 @@ task :server_recordings_sync, %i[provider] => :environment do |_task, args| recordings = BigBlueButtonApi.new(provider: args[:provider]).get_recordings(meeting_ids:) + next if recordings[:recordings].blank? + # Skip the entire batch if the first and last recordings exist if Recording.exists?(record_id: recordings[:recordings][0][:recordID]) && Recording.exists?(record_id: recordings[:recordings][-1][:recordID]) next From ef68ad394423ecafd30eec80573f7c4262ef73f2 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 13:17:17 -0500 Subject: [PATCH 040/103] Make changes to openid_connect uid field (#5523) * Make changes to openid_connect uid field * Clean up --- .rubocop.yml | 4 ++-- .../api/v1/migrations/external_controller.rb | 3 --- app/controllers/external_controller.rb | 10 +++++++++- config/initializers/omniauth.rb | 4 ++-- sample.env | 1 + 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 9f6ae1c9eb..db58bc2600 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -70,7 +70,7 @@ Metrics/ClassLength: # A calculated magnitude based on number of assignments, # branches, and conditions. Metrics/AbcSize: - Max: 65 + Max: 75 Metrics/ParameterLists: CountKeywordArgs: false @@ -82,7 +82,7 @@ Metrics/CyclomaticComplexity: Max: 16 Metrics/PerceivedComplexity: - Max: 15 + Max: 17 Rails/Exit: Exclude: diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index b398e241e5..f5191878ad 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -16,8 +16,6 @@ # frozen_string_literal: true -# rubocop:disable Metrics/PerceivedComplexity - module Api module V1 module Migrations @@ -276,4 +274,3 @@ def generate_secure_pwd end end end -# rubocop:enable Metrics/PerceivedComplexity diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb index 7e91680566..a4b87b6af1 100644 --- a/app/controllers/external_controller.rb +++ b/app/controllers/external_controller.rb @@ -30,7 +30,15 @@ def create_user user_info = build_user_info(credentials) - user = User.find_by(external_id: credentials['uid'], provider:) || User.find_by(email: credentials['info']['email'], provider:) + user = User.find_by(external_id: credentials['uid'], provider:) + + # Fallback mechanism to search by email + if user.blank? + user = User.find_by(email: credentials['info']['email'], provider:) + # Update the user's external id to the latest value to avoid using the fallback + user.update(external_id: credentials['uid']) if user.present? && credentials['uid'].present? + end + new_user = user.blank? registration_method = SettingGetter.new(setting_name: 'RegistrationMethod', provider: current_provider).call diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index 9567c50278..7d0a0cb7c9 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -29,7 +29,7 @@ env['omniauth.strategy'].options[:issuer] = issuer_url env['omniauth.strategy'].options[:scope] = %i[openid email profile] - env['omniauth.strategy'].options[:uid_field] = ENV.fetch('OPENID_CONNECT_UID_FIELD', 'preferred_username') + env['omniauth.strategy'].options[:uid_field] = ENV.fetch('OPENID_CONNECT_UID_FIELD', 'sub') env['omniauth.strategy'].options[:discovery] = true env['omniauth.strategy'].options[:client_options].identifier = ENV.fetch('OPENID_CONNECT_CLIENT_ID') env['omniauth.strategy'].options[:client_options].secret = secret @@ -46,7 +46,7 @@ provider :openid_connect, issuer:, scope: %i[openid email profile], - uid_field: ENV.fetch('OPENID_CONNECT_UID_FIELD', 'preferred_username'), + uid_field: ENV.fetch('OPENID_CONNECT_UID_FIELD', 'sub'), discovery: true, client_options: { identifier: ENV.fetch('OPENID_CONNECT_CLIENT_ID'), diff --git a/sample.env b/sample.env index cce81b720d..d5716eb8d6 100644 --- a/sample.env +++ b/sample.env @@ -44,6 +44,7 @@ REDIS_URL= #OPENID_CONNECT_CLIENT_SECRET= #OPENID_CONNECT_ISSUER= #OPENID_CONNECT_REDIRECT= +#OPENID_CONNECT_UID_FIELD= # To enable hCaptcha on the user sign up and sign in, define these 2 keys #HCAPTCHA_SITE_KEY= From 2cdd41d46921f457136559f5207290bb11e21e9d Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:17:34 -0500 Subject: [PATCH 041/103] Translate app/assets/locales/en.json in gl (#5541) 100% translated source file: 'app/assets/locales/en.json' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/gl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/gl.json b/app/assets/locales/gl.json index 4732cc120d..650eff6569 100644 --- a/app/assets/locales/gl.json +++ b/app/assets/locales/gl.json @@ -81,6 +81,7 @@ "account_info": "Información da conta", "delete_account": "Eliminar a conta", "change_password": "Cambiar o contrasinal", + "set_password": "Defina o seu novo contrasinal", "reset_password": "Restabelecer o contrasinal", "update_account_info": "Actualizar a información da conta", "current_password": "Contrasinal actual", @@ -129,6 +130,7 @@ "click_to_upload": "Prema para enviar", "drag_and_drop": " ou arrastre e solte", "upload_description": "Envíe calquera documento de oficina ou ficheiro PDF (non maior que {{size}}). Dependendo do tamaño do ficheiro, pode requirir un tempo adicional para envialo antes de poder utilizalo", + "delete_presentation": "Eliminar presentación", "are_you_sure_delete_presentation": "Confirma que quere eliminar esta presentación?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Gravación", "recordings": "Gravacións", + "processing": "Procesando as gravacións…", "name": "Nome", "length": "Duración", "users": "Usuarios", @@ -347,7 +350,8 @@ "manage_site_settings": "Permitir que os usuarios con este rol xestionen os axustes do sitio", "manage_roles": "Permitir que os usuarios con este rol editen outros roles", "shared_list": "Incluir os usuarios con este rol no menú despregábel para compartir salas", - "room_limit": "Límite de salas" + "room_limit": "Límite de salas", + "email_on_signup": "Recibir un correo-e cando se rexistre un novo usuario" } } }, @@ -358,6 +362,7 @@ "user_updated": "O usuario foi actualizado.", "user_deleted": "O usuario foi eliminado.", "avatar_updated": "O avatar foi actualizado.", + "password_changed": "O seu contrasinal foi actualizado correctamente. Acceda de novo.", "password_updated": "O contrasinal foi actualizado.", "account_activated": "A súa conta foi activada.", "activation_email_sent": "Enviouse un correo que contén as instrucións para activar a súa conta.", From 6cdd3d6db771c6feb09633bd75742f18b2e1c397 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:17:43 -0500 Subject: [PATCH 042/103] Translate config/locales/en.yml in gl (#5540) 100% translated source file: 'config/locales/en.yml' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/gl.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 56ad6f0410..4165a92475 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -65,6 +65,13 @@ gl: get_started: "Para rexistrarse, prema no seguinte botón e siga os pasos." valid_invitation: O convite é válido durante 24 horas. sign_up: Rexistrarse + new_user_signup: + new_user: Rexistro de novo usuario + new_user_description: Rexistrouse un novo usuario para usar BigBlueButton. + name: "Nome: %{name}" + email: "Correo-e: %{email}" + admin_panel: "Panel de administración" + take_action: "Para ver o novo usuario ou realizar a acción necesaria, visite o Panel de administración" reset: password_reset: Restabelecer o contrasinal password_reset_requested: "Solicitouse un restabelecemento de contrasinal para %{email}." @@ -73,4 +80,4 @@ gl: link_expires: A ligazón caducará en 1 hora. ignore_request: "Se Vde. non fixo unha solicitude para cambiar o seu contrasinal, ignore este correo" room: - new_room_name: "Sala de %{username}" + new_room_name: " \nSala de %{username}" From 2de243ffdaa8f6b9e79932953a4a50c164aa15ed Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:17:59 -0500 Subject: [PATCH 043/103] Updates for file config/locales/en.yml in ru (#5531) * Translate config/locales/en.yml in ru 100% translated source file: 'config/locales/en.yml' on 'ru'. * Removing config/locales/en.yml in ru 77% of minimum 100% translated source file: 'config/locales/en.yml' on 'ru'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> From 1960ec7779c912f22c3ee573b000adf269845ba9 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 14:17:26 -0500 Subject: [PATCH 044/103] Prevent local users from signing in if external accounts is enabled (#5542) --- app/controllers/api/v1/sessions_controller.rb | 3 +- app/controllers/concerns/authorizable.rb | 5 + spec/controllers/sessions_controller_spec.rb | 110 +++++++++++------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/app/controllers/api/v1/sessions_controller.rb b/app/controllers/api/v1/sessions_controller.rb index 41eb19cbe6..bbf1372a65 100644 --- a/app/controllers/api/v1/sessions_controller.rb +++ b/app/controllers/api/v1/sessions_controller.rb @@ -20,6 +20,7 @@ module Api module V1 class SessionsController < ApiController skip_before_action :ensure_authenticated, only: %i[index create] + before_action :ensure_unauthenticated, only: :create # GET /api/v1/sessions # Returns the current_user @@ -43,7 +44,7 @@ def create return render_error if user.blank? # Will return an error if the user is NOT from the current provider and if the user is NOT a super admin - return render_error if user.provider != current_provider && !user.super_admin? + return render_error status: :forbidden if !user.super_admin? && (user.provider != current_provider || external_auth?) # Password is not set (local user migrated from v2) if user.external_id.blank? && user.password_digest.blank? diff --git a/app/controllers/concerns/authorizable.rb b/app/controllers/concerns/authorizable.rb index cea926b72b..4b8b404975 100644 --- a/app/controllers/concerns/authorizable.rb +++ b/app/controllers/concerns/authorizable.rb @@ -29,6 +29,11 @@ def ensure_authenticated render_error status: :unauthorized unless current_user end + # Ensures that the user is NOT logged in + def ensure_unauthenticated + render_error status: :unauthorized if current_user + end + # PermissionsChecker service will return a true or false depending on whether the current_user's role has the provided permission_name def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_id: nil) render_error status: :forbidden unless PermissionsChecker.new( diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index e2202d2699..4b234930f8 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -54,46 +54,6 @@ expect(session[:session_token]).to eq(user.session_token) end - it 'returns UnverifiedUser error if the user is not verified' do - unverified_user = create(:user, password: 'Password1!', verified: false) - - post :create, params: { - session: { - email: unverified_user.email, - password: 'Password1!' - } - } - - expect(response.parsed_body['data']).to eq(unverified_user.id) - expect(response.parsed_body['errors']).to eq('UnverifiedUser') - end - - it 'returns BannedUser error if the user is banned' do - banned_user = create(:user, password: 'Password1!', status: :banned) - - post :create, params: { - session: { - email: banned_user.email, - password: 'Password1!' - } - } - - expect(response.parsed_body['errors']).to eq('BannedUser') - end - - it 'returns Pending error if the user is banned' do - banned_user = create(:user, password: 'Password1!', status: :pending) - - post :create, params: { - session: { - email: banned_user.email, - password: 'Password1!' - } - } - - expect(response.parsed_body['errors']).to eq('PendingUser') - end - it 'logs in with greenlight account before bn account' do post :create, params: { session: { email: user.email, password: 'Password1!' } } expect(response).to have_http_status(:ok) @@ -107,6 +67,76 @@ expect(response).to have_http_status(:ok) expect(session[:session_token]).to eq(super_admin.reload.session_token) end + + context 'errors' do + it 'returns unauthorized if the user is already signed in' do + sign_in_user(user) + + post :create, params: { + session: { + email: 'email@email.com', + password: 'Password1!', + extend_session: false + } + }, as: :json + + expect(response).to be_unauthorized + end + + it 'returns forbidden if the external auth is enabled' do + allow(controller).to receive(:external_auth?).and_return(true) + + post :create, params: { + session: { + email: 'email@email.com', + password: 'Password1!', + extend_session: false + } + }, as: :json + + expect(response).to be_forbidden + end + + it 'returns UnverifiedUser error if the user is not verified' do + unverified_user = create(:user, password: 'Password1!', verified: false) + + post :create, params: { + session: { + email: unverified_user.email, + password: 'Password1!' + } + } + + expect(response.parsed_body['data']).to eq(unverified_user.id) + expect(response.parsed_body['errors']).to eq('UnverifiedUser') + end + + it 'returns BannedUser error if the user is banned' do + banned_user = create(:user, password: 'Password1!', status: :banned) + + post :create, params: { + session: { + email: banned_user.email, + password: 'Password1!' + } + } + + expect(response.parsed_body['errors']).to eq('BannedUser') + end + + it 'returns Pending error if the user is banned' do + banned_user = create(:user, password: 'Password1!', status: :pending) + + post :create, params: { + session: { + email: banned_user.email, + password: 'Password1!' + } + } + + expect(response.parsed_body['errors']).to eq('PendingUser') + end + end end describe '#destroy' do From ddffe5483f7c1c23afc0ac9e86c7760b999cf13f Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Mon, 20 Nov 2023 21:59:47 +0100 Subject: [PATCH 045/103] feat(migrations): Import password digests from Greenlight2 (#5507) * feat(migrations): Import password digests from Greenlight2 * Update external_controller.rb * Update external_controller.rb --------- Co-authored-by: Ahmad Farhat Co-authored-by: Ahmad Farhat --- .../api/v1/migrations/external_controller.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index f5191878ad..717af9694d 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -75,7 +75,7 @@ def create_role end # POST /api/v1/migrations/users.json - # Expects: { user: { :name, :email, :external_id, :language, :role } } + # Expects: { user: { :name, :email, :password_digest, :provider, :external_id, :language, :role } } # Returns: { data: Array[serializable objects] , errors: Array[String] } # Does: Creates a user. def create_user @@ -103,10 +103,8 @@ def create_user return render_error(status: :bad_request, errors: user&.errors&.to_a) unless user.save - if user_hash[:provider] != 'greenlight' - user.password_digest = nil - user.save(validations: false) - end + user.password_digest = user_hash[:provider] == 'greenlight' ? user_hash[:password_digest] : nil + user.save(validations: false) render_data status: :created end @@ -228,7 +226,7 @@ def role_params end def user_params - decrypted_params.require(:user).permit(:name, :email, :provider, :external_id, :language, :role, :created_at) + decrypted_params.require(:user).permit(:name, :email, :password_digest, :provider, :external_id, :language, :role, :created_at) end def room_params From b83e0d99b65e86e9cd202551f0d08059505fc981 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:49:43 -0500 Subject: [PATCH 046/103] Translate config/locales/en.yml in ar (#5550) 100% translated source file: 'config/locales/en.yml' on 'ar'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index a2d57909d9..50f99d3f94 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -65,6 +65,13 @@ ar: get_started: للتسجيل ، يرجى النقر فوق الزر أدناه واتباع الخطوات. valid_invitation: الدعوة صالحة لمدة 24 ساعة. sign_up: التسجيل + new_user_signup: + new_user: تسجيل مستخدم جديد + new_user_description: قام مستخدم جديد بالتسجيل لاستخدام بك بلو بتن. + name: "الاسم: %{name}" + email: "البريد: %{email}" + admin_panel: "لوحة الإدارة" + take_action: "لعرض المستخدم الجديد أو اتخاذ الإجراء اللازم، قم بزيارة لوحة الادارة" reset: password_reset: إعادة تعيين كلمة المرور password_reset_requested: "تم طلب إعادة تعيين كلمة المرور لـ %{email}." From ca8e31ebd4bed10876c4d034b24de837045a0741 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:49:51 -0500 Subject: [PATCH 047/103] Translate config/locales/en.yml in fa_IR (#5549) 100% translated source file: 'config/locales/en.yml' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index 53e1eaf7e7..c522174169 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -65,6 +65,13 @@ fa_IR: get_started: برای ثبت‌نام، لطفا روی دکمهٔ زیر کلیک کنید و گام‌ها را دنبال کنید. valid_invitation: دعوت‌نامه فقط ۴۸ ساعت اعتبار دارد. sign_up: ثبت‌نام + new_user_signup: + new_user: ثبت نام کاربر جدید + new_user_description: یک کاربر جدید برای استفاده از BigBlueButton ثبت نام کرده است. + name: "نام: %{name}" + email: "ایمیل: %{email}" + admin_panel: "پنل مدیر کل" + take_action: "برای مشاهده کاربر جدید یا انجام اقدامات لازم، به پنل مدیر مراجعه کنید" reset: password_reset: بازنشانی گذرواژه password_reset_requested: "بازنشانی گذرواژه برای %{email} درخواست شده‌است." From 80c9d51edad4a6985ad34c3f0f2f80170c99162e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:50:03 -0500 Subject: [PATCH 048/103] Translate app/assets/locales/en.json in fa_IR (#5548) 100% translated source file: 'app/assets/locales/en.json' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/fa_IR.json | 373 +++++++++++++++++----------------- 1 file changed, 189 insertions(+), 184 deletions(-) diff --git a/app/assets/locales/fa_IR.json b/app/assets/locales/fa_IR.json index c249902625..f787efe242 100644 --- a/app/assets/locales/fa_IR.json +++ b/app/assets/locales/fa_IR.json @@ -1,7 +1,7 @@ { "start": "شروع", "search": "جستجو", - "home": "صفحه اصلی", + "home": "صفحهٔ خانه", "previous": "قبلی", "back": "بازگشت", "next": "بعدی", @@ -9,52 +9,52 @@ "join": "پیوستن", "edit": "ویرایش", "save": "ذخیره", - "save_changes": "ذخیره تغییرات", + "save_changes": "ذخیرهٔ تغییرات", "update": "به‌روزرسانی", "report": "گزارش", - "share": "اشتراک گذاری", + "share": "هم‌رسانی", "cancel": "انصراف", "close": "بستن", "delete": "حذف", - "copy": "کپی پیوند عضویت", + "copy": "رونوشت پیوند عضویت", "or": "یا", "online": "آنلاین", "help_center": "مرکز راهنمایی", - "are_you_sure": "آیا مطمئنی؟", - "return_home": "بازگشت به صفحه اصلی", - "created_at": "ایجاد شده در", + "are_you_sure": "آیا مطمئن هستید؟", + "return_home": "بازگشت به صفحهٔ خانه", + "created_at": "ایجادشده در", "view_recordings": "مشاهدهٔ ضبط‌شده‌ها", "join_session": "پیوستن به نشست", "no_result_search_input": "هیچ نتیجه‌ای برای «{{ searchInput }}» یافت نشد", "action_permanent": "این عمل قابل بازگردانی نیست.", "homepage": { "welcome_bbb": "به BigBlueButton خوش آمدید.", - "bigbluebutton_description": "BigBlueButton یک سیستم کنفرانس وب متن باز برای کلاس‌های آنلاین است. این پلتفرم زمان را برای یادگیری کاربردی به حداکثر می‌رساند و به دانش‌اموزان امکاناتی ارائه می‌دهد تا با یکدیگر همکاری کنند و بازخورد دریافت کنند.", - "greenlight_description": "اتاق‌های خود را برای میزبانی جلسات با استفاده از یک پیوند کوتاه و راحت برای پیوستن دیگران ایجاد کنید.", - "learn_more": "درباره BigBlueButton بیشتر بدانید", + "bigbluebutton_description": "BigBlueButton یک سیستم کنفرانس وب متن‌باز برای کلاس‌های آنلاین است. این سکو زمان یادگیری کاربردی را به حداکثر می‌رساند و به دانش‌اموزان امکاناتی ارائه می‌دهد تا با یک‌دیگر همکاری کنند و در لحظه بازخورد دریافت کنند.", + "greenlight_description": "اتاق‌های خود را برای میزبانی جلسات ایجاد کنید یا با استفاده از یک پیوند کوتاه و راحت به اتاق‌های دیگران بپیوندید.", + "learn_more": "دربارهٔ BigBlueButton بیشتر بدانید", "explore_features": "کاوش ویژگی‌های ما", - "meeting_title": " راه‌اندازی جلسه", - "meeting_description": "یک کلاس مجازی به صورت ویدیوای، صوتی، اشتراک گذاری صفحه نمایش، گفتگو و تمام ابزارهای مورد نیاز برای یادگیری کاربردی راه‌اندازی کنید.", - "recording_title": "ضبط جلسات خود", - "recording_description": "جلسات BigBlueButton را ضبط کنید و آنها را با دانش‌آموزان به اشتراک بگذارید تا مطالب را دوباره بررسی و مشاهده کنند.", + "meeting_title": " راه‌اندازی یک جلسه", + "meeting_description": "یک کلاس مجازی به همراه ویدیو، صدا، اشتراک‌گذاری صفحه نمایش، گپ و تمام ابزارهای مورد نیاز برای یادگیری کاربردی راه‌اندازی کنید.", + "recording_title": "جلسات خود را ضبط کنید", + "recording_description": "جلسات BigBlueButton را ضبط کنید و آنها را با دانش‌آموزان هم‌رسانی کنید تا مطالب را بررسی و روی آن فکر کنند.", "settings_title": "مدیریت اتاق‌های خود", "settings_description": "تنظیمات اتاق‌ها و جلسه خود را به گونه‌ای پیکربندی کنید که در روند کلاسی تأثیر بهتری داشته باشد.", - "and_more_title": "و بیشتر!", + "and_more_title": "و موارد بیشتر!", "and_more_description": "BigBlueButton برای یادگیری کاربردی، ابزارهای درونی مختلفی را ارائه می‌کند و برای صرفه‌جویی در وقت شما در طول کلاس طراحی شده است.", "enter_meeting_url": "نشانی اینترنتی جلسه را وارد کنید", - "enter_meeting_url_instruction": "لطفا نشانی اینترنتی جلسه BigBlueButton خود را در فیلد زیر وارد کنید." + "enter_meeting_url_instruction": "لطفا نشانی اینترنتی جلسه BigBlueButton خود را در زمینهٔ متنی زیر وارد کنید." }, "authentication": { "sign_in": "ورود", - "sign_up": "ثبت نام", + "sign_up": "ثبت‌نام", "sign_out": "خروج", - "email": "ایمیل", + "email": "رایانامه", "password": "گذرواژه", - "confirm_password": "تایید گذرواژه", - "enter_email": "ایمیل خود را وارد کنید", + "confirm_password": "تأیید گذرواژه", + "enter_email": "رایانامهٔ خود را وارد کنید", "enter_name": "نام خود را وارد کنید", "remember_me": "مرا به خاطر بسپار", - "forgot_password": "رمز عبور را فراموش کرده‌اید؟", + "forgot_password": "گذرواژه را فراموش کرده‌اید؟", "dont_have_account": "حساب کاربری ندارید؟", "create_account": "ایجاد حساب کاربری", "create_an_account": "ایجاد یک حساب کاربری", @@ -64,11 +64,11 @@ "user": "کاربر", "users": "کاربران", "name": "نام", - "email_address": "نشانی ایمیل", - "authenticator": "احراز هویت", + "email_address": "نشانی رایانامه", + "authenticator": "احرازگر هویت", "full_name": "نام کامل", "no_user_found": "هیچ کاربری پیدا نشد", - "type_three_characters": "لطفا سه «۳» کاراکتر یا بیشتر برای نمایش دیگر کاربران تایپ کنید.", + "type_three_characters": "لطفا سه «۳» نویسه یا بیشتر برای نمایش دیگر کاربران تایپ کنید.", "search_not_found": "هیچ کاربری پیدا نشد", "profile": { "profile": "نمایه", @@ -81,24 +81,25 @@ "account_info": "اطلاعات حساب کاربری", "delete_account": "حذف حساب کاربری", "change_password": "تغییر گذرواژه", + "set_password": "گذرواژهٔ جدید خود را وارد کنید", "reset_password": "بازنشانی گذرواژه", "update_account_info": "به‌روزرسانی اطلاعات حساب کاربری", - "current_password": "گذرواژه فعلی", - "new_password": "گذرواژه جدید", - "confirm_password": "تایید گذرواژه", + "current_password": "گذرواژهٔ فعلی", + "new_password": "گذرواژهٔ جدید", + "confirm_password": "تأیید گذرواژه", "permanently_delete_account": "حساب کاربری خود را برای همیشه حذف کنید", - "delete_account_description": "اگر حساب کاربری خود را حذف کنید، قابل بازیابی نخواهد بود.\nتمام اطلاعات مربوط به حساب کاربری شما، از جمله تنظیمات، اتاق‌ها و موارد ضبط شده حذف خواهد شد.", + "delete_account_description": "اگر حساب کاربری خود را حذف کنید، قابل بازیابی نخواهد بود.\nتمام اطلاعات مربوط به حساب کاربری شما، از جمله تنظیمات، اتاق‌ها و موارد ضبط‌شده حذف خواهند شد.", "delete_account_confirmation": "بله، من می‌خواهم حساب کاربریم را حذف کنم", "are_you_sure_delete_account": "آیا مطمئن هستید که می‌خواهید حساب کاربری خود را حذف کنید؟" }, "avatar": { - "upload_avatar": "بارگذاری آواتار", - "delete_avatar": "حذف آواتار", - "crop_avatar": "برش آواتار شما" + "upload_avatar": "بارگذاری تصویر نمایه", + "delete_avatar": "حذف تصویر نمایه", + "crop_avatar": "برش تصویر نمایهٔ شما" }, "pending": { "title": "در انتظار ثبت‌نام", - "message": "ممنون از اینکه ثبت نام کردید! حساب کاربری شما در حال حاضر در انتظار تایید توسط مدیر کل است." + "message": "ممنون از این‌که ثبت‌نام کردید! حساب کاربری شما در حال حاضر در انتظار تأیید توسط یک مدیر کل است." } }, "room": { @@ -110,44 +111,45 @@ "delete_room": "حذف اتاق", "create_new_room": "ایجاد اتاق جدید", "enter_room_name": "نام اتاق را وارد کنید", - "shared_by": "اشتراک گذاشته شده توسط", + "shared_by": "هم‌رسانی‌شده توسط", "last_session": "آخرین جلسه: {{ localizedTime }}", "no_last_session": "هنوز هیچ جلسه‌ای از قبل ایجاد نشده است", "search_not_found": "هیچ اتاقی پیدا نشد", "rooms_list_is_empty": "شما هنوز هیچ اتاقی ندارید!", - "rooms_list_empty_create_room": "با کلیک بر روی دکمه زیر و وارد کردن نام اتاق، اولین اتاق خود را ایجاد کنید.", + "rooms_list_empty_create_room": "با کلیک بر روی دکمهٔ زیر و وارد کردن نام اتاق، اولین اتاق خود را ایجاد کنید.", "meeting": { "start_meeting": "شروع جلسه", - "join_meeting": "به جلسه بپیوندید", + "join_meeting": "پیوستن به جلسه", "meeting_invitation": "شما برای پیوستن به جلسه دعوت شده‌اید", "meeting_not_started": "جلسه هنوز شروع نشده است", - "join_meeting_automatically": "با شروع جلسه به طور خودکار به آن ملحق خواهید شد", - "recording_consent": "من اذعان دارم که این جلسه ممکن است، ضبط شود. این ممکن است شامل صدا و ویدیو من در صورت فعال شدن، باشد." + "join_meeting_automatically": "با شروع جلسه، به طور خودکار به آن خواهید پیوست.", + "recording_consent": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." }, "presentation": { "presentation": "ارائه", "click_to_upload": "برای بارگذاری کلیک کنید", "drag_and_drop": " یا بکشید و رها کنید", "upload_description": "هر سند اداری یا پرونده PDF (بزرگتر از {{size}}) را بارگذاری کنید. بسته به اندازه پرونده، ممکن است به زمان بیشتری برای بارگذاری نیاز باشد تا بتوان از آن استفاده کرد.", + "delete_presentation": "حذف ارائه", "are_you_sure_delete_presentation": "آیا مطمئن هستید که می‌خواهید این ارائه را حذف کنید؟" }, "shared_access": { "access": "دسترسی", - "add_share_access": "+ اشتراک گذاری دسترسی", - "share_room_access": "دسترسی به اتاق را به اشتراک بگذارید", - "add_some_users": "زمان افزودن چند کاربر است!", - "add_some_users_description": "برای افزودن کاربران جدید، روی دکمه زیر کلیک کنید و کاربرانی را که می‌خواهید این اتاق را با آنها به اشتراک بگذارید، جستجو یا انتخاب کنید.", + "add_share_access": "+ هم‌رسانی دسترسی", + "share_room_access": "هم‌رسانی دسترسی به اتاق", + "add_some_users": "اکنون زمان افزودن چند کاربر است!", + "add_some_users_description": "برای افزودن کاربران جدید، روی دکمهٔ زیر کلیک کنید و کاربرانی را که می‌خواهید این اتاق را با آنها هم‌رسانی کنید، جستجو یا انتخاب کنید.", "delete_shared_access": "حذف دسترسی هم‌رسانی‌شده", - "are_you_sure_delete_shared_access": "آیا مطمئن هستید که می‌خواهید این دسترسی اشتراک گذاری را حذف کنید؟" + "are_you_sure_delete_shared_access": "آیا مطمئن هستید که می‌خواهید این دسترسی هم‌رسانی‌شده را حذف کنید؟" }, "settings": { "settings": "تنظیمات", "room_name": "نام اتاق", "user_settings": "تنظیمات کاربر", "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "require_signed_in": "کاربران قبل از پیوستن به جلسه، ملزم به ورود به سیستم شوند", - "require_signed_in_message": "برای پیوستن به این اتاق باید وارد سیستم شوید.", - "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تایید مدیر باشد", + "require_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", + "require_signed_in_message": "برای پیوستن به این اتاق باید وارد حساب کاربری خود شوید.", + "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تأیید مدیر باشد", "allow_any_user_to_start": "به هر کاربری اجازه دهید این جلسه را شروع کند", "all_users_join_as_mods": "همه کاربران به عنوان مدیر عضو شوند", "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", @@ -163,45 +165,46 @@ } }, "recording": { - "recording": "در حال ضبط", - "recordings": "ضبط شده‌ها", + "recording": "ضبط", + "recordings": "ضبط‌شده‌ها", + "processing": "درحال پردازش ضبط‌ها", "name": "نام", "length": "طول مدت", "users": "کاربران", - "visibility": "قابلیت دیدن", + "visibility": "قابلیت مشاهده", "formats": "قالب‌ها", - "published": "منتشر شده", - "unpublished": "منتشر نشده", - "protected": "محافظت شده", + "published": "منتشرشده", + "unpublished": "منتشرنشده", + "protected": "محافظت‌شده", "public": "عمومی", "public_protected": "عمومی/محافظت‌شده", "length_in_minutes": "{{recording.length}} دقیقه.", - "processing_recording": "در حال پردازش ضبط، این‌کار ممکن است چند دقیقه طول بکشد...", - "copy_recording_urls": "کپی نشانی(های) ضبط شده", - "recordings_list_empty": "شما هنوز هیچ جلسه ضبط شده‌ای ندارید!", + "processing_recording": "در حال پردازش ضبط؛ این‌کار ممکن است چند دقیقه طول بکشد...", + "copy_recording_urls": "رونوشت نشانی(های) ضبط", + "recordings_list_empty": "شما هنوز هیچ جلسهٔ ضبط‌شده‌ای ندارید!", "public_recordings_list_empty": "هنوز هیچ ضبط عمومی‌ای وجود ندارد!", "recordings_list_empty_description": "بعد از شروع جلسه و ضبط آن، موارد ضبط‌شده در این‌جا نمایان می‌شوند.", "public_recordings_list_empty_description": "موارد ضبط‌شده هنگامی که موجود شوند در این‌جا پدیدار خواهند شد.", "delete_recording": "حذف ضبط", - "are_you_sure_delete_recording": "آیا مطمئنید که می‌خواهید این ضبط را حذف کنید؟", + "are_you_sure_delete_recording": "آیا مطمئن هستید که می‌خواهید این ضبط را حذف کنید؟", "search_not_found": "هیچ ضبطی یافت نشد" }, "admin": { - "admin_panel": "پنل مدیر کل", + "admin_panel": "تابلوی مدیر کل", "manage_users": { "manage_users": "مدیریت کاربران", "active": "فعال", - "approve": "تایید", - "decline": "رد کردن", + "approve": "تأیید", + "decline": "ردکردن", "pending": "در انتظار", - "banned": "مسدود شده", + "banned": "مسدودشده", "ban": "مسدود", "unban": "لغو مسدودیت", - "deleted": "حذف شده", - "invited_tab": "دعوت شده", + "deleted": "حذف‌شده", + "invited_tab": "دعوت‌شده", "invite_user": "دعوت از کاربر", - "send_invitation": "ارسال دعوتنامه", - "enter_user_email": "ایمیل کاربر را وارد کنید", + "send_invitation": "ارسال دعوت‌نامه", + "enter_user_email": "رایانامهٔ کاربر را وارد کنید", "new_user": "کاربر جدید", "add_new_user": "کاربر جدید", "create_new_user": "ایجاد کاربر جدید", @@ -216,14 +219,14 @@ "delete_account_warning": "اگر این حساب کاربری را حذف کنید، قابل بازیابی نخواهد بود.", "empty_active_users": "هنوز هیچ کاربر فعالی در این سرور وجود ندارد!", "empty_active_users_subtext": "هنگامی که وضعیت یک کاربر به فعال تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_pending_users": "هنوز هیچ کاربر در انتظار تایید در این سرور وجود ندارد!", - "empty_pending_users_subtext": "هنگامی که وضعیت یک کاربر به در انتظارِ تایید تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_banned_users": "هنوز هیچ کاربر مسدود شده‌ای در این سرور وجود ندارد!", - "empty_banned_users_subtext": "هنگامی که وضعیت یک کاربر به مسدود شده تغییر می‌کند، در اینجا نمایان می‌شوند.", + "empty_pending_users": "هنوز هیچ کاربر درانتظار تأیید در این سرور وجود ندارد!", + "empty_pending_users_subtext": "هنگامی که وضعیت یک کاربر به در انتظارِ تأیید تغییر می‌کند، در اینجا نمایان می‌شوند.", + "empty_banned_users": "هنوز هیچ کاربر مسدودشده‌ای در این سرور وجود ندارد!", + "empty_banned_users_subtext": "هنگامی که وضعیت یک کاربر به مسدودشده تغییر می‌کند، در اینجا نمایان می‌شوند.", "empty_invited_users": "هنوز هیچ کاربر دعوت‌شده‌ای در این سرور وجود ندارد!", "empty_invited_users_subtext": "هنگامی که وضعیت یک کاربر به دعوت‌شده تغییر می‌کند، در اینجا نمایان می‌شوند.", "invited": { - "time_sent": "زمان ارسال شده", + "time_sent": "زمان ارسال‌شده", "valid": "معتبر" } }, @@ -232,22 +235,22 @@ "name": "نام", "owner": "صاحب", "room_id": "شناسه اتاق", - "participants": "شركت كنندگان", + "participants": "شركت‌كنندگان", "status": "وضعیت", "running": "در حال اجرا", "not_running": "در حال اجرا نیست", "active": "فعال", - "current_session": "جلسه فعلی: {{lastSession}}", + "current_session": "جلسهٔ کنونی: {{lastSession}}", "last_session": "آخرین جلسه: {{localizedTime}}", "no_meeting_yet": "هنوز هیچ جلسه‌ای وجود ندارد.", "delete_server_rooms": "حذف اتاق سرور", - "resync_recordings": "همگام‌سازی مجدد ضبط شده‌ها", + "resync_recordings": "همگام‌سازی مجدد ضبط‌شده‌ها", "empty_room_list": "هنوز هیچ اتاق سروری وجود ندارد!", - "empty_room_list_subtext": "پس از اینکه اولین اتاق خود را ایجاد کنید در اینجا نمایان می‌شوند." + "empty_room_list_subtext": "اتاق‌ها پس از این‌که اولین اتاق خود را ایجاد کنید در اینجا نمایان می‌شوند." }, "server_recordings": { - "server_recordings": "سرور ضبط شده‌ها", - "latest_recordings": "آخرین موارد ضبط شده", + "server_recordings": "ضبط‌شده‌های سرور", + "latest_recordings": "آخرین ضبط‌شده‌ها", "no_recordings_found": "هیچ ضبطی یافت نشد." }, "site_settings": { @@ -265,37 +268,37 @@ "remove_branding_image": "حذف تصویر برند" }, "administration": { - "administration": "مدیر کل", + "administration": "مدیریت", "terms": "شرایط و ضوابط", "privacy": "سیاست حفظ حریم خصوصی", "privacy_policy": "سیاست حفظ حریم خصوصی", - "change_term_links": "تغییر مقررات پیوندهایی که در پایین صفحه ظاهر می‌شوند", - "change_privacy_link": "پیوند حریم خصوصی که در پایین صفحه ظاهر می‌شود را تغییر دهید", + "change_term_links": "تغییر پیوندهای مقررات که در پایین صفحه نمایان می‌شوند", + "change_privacy_link": "پیوند حریم خصوصی که در پایین صفحه نمایان می‌شود را تغییر دهید", "change_url": "تغییر نشانی اینترنتی", "enter_link": "پیوند را اینجا وارد کنید" }, "settings": { "settings": "تنظیمات", - "allow_users_to_share_rooms": "به کاربران اجازه دهید، اتاق‌ها را به اشتراک بگذارند", - "allow_users_to_share_rooms_description": "تنظیمات غیرفعال باشد، دکمه‌ها از منوی کشویی گزینه‌های اتاق حذف می‌شود و از اشتراک‌گذاری اتاق توسط کاربران جلوگیری می‌کند", + "allow_users_to_share_rooms": "به کاربران اجازه دهید اتاق‌ها را هم‌رسانی کنند", + "allow_users_to_share_rooms_description": "تنظیم برروی غیرفعال، دکمه را از فهرست کشویی گزینه‌های اتاق حذف می‌کند و از هم‌رسانی اتاق‌ها توسط کاربران جلوگیری می‌کند", "allow_users_to_preupload_presentation": "به کاربران اجازه دهید تا ارائه‌ها را از قبل بارگذاری کنند", - "allow_users_to_preupload_presentation_description": "کاربران می‌توانند یک ارائه را از قبل بارگذاری کنند تا به عنوان ارائه پیش‌فرض برای آن اتاق خاص استفاده شود" + "allow_users_to_preupload_presentation_description": "کاربران می‌توانند یک ارائه را از قبل بارگذاری کنند تا به عنوان ارائهٔ پیش‌فرض برای آن اتاق خاص استفاده شود" }, "registration": { - "registration": "ثبت نام", - "role_mapping_by_email": "اعطا نقش از طریق ایمیل", - "role_mapping_by_email_description": "با استفاده از ایمیل کاربر نقشی بهش اعطا کنید. باید در قالب: role1=email1، role2=email2 باشد", - "enter_role_mapping_rule": "یک قانون اعطا نقش را وارد کنید", + "registration": "ثبت‌نام", + "role_mapping_by_email": "سپردن نقش از طریق رایانامه", + "role_mapping_by_email_description": "با استفاده از رایانامهٔ کاربر نقشی به او بسپارید. باید در قالب: role1=email1, role2=email2 باشد", + "enter_role_mapping_rule": "یک قانون سپردن نقش را وارد کنید", "resync_on_login": "همگام‌سازی مجدد داده‌های کاربر در هر بار ورود", - "resync_on_login_description": "هر بار که کاربر وارد سیستم می‌شود، اطلاعات کاربر را مجددا همگام‌سازی می‌کند و باعث می‌شود که ارائه‌دهنده احراز هویت خارجی همیشه با اطلاعات موجود در Greenlight مطابقت داشته باشد.", + "resync_on_login_description": "هر بار که کاربر وارد سیستم می‌شود، اطلاعات کاربر را مجددا همگام‌سازی می‌کند و باعث می‌شود که ارائه‌دهندهٔ احراز هویت خارجی همیشه با اطلاعات موجود در Greenlight مطابقت داشته باشد.", "default_role": "نقش پیش‌فرض", - "default_role_description": "نقش پیش‌فرضی که به کاربران تازه ایجاد شده اختصاص داده می‌شود", - "registration_method": "روش ثبت نام", - "registration_method_description": "نحوه ثبت نام کاربران در وب‌سایت را تغییر دهید", + "default_role_description": "نقش پیش‌فرضی که به کاربران تازهٔ ایجاد‌شده اختصاص داده می‌شود", + "registration_method": "روش ثبت‌نام", + "registration_method_description": "نحوه ثبت‌نام کاربران در وب‌سایت را تغییر دهید", "registration_methods" : { - "open": "باز کردن ثبت نام", - "invite": "پیوستن با دعوتنامه", - "approval": "تایید/رد کردن" + "open": "بازکردن ثبت‌نام", + "invite": "پیوستن با دعوت‌نامه", + "approval": "تأیید/رد" } } }, @@ -304,24 +307,24 @@ "default": "اختیاری (پیش‌فرض: فعال‌شده)", "optional": "اختیاری (پیش‌فرض: غیرفعال‌شده)", "enabled": "اجباری فعال‌شده", - "disabled": "غیرفعال شد", + "disabled": "غیرفعال‌شده", "configurations": { "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "allow_room_to_be_recorded_description": "به صاحبان اتاق اجازه می‌دهد تعیین کنند که آیا می‌خواهند، اتاق را ضبط کنند یا خیر. اگر فعال باشد، مدیر همچنان باید پس از شروع جلسه، روی دکمه «ضبط» کلیک کند.", - "require_user_signed_in": "کاربران قبل از پیوستن به جلسه، ملزم به ورود به سیستم شوند", - "require_user_signed_in_description": "فقط به کاربرانی که دارای حساب کاربری در Greenlight هستند، اجازه می‌دهد به جلسه بپیوندند. اگر وارد سیستم نشده باشند، هنگام تلاش برای پیوستن به اتاق، به صفحه ورود هدایت می‌شوند.", + "allow_room_to_be_recorded_description": "به صاحبان اتاق اجازه می‌دهد تعیین کنند که آیا می‌خواهند امکان ضبط اتاق را داشته باشند یا خیر. اگر فعال باشد، مدیر همچنان باید پس از شروع جلسه، روی دکمهٔ «ضبط» کلیک کند.", + "require_user_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", + "require_user_signed_in_description": "فقط به کاربرانی که دارای حساب کاربری در Greenlight هستند اجازه می‌دهد به جلسه بپیوندند. اگر وارد سیستم نشده باشند، هنگام تلاش برای پیوستن به اتاق، به صفحهٔ ورود هدایت می‌شوند.", "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تایید مدیر باشد", - "require_mod_approval_description": "هنگامی که کاربر سعی می‌کند به جلسه بپیوندد، از مدیر جلسه BigBlueButton درخواست می‌کند. در صورت تایید کاربر، می‌تواند به جلسه بپیوندد.", + "require_mod_approval_description": "هنگامی که یک کاربر سعی می‌کند به جلسه بپیوندد، از مدیر جلسه BigBlueButton درخواست می‌کند. در صورت تأییدشدن کاربر، می‌تواند به جلسه بپیوندد.", "allow_any_user_to_start_meeting": "به هر کاربری اجازه دهید تا جلسه را شروع کند", "allow_any_user_to_start_meeting_description": "به هر کاربری اجازه دهید جلسه را در هر زمانی که خواست شروع کند. به‌طور پیش‌فرض، فقط صاحب اتاق می‌تواند جلسه را شروع کند.", - "allow_users_to_join_as_mods": "همه کاربران به عنوان مدیر عضو شوند", - "allow_users_to_join_as_mods_description": "به همه کاربران هنگام پیوستن به جلسه، در BigBlueButton اختیارات مدیر را می‌دهد", + "allow_users_to_join_as_mods": "همهٔ کاربران به عنوان مدیر بپیوندند", + "allow_users_to_join_as_mods_description": "به همهٔ کاربران هنگام پیوستن به جلسه، در BigBlueButton اختیارات مدیر را می‌دهد", "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", - "mute_users_on_join_description": "هنگامی که کاربر به جلسه BigBlueButton می‌پیوندد، به‌طور خودکار بی‌صدا می‌شود", + "mute_users_on_join_description": "هنگامی که کاربر به جلسهٔ BigBlueButton می‌پیوندد، به‌طور خودکار بی‌صدا می‌شود", "viewer_access_code": "کد دسترسی بینندگان", - "viewer_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران به اشتراک بگذارند. در صورت تولید کد، برای پیوستن کاربران به جلسات اتاق الزامی است.", + "viewer_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی شود. اگر کد تولید شده باشد، برای پیوستن کاربران به جلسات اتاق الزامی است.", "mod_access_code": "کد دسترسی مدیر", - "mod_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران به اشتراک بگذارند. کد، در صورت تولید، مورد نیاز نخواهد بود و در صورت استفاده در هر جلسه اتاق، کاربر به عنوان مدیر ملحق خواهد شد." + "mod_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی کنند. کد، در صورت تولید، مورد نیاز نخواهد بود و در صورت استفاده در هر جلسه اتاق، کاربر به عنوان مدیر به جلسه خواهد پیوست." } }, "roles": { @@ -343,93 +346,95 @@ "record": "به کاربران دارای این نقش اجازه دهید تا جلسات خود را ضبط کنند", "manage_users": "به کاربران دارای این نقش اجازه دهید تا کاربران را مدیریت کنند", "manage_rooms": "به کاربران دارای این نقش اجازه دهید تا اتاق‌های سرور را مدیریت کنند", - "manage_recordings": "به کاربران دارای این نقش اجازه دهید تا جلسات ضبط‌شده سرور را مدیریت کنند", + "manage_recordings": "به کاربران دارای این نقش اجازه دهید تا جلسات ضبط‌شدهٔ سرور را مدیریت کنند", "manage_site_settings": "به کاربران دارای این نقش اجازه دهید تا تنظیمات سایت را مدیریت کنند", "manage_roles": "به کاربران دارای این نقش اجازه دهید تا دیگر نقش‌ها را ویرایش کنند", - "shared_list": "کاربران دارای این نقش را در فهرست کشویی اشتراک‌گذاری اتاق‌ها بگنجانید", - "room_limit": "محدودیت اتاق" + "shared_list": "کاربران دارای این نقش را در فهرست کشویی هم‌رسانی اتاق‌ها بگنجانید", + "room_limit": "محدودیت اتاق", + "email_on_signup": "دریافت ایمیل زمانی که یک کاربر جدید ثبت نام می‌کند" } } }, "toast": { "success": { "user": { - "user_created": "یک کاربر جدید ایجاد شده‌ است.", - "user_updated": "کاربر به‌روز شده‌ است.", - "user_deleted": "کاربر حذف شده‌ است.", - "avatar_updated": "تصویر نمایه به‌روز شده‌ است.", - "password_updated": "گذرواژه به‌روز شده‌ است.", - "account_activated": "حساب کاربری شما فعال شده‌ است.", - "activation_email_sent": "ایمیلی حاوی راهنماهای فعال‌سازی حساب کاربری شما ارسال شده‌ است.", - "reset_pwd_email_sent": "ایمیلی حاوی راهنماهای بازنشانی گذرواژه شما ارسال شده‌ است." + "user_created": "یک کاربر جدید ایجاد شده‌است.", + "user_updated": "کاربر به‌روز شده‌است.", + "user_deleted": "کاربر حذف شده‌است.", + "avatar_updated": "تصویر نمایه به‌روز شده‌است.", + "password_changed": "گذرواژهٔ شما با موفقیت به‌روزرسانی شد. لطفا دوباره وارد شوید.", + "password_updated": "گذرواژه به‌روز شده‌است.", + "account_activated": "حساب کاربری شما فعال شده‌است.", + "activation_email_sent": "رایانامه‌ای حاوی راهنماهای فعال‌سازی حساب کاربری شما ارسال شده‌است.", + "reset_pwd_email_sent": "رایانامه‌ای حاوی راهنماهای بازنشانی گذرواژه شما ارسال شده‌است." }, "session": { "signed_out": "از سیستم خارج شده‌اید." }, "room": { - "room_created": "یک اتاق جدید ایجاد شده‌ است.", - "room_updated": "اتاق به‌روز شده‌ است.", - "room_deleted": "اتاق حذف شده‌ است.", - "room_shared": "اتاق اشتراک‌گذاری شده‌ است.", - "room_unshared": "اشتراک‌گذاری اتاق لغو شده‌ است.", + "room_created": "یک اتاق جدید ایجاد شده‌است.", + "room_updated": "اتاق به‌روز شده‌است.", + "room_deleted": "اتاق حذف شده‌است.", + "room_shared": "اتاق هم‌رسانی شده‌است.", + "room_unshared": "هم‌رسانی اتاق لغو شده‌است.", "recordings_synced": "ضبط‌‌شده‌های اتاق همگام‌سازی شده‌اند.", - "room_configuration_updated": "پیکربندی اتاق به‌روز شده‌ است.", - "room_setting_updated": "تنظیمات اتاق به‌روز شده‌ است.", - "presentation_updated": "ارائه به‌روز شده‌ است.", - "presentation_deleted": "ارائه حذف شده‌ است.", + "room_configuration_updated": "پیکربندی اتاق به‌روز شده‌است.", + "room_setting_updated": "تنظیمات اتاق به‌روز شده‌است.", + "presentation_updated": "ارائه به‌روز شده‌است.", + "presentation_deleted": "ارائه حذف شده‌است.", "joining_meeting": "در حال پیوستن به جلسه...", "meeting_started": "جلسه شروع شد.", - "access_code_copied": "کد دسترسی کپی شده‌ است.", - "access_code_generated": "کد دسترسی تولید شده‌ است.", - "access_code_deleted": "کد دسترسی حذف شده‌ است.", - "copied_meeting_url": "نشانی اینترنتی جلسه کپی شده‌ است. این پیوند می‌تواند برای پیوستن به جلسه استفاده شود." + "access_code_copied": "کد دسترسی رونوشت شده‌است.", + "access_code_generated": "کد دسترسی تولید شده‌است.", + "access_code_deleted": "کد دسترسی حذف شده‌است.", + "copied_meeting_url": "نشانی اینترنتی جلسه رونوشت شده‌است. این پیوند می‌تواند برای پیوستن به جلسه استفاده شود." }, "site_settings": { "site_setting_updated": "تنظیمات سایت به‌روز شده‌اند.", - "brand_color_updated": "رنگ برند به‌روز شده‌ است.", - "brand_image_updated": "تصویر برند به‌روز شده‌ است.", - "brand_image_deleted": "تصویر برند حذف شده‌ است.", - "privacy_policy_updated": "سیاست حفظ حریم خصوصی به‌روز شده‌ است.", - "terms_of_service_updated": "شرایط خدمات به‌روز شده‌ است." + "brand_color_updated": "رنگ برند به‌روز شده‌است.", + "brand_image_updated": "تصویر برند به‌روز شده‌است.", + "brand_image_deleted": "تصویر برند حذف شده‌است.", + "privacy_policy_updated": "سیاست حفظ حریم خصوصی به‌روز شده‌است.", + "terms_of_service_updated": "شرایط خدمات به‌روز شده‌است." }, "recording": { - "recording_visibility_updated": "قابلیت مشاهده ضبط به‌روز شده‌ است.", - "recording_name_updated": "نام جلسه ضبط‌شده به‌روز شده‌ است.", - "recording_deleted": "جلسه ضبط‌شده حذف شده‌ است.", - "copied_urls": "نشانی‌های اینترنتی جلسه ضبط‌شده کپی شده‌ است." + "recording_visibility_updated": "قابلیت مشاهدهٔ ضبط به‌روز شده‌است.", + "recording_name_updated": "نام جلسهٔ ضبط‌شده به‌روز شده‌است.", + "recording_deleted": "جلسهٔ ضبط‌شده حذف شده‌است.", + "copied_urls": "نشانی‌های اینترنتی جلسهٔ ضبط‌شده رونوشت شده‌است." }, "role": { - "role_created": "یک نقش جدید ایجاد شده‌ است.", - "role_updated": "نقش به‌روز شده‌ است.", - "role_deleted": "نقش حذف شده‌ است.", - "role_permission_updated": "دسترسی نقش به‌روز شده‌ است." + "role_created": "یک نقش جدید ایجاد شده‌است.", + "role_updated": "نقش به‌روز شده‌است.", + "role_deleted": "نقش حذف شده‌است.", + "role_permission_updated": "دسترسی نقش به‌روز شده‌است." }, "invitations": { - "invitation_sent": "دعوت‌نامه ارسال شده‌ است." + "invitation_sent": "دعوت‌نامه ارسال شده‌است." } }, "error": { "problem_completing_action": "این عمل نمی‌تواند تکمیل شود.\nلطفا دوباره تلاش کنید.", "file_type_not_supported": "نوع پرونده پشتیبانی نمی‌شود.", - "file_size_too_large": "اندازه پرونده خیلی بزرگ است.", + "file_size_too_large": "اندازهٔ پرونده خیلی بزرگ است.", "file_upload_error": "پرونده نمی‌تواند بارگذاری شود.", "signin_required": "برای دسترسی به این صفحه باید وارد سیستم شده باشید.", "roles": { - "role_assigned": "این نقش نمی‌تواند حذف شود، زیرا به حداقل یک کاربر اختصاص داده شده‌ است." + "role_assigned": "این نقش نمی‌تواند حذف شود، زیرا به حداقل یک کاربر اختصاص داده شده‌است." }, "users": { "signup_error": "شما نمی‌توانید احراز هویت شوید. لطفا با مدیریت تماس بگیرید.", - "invalid_invite": "ژتون دعوتنامه شما یا نامعتبر است یا نادرست است. لطفا با مدیریت تماس بگیرید تا یک ژتون جدید دریافت کنید", - "email_exists": "یک حساب کاربری با این ایمیل از قبل وجود دارد. لطفا با ایمیل دیگری دوباره امتحان کنید.", + "invalid_invite": "ژتون دعوت‌نامهٔ شما یا نامعتبر است یا نادرست است. لطفا با مدیریت تماس بگیرید تا یک ژتون جدید دریافت کنید.", + "email_exists": "یک حساب کاربری با این رایانامه از قبل وجود دارد. لطفا با رایانامهٔ دیگری دوباره امتحان کنید.", "old_password": "گذرواژه‌ای که وارد کرده‌اید اشتباه است.", - "pending": "ثبت‌نام شما در انتظار تایید مدیر کل است. لطفا بعدا دوباره تلاش کنید.", - "banned": "شما به این برنامه دسترسی ندارید. اگر فکر می‌کنید که اشتباهی رخ داده است، لطفا با مدیریت تماس بگیرید." + "pending": "ثبت‌نام شما در انتظار تأیید مدیر کل است. لطفا بعدا دوباره تلاش کنید.", + "banned": "شما به این برنامه دسترسی ندارید. اگف فکر می‌کنید که اشتباهی رخ داده است، لطفا با مدیریت تماس بگیرید." }, "rooms": { "room_limit": "به دلیل رسیدن به سقف مجاز تعداد اتاق‌ها، نمی‌توانید اتاق ایجاد کنید." }, "session": { - "invalid_credentials": "نام‌کاربری یا گذرواژه نامعتبر است. لطفا اطلاعات کاربری خود را تایید کنید و دوباره امتحان کنید." + "invalid_credentials": "نام‌کاربری یا گذرواژه نامعتبر است. لطفا اطلاعات کاربری خود را تأیید کنید و دوباره امتحان کنید." } } }, @@ -444,9 +449,9 @@ "account_activation_page": { "title": "فعال‌سازی حساب کاربری", "account_unverified": "حساب کاربری شما هنوز تایید نشده است.", - "message": "برای استفاده از Greenlight، لطفا با دنبال‌کردن راهنماهای موجود در ایمیل فعال‌سازی که برای شما ارسال شده‌است، حساب کاربری خود را تأیید کنید.", - "resend_activation_link": "اگر ایمیل فعال‌سازی را دریافت نکرده‌اید یا در استفاده از آن مشکل دارید، روی دکمه زیر کلیک کنید تا ایمیل فعال‌سازی جدیدی را درخواست دهید.", - "resend_btn_lbl": "ارسال مجدد تائیدیه" + "message": "برای استفاده از Greenlight، لطفا با دنبال‌کردن راهنماهای موجود در رایانامه فعال‌سازی که برای شما ارسال شده‌است، حساب کاربری خود را تأیید کنید.", + "resend_activation_link": "اگر رایانامه فعال‌سازی را دریافت نکرده‌اید یا در استفاده از آن مشکل دارید، روی دکمهٔ زیر کلیک کنید تا رایانامه فعال‌سازی جدیدی را درخواست دهید.", + "resend_btn_lbl": "ارسال مجدد تأییدیه" }, "forms": { "validations": { @@ -456,10 +461,10 @@ "max": "نام باید حداکثر ۲۵۵ نویسه داشته باشد" }, "email": { - "required": "لطفا یک ایمیل وارد کنید", - "email": "مقدار وارد شده با قالب ایمیل مطابقت ندارد", - "min": "ایمیل باید حداقل ۶ نویسه داشته باشد", - "max": "ایمیل باید حداکثر ۲۵۵ نویسه داشته باشد" + "required": "لطفا یک رایانامه وارد کنید", + "email": "مقدار واردشده با قالب رایانامه مطابقت ندارد", + "min": "رایانامه باید حداقل ۶ نویسه داشته باشد", + "max": "رایانامه باید حداکثر ۲۵۵ نویسه داشته باشد" }, "password": { "required": "لطفا یک گذرواژه وارد کنید", @@ -472,12 +477,12 @@ "max": "گذرواژه باید حداکثر ۲۵۵ نویسه داشته باشد" }, "password_confirmation": { - "required": "لطفا تایید گذرواژه را وارد کنید", + "required": "لطفا تأیید گذرواژه را وارد کنید", "match": "گذرواژه‌ها با هم یکسان نمی‌باشند" }, "emails": { - "required": "لطفا حداقل یک ایمیل معتبر وارد کنید", - "list": "لطفا فهرستی از ایمیل‌های معتبر جدا شده با ویرگول ارائه دهید (user@users.com,user1@users.com,user2@users.com)" + "required": "لطفا حداقل یک رایانامهٔ معتبر وارد کنید", + "list": "لطفا فهرستی از رایانامه‌های معتبر جداشده با ویرگول ارائه دهید (user@users.com,user1@users.com,user2@users.com)" }, "role_name": { "required": "لطفا نام نقش را وارد کنید" @@ -526,7 +531,7 @@ "placeholder": "کد دسترسی را وارد کنید" }, "recording_consent": { - "label": "من اذعان دارم که این جلسه ممکن است، ضبط شود. این ممکن است شامل صدا و ویدیو من در صورت فعال شدن، باشد." + "label": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." } } }, @@ -538,24 +543,24 @@ "placeholder": "نام کامل خود را وارد کنید" }, "email": { - "label": "ایمیل", - "placeholder": "ایمیل خود را وارد کنید" + "label": "رایانامه", + "placeholder": "رایانامهٔ خود را وارد کنید" }, "password": { "label": "گذرواژه", "placeholder": "ایجاد گذرواژه" }, "password_confirmation": { - "label": "تایید گذرواژه", - "placeholder": "تایید گذرواژه" + "label": "تأیید گذرواژه", + "placeholder": "تأیید گذرواژه" } } }, "signin": { "fields": { "email": { - "label": "ایمیل", - "placeholder": "ایمیل" + "label": "رایانامه", + "placeholder": "رایانامه" }, "password": { "label": "گذرواژه", @@ -569,46 +574,46 @@ "change_password": { "fields": { "old_password": { - "label": "گذرواژه فعلی", - "placeholder": "گذرواژه خود را وارد کنید" + "label": "گذرواژهٔ فعلی", + "placeholder": "گذرواژهٔ خود را وارد کنید" }, "new_password": { - "label": "گذرواژه جدید", - "placeholder": "گذرواژه جدید خود را وارد کنید" + "label": "گذرواژهٔ جدید", + "placeholder": "گذرواژهٔ جدید خود را وارد کنید" }, "password_confirmation": { - "label": "تایید گذرواژه", - "placeholder": "گذرواژه جدید خود را تایید کنید" + "label": "تأیید گذرواژه", + "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" } }, "validations": { "old_password": { - "required": "لطفا گذرواژه کنونی خود را وارد کنید" + "required": "لطفا گذرواژهٔ کنونی خود را وارد کنید" } } }, "forget_password": { "fields": { "email": { - "label": "ایمیل", - "placeholder": "ایمیل حساب کاربری را وارد کنید" + "label": "رایانامه", + "placeholder": "رایانامهٔ حساب کاربری را وارد کنید" } }, "validations": { "email": { - "required": "لطفا ایمیل حساب کاربری را وارد کنید" + "required": "لطفا رایانامهٔ حساب کاربری را وارد کنید" } } }, "reset_password": { "fields": { "new_password": { - "label": "گذرواژه جدید", - "placeholder": "گذرواژه جدید خود را وارد کنید" + "label": "گذرواژهٔ جدید", + "placeholder": "گذرواژهٔ جدید خود را وارد کنید" }, "password_confirmation": { - "label": "تایید گذرواژه", - "placeholder": "گذرواژه جدید خود را تایید کنید" + "label": "تأیید گذرواژه", + "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" } } }, @@ -618,7 +623,7 @@ "label": "نام کامل" }, "email": { - "label": "ایمیل" + "label": "رایانامه" }, "language": { "label": "زبان" @@ -634,18 +639,18 @@ "fields": { "full_name": { "label": "نام کامل", - "placeholder": "نام کامل خود را وارد کنید" + "placeholder": "نام کامل کاربر را وارد کنید" }, "email": { - "label": "ایمیل", - "placeholder": "ایمیل خود را وارد کنید" + "label": "رایانامه", + "placeholder": "رایانامهٔ کاربر را وارد کنید" }, "password": { "label": "گذرواژه", - "placeholder": "گذرواژه کاربر را وارد کنید" + "placeholder": "گذرواژهٔ کاربر را وارد کنید" }, "password_confirmation": { - "label": "تایید گذرواژه", + "label": "تأیید گذرواژه", "placeholder": "تأیید گذرواژه" } } @@ -653,7 +658,7 @@ "invite_user": { "fields": { "emails": { - "label": "ایمیل‌ها" + "label": "رایانامه‌ها" } } }, From 287ec2e174234547f192171832766528bdfe808b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:50:22 -0500 Subject: [PATCH 049/103] Translate config/locales/en.yml in el (#5546) 100% translated source file: 'config/locales/en.yml' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/el.yml | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/config/locales/el.yml b/config/locales/el.yml index 3c5b7a7db4..dfa0cc2b36 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -47,30 +47,37 @@ el: opengraph: - description: "Εκπαιδευτείτε με χρήση του BigBlueButton, την αξιόπιστη λύση διαδικτυακής διάσκεψης ανοιχτού κώδικα που επιτρέπει την απρόσκοπτη εικονική συνεργασία και τη διαδικτυακή εμπειρία εκπαίδευσης." + description: "Μάθετε να χρησιμοποιείτε το BigBlueButton, την αξιόπιστη λύση διαδικτυακής διάσκεψης ανοιχτού κώδικα, που επιτρέπει την απρόσκοπτη εικονική συνεργασία και τη διαδικτυακή εμπειρία μάθησης." meeting: - moderator_message: "Για να προσκαλέσετε κάποιον στη συνεδρίαση, στείλτε τον σύνδεσμο:" + moderator_message: "Για αποστολή πρόσκλησης στη διάσκεψη, χρησιμοποιήστε τον σύνδεσμο:" access_code: "Κωδικός πρόσβασης: %{code}" email: activation: account_activation: Ενεργοποίηση λογαριασμού - welcome_to_bbb: Καλώς ορίσατε στο BigBlueButton! - get_started: "Για να ξεκινήσετε, παρακαλούμε ενεργοποιήστε τον λογαριασμό σας κάνοντας κλικ στο κουμπί παρακάτω." + welcome_to_bbb: Καλώς ήρθατε στο BigBlueButton! + get_started: "Για να ξεκινήσετε, παρακαλούμε ενεργοποιήστε τον λογαριασμό σας κάνοντας κλικ στο παρακάτω κουμπί." activate_account: Ενεργοποίηση λογαριασμού - link_expires: Ο σύνδεσμος θα λήξει σε 24 ώρες. - if_link_expires: "Εάν έληξε ο σύνδεσμος, συνδεθείτε και ζητήστε νέο email ενεργοποίησης." + link_expires: Ο σύνδεσμος θα λήξη σε 24 ώρες. + if_link_expires: "Εάν ο σύνδεσμος λήξει, συνδεθείτε και ζητήστε νέο email ενεργοποίησης." invitation: - invitation_to_join: Πρόσκληση BigBlueButton - you_have_been_invited: "Έχετε προσκληθεί από τον/την %{name}, να δημιουργήσετε έναν λογαριασμό BigBlueButton." - get_started: "Για να εγγραφείτε, παρακαλούμε κάντε κλικ στο κουμπί παρακάτω και ακολουθήστε τα βήματα." + invitation_to_join: Πρόσκληση στο BigBlueButton + you_have_been_invited: "Έχετε προσκληθεί να δημιουργήσετε λογαριασμό στο BigBlueButton από τον/την %{name}." + get_started: "Για εγγραφή, παρακαλούμε κάντε κλικ στο παρακάτω κουμπί και ακολουθήστε τα βήματα." valid_invitation: Η πρόσκληση ισχύει για 24 ώρες. sign_up: Εγγραφή + new_user_signup: + new_user: Εγγραφή νέου χρήστη + new_user_description: Ένας νέος χρήστης έχει εγγραφεί για να χρησιμοποιήσει το BigBlueButton. + name: "Όνομα: %{name}" + email: "Email: %{email}" + admin_panel: "Πίνακας ελέγχου διαχειριστή" + take_action: "Για να δείτε τον νέο χρήστη ή για να κάνετε τις απαραίτητες ενέργειες, επισκεφτείτε τον «Πίνακα ελέγχου» του διαχειριστή." reset: - password_reset: Επαναφορά κωδικού πρόσβασης - password_reset_requested: "Αίτημα επαναφοράς κωδικού πρόσβασης για %{email}." - password_reset_confirmation: "Για επαναφορά κωδικού πρόσβασης, παρακαλούμε κάντε κλικ στο παρακάτω κουμπί." + password_reset: Αίτημα επαναφοράς κωδικού πρόσβασης + password_reset_requested: "Ένα αίτημα επαναφοράς κωδικού πρόσβασης στάλθηκε για %{email}." + password_reset_confirmation: "Για επαναφορά του κωδικού πρόσβασης σας, παρακαλούμε κάντε κλικ στο παρακάτω κουμπί." reset_password: Επαναφορά κωδικού πρόσβασης - link_expires: Ο σύνδεσμος θα λήξει σε 1 ώρα. - ignore_request: "Εάν δεν υποβάλατε αίτημα αλλαγής κωδικού πρόσβασης, παρακαλούμε αγνοήστε αυτό το email." + link_expires: Ο σύνδεσμος θα λήξη σε 1 ώρα. + ignore_request: "Εάν δε ζητήσατε εσείς την αλλαγή του κωδικού πρόσβασης σας, παρακαλούμε αγνοείστε αυτό το email." room: new_room_name: "Αίθουσα του %{username}" From c2e0c6315d3e80a3336f0929d2ac2c50993f4fd9 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:50:30 -0500 Subject: [PATCH 050/103] Translate app/assets/locales/en.json in el (#5545) 100% translated source file: 'app/assets/locales/en.json' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/el.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/el.json b/app/assets/locales/el.json index 3590b585ba..28f353e9fa 100644 --- a/app/assets/locales/el.json +++ b/app/assets/locales/el.json @@ -350,7 +350,8 @@ "manage_site_settings": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να διαχειρίζονται τις ρυθμίσεις του ιστοτόπου", "manage_roles": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να επεξεργάζονται άλλους ρόλους", "shared_list": "Να συμπεριλαμβάνονται χρήστες με αυτόν τον ρόλο στο αναπτυσσόμενο μενού για κοινή χρήση αιθουσών", - "room_limit": "Όριο αίθουσας" + "room_limit": "Όριο αίθουσας", + "email_on_signup": "Λάβετε ένα email όταν εγγραφεί ένας νέος χρήστης" } } }, From 138037acb9c11f4f11436f79e5ae474fcb6c9e08 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 21 Nov 2023 09:51:28 -0500 Subject: [PATCH 051/103] added links to docs (#5544) --- sample.env | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sample.env b/sample.env index d5716eb8d6..23a2762c5d 100644 --- a/sample.env +++ b/sample.env @@ -25,6 +25,7 @@ REDIS_URL= ### SMTP CONFIGURATION # Emails are required for the basic features of Greenlight to function. # Please refer to your SMTP provider to get the values for the variables below +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#email-setup #SMTP_SENDER_EMAIL= #SMTP_SENDER_NAME= #SMTP_SERVER= @@ -39,7 +40,7 @@ REDIS_URL= #SMTP_SSL_VERIFY=true ### EXTERNAL AUTHENTICATION METHODS -# +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#openid-connect-setup #OPENID_CONNECT_CLIENT_ID= #OPENID_CONNECT_CLIENT_SECRET= #OPENID_CONNECT_ISSUER= @@ -47,6 +48,7 @@ REDIS_URL= #OPENID_CONNECT_UID_FIELD= # To enable hCaptcha on the user sign up and sign in, define these 2 keys +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#hcaptcha-setup #HCAPTCHA_SITE_KEY= #HCAPTCHA_SECRET_KEY= @@ -71,6 +73,7 @@ REDIS_URL= # Define the default locale language code (i.e. 'en' for English) from the following list: # [en, ar, fr, es, fa_IR] +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#default-locale-setup #DEFAULT_LOCALE=en # Define the phone number for the voice bridge. @@ -79,6 +82,7 @@ REDIS_URL= #VOICE_BRIDGE_PHONE_NUMBER= # Set this if you like to deploy Greenlight on a relative root path other than / +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#relative-url-root-path-subdirectory-setup #RELATIVE_URL_ROOT=/gl ## Define log level in production. From b5f0f36ad4c8ccf96120a9d116382609c6dbf03c Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 10:39:52 -0500 Subject: [PATCH 052/103] Translate config/locales/en.yml in fr (#5552) 100% translated source file: 'config/locales/en.yml' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fr.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7802eab8c5..297559a0dc 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -65,6 +65,13 @@ fr: get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les étapes proposées" valid_invitation: L'invitation est valable pendant 24 heures. sign_up: inscription + new_user_signup: + new_user: Un nouvel utilisateur s'est inscrit + new_user_description: Un nouvel utilisateur s'est inscrit pour utiliser BigBlueButton. + name: "Nom: %{name}" + email: "Courriel: %{email}" + admin_panel: "Panneau Administrateur" + take_action: "Pour afficher le nouvel utilisateur ou pour toute action nécessaire, consultez le panneau Administrateur" reset: password_reset: Demande de réinitialisation du mot de passe password_reset_requested: "Une demande de réinitialisation de mot de passe est demandée par 1%{email}" From 9b25ab0ae79e7d1b177fcb6e23ce31d6d08b8b50 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 21 Nov 2023 10:59:23 -0500 Subject: [PATCH 053/103] added wording to explain default language a little more concisely in sample.env (#5553) --- sample.env | 1 + 1 file changed, 1 insertion(+) diff --git a/sample.env b/sample.env index 23a2762c5d..b10976b327 100644 --- a/sample.env +++ b/sample.env @@ -73,6 +73,7 @@ REDIS_URL= # Define the default locale language code (i.e. 'en' for English) from the following list: # [en, ar, fr, es, fa_IR] +# The DEFAULT_LOCALE setting specifies the default language, overriding the browser language which is always set. # More information: https://docs.bigbluebutton.org/greenlight/v3/install/#default-locale-setup #DEFAULT_LOCALE=en From 1ff48d90af8a18ae24e51cab52c09cc2087de844 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Tue, 21 Nov 2023 11:16:01 -0500 Subject: [PATCH 054/103] Fix failing rspecs (#5554) * Fix failing rspecs * more tests --- .../migrations/external_controller_spec.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/spec/controllers/migrations/external_controller_spec.rb b/spec/controllers/migrations/external_controller_spec.rb index f15c602782..1efac7b25c 100644 --- a/spec/controllers/migrations/external_controller_spec.rb +++ b/spec/controllers/migrations/external_controller_spec.rb @@ -150,6 +150,7 @@ name: 'user', email: 'user@users.com', provider: 'greenlight', + password_digest: 'fake_password_digest', language: 'language', role: valid_user_role.name } @@ -185,8 +186,8 @@ expect(user.role).to eq(valid_user_role) expect(user.session_token).to be_present expect(user.provider).to eq('greenlight') + expect(user.password_digest).to eq(valid_user_params[:password_digest]) expect(response).to have_http_status(:created) - expect(user.password_digest).to be_present end it 'creates the user without a password if provider is not greenlight' do @@ -251,8 +252,8 @@ expect(user.role).to eq(valid_user_role) expect(user.session_token).to be_present expect(user.provider).to eq('greenlight') + expect(user.password_digest).to eq(valid_user_params[:password_digest]) expect(response).to have_http_status(:created) - expect(user.password_digest).to be_blank end end @@ -296,14 +297,17 @@ end end - context 'when providing a :provider or a :password' do - before { valid_user_params.merge!(password: 'Password1!') } + context 'when providing a valid :password_digest' do + before do + temp_user = create(:user, password: 'Password1!') + valid_user_params.merge!(password_digest: temp_user.password_digest) + end it 'returns :created and creates a user while ignoring the extra values' do encrypted_params = encrypt_params({ user: valid_user_params }, expires_in: 10.seconds) - expect { post :create_user, params: { v2: { encrypted_params: } } }.to change(User, :count).from(0).to(1) + expect { post :create_user, params: { v2: { encrypted_params: } } }.to change(User, :count).by(1) - user = User.take + user = User.find_by(email: valid_user_params[:email]) expect(user.name).to eq(valid_user_params[:name]) expect(user.email).to eq(valid_user_params[:email]) expect(user.language).to eq(valid_user_params[:language]) @@ -311,7 +315,7 @@ expect(user.session_token).to be_present expect(user.provider).to eq(valid_user_params[:provider]) expect(response).to have_http_status(:created) - expect(user.authenticate('Password1!')).to be_falsy + expect(user.authenticate('Password1!')).to be_truthy end end From 87f5c28aadaf0ee08a24fe77c578e75073a9a324 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 21 Nov 2023 13:34:30 -0500 Subject: [PATCH 055/103] fixed admin room access issues (#5543) * fixed admin room access issues * fixed eslint errors * updated to use room shared boolean over owner name --- .../components/rooms/room/shared_access/SharedAccess.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx b/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx index d3d8069b0f..a0d484c42d 100644 --- a/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx +++ b/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx @@ -29,6 +29,7 @@ import useDeleteSharedAccess from '../../../../hooks/mutations/shared_accesses/u import useSharedUsers from '../../../../hooks/queries/shared_accesses/useSharedUsers'; import SharedAccessEmpty from './SharedAccessEmpty'; import useRoom from '../../../../hooks/queries/rooms/useRoom'; +import { useAuth } from '../../../../contexts/auth/AuthProvider'; export default function SharedAccess() { const { t } = useTranslation(); @@ -37,6 +38,8 @@ export default function SharedAccess() { const { data: sharedUsers } = useSharedUsers(friendlyId, searchInput); const deleteSharedAccess = useDeleteSharedAccess(friendlyId); const { data: room } = useRoom(friendlyId); + const currentUser = useAuth(); + const isAdmin = currentUser?.role.name === 'Administrator'; if (sharedUsers?.length || searchInput) { return ( @@ -45,7 +48,7 @@ export default function SharedAccess() {
- { !room.shared && ( + { (!room.shared || isAdmin) && ( - {!room.shared && ( + { (!room.shared || isAdmin) && (
diff --git a/app/views/user_mailer/new_user_signup_email.text.erb b/app/views/user_mailer/new_user_signup_email.text.erb index bf3f123789..1d3b468ca3 100644 --- a/app/views/user_mailer/new_user_signup_email.text.erb +++ b/app/views/user_mailer/new_user_signup_email.text.erb @@ -18,9 +18,9 @@ --- <%= t('email.new_user_signup.new_user') %> -<%= t('email.new_user_signup.new_user_description' %> +<%= t('email.new_user_signup.new_user_description') %> <%= t('email.new_user_signup.name', name: @user.name) %> <%= t('email.new_user_signup.email', email: @user.email) %> <%= t('email.new_user_signup.take_action') %> -<%= @signup_url %> +<%= @admin_panel_url %> --- From 3fb0a978933b0bcff2fcee7db4eb2c941c8ee4bc Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:33:46 -0500 Subject: [PATCH 062/103] Translate app/assets/locales/en.json in tr (#5562) 100% translated source file: 'app/assets/locales/en.json' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/tr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/tr.json b/app/assets/locales/tr.json index caa315b28f..8f6d4a8b34 100644 --- a/app/assets/locales/tr.json +++ b/app/assets/locales/tr.json @@ -81,6 +81,7 @@ "account_info": "Hesap bilgileri", "delete_account": "Hesabı sil", "change_password": "Parolayı değiştir", + "set_password": "Yeni parolanızı ayarlayın", "reset_password": "Parolayı sıfırla", "update_account_info": "Hesap bilgilerinizi güncelleyin", "current_password": "Geçerli parola", @@ -129,6 +130,7 @@ "click_to_upload": "Yüklemek için tıklayın", "drag_and_drop": "ya da sürükleyip bırakın", "upload_description": "Herhangi bir Office belgesi ya da PDF dosyası ({{size}} boyutundan büyük olmayan) yükleyin. Dosyanın boyutuna bağlı olarak, kullanılmadan önce karşıya yüklenmesi biraz sürebilir.", + "delete_presentation": "Sunumu sil", "are_you_sure_delete_presentation": "Bu sunumu silmek istediğinize emin misiniz?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Kaydediliyor", "recordings": "Kayıtlar", + "processing": "Kayıtlar işleniyor...", "name": "Ad", "length": "Süre", "users": "Kullanıcılar", @@ -347,7 +350,8 @@ "manage_site_settings": "Bu roldeki kullanıcılar site ayarlarını yönetebilsin", "manage_roles": "Bu roldeki kullanıcılar diğer kullanıcı rollerini düzenleyebilsin", "shared_list": "Bu roldeki kullanıcılar oda paylaşma açılan kutularında görüntülensin", - "room_limit": "Oda sayısı sınırı" + "room_limit": "Oda sayısı sınırı", + "email_on_signup": "Yeni bir kullanıcı hesap açtığında e-posta alın" } } }, @@ -358,6 +362,7 @@ "user_updated": "Kullanıcı güncellendi.", "user_deleted": "Kullanıcı silindi.", "avatar_updated": "Avatar güncellendi.", + "password_changed": "Parolanız güncellendi. Lütfen yeniden oturum açın.", "password_updated": "Parola güncellendi.", "account_activated": "Hesap etkinleştirildi. Lütfen hesabınızla oturum açın.", "activation_email_sent": "Etkinleştirme e-postası gönderildi.", From 48020dd63b14e97fe04dd812a4f831fdeb224c5d Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:33:57 -0500 Subject: [PATCH 063/103] Translate config/locales/en.yml in tr (#5561) 100% translated source file: 'config/locales/en.yml' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/tr.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 61da9c74d4..0dc558d6ee 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -65,6 +65,13 @@ tr: get_started: Hesap açmak için aşağıdaki düğmeye tıklayın ve yönergeleri izleyin. valid_invitation: Bu çağrı 24 saat süreyle geçerlidir. sign_up: Hesap aç + new_user_signup: + new_user: Yeni kullanıcı hesabı açma + new_user_description: Yeni bir kullanıcı BigBlueButton kullanmak için hesap açtı. + name: "Adı: %{name}" + email: "E-posta adresi: %{email}" + admin_panel: "Yönetim panosu" + take_action: "Yeni kullanıcıyı görüntülemek ya da gerekli işlemi yapmak için yönetim panosuna gidin" reset: password_reset: Parolayı sıfırla password_reset_requested: "%{email} için bir parola sıfırlama isteğinde bulunuldu." From 774625c6b80b683c65c730aa2f1f54d0cbe56636 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 22 Nov 2023 15:50:12 -0500 Subject: [PATCH 064/103] More fixes for email notification (#5566) --- app/controllers/api/v1/users_controller.rb | 2 +- app/controllers/api/v1/verify_account_controller.rb | 5 ++--- app/controllers/external_controller.rb | 5 ++++- config/locales/en.yml | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index 558dda4a9d..253371103f 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -77,7 +77,7 @@ def create activation_url: activate_account_url(token), base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later - UserMailer.with(user:, admin_panel_url:, provider: current_provider).new_user_signup_email.deliver_later + UserMailer.with(user:, admin_panel_url:, base_url: request.base_url, provider: current_provider).new_user_signup_email.deliver_later end create_default_room(user) diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb index 8e508fc059..876eb3014d 100644 --- a/app/controllers/api/v1/verify_account_controller.rb +++ b/app/controllers/api/v1/verify_account_controller.rb @@ -29,9 +29,8 @@ class VerifyAccountController < ApiController def create token = @user.generate_activation_token! - UserMailer.with(user: @user, - activation_url: activate_account_url(token), base_url: request.base_url, - provider: current_provider).activate_account_email.deliver_later + UserMailer.with(user: @user, activation_url: activate_account_url(token), + base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later render_data status: :ok end diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb index 0c6e2bbe4a..4bb6bdeb8b 100644 --- a/app/controllers/external_controller.rb +++ b/app/controllers/external_controller.rb @@ -55,7 +55,10 @@ def create_user create_default_room(user) # Send admins an email if smtp is enabled - UserMailer.with(user:, admin_panel_url:, provider: current_provider).new_user_signup_email.deliver_later if ENV['SMTP_SERVER'].present? + if ENV['SMTP_SERVER'].present? + UserMailer.with(user:, admin_panel_url:, base_url: request.base_url, + provider: current_provider).new_user_signup_email.deliver_later + end end if SettingGetter.new(setting_name: 'ResyncOnLogin', provider:).call diff --git a/config/locales/en.yml b/config/locales/en.yml index ba04fe59fc..a5437ca7f3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -66,7 +66,7 @@ en: valid_invitation: The invitation is valid for 24 hours. sign_up: Sign Up new_user_signup: - new_user: New User Signup + new_user: New BigBlueButton User Signup new_user_description: A new user has signed up to use BigBlueButton. name: "Name: %{name}" email: "Email: %{email}" From de0437dd4068b5dc3db8a1399ef7ea9ebd41f3de Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:10 -0500 Subject: [PATCH 065/103] Translate config/locales/en.yml in ja (#5573) 100% translated source file: 'config/locales/en.yml' on 'ja'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ja.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 4bf19f3fde..5f11983552 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -65,6 +65,13 @@ ja: get_started: 登録するには下のボタンをクリックし、手順にしたがってください。 valid_invitation: この招待は24時間有効です。 sign_up: 登録 + new_user_signup: + new_user: 新しいBigBlueButtonユーザーの登録 + new_user_description: 新しいBigBlueButtonユーザーの登録が行われました。 + name: "名前: %{name}" + email: "メール: %{email}" + admin_panel: "管理者パネル" + take_action: "新しいユーザーをチェックしたり、必要な操作を行ったりするには、管理者パネルを使用してください" reset: password_reset: パスワード再設定 password_reset_requested: "%{email}に対してパスワードの再設定が要請されました。" From 0c85c1935f472c29bce679024fc1cf0da554f07e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:30 -0500 Subject: [PATCH 066/103] Updates for file app/assets/locales/en.json in ja (#5572) * Translate app/assets/locales/en.json in ja 100% translated source file: 'app/assets/locales/en.json' on 'ja'. * Translate app/assets/locales/en.json in ja 100% translated source file: 'app/assets/locales/en.json' on 'ja'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/ja.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/ja.json b/app/assets/locales/ja.json index 16e35f3efb..25c63162a3 100644 --- a/app/assets/locales/ja.json +++ b/app/assets/locales/ja.json @@ -81,6 +81,7 @@ "account_info": "アカウント情報", "delete_account": "アカウント削除", "change_password": "パスワード変更", + "set_password": "新しいパスワードを入力", "reset_password": "パスワード再設定", "update_account_info": "アカウント情報の更新", "current_password": "現在のパスワード", @@ -129,6 +130,7 @@ "click_to_upload": "クリックしてアップロード", "drag_and_drop": "またはドラッグ&ドロップ", "upload_description": "OfficeドキュメントかPDFファイル(サイズ{{size}}以下)をアップロードしてください。ファイルの大きさによっては、使用可能になるまでに少し時間がかかるかもしれません。", + "delete_presentation": "プレゼンファイルを削除", "are_you_sure_delete_presentation": "本当にこのプレゼンファイルを削除しますか?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "録画", "recordings": "録画", + "processing": "録画を処理しています...", "name": "名前", "length": "長さ", "users": "参加者", @@ -347,7 +350,8 @@ "manage_site_settings": "この役割のユーザーに、サイト全体の設定を許可する", "manage_roles": "この役割のユーザーに、他の役割の内容を変更することを許可する", "shared_list": "この役割のユーザーを、会議室を共有できるユーザーのリストに含める", - "room_limit": "作成できる会議室数の制限" + "room_limit": "作成できる会議室数の制限", + "email_on_signup": "新しいユーザーが登録したときメールを受け取る" } } }, @@ -358,6 +362,7 @@ "user_updated": "ユーザーが更新されました。", "user_deleted": "ユーザーが削除されました。", "avatar_updated": "アバターが更新されました。", + "password_changed": "パスワードが更新されました。もう一度サインインしてください。", "password_updated": "パスワードが更新されました。", "account_activated": "アカウントが有効化されました。サインインしてみてください。", "activation_email_sent": "アクチベーションメールが送信されました", From f0cab9e71b8741303e1a546d7e72e76587e14f04 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:41 -0500 Subject: [PATCH 067/103] Translate config/locales/en.yml in fr (#5571) 100% translated source file: 'config/locales/en.yml' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fr.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 297559a0dc..a7d46912e4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -47,37 +47,37 @@ fr: opengraph: - description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." + description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." meeting: - moderator_message: "Pour inviter quelqu'un à la réunion, envoyez ce lien:" - access_code: "Code d'accès: 1%{code}" + moderator_message: "Pour inviter quelqu'un à la réunion, envoyez-lui ce lien :" + access_code: "Code d'accès: %{code}" email: activation: account_activation: Activation du compte - welcome_to_bbb: Bienvenue dans BigBlueButton! - get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le lien ci-dessous." + welcome_to_bbb: Bienvenue dans BigBlueButton + get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le bouton ci-dessous." activate_account: Activer le compte link_expires: Le lien expirera dans 24 heures. - if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel d'activation" + if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel pour l'activation." invitation: - invitation_to_join: Invitation à rejoindre BigBlueButton - you_have_been_invited: "Vous avez été invité à créer un compte dans BigBlueButton par 1%{name}." - get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les étapes proposées" + invitation_to_join: Invitation BigBlueButton + you_have_been_invited: "Vous avez été invité à créer un compte BigBlueButton par %{name} ." + get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les instructions." valid_invitation: L'invitation est valable pendant 24 heures. - sign_up: inscription + sign_up: Inscription new_user_signup: - new_user: Un nouvel utilisateur s'est inscrit + new_user: Inscription d'un nouvel utilisateur à BigBlueButton new_user_description: Un nouvel utilisateur s'est inscrit pour utiliser BigBlueButton. name: "Nom: %{name}" - email: "Courriel: %{email}" + email: "Courriel: %{email}" admin_panel: "Panneau Administrateur" - take_action: "Pour afficher le nouvel utilisateur ou pour toute action nécessaire, consultez le panneau Administrateur" + take_action: "Pour afficher le nouvel utilisateur ou toute action nécessaire, consultez le Panneau Administrateur" reset: - password_reset: Demande de réinitialisation du mot de passe - password_reset_requested: "Une demande de réinitialisation de mot de passe est demandée par 1%{email}" - password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur la bouton ci-dessous\"" - reset_password: Réinitialisation du mot de passe + password_reset: Réinitialiser le mot de passe + password_reset_requested: "Une réinitialisation de mot de passe a été demandée par %{email} ." + password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur le bouton ci-dessous." + reset_password: Réinitialiser le mot de passe link_expires: Le lien expirera dans 1 heure. - ignore_request: "Si vous n'avez pas demandé à changer de mot de passe, ignorez ce message." + ignore_request: "Si vous n'avez pas demandé un changement de mot de passe, veuillez ignorer ce courriel." room: new_room_name: "Salle de %{username}" From 4f2b9c7dc2ec39de2f5d6562465e8f3bb63861d8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:50 -0500 Subject: [PATCH 068/103] Translate config/locales/en.yml in gl (#5570) 100% translated source file: 'config/locales/en.yml' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/gl.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 4165a92475..7cff02e9fa 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -66,7 +66,7 @@ gl: valid_invitation: O convite é válido durante 24 horas. sign_up: Rexistrarse new_user_signup: - new_user: Rexistro de novo usuario + new_user: Novo rexistro de usuario de BigBlueButton new_user_description: Rexistrouse un novo usuario para usar BigBlueButton. name: "Nome: %{name}" email: "Correo-e: %{email}" @@ -80,4 +80,4 @@ gl: link_expires: A ligazón caducará en 1 hora. ignore_request: "Se Vde. non fixo unha solicitude para cambiar o seu contrasinal, ignore este correo" room: - new_room_name: " \nSala de %{username}" + new_room_name: "Sala de %{username}" From 347c8658807fefb30931c843b6869d52d94bd7e8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:02:04 -0500 Subject: [PATCH 069/103] Translate config/locales/en.yml in gl (#5569) 100% translated source file: 'config/locales/en.yml' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> From ad32bff3cdc0c6d514dd7e2e094bf05ac8ed1ec8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:02:14 -0500 Subject: [PATCH 070/103] Translate config/locales/en.yml in tr (#5568) 100% translated source file: 'config/locales/en.yml' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/tr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 0dc558d6ee..b63de8e6b4 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -66,7 +66,7 @@ tr: valid_invitation: Bu çağrı 24 saat süreyle geçerlidir. sign_up: Hesap aç new_user_signup: - new_user: Yeni kullanıcı hesabı açma + new_user: Yeni BigBlueButton kullanıcı hesabı açılışı new_user_description: Yeni bir kullanıcı BigBlueButton kullanmak için hesap açtı. name: "Adı: %{name}" email: "E-posta adresi: %{email}" From 455734a2cfafd7b8cd1e3611682b580465c77df9 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:02:23 -0500 Subject: [PATCH 071/103] Translate config/locales/en.yml in tr (#5567) 100% translated source file: 'config/locales/en.yml' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/tr.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index b63de8e6b4..4bd81d1b32 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -47,23 +47,23 @@ tr: opengraph: - description: "Sorunsuz sanal işbirliği ve çevrim içi öğrenme deneyimleri sağlayan, güvenilir ve açık kaynaklı internet üzerinden görüşme çözümü BigBlueButton uygulamasını kullanarak öğrenin." + description: "Sorunsuz sanal işbirliği ve çevrim içi öğrenme deneyimi sağlayan, güvenilir açık kaynaklı internet konferansı çözümü BigBlueButton uygulamasını kullanarak öğrenin." meeting: - moderator_message: "Toplantıya katılmasını istediğiniz kişilere bu bağlantıyı gönderin: " + moderator_message: "Toplantıya çağırmak istediğiniz kişilere bu bağlantıyı gönderin:" access_code: "Erişim kodu: %{code}" email: activation: account_activation: Hesap etkinleştirme welcome_to_bbb: BigBlueButton uygulamasına hoş geldiniz! - get_started: "Başlamak için, lütfen aşağıdaki düğmeye tıklayarak hesabınızı etkinleştirin." + get_started: Lütfen başlamak için aşağıdaki düğmeye tıklayarak hesabınızı etkinleştirin. activate_account: Hesabı etkinleştir - link_expires: Bağlantı 24 saat sonra geçersiz olacak. - if_link_expires: Bağlantının süresi geçerse oturum açarak yeni bir etkinleştirme e-postası alın. + link_expires: Bu bağlantı 24 saat sonra geçersiz olacak. + if_link_expires: "Bağlantının süresi geçerse, yeni bir etkinleştirme e-postası almak için oturum açın." invitation: invitation_to_join: BigBlueButton çağrısı you_have_been_invited: "%{name} tarafından bir BigBlueButton hesabı açmaya çağrıldınız." get_started: Hesap açmak için aşağıdaki düğmeye tıklayın ve yönergeleri izleyin. - valid_invitation: Bu çağrı 24 saat süreyle geçerlidir. + valid_invitation: Çağrı 24 saat boyunca geçerlidir. sign_up: Hesap aç new_user_signup: new_user: Yeni BigBlueButton kullanıcı hesabı açılışı @@ -74,10 +74,10 @@ tr: take_action: "Yeni kullanıcıyı görüntülemek ya da gerekli işlemi yapmak için yönetim panosuna gidin" reset: password_reset: Parolayı sıfırla - password_reset_requested: "%{email} için bir parola sıfırlama isteğinde bulunuldu." + password_reset_requested: "%{email} e-posta adresi için parola sıfırlama isteğinde bulunuldu." password_reset_confirmation: Parolanızı sıfırlamak için aşağıdaki düğmeye tıklayın. reset_password: Parolayı sıfırla link_expires: Bağlantı 1 saat sonra geçersiz olacak. - ignore_request: Parola değiştirme isteğinde bulunmadıysanız bu e-postayı yok sayabilirsiniz. + ignore_request: Parolanızı değiştirme isteğinde bulunmadıysanız bu e-postayı yok sayabilirsiniz. room: new_room_name: "%{username} kullanıcısının odası" From a60f3e42f0804a2e0fd53e846e785026a0ff6155 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 29 Nov 2023 10:40:32 -0500 Subject: [PATCH 072/103] Fixed issues with uploads (profile, presentation, branding) (#5590) --- app/controllers/api/v1/admin/site_settings_controller.rb | 2 +- .../mutations/admin/site_settings/useUpdateSiteSetting.jsx | 6 +++++- .../hooks/mutations/rooms/useUploadPresentation.jsx | 6 +++++- app/javascript/hooks/mutations/users/useCreateAvatar.jsx | 6 +++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v1/admin/site_settings_controller.rb b/app/controllers/api/v1/admin/site_settings_controller.rb index 6b8a273c0c..49109a35d4 100644 --- a/app/controllers/api/v1/admin/site_settings_controller.rb +++ b/app/controllers/api/v1/admin/site_settings_controller.rb @@ -35,7 +35,7 @@ def index render_data data: site_settings, status: :ok end - # GET /api/v1/admin/site_settings/:name.json + # PATCH /api/v1/admin/site_settings/:name.json # Updates the value of the specified Site Setting def update site_setting = SiteSetting.joins(:setting) diff --git a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx index 0fb1a45285..c956b52404 100644 --- a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx +++ b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx @@ -35,7 +35,11 @@ export default function useUpdateSiteSetting(name) { settings = data; } - return axios.patch(`/admin/site_settings/${name}.json`, settings); + return axios.patch(`/admin/site_settings/${name}.json`, settings, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); }; const handleSuccess = () => { diff --git a/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx b/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx index 4830574d16..3f5e0e2c75 100644 --- a/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx +++ b/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx @@ -28,7 +28,11 @@ export default function useUploadPresentation(friendlyId) { fileValidation(presentation, 'presentation'); const formData = new FormData(); formData.append('room[presentation]', presentation); - return axios.patch(`/rooms/${friendlyId}.json`, formData); + return axios.patch(`/rooms/${friendlyId}.json`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); }; const mutation = useMutation(uploadPresentation, { diff --git a/app/javascript/hooks/mutations/users/useCreateAvatar.jsx b/app/javascript/hooks/mutations/users/useCreateAvatar.jsx index ab4baf77c6..106ade8fd9 100644 --- a/app/javascript/hooks/mutations/users/useCreateAvatar.jsx +++ b/app/javascript/hooks/mutations/users/useCreateAvatar.jsx @@ -30,7 +30,11 @@ export default function useCreateAvatar(currentUser) { }); const formData = new FormData(); formData.append('user[avatar]', avatarBlob); - return axios.patch(`/users/${currentUser.id}.json`, formData); + return axios.patch(`/users/${currentUser.id}.json`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); } const mutation = useMutation( From 58679cd536ea5194e91fee89c9e739036d0c97a4 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:40:45 -0500 Subject: [PATCH 073/103] Translate config/locales/en.yml in ru (#5586) 100% translated source file: 'config/locales/en.yml' on 'ru'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ru.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config/locales/ru.yml b/config/locales/ru.yml index b3d9bee508..c64b8d6704 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -65,6 +65,13 @@ ru: get_started: "Чтобы зарегистрироваться, нажмите кнопку ниже и следуйте инструкциям." valid_invitation: Приглашение действительно в течение 24 часов. sign_up: Зарегистрироваться + new_user_signup: + new_user: Новая регистрация пользователя + new_user_description: Зарегистрирован новый пользователь. + name: "Имя: %{name}" + email: "Email: %{email}" + admin_panel: "Панель администратора" + take_action: "Чтобы просмотреть нового пользователя, откройте панель администратора" reset: password_reset: Сброс пароля password_reset_requested: "Запрошен сброс пароля для %{email}." @@ -72,3 +79,5 @@ ru: reset_password: Сбросить пароль link_expires: Срок действия ссылки истекает через 1 час. ignore_request: "Если вы не отправляли запрос на смену пароля, проигнорируйте это письмо." + room: + new_room_name: "Комната для встреч пользователя %{username}" From 34c1bf8ce4d13292207b27d36ac12dd95b824cc2 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:40:55 -0500 Subject: [PATCH 074/103] Translate app/assets/locales/en.json in ru (#5585) 100% translated source file: 'app/assets/locales/en.json' on 'ru'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/ru.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/assets/locales/ru.json b/app/assets/locales/ru.json index 96220e82bd..e0cae0ae32 100644 --- a/app/assets/locales/ru.json +++ b/app/assets/locales/ru.json @@ -23,6 +23,8 @@ "are_you_sure": "Вы уверены?", "return_home": "Вернуться Домой", "created_at": "Создано", + "view_recordings": "Посмотреть записи", + "join_session": "Присоединиться к вебинару", "no_result_search_input": "Не удалось найти никаких результатов для \"{{ searchInput }}\"", "action_permanent": "Это действие не может быть отменено.", "homepage": { @@ -79,6 +81,7 @@ "account_info": "Информация об аккаунте", "delete_account": "Удалить аккаунт", "change_password": "Сменить пароль", + "set_password": "Установить новый пароль", "reset_password": "Сбросить пароль", "update_account_info": "Обновить информацию об аккаунте", "current_password": "Текущий пароль", @@ -108,7 +111,7 @@ "delete_room": "Удалить комнату", "create_new_room": "Создать новую комнату", "enter_room_name": "Введите название комнаты", - "shared_by": "доступ предоставлен ", + "shared_by": "опубликовано", "last_session": "Последний сеанс: {{ localizedTime }}", "no_last_session": "Предыдущие сеансы отсутствуют", "search_not_found": "Комнаты не найдены", @@ -127,6 +130,7 @@ "click_to_upload": "Нажмите, чтобы загрузить ", "drag_and_drop": "или перетащите и отпустите", "upload_description": "Загрузите любой офисный документ или PDF (размером не более {{size}}). В зависимости от размера файла, для загрузки может потребоваться дополнительное время, прежде чем его можно будет использовать", + "delete_presentation": "Удалить презентацию", "are_you_sure_delete_presentation": "Вы уверены, что хотите удалить эту презентацию?" }, "shared_access": { @@ -163,6 +167,7 @@ "recording": { "recording": "Запись", "recordings": "Записи", + "processing": "Записи обрабатываются...", "name": "Имя", "length": "Длина", "users": "Пользователи", @@ -171,11 +176,15 @@ "published": "Опубликована", "unpublished": "Не опубликована", "protected": "Защищенные", + "public": "Публичная", + "public_protected": "Публичная/Защищенная", "length_in_minutes": "{{recording.length}} мин.", "processing_recording": "Обработка записи, это может занять несколько минут...", "copy_recording_urls": "Скопировать ссылку на запись", "recordings_list_empty": "У вас еще нет записей!", + "public_recordings_list_empty": "Публичных записей нет!", "recordings_list_empty_description": "Записи появятся здесь после того, как вы начнете встречу и запишете ее.", + "public_recordings_list_empty_description": "Записи будут появляться здесь по мере поступления.", "delete_recording": "Удалить запись", "are_you_sure_delete_recording": "Вы уверены, что хотите удалить эту запись?", "search_not_found": "Записи не найдены" @@ -341,7 +350,8 @@ "manage_site_settings": "Разрешить пользователям с этой ролью управлять настройками сайта", "manage_roles": "Разрешить пользователям с этой ролью изменять другие роли", "shared_list": "Включите пользователей с этой ролью в раскрывающийся список для совместного использования комнат.", - "room_limit": "Ограничение комнаты" + "room_limit": "Ограничение комнаты", + "email_on_signup": "Отправлять email, когда новый пользователь зарегистрируется" } } }, @@ -352,6 +362,7 @@ "user_updated": "Пользователь обновлен.", "user_deleted": "Пользователь удален.", "avatar_updated": "Аватар обновлен.", + "password_changed": "Пароль успешно обновлен. Пожалуйста, войдите в систему еще раз.", "password_updated": "Пароль обновлен.", "account_activated": "Учетная запись успешно активирована. Пожалуйста, войдите в ваш аккаунт.", "activation_email_sent": "Письмо активации было выслано", From c167158ec9107bcccfa062fd00b820677bf71936 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:06 -0500 Subject: [PATCH 075/103] Translate config/locales/en.yml in fa_IR (#5582) 100% translated source file: 'config/locales/en.yml' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index c522174169..d65cbec831 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -66,7 +66,7 @@ fa_IR: valid_invitation: دعوت‌نامه فقط ۴۸ ساعت اعتبار دارد. sign_up: ثبت‌نام new_user_signup: - new_user: ثبت نام کاربر جدید + new_user: ثبت نام کاربر جدید BigBlueButton new_user_description: یک کاربر جدید برای استفاده از BigBlueButton ثبت نام کرده است. name: "نام: %{name}" email: "ایمیل: %{email}" From 8ea829080fa33cb1b75ead307c9e98852f702831 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:20 -0500 Subject: [PATCH 076/103] Translate config/locales/en.yml in fa_IR (#5581) 100% translated source file: 'config/locales/en.yml' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index d65cbec831..d8586cadfd 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -47,37 +47,37 @@ fa_IR: opengraph: - description: با استفاده از BigBlueButton بیاموزید؛ راه‌حل متن‌باز و قابل اعتماد کنفرانس تحت وب که همکاری مجازی یکپارچه و تجربیات یادگیری آنلاین را امکان‌پذیر می‌کند. + description: یادگیری با استفاده از BigBlueButton، راه‌حل متن‌باز کنفرانس وب قابل اعتماد است که همکاری مجازی یکپارچه و تجربیات یادگیری آنلاین را امکان پذیر می‌کند. meeting: - moderator_message: "برای دعوت از افراد دیگر به این جلسه، این پیوند را برای آن‌ها ارسال کنید:" + moderator_message: "برای دعوت از افراد دیگر به این جلسه، این پیوند را برای آنها ارسال کنید:" access_code: "کد دسترسی: %{code}" email: activation: account_activation: فعال‌سازی حساب کاربری welcome_to_bbb: به BigBlueButton خوش آمدید. - get_started: برای شروع، لطفا با کلیک بر روی دکمهٔ زیر حساب کاربری خود را فعال کنید. - activate_account: فعال‌کردن حساب کاربری + get_started: برای شروع، لطفا با کلیک بر روی دکمه زیر حساب کاربری خود را فعال کنید. + activate_account: فعال کردن حساب کاربری link_expires: این پیوند ۲۴ ساعت دیگر منقضی خواهد شد. - if_link_expires: در صورت منقضی‌شدن پیوند، لطفا وارد شوید و درخواست یک رایانامهٔ فعال‌سازی جدید کنید. + if_link_expires: در صورت منقضی شدن پیوند، لطفا در سیستم وارد شوید و درخواست فعال سازی ایمیل، جدید کنید. invitation: - invitation_to_join: دعوت‌نامهٔ BigBlueButton + invitation_to_join: دعوت به پیوستن به BigBlueButton you_have_been_invited: "شما توسط %{name} برای ایجاد حساب کاربری در BigBlueButton دعوت شده‌اید." - get_started: برای ثبت‌نام، لطفا روی دکمهٔ زیر کلیک کنید و گام‌ها را دنبال کنید. - valid_invitation: دعوت‌نامه فقط ۴۸ ساعت اعتبار دارد. - sign_up: ثبت‌نام + get_started: برای ثبت نام لطفا روی دکمه زیر کلیک کنید و مراحل را دنبال کنید. + valid_invitation: The invitation is valid for 24 hours. + sign_up: ثبت نام new_user_signup: new_user: ثبت نام کاربر جدید BigBlueButton new_user_description: یک کاربر جدید برای استفاده از BigBlueButton ثبت نام کرده است. name: "نام: %{name}" email: "ایمیل: %{email}" - admin_panel: "پنل مدیر کل" - take_action: "برای مشاهده کاربر جدید یا انجام اقدامات لازم، به پنل مدیر مراجعه کنید" + admin_panel: "پنل مدیریت" + take_action: "برای مشاهده کاربر جدید یا انجام اقدامات لازم، به پنل مدیریت مراجعه کنید" reset: - password_reset: بازنشانی گذرواژه - password_reset_requested: "بازنشانی گذرواژه برای %{email} درخواست شده‌است." - password_reset_confirmation: برای بازنشانی گذرواژه، لطفا روی دکمهٔ زیر کلیک کنید. - reset_password: بازنشانی گذرواژه + password_reset: بازنشانی رمز عبور + password_reset_requested: "بازنشانی رمز عبور برای %{email} درخواست شده است." + password_reset_confirmation: برای بازنشانی رمز عبور، لطفا روی دکمه زیر کلیک کنید. + reset_password: بازنشانی رمز عبور link_expires: این پیوند ۱ ساعت دیگر منقضی خواهد شد. - ignore_request: اگر درخواستی برای تغییر گذرواژه خود نکرده‌اید، لطفا این رایانامه را نادیده بگیرید. + ignore_request: اگر درخواستی برای تغییر رمز عبور خود نکرده‌اید، لطفا این ایمیل را نادیده بگیرید. room: new_room_name: "اتاق %{username}" From 24a18552ffbbd393ecd01d1a376b98be384b1a5a Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:32 -0500 Subject: [PATCH 077/103] Translate config/locales/en.yml in ar (#5576) 100% translated source file: 'config/locales/en.yml' on 'ar'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 50f99d3f94..e17e5d7499 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -66,7 +66,7 @@ ar: valid_invitation: الدعوة صالحة لمدة 24 ساعة. sign_up: التسجيل new_user_signup: - new_user: تسجيل مستخدم جديد + new_user: تسجيل مستخدم جديد في بك بلو بتن new_user_description: قام مستخدم جديد بالتسجيل لاستخدام بك بلو بتن. name: "الاسم: %{name}" email: "البريد: %{email}" From 18849e744b222ed2bacbfc83c7c4732f0f6be780 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:43 -0500 Subject: [PATCH 078/103] Translate config/locales/en.yml in el (#5575) 100% translated source file: 'config/locales/en.yml' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/el.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/el.yml b/config/locales/el.yml index dfa0cc2b36..0b8b9de257 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -66,7 +66,7 @@ el: valid_invitation: Η πρόσκληση ισχύει για 24 ώρες. sign_up: Εγγραφή new_user_signup: - new_user: Εγγραφή νέου χρήστη + new_user: Εγγραφή νέου χρήστη BigBlueButton new_user_description: Ένας νέος χρήστης έχει εγγραφεί για να χρησιμοποιήσει το BigBlueButton. name: "Όνομα: %{name}" email: "Email: %{email}" From 2afc7cc62eb6e3cf11c92256f43c45428276ae6c Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Thu, 30 Nov 2023 10:15:16 -0500 Subject: [PATCH 079/103] Fix site settings not updating (#5591) --- .../admin/site_settings/useUpdateSiteSetting.jsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx index c956b52404..797a169f48 100644 --- a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx +++ b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx @@ -26,20 +26,18 @@ export default function useUpdateSiteSetting(name) { const uploadPresentation = (data) => { let settings; + let headers = { 'Content-Type': 'application/json' }; if (name === 'BrandingImage') { fileValidation(data, 'image'); settings = new FormData(); settings.append('site_setting[value]', data); + headers = { 'Content-Type': 'multipart/form-data' }; } else { settings = data; } - return axios.patch(`/admin/site_settings/${name}.json`, settings, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); + return axios.patch(`/admin/site_settings/${name}.json`, settings, { headers }); }; const handleSuccess = () => { From c890b31a31de0f87ab99917028e802165389229e Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 09:30:46 +0000 Subject: [PATCH 080/103] Static SIP --- app/assets/locales/de.json | 1 - app/assets/locales/en.json | 1 - app/javascript/components/rooms/room/Room.jsx | 48 +++++++++---------- config/application.rb | 2 + greenlight-v3.nginx | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/app/assets/locales/de.json b/app/assets/locales/de.json index 0fbf5c1fcf..70618ed148 100644 --- a/app/assets/locales/de.json +++ b/app/assets/locales/de.json @@ -390,7 +390,6 @@ "access_code_generated": "Zugangscode generiert.", "access_code_deleted": "Zugriffcode wurde gelöscht.", "copied_meeting_url": "Die URL der Konferenz wurde kopiert. Der Link kann verwendet werden, um an der Konferenz teilzunehmen.", - "download_ics": "Die .ics-Datei wurde erstellt. Öffnen Sie sie, um sie zu bearbeiten und zu versenden, um Personen zu Ihrem Meeting einzuladen.", "copied_voice_bridge": "Die Telefonnummer und der Pin wurden kopiert. Diese können genutzt werden um an der Konferenz teilzunehmen." }, "site_settings": { diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index dc38c66ceb..dce02df3fb 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -395,7 +395,6 @@ "access_code_generated": "A new access code has been generated.", "access_code_deleted": "The access code has been deleted.", "copied_meeting_url": "The meeting URL has been copied. The link can be used to join the meeting.", - "download_ics": "The .ics file has been created. Open it to edit and send it, to invite people to your Meeting.", "copied_voice_bridge": "The phone number and pin have been copied. They can be used to join the conference." }, "site_settings": { diff --git a/app/javascript/components/rooms/room/Room.jsx b/app/javascript/components/rooms/room/Room.jsx index ddb66b5135..f69d3cf34b 100644 --- a/app/javascript/components/rooms/room/Room.jsx +++ b/app/javascript/components/rooms/room/Room.jsx @@ -18,7 +18,7 @@ import React from 'react'; import { Stack, Button, Col, Row, } from 'react-bootstrap'; -import { Link, useParams } from 'react-router-dom'; +import { Link, Navigate, useLocation, useParams } from 'react-router-dom'; import { HomeIcon, Square2StackIcon, PhoneIcon } from '@heroicons/react/24/outline'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; @@ -90,29 +90,29 @@ export default function Room() { } - { - isRoomLoading - ? ( - - ) : ( - <> - - - {typeof room.voice_bridge_phone_number !== 'undefined' && }) - } + { + isRoomLoading + ? ( + + ) : ( + <> + + + { typeof room.voice_bridge_phone_number !== 'undefined' && }) +}
diff --git a/config/application.rb b/config/application.rb index 07d5674c3b..7160049e0d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -87,5 +87,7 @@ class Application < Rails::Application config.relative_url_root = '/' if config.relative_url_root.blank? I18n.load_path += Dir[Rails.root.join('config/locales/*.{rb,yml}').to_s] + + config.voice_bridge_phone_number = ENV.fetch('VOICE_BRIDGE_PHONE_NUMBER', nil) end end diff --git a/greenlight-v3.nginx b/greenlight-v3.nginx index 86fb01d34d..0abfde4720 100644 --- a/greenlight-v3.nginx +++ b/greenlight-v3.nginx @@ -1,7 +1,7 @@ ### Greenlight version 3: location /cable { - proxy_pass http://127.0.0.1:5050; + proxy_pass http://127.0.0.1:3000; proxy_redirect off; proxy_http_version 1.1; From d98163ba09aa380b604f5b0031f5ec243bfa6f28 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 10:40:50 +0000 Subject: [PATCH 081/103] revert locale dev change --- greenlight-v3.nginx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenlight-v3.nginx b/greenlight-v3.nginx index 0abfde4720..86fb01d34d 100644 --- a/greenlight-v3.nginx +++ b/greenlight-v3.nginx @@ -1,7 +1,7 @@ ### Greenlight version 3: location /cable { - proxy_pass http://127.0.0.1:3000; + proxy_pass http://127.0.0.1:5050; proxy_redirect off; proxy_http_version 1.1; From e6e33c904bf7ebf8b4996a15f2e0a177109eea56 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Mar 2023 11:07:09 +0000 Subject: [PATCH 082/103] sample.env update with VoiceBrige config --- sample.env | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sample.env b/sample.env index fac1b5759e..e40915ed84 100644 --- a/sample.env +++ b/sample.env @@ -95,3 +95,8 @@ LOG_LEVEL=info # RAILS_LOG_REMOTE_NAME=xxx.papertrailapp.com # RAILS_LOG_REMOTE_PORT=99999 # RAILS_LOG_REMOTE_TAG=greenlight-v3 + +# Define the phone number for the voice bridge. +# This number is not sent to bbb and is only displayed in the greenlight UI, but it should match the number in the bbb instance to avoid user confusion. +# If this number is defined, each newly created room will be assigned a static voiceBridge pin. +#VOICE_BRIDGE_PHONE_NUMBER= From 9e99052e1b0dc4836b26acc237e5a826123d4794 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 21 Mar 2023 12:27:28 +0000 Subject: [PATCH 083/103] st --- app/helpers/application_helper.rb | 1 + db/schema.rb | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 0fa721f729..e01dfa4485 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -20,6 +20,7 @@ module ApplicationHelper def branding_image asset_path = SettingGetter.new(setting_name: 'BrandingImage', provider: current_provider).call asset_url(asset_path) + #"https://jobs.secunet.com/templates/secunet/images/secunet_logo.png" end def page_title diff --git a/db/schema.rb b/db/schema.rb index ee6ce85a16..6cacc7bd39 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -43,9 +43,6 @@ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end - create_table "data_migrations", primary_key: "version", id: :string, force: :cascade do |t| - end - create_table "formats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "recording_id" t.string "recording_type", null: false From 8076e830167abb9fece55000fb2e4d485ecd437f Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Mar 2023 11:01:47 +0000 Subject: [PATCH 084/103] Improved room sharing --- app/javascript/components/rooms/RoomCard.jsx | 15 +- app/javascript/components/rooms/room/Room.jsx | 2 +- .../rooms/room/forms/ShareRoomForm.jsx | 126 +++++++++++++++ app/javascript/helpers/ICSDownloadHelper.jsx | 144 ++++++++++++++++++ package-lock.json | 10 -- yarn.lock | 1 + 6 files changed, 281 insertions(+), 17 deletions(-) create mode 100644 app/javascript/components/rooms/room/forms/ShareRoomForm.jsx create mode 100644 app/javascript/helpers/ICSDownloadHelper.jsx diff --git a/app/javascript/components/rooms/RoomCard.jsx b/app/javascript/components/rooms/RoomCard.jsx index 8373e88eb6..e4edd5113c 100644 --- a/app/javascript/components/rooms/RoomCard.jsx +++ b/app/javascript/components/rooms/RoomCard.jsx @@ -27,6 +27,9 @@ import Spinner from '../shared_components/utilities/Spinner'; import useStartMeeting from '../../hooks/mutations/rooms/useStartMeeting'; import MeetingBadges from './MeetingBadges'; import UserBoardIcon from './UserBoardIcon'; +import { downloadICS } from '../../helpers/ICSDownloadHelper'; +import Modal from '../shared_components/modals/Modal'; +import ShareRoomForm from './room/forms/ShareRoomForm'; export default function RoomCard({ room }) { const { t } = useTranslation(); @@ -51,11 +54,11 @@ export default function RoomCard({ room }) {
- { room?.shared_owner + {room?.shared_owner ? : }
- { room?.online + {room?.online && }
@@ -64,10 +67,10 @@ export default function RoomCard({ room }) { {room.shared_owner && ( { t('room.shared_by') } {' '} { room.shared_owner } )} - { room.last_session ? ( - { t('room.last_session', { localizedTime }) } + {room.last_session ? ( + {t('room.last_session', { localizedTime })} ) : ( - { t('room.no_last_session') } + {t('room.no_last_session')} )}
@@ -86,7 +89,7 @@ export default function RoomCard({ room }) { } + + + + {typeof room.voice_bridge_phone_number !== 'undefined' && typeof room.voice_bridge !== 'undefined' && + {t('copy_number')} + + + + + } + + + {t('room.meeting.download_ics')} + + + + + + + ); +} + +ShareRoomForm.defaulProps = { + room: PropTypes.shape({ + last_session: '', + }), +}; + +ShareRoomForm.propTypes = { + room: PropTypes.shape({ + id: PropTypes.string.isRequired, + friendly_id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + last_session: PropTypes.string, + shared_owner: PropTypes.string, + online: PropTypes.bool, + participants: PropTypes.number, + }).isRequired, +}; \ No newline at end of file diff --git a/app/javascript/helpers/ICSDownloadHelper.jsx b/app/javascript/helpers/ICSDownloadHelper.jsx new file mode 100644 index 0000000000..ff1dd0d2e0 --- /dev/null +++ b/app/javascript/helpers/ICSDownloadHelper.jsx @@ -0,0 +1,144 @@ +// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +// +// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +// +// This program is free software; you can redistribute it and/or modify it under the +// terms of the GNU Lesser General Public License as published by the Free Software +// Foundation; either version 3.0 of the License, or (at your option) any later +// version. +// +// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with Greenlight; if not, see . + +import { createEvent } from "ics"; +import { saveAs } from "file-saver"; + + +export const createICSContent = (name, url, voice_bridge, voice_bridge_phone_number, t, use_html=false) => { + if (use_html) { + return createICSWithHtml(name,url,voice_bridge,voice_bridge_phone_number, t); + } + + + description = `\n\n${t('room.meeting.invite_to_meeting', {name})}\n\n${t('room.meeting.join_by_url')}:\n${url}`; + + if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { + description += `\n${t('or')} ${('room.meeting.phone')}:\n${voice_bridge_phone_number}, ${voice_bridge}`; + } + + const date = new Date(); + + return eventContent = { + start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], + title: t('room.meeting.join_meeting'), + location: 'BBB: ' + url, + url: url, + description: description, + }; +} + +const createICSWithHtml = (name, url, voice_bridge, voice_bridge_phone_number) => { + phone_data = ""; + + if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { + phone_data = `
${t('or')} ${t('room.meeting.phone')}:
+

${voice_bridge_phone_number},,,,${voice_bridge}

`; + } + + const HTML = ` + + + + + + + + + + + + + + + + `; + + const date = new Date(); + + return eventContent = { + start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], + title: t('room.meeting.join_meeting'), + location: 'BBB: ' + url, + url: url, + htmlContent: HTML + }; +} + +export const downloadICS = (name, room, url, voice_bridge, voice_bridge_phone_number, t) => { + createEvent(createICSContent(name, url, voice_bridge, voice_bridge_phone_number, t), (error, value) => { + console.log(error); + const blob = new Blob([value], { type: "text/plain;charset=utf-8" }); + saveAs(blob, `bbb-meeting-${room.replace(/[/\\?%*:|"<>]/g, '')}.ics`); + }); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8711c7efff..13e4f0445e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6906,16 +6906,6 @@ } }, "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", diff --git a/yarn.lock b/yarn.lock index a05b082b0b..6a4c89e77e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3497,6 +3497,7 @@ yocto-queue@^0.1.0: yup@^0.32.11, yup@^0.32.9: version "0.32.11" resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" + integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== dependencies: "@babel/runtime" "^7.15.4" "@types/lodash" "^4.14.175" From e40dfaaa0979fee0326b0c150f9b06c1dfdc1bcd Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Mon, 23 Oct 2023 08:14:35 +0000 Subject: [PATCH 085/103] Fixed mixup with the ICS branch. --- app/helpers/application_helper.rb | 1 - .../rooms/room/forms/ShareRoomForm.jsx | 126 --------------- app/javascript/helpers/ICSDownloadHelper.jsx | 144 ------------------ 3 files changed, 271 deletions(-) delete mode 100644 app/javascript/components/rooms/room/forms/ShareRoomForm.jsx delete mode 100644 app/javascript/helpers/ICSDownloadHelper.jsx diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e01dfa4485..0fa721f729 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -20,7 +20,6 @@ module ApplicationHelper def branding_image asset_path = SettingGetter.new(setting_name: 'BrandingImage', provider: current_provider).call asset_url(asset_path) - #"https://jobs.secunet.com/templates/secunet/images/secunet_logo.png" end def page_title diff --git a/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx b/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx deleted file mode 100644 index fe2edbd1bf..0000000000 --- a/app/javascript/components/rooms/room/forms/ShareRoomForm.jsx +++ /dev/null @@ -1,126 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). -// -// This program is free software; you can redistribute it and/or modify it under the -// terms of the GNU Lesser General Public License as published by the Free Software -// Foundation; either version 3.0 of the License, or (at your option) any later -// version. -// -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License along -// with Greenlight; if not, see . - -import React from 'react'; -import PropTypes from 'prop-types'; -import { useTranslation } from 'react-i18next'; -import { DocumentDuplicateIcon, CalendarIcon } from '@heroicons/react/24/outline'; -import { useAuth } from '../../../../contexts/auth/AuthProvider'; -import { Form, InputGroup, Button } from 'react-bootstrap'; -import { toast } from 'react-toastify'; -import { downloadICS } from '../../../../helpers/ICSDownloadHelper'; - - - -export default function ShareRoomForm({ room, handleClose }) { - const { t } = useTranslation(); - const currentUser = useAuth(); - - function roomJoinUrl(){ - return `https://${window.location.hostname}/rooms/${room.friendly_id}/join`; - } - - - function copyInvite() { - console.log(roomJoinUrl()); - navigator.clipboard.writeText(roomJoinUrl()); - toast.success(t('toast.success.room.copied_meeting_url')); - } - - function downloadICSFile(){ - downloadICS(currentUser.name, room.name, roomJoinUrl(), room.voice_bridge, room.voice_bridge_phone_number, t); - toast.success(t('toast.success.room.download_ics')); - } - - return ( -
- - {t('copy')} - - - - - - - {typeof room.voice_bridge_phone_number !== 'undefined' && typeof room.voice_bridge !== 'undefined' && - {t('copy_number')} - - - - - } - - - {t('room.meeting.download_ics')} - - - - - -
- ); -} - -ShareRoomForm.defaulProps = { - room: PropTypes.shape({ - last_session: '', - }), -}; - -ShareRoomForm.propTypes = { - room: PropTypes.shape({ - id: PropTypes.string.isRequired, - friendly_id: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - last_session: PropTypes.string, - shared_owner: PropTypes.string, - online: PropTypes.bool, - participants: PropTypes.number, - }).isRequired, -}; \ No newline at end of file diff --git a/app/javascript/helpers/ICSDownloadHelper.jsx b/app/javascript/helpers/ICSDownloadHelper.jsx deleted file mode 100644 index ff1dd0d2e0..0000000000 --- a/app/javascript/helpers/ICSDownloadHelper.jsx +++ /dev/null @@ -1,144 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). -// -// This program is free software; you can redistribute it and/or modify it under the -// terms of the GNU Lesser General Public License as published by the Free Software -// Foundation; either version 3.0 of the License, or (at your option) any later -// version. -// -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License along -// with Greenlight; if not, see . - -import { createEvent } from "ics"; -import { saveAs } from "file-saver"; - - -export const createICSContent = (name, url, voice_bridge, voice_bridge_phone_number, t, use_html=false) => { - if (use_html) { - return createICSWithHtml(name,url,voice_bridge,voice_bridge_phone_number, t); - } - - - description = `\n\n${t('room.meeting.invite_to_meeting', {name})}\n\n${t('room.meeting.join_by_url')}:\n${url}`; - - if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { - description += `\n${t('or')} ${('room.meeting.phone')}:\n${voice_bridge_phone_number}, ${voice_bridge}`; - } - - const date = new Date(); - - return eventContent = { - start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], - title: t('room.meeting.join_meeting'), - location: 'BBB: ' + url, - url: url, - description: description, - }; -} - -const createICSWithHtml = (name, url, voice_bridge, voice_bridge_phone_number) => { - phone_data = ""; - - if (typeof voice_bridge !== 'undefined' && typeof voice_bridge_phone_number !== 'undefined') { - phone_data = `
${t('or')} ${t('room.meeting.phone')}:
-

${voice_bridge_phone_number},,,,${voice_bridge}

`; - } - - const HTML = ` - - - - - - - - - - - - - - - - `; - - const date = new Date(); - - return eventContent = { - start: [date.getFullYear(), date.getMonth(), date.getDay(), 12, 0], - title: t('room.meeting.join_meeting'), - location: 'BBB: ' + url, - url: url, - htmlContent: HTML - }; -} - -export const downloadICS = (name, room, url, voice_bridge, voice_bridge_phone_number, t) => { - createEvent(createICSContent(name, url, voice_bridge, voice_bridge_phone_number, t), (error, value) => { - console.log(error); - const blob = new Blob([value], { type: "text/plain;charset=utf-8" }); - saveAs(blob, `bbb-meeting-${room.replace(/[/\\?%*:|"<>]/g, '')}.ics`); - }); -}; \ No newline at end of file From 965cbe39a7be53169dc846826c5a39efc5e2fa3c Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Mon, 23 Oct 2023 08:42:29 +0000 Subject: [PATCH 086/103] Fixed missing import --- db/schema.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/db/schema.rb b/db/schema.rb index 6cacc7bd39..ee6ce85a16 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -43,6 +43,9 @@ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end + create_table "data_migrations", primary_key: "version", id: :string, force: :cascade do |t| + end + create_table "formats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "recording_id" t.string "recording_type", null: false From 2a0e98021affdd9c9bba154e7b5392f5b2d93102 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 20 Dec 2023 10:37:02 +0000 Subject: [PATCH 087/103] FIX wrong imports --- app/javascript/components/rooms/RoomCard.jsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/javascript/components/rooms/RoomCard.jsx b/app/javascript/components/rooms/RoomCard.jsx index e4edd5113c..c565fae9f9 100644 --- a/app/javascript/components/rooms/RoomCard.jsx +++ b/app/javascript/components/rooms/RoomCard.jsx @@ -27,9 +27,6 @@ import Spinner from '../shared_components/utilities/Spinner'; import useStartMeeting from '../../hooks/mutations/rooms/useStartMeeting'; import MeetingBadges from './MeetingBadges'; import UserBoardIcon from './UserBoardIcon'; -import { downloadICS } from '../../helpers/ICSDownloadHelper'; -import Modal from '../shared_components/modals/Modal'; -import ShareRoomForm from './room/forms/ShareRoomForm'; export default function RoomCard({ room }) { const { t } = useTranslation(); From 8b51efa4ce6dadfb1990db85d59d49e18dd34e4d Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 20 Dec 2023 11:03:36 +0000 Subject: [PATCH 088/103] Improved number space filling --- app/models/room.rb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/models/room.rb b/app/models/room.rb index cad804f6a2..5191df0271 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -103,13 +103,18 @@ def set_meeting_id # Create unique pin for voice brige max 10^5 - 10000 unique ids def set_voice_brige - if Rails.application.config.voice_bridge_phone_number != nil + unless Rails.application.config.voice_bridge_phone_number.nil? + if Room.all.where.not(voice_bridge: nil).length > 89999 + self.voice_bridge = nil + return + end + id = SecureRandom.random_number((10.pow(5)) - 1) - raise if Room.exists?(voice_bridge: id) || id < 10000 - + while Room.exists?(voice_bridge: id) || id < 10000 + id += 1 % 89999 + 10000 + end + self.voice_bridge = id end - rescue StandardError - retry end end From 868375ba63654fd059118dc7d8e2c6571073ab0f Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 20 Dec 2023 11:09:59 +0000 Subject: [PATCH 089/103] style improvements --- app/models/room.rb | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/app/models/room.rb b/app/models/room.rb index 5191df0271..f68f29f978 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -103,18 +103,13 @@ def set_meeting_id # Create unique pin for voice brige max 10^5 - 10000 unique ids def set_voice_brige - unless Rails.application.config.voice_bridge_phone_number.nil? - if Room.all.where.not(voice_bridge: nil).length > 89999 - self.voice_bridge = nil - return - end - - id = SecureRandom.random_number((10.pow(5)) - 1) - while Room.exists?(voice_bridge: id) || id < 10000 - id += 1 % 89999 + 10000 - end - - self.voice_bridge = id - end + return if Rails.application.config.voice_bridge_phone_number.nil? + + return if Room.all.where.not(voice_bridge: nil).length > 89_999 + + id = SecureRandom.random_number(10.pow(5) - 1) + id += (1 % 89_999) + 10_000 while Room.exists?(voice_bridge: id) || id < 10_000 + + self.voice_bridge = id end end From 9decdb9abe184bd6029946623d3d24d3cd6ebe23 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 20 Dec 2023 11:20:55 +0000 Subject: [PATCH 090/103] FIX unused imports --- app/javascript/components/rooms/room/Room.jsx | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/javascript/components/rooms/room/Room.jsx b/app/javascript/components/rooms/room/Room.jsx index fb9dd900cc..ddb66b5135 100644 --- a/app/javascript/components/rooms/room/Room.jsx +++ b/app/javascript/components/rooms/room/Room.jsx @@ -18,7 +18,7 @@ import React from 'react'; import { Stack, Button, Col, Row, } from 'react-bootstrap'; -import { Link, Navigate, useLocation, useParams } from 'react-router-dom'; +import { Link, useParams } from 'react-router-dom'; import { HomeIcon, Square2StackIcon, PhoneIcon } from '@heroicons/react/24/outline'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; @@ -90,29 +90,29 @@ export default function Room() { } - { - isRoomLoading - ? ( - - ) : ( - <> - - - { typeof room.voice_bridge_phone_number !== 'undefined' && }) -} + { + isRoomLoading + ? ( + + ) : ( + <> + + + {typeof room.voice_bridge_phone_number !== 'undefined' && }) + }
From 6b806ae29cbeae5030c1543a397120b7255e08eb Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Thu, 13 Jun 2024 06:52:41 +0000 Subject: [PATCH 091/103] Custom PIN Length --- app/models/room.rb | 13 +++++++++---- config/application.rb | 3 +-- sample.env | 4 +++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/models/room.rb b/app/models/room.rb index f68f29f978..cba1a5c82a 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -101,14 +101,19 @@ def set_meeting_id retry end - # Create unique pin for voice brige max 10^5 - 10000 unique ids + # Create unique pin for voice brige max 10^x - x*0.1 unique ids (x = len of pin) + # No leading Zeros def set_voice_brige return if Rails.application.config.voice_bridge_phone_number.nil? - return if Room.all.where.not(voice_bridge: nil).length > 89_999 + pin_len = Rails.application.config.sip_pin_length - id = SecureRandom.random_number(10.pow(5) - 1) - id += (1 % 89_999) + 10_000 while Room.exists?(voice_bridge: id) || id < 10_000 + max_pins = 10.pow(pin_len) - 10.pow(pin_len - 1) - 1 + + return if Room.all.where.not(voice_bridge: nil).length > max_pins # Check if a pins are left + + id = SecureRandom.random_number(10.pow(pin_len) - 1) # Pick random pin + id = ((id + 1) % max_pin) + 10.pow(pin_len - 1) while Room.exists?(voice_bridge: id) || id < 10.pow(pin_len - 1) # Take next free pin self.voice_bridge = id end diff --git a/config/application.rb b/config/application.rb index 7160049e0d..2395672c48 100644 --- a/config/application.rb +++ b/config/application.rb @@ -79,8 +79,6 @@ class Application < Rails::Application config.bigbluebutton_secret = ENV.fetch('BIGBLUEBUTTON_SECRET', '8cd8ef52e8e101574e400365b55e11a6') - config.voice_bridge_phone_number = ENV.fetch('VOICE_BRIDGE_PHONE_NUMBER', nil) - config.relative_url_root = ENV.fetch('RELATIVE_URL_ROOT', '/') # Fetch 'RELATIVE_URL_ROOT' ENV variable value while removing any trailing slashes. config.relative_url_root = ENV.fetch('RELATIVE_URL_ROOT', nil)&.sub(%r{/*\z}, '') @@ -89,5 +87,6 @@ class Application < Rails::Application I18n.load_path += Dir[Rails.root.join('config/locales/*.{rb,yml}').to_s] config.voice_bridge_phone_number = ENV.fetch('VOICE_BRIDGE_PHONE_NUMBER', nil) + config.sip_pin_length = ENV.fetch('SIP_PIN_LENGTH', 5) end end diff --git a/sample.env b/sample.env index e40915ed84..24469c175c 100644 --- a/sample.env +++ b/sample.env @@ -97,6 +97,8 @@ LOG_LEVEL=info # RAILS_LOG_REMOTE_TAG=greenlight-v3 # Define the phone number for the voice bridge. -# This number is not sent to bbb and is only displayed in the greenlight UI, but it should match the number in the bbb instance to avoid user confusion. +# This number is not sent to bbb and is only displayed in the Greenlight UI, but it should match the number in the bbb instance to avoid user confusion. # If this number is defined, each newly created room will be assigned a static voiceBridge pin. #VOICE_BRIDGE_PHONE_NUMBER= +# Define the length of the PIN for SIP if not set PIN length is 5 (sufficient for small to medium BBB servers < 90000 rooms) +#SIP_PIN_LENGTH= From cc0cf0d675e23f67594db5bff6032597809abc07 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Fri, 14 Jun 2024 06:53:45 +0000 Subject: [PATCH 092/103] Custom PIN Length --- app/models/room.rb | 1 - ...populate_voice_brige_for_existing_rooms.rb | 25 +++++++------------ 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/app/models/room.rb b/app/models/room.rb index cba1a5c82a..c328c699df 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -107,7 +107,6 @@ def set_voice_brige return if Rails.application.config.voice_bridge_phone_number.nil? pin_len = Rails.application.config.sip_pin_length - max_pins = 10.pow(pin_len) - 10.pow(pin_len - 1) - 1 return if Room.all.where.not(voice_bridge: nil).length > max_pins # Check if a pins are left diff --git a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb index acdb99b8a8..2cb7351a9f 100644 --- a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb +++ b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb @@ -2,28 +2,21 @@ class PopulateVoiceBrigeForExistingRooms < ActiveRecord::Migration[7.0] def up - if Rails.application.config.voice_bridge_phone_number == nil - return - end + return if Rails.application.config.voice_bridge_phone_number.nil? - if Room.all.length > 89999 - raise "The db contains to many rooms to assign each one a unique voice_brige" - end + pin_len = Rails.application.config.sip_pin_length + max_pins = 10.pow(pin_len) - 10.pow(pin_len - 1) - 1 - Room.where(voice_bridge: nil).each do |room| - id = SecureRandom.random_number((10.pow(5)) - 1) + raise 'The db contains to many rooms to assign each one a unique voice_bridge' if Room.all.length > max_pins - if id < 10000 - id = id + 10000 - end + Room.where(voice_bridge: nil).each do |room| + id = SecureRandom.random_number(max_pins) + 10.pow(pin_len - 1) while Room.exists?(voice_bridge: id) - id = id + 1 - if id >= 99999 - id = 10000 - end + id += 1 + id = 10.pow(pin_len - 1) if id > max_pins end - + room.update(voice_bridge: id) end end From 8d43f9dcd35c729fc9e2fc3d48679700b773897a Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Fri, 14 Jun 2024 08:42:23 +0000 Subject: [PATCH 093/103] Fix merge messup --- app/javascript/components/rooms/room/Room.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/components/rooms/room/Room.jsx b/app/javascript/components/rooms/room/Room.jsx index 9722a685a6..a541d7107f 100644 --- a/app/javascript/components/rooms/room/Room.jsx +++ b/app/javascript/components/rooms/room/Room.jsx @@ -121,7 +121,7 @@ export default function Room() { { t('copy') } - {typeof room.voice_bridge_phone_number !== 'undefined' && } From 987915fa1d78423f50c99bc51029b452b122d5b1 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Fri, 14 Jun 2024 14:30:04 +0000 Subject: [PATCH 094/103] Removed changes to unrelated files --- Gemfile.lock | 6 ------ config/locales/fr.yml | 12 +++++------ package-lock.json | 42 +-------------------------------------- package.json | 2 -- sample.env | 5 ----- yarn.lock | 46 ++----------------------------------------- 6 files changed, 9 insertions(+), 104 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 19fc4aa009..f5ea4a2a32 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -551,9 +551,3 @@ DEPENDENCIES web-console (>= 4.2.1) webdrivers webmock - -RUBY VERSION - ruby 3.1.0p0 - -BUNDLED WITH - 2.3.3 diff --git a/config/locales/fr.yml b/config/locales/fr.yml index acf99e662d..d4eaa2b883 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -47,18 +47,18 @@ fr: opengraph: - description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." + description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." meeting: moderator_message: "Pour inviter quelqu'un à la réunion, envoyez ce lien:" access_code: "Code d'accès: %{code}" email: activation: account_activation: Activation du compte - welcome_to_bbb: Bienvenue dans BigBlueButton - get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le bouton ci-dessous." + welcome_to_bbb: Bienvenue dans BigBlueButton! + get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le lien ci-dessous." activate_account: Activer le compte link_expires: Le lien expirera dans 24 heures. - if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel pour l'activation." + if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel d'activation" invitation: invitation_to_join: Invitation à rejoindre BigBlueButton you_have_been_invited: "Vous avez été invité à créer un compte dans BigBlueButton par %{name}." @@ -78,6 +78,6 @@ fr: password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur le bouton ci-dessous." reset_password: Réinitialisation du mot de passe link_expires: Le lien expirera dans 1 heure. - ignore_request: "Si vous n'avez pas demandé un changement de mot de passe, veuillez ignorer ce courriel." + ignore_request: "Si vous n'avez pas demandé à changer de mot de passe, ignorez ce message." room: - new_room_name: "Salle de %{username}" + new_room_name: "Salle de %{username}" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e4966b7a71..a85ef9f339 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3382,11 +3382,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "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==" - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -3749,17 +3744,6 @@ "node": ">= 0.8" } }, - "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==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5915,25 +5899,6 @@ "node": ">= 0.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==", - "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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6355,11 +6320,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "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==" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7766,4 +7726,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index b3495512ac..22f3733024 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,8 @@ "esbuild": "^0.19.9", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-sass-plugin": "^2.2.6", - "file-saver": "^2.0.5", "i18next": "^21.9.1", "i18next-http-backend": "^1.4.1", - "ics": "^3.1.0", "lodash.debounce": "^4.0.8", "prop-types": "^15.8.1", "react": "^17.0.2", diff --git a/sample.env b/sample.env index 878205df42..56ea92a49c 100644 --- a/sample.env +++ b/sample.env @@ -80,11 +80,6 @@ REDIS_URL= # More information: https://docs.bigbluebutton.org/greenlight/v3/install/#default-locale-setup #DEFAULT_LOCALE=en -# Define the phone number for the voice bridge. -# This number is not sent to bbb and is only displayed in the greenlight UI, but it should match the number in the bbb instance to avoid user confusion. -# If this number is defined, each newly created room will be assigned a static voiceBridge pin. -#VOICE_BRIDGE_PHONE_NUMBER= - # Set this if you like to deploy Greenlight on a relative root path other than / # More information: https://docs.bigbluebutton.org/greenlight/v3/install/#relative-url-root-path-subdirectory-setup #RELATIVE_URL_ROOT=/gl diff --git a/yarn.lock b/yarn.lock index 3106ea50d0..8cd4567171 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1635,10 +1635,6 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -1854,12 +1850,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - dependencies: - delayed-stream "~1.0.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -2420,11 +2410,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-saver@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" - integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -2671,14 +2656,6 @@ i18next@^21.9.1: dependencies: "@babel/runtime" "^7.17.2" -ics@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ics/-/ics-3.1.0.tgz#ea3e369d69a53c5cd70a33e2b790cfc483b9b7b7" - integrity sha512-O48TZKyLYagLlXoZwDmjetXc6SoT54wFkTu2MEYe7zse8kL+C/dgSynYCjRG1OTAv3iHtGtG0PWKG81LbcrKFA== - dependencies: - nanoid "^3.1.23" - yup "^0.32.9" - ignore@^5.2.0: version "5.3.0" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz" @@ -3120,16 +3097,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - dependencies: - mime-db "1.52.0" - minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -3164,11 +3131,6 @@ nanoclone@^0.2.1: resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== -nanoid@^3.1.23: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" @@ -3388,10 +3350,6 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" @@ -4214,7 +4172,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yup@^0.32.11, yup@^0.32.9: +yup@^0.32.11: version "0.32.11" resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== @@ -4225,4 +4183,4 @@ yup@^0.32.11, yup@^0.32.9: lodash-es "^4.17.21" nanoclone "^0.2.1" property-expr "^2.0.4" - toposort "^2.0.2" + toposort "^2.0.2" \ No newline at end of file From e8d4d4fb7bbff7b7c3ba83409f986c1a716352a4 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Fri, 14 Jun 2024 14:32:31 +0000 Subject: [PATCH 095/103] Removed changes to unrelated files --- config/locales/fr.yml | 2 +- package-lock.json | 2 +- yarn.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index d4eaa2b883..d5354e0717 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -80,4 +80,4 @@ fr: link_expires: Le lien expirera dans 1 heure. ignore_request: "Si vous n'avez pas demandé à changer de mot de passe, ignorez ce message." room: - new_room_name: "Salle de %{username}" \ No newline at end of file + new_room_name: "Salle de %{username}" diff --git a/package-lock.json b/package-lock.json index a85ef9f339..a93e865bd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7726,4 +7726,4 @@ } } } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 8cd4567171..52cf063646 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4183,4 +4183,4 @@ yup@^0.32.11: lodash-es "^4.17.21" nanoclone "^0.2.1" property-expr "^2.0.4" - toposort "^2.0.2" \ No newline at end of file + toposort "^2.0.2" From 9600e2d476efeabddb110a4b0fa3cc4b39d04bd3 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Mon, 17 Jun 2024 07:05:34 +0000 Subject: [PATCH 096/103] Fix rubocop issues --- app/services/meeting_starter.rb | 3 ++- app/services/room_settings_getter.rb | 6 +++--- config/application.rb | 2 +- ...30328124724_populate_voice_brige_for_existing_rooms.rb | 2 ++ db/migrate/20230321125010_add_voice_brige_to_romms.rb | 4 +++- db/schema.rb | 8 ++++---- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/services/meeting_starter.rb b/app/services/meeting_starter.rb index caf3e4e3bf..90a5fa0044 100644 --- a/app/services/meeting_starter.rb +++ b/app/services/meeting_starter.rb @@ -30,7 +30,8 @@ def initialize(room:, base_url:, current_user:, provider:) def call # TODO: amir - Check the legitimately of the action. - options = RoomSettingsGetter.new(room_id: @room.id, provider: @room.user.provider, current_user: @current_user, only_bbb_options: true, voice_bridge: @room.voice_bridge).call + options = RoomSettingsGetter.new(room_id: @room.id, provider: @room.user.provider, current_user: @current_user, only_bbb_options: true, + voice_bridge: @room.voice_bridge).call viewer_code = RoomSettingsGetter.new( room_id: @room.id, provider: @room.user.provider, diff --git a/app/services/room_settings_getter.rb b/app/services/room_settings_getter.rb index 52b85666d0..e57d28efaf 100644 --- a/app/services/room_settings_getter.rb +++ b/app/services/room_settings_getter.rb @@ -103,8 +103,8 @@ def infer_can_record(room_settings:) end def set_voice_brige(room_settings:) - if @voice_bridge != nil - room_settings['voiceBridge'] = "#{@voice_bridge}" - end + return if @voice_bridge.nil? + + room_settings['voiceBridge'] = @voice_bridge.to_s end end diff --git a/config/application.rb b/config/application.rb index b530d89add..8645015a6d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -88,7 +88,7 @@ class Application < Rails::Application config.voice_bridge_phone_number = ENV.fetch('VOICE_BRIDGE_PHONE_NUMBER', nil) config.sip_pin_length = ENV.fetch('SIP_PIN_LENGTH', 5) - + config.i18n.fallbacks = %i[en] config.i18n.enforce_available_locales = false end diff --git a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb index 2cb7351a9f..9982b88f6e 100644 --- a/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb +++ b/db/data/20230328124724_populate_voice_brige_for_existing_rooms.rb @@ -22,6 +22,8 @@ def up end def down + # rubocop:disable Rails/SkipsModelValidations Room.update_all(voice_bridge: nil) + # rubocop:enable Rails/SkipsModelValidations end end diff --git a/db/migrate/20230321125010_add_voice_brige_to_romms.rb b/db/migrate/20230321125010_add_voice_brige_to_romms.rb index 42fac35f2a..2b87a390d9 100644 --- a/db/migrate/20230321125010_add_voice_brige_to_romms.rb +++ b/db/migrate/20230321125010_add_voice_brige_to_romms.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + class AddVoiceBrigeToRomms < ActiveRecord::Migration[7.0] def change add_column :rooms, :voice_bridge, :integer, null: true, default: nil - add_index :rooms, :voice_bridge + add_index :rooms, :voice_bridge, unique: true end end diff --git a/db/schema.rb b/db/schema.rb index ba56dfc17c..654f0972ed 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -136,7 +136,7 @@ t.index ["friendly_id"], name: "index_rooms_on_friendly_id", unique: true t.index ["meeting_id"], name: "index_rooms_on_meeting_id", unique: true t.index ["user_id"], name: "index_rooms_on_user_id" - t.index ["voice_bridge"], name: "index_rooms_on_voice_bridge" + t.index ["voice_bridge"], name: "index_rooms_on_voice_bridge", unique: true end create_table "rooms_configurations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| @@ -195,12 +195,12 @@ t.uuid "role_id" t.string "language", null: false t.string "reset_digest" - t.datetime "reset_sent_at", precision: nil + t.datetime "reset_sent_at" t.boolean "verified", default: false t.string "verification_digest" - t.datetime "verification_sent_at", precision: nil + t.datetime "verification_sent_at" t.string "session_token" - t.datetime "session_expiry", precision: nil + t.datetime "session_expiry" t.integer "status", default: 0 t.index ["email", "provider"], name: "index_users_on_email_and_provider", unique: true t.index ["reset_digest"], name: "index_users_on_reset_digest", unique: true From 97027f4ad3fb2194e8f865df888b898289e6b0af Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Mon, 15 Jul 2024 09:27:48 +0000 Subject: [PATCH 097/103] Fix config double assignment --- config/application.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/config/application.rb b/config/application.rb index 8645015a6d..8825925ec1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -79,7 +79,6 @@ class Application < Rails::Application config.bigbluebutton_secret = ENV.fetch('BIGBLUEBUTTON_SECRET', '8cd8ef52e8e101574e400365b55e11a6') - config.relative_url_root = ENV.fetch('RELATIVE_URL_ROOT', '/') # Fetch 'RELATIVE_URL_ROOT' ENV variable value while removing any trailing slashes. config.relative_url_root = ENV.fetch('RELATIVE_URL_ROOT', nil)&.sub(%r{/*\z}, '') config.relative_url_root = '/' if config.relative_url_root.blank? From d4c9563aafed1f24085a657ba8a20c45cfdd4363 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 18 Sep 2024 07:53:19 +0000 Subject: [PATCH 098/103] rspec --- app/models/room.rb | 18 +++++++++++------- ...20230321125010_add_voice_brige_to_romms.rb | 2 +- spec/factories/room_factory.rb | 2 +- spec/models/room_spec.rb | 19 ++++++++++++++++++- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/models/room.rb b/app/models/room.rb index 1736f80c64..5620e78113 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -30,7 +30,7 @@ class Room < ApplicationRecord validates :name, presence: true validates :friendly_id, presence: true, uniqueness: true validates :meeting_id, presence: true, uniqueness: true - validates :voice_bridge, uniqueness: true + # validates :voice_bridge, uniqueness: true validates :presentation, content_type: Rails.configuration.uploads[:presentations][:formats], size: { less_than: Rails.configuration.uploads[:presentations][:max_size] } @@ -38,7 +38,7 @@ class Room < ApplicationRecord validates :name, length: { minimum: 1, maximum: 255 } validates :recordings_processing, numericality: { only_integer: true, greater_than_or_equal_to: 0 } - before_validation :set_friendly_id, :set_meeting_id, :set_voice_brige, on: :create + before_validation :set_friendly_id, :set_meeting_id, :set_voice_bridge, on: :create before_save :scan_presentation_for_virus after_create :create_meeting_options @@ -103,18 +103,22 @@ def set_meeting_id retry end - # Create unique pin for voice brige max 10^x - x*0.1 unique ids (x = len of pin) + # Create unique pin for voice brige max 10^x - 10^(x-1) unique ids (x = len of pin) # No leading Zeros - def set_voice_brige + def set_voice_bridge + self.voice_bridge = nil + return if Rails.application.config.voice_bridge_phone_number.nil? pin_len = Rails.application.config.sip_pin_length max_pins = 10.pow(pin_len) - 10.pow(pin_len - 1) - 1 - return if Room.all.where.not(voice_bridge: nil).length > max_pins # Check if a pins are left + return if Room.all.where.not(voice_bridge: nil).length >= max_pins # Check if pins are left - id = SecureRandom.random_number(10.pow(pin_len) - 1) # Pick random pin - id = ((id + 1) % max_pin) + 10.pow(pin_len - 1) while Room.exists?(voice_bridge: id) || id < 10.pow(pin_len - 1) # Take next free pin + # Pick random pin + id = SecureRandom.random_number(10.pow(pin_len) - 1) + # Ensure uniqueness and if not take next free pin + id = ((id + 1) % max_pins) + 10.pow(pin_len - 1) while Room.exists?(voice_bridge: id) || id < 10.pow(pin_len - 1) self.voice_bridge = id end diff --git a/db/migrate/20230321125010_add_voice_brige_to_romms.rb b/db/migrate/20230321125010_add_voice_brige_to_romms.rb index 2b87a390d9..829e427e07 100644 --- a/db/migrate/20230321125010_add_voice_brige_to_romms.rb +++ b/db/migrate/20230321125010_add_voice_brige_to_romms.rb @@ -3,6 +3,6 @@ class AddVoiceBrigeToRomms < ActiveRecord::Migration[7.0] def change add_column :rooms, :voice_bridge, :integer, null: true, default: nil - add_index :rooms, :voice_bridge, unique: true + add_index :rooms, :voice_bridge end end diff --git a/spec/factories/room_factory.rb b/spec/factories/room_factory.rb index e94153021a..7258496f58 100644 --- a/spec/factories/room_factory.rb +++ b/spec/factories/room_factory.rb @@ -21,6 +21,6 @@ user name { Faker::Educator.course_name } last_session { nil } - # meeting_id & friendly_id are set automatically using before_validation + # meeting_id & friendly_id & voice_brige are set automatically using before_validation end end diff --git a/spec/models/room_spec.rb b/spec/models/room_spec.rb index 691d47f7e4..c5b7292c3a 100644 --- a/spec/models/room_spec.rb +++ b/spec/models/room_spec.rb @@ -30,7 +30,7 @@ it { is_expected.to validate_length_of(:name).is_at_least(1).is_at_most(255) } it { is_expected.to validate_numericality_of(:recordings_processing).only_integer.is_greater_than_or_equal_to(0) } - # Can't test validation on friendly_id and meeting_id due to before_validations + # Can't test validation on friendly_id, meeting_id and voice_brige due to before_validations context 'presentation validations' do it 'fails if the presentation is not a valid extension' do @@ -84,6 +84,23 @@ expect { duplicate_room.meeting_id = room.meeting_id }.to change { duplicate_room.valid? }.to false end end + + describe '#set_voice_brige' do + it 'sets a rooms voice_brige before creating' do + if Rails.application.config.voice_bridge_phone_number.nil? + expect(room.voice_bridge).to be_nil + else + expect(room.voice_bridge).to be_present + end + end + + it 'prevents duplicate voice_briges' do + duplicate_room = create(:room) + unless Rails.application.config.voice_bridge_phone_number.nil? + expect { duplicate_room.voice_bridge = room.voice_bridge }.to change { duplicate_room.valid? }.to false + end + end + end end describe 'before_save' do From 653b71e6c713e10a80d9ba91fb42d9ec5470b8d2 Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 18 Sep 2024 08:28:01 +0000 Subject: [PATCH 099/103] eslint --- app/javascript/components/rooms/RoomCard.jsx | 10 ++++++---- app/javascript/components/rooms/room/Room.jsx | 19 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/javascript/components/rooms/RoomCard.jsx b/app/javascript/components/rooms/RoomCard.jsx index c565fae9f9..915a7d010b 100644 --- a/app/javascript/components/rooms/RoomCard.jsx +++ b/app/javascript/components/rooms/RoomCard.jsx @@ -41,8 +41,8 @@ export default function RoomCard({ room }) { toast.success(t('toast.success.room.copied_meeting_url')); } - function copyVoiceBridge(voice_bridge, voice_bridge_phone_number) { - navigator.clipboard.writeText(`Tel.: ${voice_bridge_phone_number} Pin: ${voice_bridge}`); + function copyVoiceBridge(voiceBridge, voiceBridgePhoneNumber) { + navigator.clipboard.writeText(`Tel.: ${voiceBridgePhoneNumber} Pin: ${voiceBridge}`); toast.success(t('toast.success.room.copied_voice_bridge')); } @@ -78,12 +78,14 @@ export default function RoomCard({ room }) { > - {typeof room.voice_bridge_phone_number !== 'undefined' && } + + )} - {!isRoomLoading && typeof room.voice_bridge_phone_number !== 'undefined' && } + {!isRoomLoading && typeof room.voice_bridge_phone_number !== 'undefined' && ( + + )} { (roomSettings?.data?.glModeratorAccessCode || roomSettings?.data?.glViewerAccessCode) && ( Date: Wed, 18 Sep 2024 08:33:33 +0000 Subject: [PATCH 100/103] rspec --- spec/services/meeting_starter_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/services/meeting_starter_spec.rb b/spec/services/meeting_starter_spec.rb index 4fb0464bb0..1ba3ee5542 100644 --- a/spec/services/meeting_starter_spec.rb +++ b/spec/services/meeting_starter_spec.rb @@ -67,7 +67,7 @@ expect(RoomSettingsGetter) .to receive(:new) - .with(room_id: room.id, provider: 'greenlight', current_user: user, only_bbb_options: true) + .with(room_id: room.id, provider: 'greenlight', current_user: user, only_bbb_options: true, voice_bridge: room.voice_bridge) expect(room_setting_getter_service) .to receive(:call) From 2da029f8617875d9be60d0fd1f3a52d00a491d0f Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Wed, 18 Sep 2024 09:12:30 +0000 Subject: [PATCH 101/103] rspec --- app/models/room.rb | 1 - db/schema.rb | 7 ++----- spec/models/room_spec.rb | 7 ------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/app/models/room.rb b/app/models/room.rb index 5620e78113..7267a0df81 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -30,7 +30,6 @@ class Room < ApplicationRecord validates :name, presence: true validates :friendly_id, presence: true, uniqueness: true validates :meeting_id, presence: true, uniqueness: true - # validates :voice_bridge, uniqueness: true validates :presentation, content_type: Rails.configuration.uploads[:presentations][:formats], size: { less_than: Rails.configuration.uploads[:presentations][:max_size] } diff --git a/db/schema.rb b/db/schema.rb index 654f0972ed..71ed36b4c5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2023_12_18_154727) do +ActiveRecord::Schema[7.1].define(version: 2023_07_05_183747) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -43,9 +43,6 @@ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end - create_table "data_migrations", primary_key: "version", id: :string, force: :cascade do |t| - end - create_table "formats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "recording_id" t.string "recording_type", null: false @@ -136,7 +133,7 @@ t.index ["friendly_id"], name: "index_rooms_on_friendly_id", unique: true t.index ["meeting_id"], name: "index_rooms_on_meeting_id", unique: true t.index ["user_id"], name: "index_rooms_on_user_id" - t.index ["voice_bridge"], name: "index_rooms_on_voice_bridge", unique: true + t.index ["voice_bridge"], name: "index_rooms_on_voice_bridge" end create_table "rooms_configurations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| diff --git a/spec/models/room_spec.rb b/spec/models/room_spec.rb index c5b7292c3a..cb695a6ba8 100644 --- a/spec/models/room_spec.rb +++ b/spec/models/room_spec.rb @@ -93,13 +93,6 @@ expect(room.voice_bridge).to be_present end end - - it 'prevents duplicate voice_briges' do - duplicate_room = create(:room) - unless Rails.application.config.voice_bridge_phone_number.nil? - expect { duplicate_room.voice_bridge = room.voice_bridge }.to change { duplicate_room.valid? }.to false - end - end end end From 1ee9e16ede11e38d8d489641662f9ea15f4f6f4d Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Tue, 8 Oct 2024 10:53:15 +0000 Subject: [PATCH 102/103] re run tests --- app/models/room.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/room.rb b/app/models/room.rb index 7267a0df81..db72becc3a 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -102,7 +102,8 @@ def set_meeting_id retry end - # Create unique pin for voice brige max 10^x - 10^(x-1) unique ids (x = len of pin) + # Create unique pin for voice brige max 10^x - 10^(x-1) unique ids (x = length of the pin) + # x can be set in the .env to create a larger range for server with more rooms # No leading Zeros def set_voice_bridge self.voice_bridge = nil From 306d6bacf3579dc8d0475b4f651a9b5bd8ba8aca Mon Sep 17 00:00:00 2001 From: "Nadler, Sebastian" Date: Tue, 8 Oct 2024 11:26:26 +0000 Subject: [PATCH 103/103] Gammer fix --- app/models/room.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/room.rb b/app/models/room.rb index db72becc3a..27a4c4d4ae 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -103,7 +103,7 @@ def set_meeting_id end # Create unique pin for voice brige max 10^x - 10^(x-1) unique ids (x = length of the pin) - # x can be set in the .env to create a larger range for server with more rooms + # x can be set in the .env to create a larger range for a server with many rooms # No leading Zeros def set_voice_bridge self.voice_bridge = nil