diff --git a/.gitignore b/.gitignore index 67bb3fa..0d4afbc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ api/node_modules api/.DS_Store api/.env api/dist +xcuserdata/ + +.sentryclirc \ No newline at end of file diff --git "a/Oscar\302\260.xcodeproj/project.pbxproj" "b/Oscar\302\260.xcodeproj/project.pbxproj" index 6ffabad..3d6a24b 100644 --- "a/Oscar\302\260.xcodeproj/project.pbxproj" +++ "b/Oscar\302\260.xcodeproj/project.pbxproj" @@ -3,22 +3,32 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ + 250163DA2B093C0B00EEF882 /* CityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E30B2A26CD9B31007F468D /* CityService.swift */; }; 2505C94D29E5F0D200BDB0A8 /* PrecipitationLockscreenWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2505C94C29E5F0D200BDB0A8 /* PrecipitationLockscreenWidget.swift */; }; + 2516BD562BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 2516BD552BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy */; }; + 2516BD572BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 2516BD552BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy */; }; + 2516BD582BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 2516BD552BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy */; }; 251FE39127C5674400D26F0F /* WMSTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 251FE39027C5674400D26F0F /* WMSTileOverlay.swift */; }; - 2523367D27C3E9D500C2111A /* RainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2523367C27C3E9D500C2111A /* RainModel.swift */; }; 2523367F27C3EB3900C2111A /* RainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2523367E27C3EB3900C2111A /* RainView.swift */; }; - 25288A0126D130E300A612AF /* SPIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = 25288A0026D130E300A612AF /* SPIndicator */; }; - 2533940827C434900087C220 /* DWDAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2533940727C434900087C220 /* DWDAlerts.swift */; }; 2533940A27C43F810087C220 /* AlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2533940927C43F810087C220 /* AlertView.swift */; }; - 2535259E26DB7FDF000AA927 /* WeatherMapsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D90A5226C40DB800128F7A /* WeatherMapsResponse.swift */; }; 2536438126DACCB800C8A952 /* LegalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2536438026DACCB800C8A952 /* LegalView.swift */; }; + 253BA17F2B093CE30070BD5E /* DataModels.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE226CACF7D00D90D6B /* DataModels.xcdatamodeld */; }; + 253BA18C2B0941670070BD5E /* LocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 253BA18B2B0941670070BD5E /* LocationService.swift */; }; + 253F70872B5314B70075D093 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E22B470335001D973A /* APIClient.swift */; }; 253F70892950FA0F000BD4C0 /* RadarWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB8902F251A55950028FED0 /* RadarWidget.swift */; }; 253F708B29510B06000BD4C0 /* AQIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 253F708A29510B06000BD4C0 /* AQIView.swift */; }; - 253F708D2951118D000BD4C0 /* AQIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 253F708C2951118D000BD4C0 /* AQIResponse.swift */; }; + 253F708C2B5316A90075D093 /* OpenAPIRuntime in Frameworks */ = {isa = PBXBuildFile; productRef = 253F708B2B5316A90075D093 /* OpenAPIRuntime */; }; + 253F708E2B5316A90075D093 /* OpenAPIURLSession in Frameworks */ = {isa = PBXBuildFile; productRef = 253F708D2B5316A90075D093 /* OpenAPIURLSession */; }; + 253F708F2B5316BC0075D093 /* openapi.yml in Resources */ = {isa = PBXBuildFile; fileRef = 257D07DC2AC355EC005EBD16 /* openapi.yml */; }; + 253F70902B5316BC0075D093 /* openapi-generator-config.yml in Resources */ = {isa = PBXBuildFile; fileRef = 257D07DE2AC3561C005EBD16 /* openapi-generator-config.yml */; }; + 253F70932B5319D20075D093 /* LocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 253BA18B2B0941670070BD5E /* LocationService.swift */; }; + 253F70962B5319DD0075D093 /* CityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E30B2A26CD9B31007F468D /* CityService.swift */; }; + 253F70972B5319EC0075D093 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE526CACFC900D90D6B /* PersistenceController.swift */; }; + 253F709C2B5333BE0075D093 /* APIResultExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E92B470461001D973A /* APIResultExtensions.swift */; }; 25429BD329E5F94100D5979F /* Oscar_WatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25429BD229E5F94100D5979F /* Oscar_WatchApp.swift */; }; 25429BD529E5F94100D5979F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25429BD429E5F94100D5979F /* ContentView.swift */; }; 25429BD729E5F94300D5979F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 25429BD629E5F94300D5979F /* Assets.xcassets */; }; @@ -28,44 +38,72 @@ 25429BE829E5F9B000D5979F /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EB8902C251A55950028FED0 /* SwiftUI.framework */; }; 25429BEB29E5F9B000D5979F /* Oscar_WatchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25429BEA29E5F9B000D5979F /* Oscar_WatchWidget.swift */; }; 25429BEE29E5F9B300D5979F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 25429BED29E5F9B300D5979F /* Assets.xcassets */; }; - 25429BF029E5F9B300D5979F /* Oscar_WatchWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 25429BEC29E5F9B000D5979F /* Oscar_WatchWidget.intentdefinition */; }; - 25429BF129E5F9B300D5979F /* Oscar_WatchWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 25429BEC29E5F9B000D5979F /* Oscar_WatchWidget.intentdefinition */; }; 25429BF429E5F9B300D5979F /* Oscar°WatchWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 25429BE629E5F9B000D5979F /* Oscar°WatchWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 25429BFA29E5FA5300D5979F /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 25429BF929E5FA5300D5979F /* Alamofire */; }; 25429BFB29E5FAC600D5979F /* LockscreenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516929E4935600D8C13D /* LockscreenProvider.swift */; }; 25429BFC29E5FAE600D5979F /* OscarWidgetsBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED4AEAF254551DD0057DF2F /* OscarWidgetsBundle.swift */; }; 25429C0029E5FAEF00D5979F /* PrecipitationLockscreenWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2505C94C29E5F0D200BDB0A8 /* PrecipitationLockscreenWidget.swift */; }; 25429C0129E5FAF200D5979F /* TemperatureLockscreenWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516329E4905E00D8C13D /* TemperatureLockscreenWidget.swift */; }; 25429C0229E5FAF600D5979F /* OMDayTemperature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516C29E494DB00D8C13D /* OMDayTemperature.swift */; }; - 25429C0329E5FB0700D5979F /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D003C526CD490200FFF8B8 /* LocationManager.swift */; }; 2546516429E4905E00D8C13D /* TemperatureLockscreenWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516329E4905E00D8C13D /* TemperatureLockscreenWidget.swift */; }; 2546516729E492E500D8C13D /* RadarProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516629E492E500D8C13D /* RadarProvider.swift */; }; 2546516A29E4935600D8C13D /* LockscreenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516929E4935600D8C13D /* LockscreenProvider.swift */; }; 2546516D29E494DB00D8C13D /* OMDayTemperature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2546516C29E494DB00D8C13D /* OMDayTemperature.swift */; }; - 255ED6E327A6D67800AE9696 /* BrightskyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 255ED6E227A6D67800AE9696 /* BrightskyResponse.swift */; }; + 255950952B45B16000122324 /* SearchCityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 255950942B45B16000122324 /* SearchCityView.swift */; }; + 255BDD9E2BD9B2E40061E4EB /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 255BDD9F2BD9B2E40061E4EB /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 4EBF1FE0D46648989064EF72 /* Sentry */; }; + 255BDDA02BD9B2E40061E4EB /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 255BDDA12BD9B2E40061E4EB /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 256FDAC92BCB164C00E18655 /* GlobalRadarWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 256FDAC42BCB14D000E18655 /* GlobalRadarWidget.swift */; }; + 256FDACA2BCB164F00E18655 /* GlobalRadarProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 256FDAC62BCB14DA00E18655 /* GlobalRadarProvider.swift */; }; 25761D4F29F1CC85006976BE /* Cloud.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED799F29F1A7DE002E0AAB /* Cloud.swift */; }; 25761D5029F1CF14006976BE /* Storm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79AA29F1A7DF002E0AAB /* Storm.swift */; }; 25761D5129F1D083006976BE /* StormDrop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79A729F1A7DF002E0AAB /* StormDrop.swift */; }; - 258428B82A18C5230033E5A3 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 258428B72A18C5230033E5A3 /* Launch Screen.storyboard */; }; + 2576B2032B586E6C004E288A /* GlobalViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E72B47043A001D973A /* GlobalViewExtensions.swift */; }; + 257EB34E2BD830F300E46468 /* openapi.yml in Resources */ = {isa = PBXBuildFile; fileRef = 257D07DC2AC355EC005EBD16 /* openapi.yml */; }; + 257EB34F2BD830F300E46468 /* openapi-generator-config.yml in Resources */ = {isa = PBXBuildFile; fileRef = 257D07DE2AC3561C005EBD16 /* openapi-generator-config.yml */; }; + 257EB3532BD8312000E46468 /* OpenAPIRuntime in Frameworks */ = {isa = PBXBuildFile; productRef = 257EB3522BD8312000E46468 /* OpenAPIRuntime */; }; + 257EB3552BD8312500E46468 /* OpenAPIURLSession in Frameworks */ = {isa = PBXBuildFile; productRef = 257EB3542BD8312500E46468 /* OpenAPIURLSession */; }; + 257EB35B2BD831C300E46468 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E22B470335001D973A /* APIClient.swift */; }; + 257EB35F2BD831CB00E46468 /* LocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 253BA18B2B0941670070BD5E /* LocationService.swift */; }; + 257EB3602BD831D200E46468 /* CityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E30B2A26CD9B31007F468D /* CityService.swift */; }; + 257EB3642BD8321700E46468 /* APIResultExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E92B470461001D973A /* APIResultExtensions.swift */; }; + 257EB3682BD8321B00E46468 /* GlobalViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E72B47043A001D973A /* GlobalViewExtensions.swift */; }; + 257EB3692BD8322A00E46468 /* RetryClientMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 258EE2EC2B5EF4E900AE942B /* RetryClientMiddleware.swift */; }; + 257EB3712BD8328A00E46468 /* HapticsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 257EB3702BD8328A00E46468 /* HapticsExtension.swift */; }; + 257EB3752BD832BC00E46468 /* DataModels.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE226CACF7D00D90D6B /* DataModels.xcdatamodeld */; }; + 257EB3792BD832C000E46468 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE526CACFC900D90D6B /* PersistenceController.swift */; }; 258B223229A81E7500E4ECCE /* Charts in Frameworks */ = {isa = PBXBuildFile; productRef = 258B223129A81E7500E4ECCE /* Charts */; }; - 2590816B28EADDB500886A0E /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 2590816A28EADDB500886A0E /* Alamofire */; }; - 2596CBBF258BE65300B1C200 /* NowViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2596CBBE258BE65300B1C200 /* NowViewModel.swift */; }; - 259704DF2757CB0D00DFCA53 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 259704DE2757CB0D00DFCA53 /* Alamofire */; }; - 259704E12757D19C00DFCA53 /* AlertResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259704E02757D19C00DFCA53 /* AlertResponse.swift */; }; + 258EE2ED2B5EF4E900AE942B /* RetryClientMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 258EE2EC2B5EF4E900AE942B /* RetryClientMiddleware.swift */; }; + 258EE2F62B5EF58100AE942B /* RetryClientMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 258EE2EC2B5EF4E900AE942B /* RetryClientMiddleware.swift */; }; + 259623D02A2BD6BF00BA75F6 /* HomeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259623CF2A2BD6BF00BA75F6 /* HomeProvider.swift */; }; + 259623D32A2BD79200BA75F6 /* NowTodayWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259623D12A2BD72C00BA75F6 /* NowTodayWidget.swift */; }; + 259623D42A2BD96600BA75F6 /* Color-Interpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED799429F1A7C6002E0AAB /* Color-Interpolation.swift */; }; + 259623D52A2BD97300BA75F6 /* Array-GradientStop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79A929F1A7DF002E0AAB /* Array-GradientStop.swift */; }; + 259623D62A2BD97C00BA75F6 /* Color-Custom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79A029F1A7DE002E0AAB /* Color-Custom.swift */; }; 259704E52757D7E800DFCA53 /* AlertDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259704E42757D7E800DFCA53 /* AlertDetailView.swift */; }; 259EDA6C29ABC19F00F94996 /* RainRadarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259EDA6B29ABC19F00F94996 /* RainRadarView.swift */; }; 25A0CEDD26C4068300DD4A79 /* RadarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A0CEDC26C4068300DD4A79 /* RadarView.swift */; }; + 25AD38E72BE716E100A8F305 /* MemoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25AD38E62BE716E100A8F305 /* MemoryView.swift */; }; + 25B734172BD9BB86003C6756 /* SentrySwiftUI in Frameworks */ = {isa = PBXBuildFile; productRef = 25B734162BD9BB86003C6756 /* SentrySwiftUI */; }; 25BEDCE426CACF7D00D90D6B /* DataModels.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE226CACF7D00D90D6B /* DataModels.xcdatamodeld */; }; 25BEDCE626CACFC900D90D6B /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE526CACFC900D90D6B /* PersistenceController.swift */; }; - 25BEDCE826CAD02A00D90D6B /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE726CAD02A00D90D6B /* SearchViewModel.swift */; }; - 25BEDCEA26CAD10B00D90D6B /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BEDCE926CAD10B00D90D6B /* SearchView.swift */; }; - 25BF3F9A289FECDF008E7566 /* OpenMeteoResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BF3F99289FECDF008E7566 /* OpenMeteoResponse.swift */; }; + 25C42FFD2AC35EE2001DA5FC /* openapi.yml in Resources */ = {isa = PBXBuildFile; fileRef = 257D07DC2AC355EC005EBD16 /* openapi.yml */; }; + 25C42FFE2AC35EE2001DA5FC /* openapi-generator-config.yml in Resources */ = {isa = PBXBuildFile; fileRef = 257D07DE2AC3561C005EBD16 /* openapi-generator-config.yml */; }; + 25C4300F2AC36165001DA5FC /* OpenAPIRuntime in Frameworks */ = {isa = PBXBuildFile; productRef = 25C4300E2AC36165001DA5FC /* OpenAPIRuntime */; }; + 25C430122AC36173001DA5FC /* OpenAPIURLSession in Frameworks */ = {isa = PBXBuildFile; productRef = 25C430112AC36173001DA5FC /* OpenAPIURLSession */; }; + 25CB17DE2B46EB61001D973A /* LegalTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17DD2B46EB61001D973A /* LegalTextView.swift */; }; + 25CB17E32B470335001D973A /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E22B470335001D973A /* APIClient.swift */; }; + 25CB17E52B4703CD001D973A /* WeatherObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E42B4703CD001D973A /* WeatherObservable.swift */; }; + 25CB17E82B47043A001D973A /* GlobalViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E72B47043A001D973A /* GlobalViewExtensions.swift */; }; + 25CB17EA2B470461001D973A /* APIResultExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CB17E92B470461001D973A /* APIResultExtensions.swift */; }; + 25CB17EB2B4704E1001D973A /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D003C526CD490200FFF8B8 /* LocationManager.swift */; }; + 25CB17EC2B4704E1001D973A /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D003C526CD490200FFF8B8 /* LocationManager.swift */; }; + 25CB17ED2B4704E2001D973A /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D003C526CD490200FFF8B8 /* LocationManager.swift */; }; + 25CBB63C2B44A13600223B69 /* WeatherSimulationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CBB63B2B44A13600223B69 /* WeatherSimulationView.swift */; }; 25D003C626CD490200FFF8B8 /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D003C526CD490200FFF8B8 /* LocationManager.swift */; }; 25D72B2727C67016001F43FC /* SettingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D72B2627C67016001F43FC /* SettingService.swift */; }; - 25D90A5326C40DB800128F7A /* WeatherMapsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D90A5226C40DB800128F7A /* WeatherMapsResponse.swift */; }; 25DA7A1A27A420970062E02B /* MapDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25DA7A1927A420970062E02B /* MapDetailView.swift */; }; - 25E0170528EAE8460037ED8C /* OpenMeteoResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25BF3F99289FECDF008E7566 /* OpenMeteoResponse.swift */; }; - 25E30B2B26CD9B31007F468D /* CityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E30B2A26CD9B31007F468D /* CityService.swift */; }; + 25DEA6152BCDA4CA00D403D5 /* WMSTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 251FE39027C5674400D26F0F /* WMSTileOverlay.swift */; }; 25ED4A4727A2F5C60050C4A9 /* HeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED4A4627A2F5C60050C4A9 /* HeadView.swift */; }; 25ED799529F1A7C6002E0AAB /* Color-Interpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED799429F1A7C6002E0AAB /* Color-Interpolation.swift */; }; 25ED79AB29F1A7DF002E0AAB /* Meteor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED799629F1A7DD002E0AAB /* Meteor.swift */; }; @@ -82,7 +120,6 @@ 25ED79BD29F1A7DF002E0AAB /* SunView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79A829F1A7DF002E0AAB /* SunView.swift */; }; 25ED79BE29F1A7DF002E0AAB /* Array-GradientStop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79A929F1A7DF002E0AAB /* Array-GradientStop.swift */; }; 25ED79BF29F1A7DF002E0AAB /* Storm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25ED79AA29F1A7DF002E0AAB /* Storm.swift */; }; - 25EE9F2326E4F7AF0066C362 /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D003C526CD490200FFF8B8 /* LocationManager.swift */; }; 3E22B523251D151300D86A58 /* WeatherApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB89014251A55700028FED0 /* WeatherApp.swift */; }; 3E6117082544B27600B68120 /* HourlyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6117072544B27600B68120 /* HourlyView.swift */; }; 3E61170C2544B2D300B68120 /* DailyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E61170B2544B2D300B68120 /* DailyView.swift */; }; @@ -92,8 +129,16 @@ 3EB8902B251A55950028FED0 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EB8902A251A55950028FED0 /* WidgetKit.framework */; }; 3EB8902D251A55950028FED0 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EB8902C251A55950028FED0 /* SwiftUI.framework */; }; 3EB89032251A55980028FED0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3EB89031251A55980028FED0 /* Assets.xcassets */; }; - 3EB89036251A55980028FED0 /* Oscar°WidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 3EB89028251A55950028FED0 /* Oscar°WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 3EB89036251A55980028FED0 /* Oscar°WidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3EB89028251A55950028FED0 /* Oscar°WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 3ED4AEB0254551DE0057DF2F /* OscarWidgetsBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED4AEAF254551DD0057DF2F /* OscarWidgetsBundle.swift */; }; + 6E00C5282B59E36D00C1A805 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6E00C5272B59E36D00C1A805 /* Localizable.xcstrings */; }; + 6E00C52A2B59E44A00C1A805 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6E00C5292B59E44A00C1A805 /* Localizable.xcstrings */; }; + 6E11533D2B59C965004D3273 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6E11533C2B59C965004D3273 /* Localizable.xcstrings */; }; + 6E1153412B59C98B004D3273 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6E1153402B59C98B004D3273 /* Localizable.xcstrings */; }; + 6E1153432B59C9A4004D3273 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6E1153422B59C9A4004D3273 /* InfoPlist.xcstrings */; }; + 6E5CBE2E2B5F12400045DCE4 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6E5CBE2D2B5F12400045DCE4 /* InfoPlist.xcstrings */; }; + 6EE66C492B59DF3700885CB7 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6EE66C482B59DF3700885CB7 /* InfoPlist.xcstrings */; }; + D580749BDBEC4BFE98D9ED6A /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 4EBF1FE0D46648989064EF72 /* Sentry */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -143,29 +188,28 @@ name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - 3EB8903A251A55980028FED0 /* Embed App Extensions */ = { + 3EB8903A251A55980028FED0 /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - 3EB89036251A55980028FED0 /* Oscar°WidgetExtension.appex in Embed App Extensions */, + 3EB89036251A55980028FED0 /* Oscar°WidgetExtension.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 2505C94C29E5F0D200BDB0A8 /* PrecipitationLockscreenWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrecipitationLockscreenWidget.swift; sourceTree = ""; }; + 2516BD552BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 251FE39027C5674400D26F0F /* WMSTileOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WMSTileOverlay.swift; sourceTree = ""; }; - 2523367C27C3E9D500C2111A /* RainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RainModel.swift; sourceTree = ""; }; 2523367E27C3EB3900C2111A /* RainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RainView.swift; sourceTree = ""; }; - 2533940727C434900087C220 /* DWDAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DWDAlerts.swift; sourceTree = ""; }; 2533940927C43F810087C220 /* AlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertView.swift; sourceTree = ""; }; 2536438026DACCB800C8A952 /* LegalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalView.swift; sourceTree = ""; }; + 253BA18B2B0941670070BD5E /* LocationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationService.swift; sourceTree = ""; }; 253F708A29510B06000BD4C0 /* AQIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AQIView.swift; sourceTree = ""; }; - 253F708C2951118D000BD4C0 /* AQIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AQIResponse.swift; sourceTree = ""; }; 25429BD029E5F94100D5979F /* Oscar°Watch Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Oscar°Watch Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 25429BD229E5F94100D5979F /* Oscar_WatchApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Oscar_WatchApp.swift; sourceTree = ""; }; 25429BD429E5F94100D5979F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -173,30 +217,40 @@ 25429BD929E5F94300D5979F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 25429BE629E5F9B000D5979F /* Oscar°WatchWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Oscar°WatchWidgetExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 25429BEA29E5F9B000D5979F /* Oscar_WatchWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Oscar_WatchWidget.swift; sourceTree = ""; }; - 25429BEC29E5F9B000D5979F /* Oscar_WatchWidget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = Oscar_WatchWidget.intentdefinition; sourceTree = ""; }; 25429BED29E5F9B300D5979F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 25429BEF29E5F9B300D5979F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2546516329E4905E00D8C13D /* TemperatureLockscreenWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemperatureLockscreenWidget.swift; sourceTree = ""; }; 2546516629E492E500D8C13D /* RadarProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadarProvider.swift; sourceTree = ""; }; 2546516929E4935600D8C13D /* LockscreenProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockscreenProvider.swift; sourceTree = ""; }; 2546516C29E494DB00D8C13D /* OMDayTemperature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OMDayTemperature.swift; sourceTree = ""; }; - 255ED6E227A6D67800AE9696 /* BrightskyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrightskyResponse.swift; sourceTree = ""; }; - 258428B72A18C5230033E5A3 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; - 2596CBBE258BE65300B1C200 /* NowViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowViewModel.swift; sourceTree = ""; }; - 259704E02757D19C00DFCA53 /* AlertResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertResponse.swift; sourceTree = ""; }; + 255950942B45B16000122324 /* SearchCityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCityView.swift; sourceTree = ""; }; + 256FDAC42BCB14D000E18655 /* GlobalRadarWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalRadarWidget.swift; sourceTree = ""; }; + 256FDAC62BCB14DA00E18655 /* GlobalRadarProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalRadarProvider.swift; sourceTree = ""; }; + 2575A1D32B53519E006005FC /* Oscar°.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Oscar°.entitlements"; sourceTree = ""; }; + 2575A1D42B5351B3006005FC /* Oscar°WidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Oscar°WidgetExtension.entitlements"; sourceTree = ""; }; + 257D07DC2AC355EC005EBD16 /* openapi.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = openapi.yml; sourceTree = ""; }; + 257D07DE2AC3561C005EBD16 /* openapi-generator-config.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = "openapi-generator-config.yml"; sourceTree = ""; }; + 257EB3702BD8328A00E46468 /* HapticsExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HapticsExtension.swift; sourceTree = ""; }; + 258EE2EC2B5EF4E900AE942B /* RetryClientMiddleware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryClientMiddleware.swift; sourceTree = ""; }; + 259623CF2A2BD6BF00BA75F6 /* HomeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeProvider.swift; sourceTree = ""; }; + 259623D12A2BD72C00BA75F6 /* NowTodayWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowTodayWidget.swift; sourceTree = ""; }; 259704E42757D7E800DFCA53 /* AlertDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertDetailView.swift; sourceTree = ""; }; 259EDA6B29ABC19F00F94996 /* RainRadarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RainRadarView.swift; sourceTree = ""; }; 25A0CEDC26C4068300DD4A79 /* RadarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadarView.swift; sourceTree = ""; }; + 25AD38E62BE716E100A8F305 /* MemoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryView.swift; sourceTree = ""; }; + 25B4C45A2B57441F0069B3B0 /* ci_post_clone.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = ""; }; 25BEDCE326CACF7D00D90D6B /* DataModels.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = DataModels.xcdatamodel; sourceTree = ""; }; 25BEDCE526CACFC900D90D6B /* PersistenceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceController.swift; sourceTree = ""; }; - 25BEDCE726CAD02A00D90D6B /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; - 25BEDCE926CAD10B00D90D6B /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = ""; }; - 25BF3F99289FECDF008E7566 /* OpenMeteoResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenMeteoResponse.swift; sourceTree = ""; }; + 25CB17DD2B46EB61001D973A /* LegalTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalTextView.swift; sourceTree = ""; }; + 25CB17E22B470335001D973A /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; + 25CB17E42B4703CD001D973A /* WeatherObservable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherObservable.swift; sourceTree = ""; }; + 25CB17E72B47043A001D973A /* GlobalViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalViewExtensions.swift; sourceTree = ""; }; + 25CB17E92B470461001D973A /* APIResultExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIResultExtensions.swift; sourceTree = ""; }; + 25CBB63B2B44A13600223B69 /* WeatherSimulationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherSimulationView.swift; sourceTree = ""; }; 25D003C526CD490200FFF8B8 /* LocationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationManager.swift; sourceTree = ""; }; 25D72B2627C67016001F43FC /* SettingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingService.swift; sourceTree = ""; }; - 25D90A5226C40DB800128F7A /* WeatherMapsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherMapsResponse.swift; sourceTree = ""; }; 25DA7A1927A420970062E02B /* MapDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDetailView.swift; sourceTree = ""; }; 25E30B2A26CD9B31007F468D /* CityService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CityService.swift; sourceTree = ""; }; + 25ECE65D2BDA1F250088B302 /* ci_post_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_xcodebuild.sh; sourceTree = ""; }; 25ED4A4627A2F5C60050C4A9 /* HeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadView.swift; sourceTree = ""; }; 25ED799429F1A7C6002E0AAB /* Color-Interpolation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Color-Interpolation.swift"; sourceTree = ""; }; 25ED799629F1A7DD002E0AAB /* Meteor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Meteor.swift; sourceTree = ""; }; @@ -220,14 +274,22 @@ 3EB89016251A55700028FED0 /* NowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowView.swift; sourceTree = ""; }; 3EB89018251A55740028FED0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 3EB8901B251A55740028FED0 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 3EB8901D251A55740028FED0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3EB89028251A55950028FED0 /* Oscar°WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Oscar°WidgetExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 3EB8902A251A55950028FED0 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 3EB8902C251A55950028FED0 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 3EB8902F251A55950028FED0 /* RadarWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadarWidget.swift; sourceTree = ""; }; 3EB89031251A55980028FED0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 3EB89033251A55980028FED0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3ED4AEAF254551DD0057DF2F /* OscarWidgetsBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OscarWidgetsBundle.swift; sourceTree = ""; }; + 6E00C5272B59E36D00C1A805 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 6E00C5292B59E44A00C1A805 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 6E11533C2B59C965004D3273 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 6E1153402B59C98B004D3273 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 6E1153422B59C9A4004D3273 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; + 6E5CBE2D2B5F12400045DCE4 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; + 6EE66C482B59DF3700885CB7 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; + 6EFBD1822B56FB1700D6E38E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6EFBD1842B56FB1C00D6E38E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6EFBD1862B56FB2100D6E38E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -235,6 +297,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 255BDDA02BD9B2E40061E4EB /* (null) in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -242,9 +305,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 25429BFA29E5FA5300D5979F /* Alamofire in Frameworks */, 25429BE829E5F9B000D5979F /* SwiftUI.framework in Frameworks */, + 257EB3532BD8312000E46468 /* OpenAPIRuntime in Frameworks */, + 257EB3552BD8312500E46468 /* OpenAPIURLSession in Frameworks */, 25429BE729E5F9B000D5979F /* WidgetKit.framework in Frameworks */, + 255BDDA12BD9B2E40061E4EB /* (null) in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -252,9 +317,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 259704DF2757CB0D00DFCA53 /* Alamofire in Frameworks */, + 255BDD9F2BD9B2E40061E4EB /* Sentry in Frameworks */, + 25B734172BD9BB86003C6756 /* SentrySwiftUI in Frameworks */, 258B223229A81E7500E4ECCE /* Charts in Frameworks */, - 25288A0126D130E300A612AF /* SPIndicator in Frameworks */, + 25C4300F2AC36165001DA5FC /* OpenAPIRuntime in Frameworks */, + 25C430122AC36173001DA5FC /* OpenAPIURLSession in Frameworks */, + 255BDD9E2BD9B2E40061E4EB /* (null) in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -262,9 +330,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2590816B28EADDB500886A0E /* Alamofire in Frameworks */, 3EB8902D251A55950028FED0 /* SwiftUI.framework in Frameworks */, + 253F708C2B5316A90075D093 /* OpenAPIRuntime in Frameworks */, + 253F708E2B5316A90075D093 /* OpenAPIURLSession in Frameworks */, 3EB8902B251A55950028FED0 /* WidgetKit.framework in Frameworks */, + D580749BDBEC4BFE98D9ED6A /* Sentry in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -278,6 +348,7 @@ 25429BD429E5F94100D5979F /* ContentView.swift */, 25429BD629E5F94300D5979F /* Assets.xcassets */, 25429BD829E5F94300D5979F /* Preview Content */, + 6E00C5292B59E44A00C1A805 /* Localizable.xcstrings */, ); path = "Oscar°Watch Watch App"; sourceTree = ""; @@ -294,9 +365,10 @@ isa = PBXGroup; children = ( 25429BEA29E5F9B000D5979F /* Oscar_WatchWidget.swift */, - 25429BEC29E5F9B000D5979F /* Oscar_WatchWidget.intentdefinition */, 25429BED29E5F9B300D5979F /* Assets.xcassets */, - 25429BEF29E5F9B300D5979F /* Info.plist */, + 6EFBD1842B56FB1C00D6E38E /* Info.plist */, + 6E00C5272B59E36D00C1A805 /* Localizable.xcstrings */, + 6E5CBE2D2B5F12400045DCE4 /* InfoPlist.xcstrings */, ); path = "Oscar°WatchWidget"; sourceTree = ""; @@ -328,15 +400,6 @@ path = Models; sourceTree = ""; }; - 255C23A7258F90F30066B2BD /* ViewModels */ = { - isa = PBXGroup; - children = ( - 2596CBBE258BE65300B1C200 /* NowViewModel.swift */, - 25BEDCE726CAD02A00D90D6B /* SearchViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; 255C23AE258F93900066B2BD /* NowSubViews */ = { isa = PBXGroup; children = ( @@ -347,10 +410,40 @@ 2523367E27C3EB3900C2111A /* RainView.swift */, 2533940927C43F810087C220 /* AlertView.swift */, 253F708A29510B06000BD4C0 /* AQIView.swift */, + 25CBB63B2B44A13600223B69 /* WeatherSimulationView.swift */, + 25CB17DD2B46EB61001D973A /* LegalTextView.swift */, + 25AD38E62BE716E100A8F305 /* MemoryView.swift */, ); path = NowSubViews; sourceTree = ""; }; + 256FDAC12BCB14B200E18655 /* GlobalRadarWidget */ = { + isa = PBXGroup; + children = ( + 256FDAC62BCB14DA00E18655 /* GlobalRadarProvider.swift */, + 256FDAC42BCB14D000E18655 /* GlobalRadarWidget.swift */, + ); + path = GlobalRadarWidget; + sourceTree = ""; + }; + 259623CE2A2BD6A000BA75F6 /* Home */ = { + isa = PBXGroup; + children = ( + 259623CF2A2BD6BF00BA75F6 /* HomeProvider.swift */, + 259623D12A2BD72C00BA75F6 /* NowTodayWidget.swift */, + ); + path = Home; + sourceTree = ""; + }; + 25B4C4592B5744000069B3B0 /* ci_scripts */ = { + isa = PBXGroup; + children = ( + 25B4C45A2B57441F0069B3B0 /* ci_post_clone.sh */, + 25ECE65D2BDA1F250088B302 /* ci_post_xcodebuild.sh */, + ); + path = ci_scripts; + sourceTree = ""; + }; 25BEDCE126CACF2900D90D6B /* Storage */ = { isa = PBXGroup; children = ( @@ -362,6 +455,30 @@ path = Storage; sourceTree = ""; }; + 25CB17E02B4702D1001D973A /* Networking */ = { + isa = PBXGroup; + children = ( + 257D07DC2AC355EC005EBD16 /* openapi.yml */, + 257D07DE2AC3561C005EBD16 /* openapi-generator-config.yml */, + 25CB17E22B470335001D973A /* APIClient.swift */, + 25D003C526CD490200FFF8B8 /* LocationManager.swift */, + 253BA18B2B0941670070BD5E /* LocationService.swift */, + 25CB17E42B4703CD001D973A /* WeatherObservable.swift */, + 258EE2EC2B5EF4E900AE942B /* RetryClientMiddleware.swift */, + ); + path = Networking; + sourceTree = ""; + }; + 25CB17E62B470429001D973A /* Extensions */ = { + isa = PBXGroup; + children = ( + 25CB17E72B47043A001D973A /* GlobalViewExtensions.swift */, + 25CB17E92B470461001D973A /* APIResultExtensions.swift */, + 257EB3702BD8328A00E46468 /* HapticsExtension.swift */, + ); + path = Extensions; + sourceTree = ""; + }; 25ED799329F1A79D002E0AAB /* Backgrounds */ = { isa = PBXGroup; children = ( @@ -384,27 +501,13 @@ path = Backgrounds; sourceTree = ""; }; - 3E279B21252C752600BAAA20 /* Models */ = { - isa = PBXGroup; - children = ( - 255ED6E227A6D67800AE9696 /* BrightskyResponse.swift */, - 25D90A5226C40DB800128F7A /* WeatherMapsResponse.swift */, - 259704E02757D19C00DFCA53 /* AlertResponse.swift */, - 2523367C27C3E9D500C2111A /* RainModel.swift */, - 2533940727C434900087C220 /* DWDAlerts.swift */, - 253F708C2951118D000BD4C0 /* AQIResponse.swift */, - 25BF3F99289FECDF008E7566 /* OpenMeteoResponse.swift */, - ); - path = Models; - sourceTree = ""; - }; 3E89BBA6252EFEC5006F7BCC /* Views */ = { isa = PBXGroup; children = ( 25ED799329F1A79D002E0AAB /* Backgrounds */, 255C23AE258F93900066B2BD /* NowSubViews */, 3EB89016251A55700028FED0 /* NowView.swift */, - 25BEDCE926CAD10B00D90D6B /* SearchView.swift */, + 255950942B45B16000122324 /* SearchCityView.swift */, 2536438026DACCB800C8A952 /* LegalView.swift */, 259704E42757D7E800DFCA53 /* AlertDetailView.swift */, 25DA7A1927A420970062E02B /* MapDetailView.swift */, @@ -421,6 +524,7 @@ 3EB8902E251A55950028FED0 /* Oscar°Widget */, 25429BD129E5F94100D5979F /* Oscar°Watch Watch App */, 25429BE929E5F9B000D5979F /* Oscar°WatchWidget */, + 25B4C4592B5744000069B3B0 /* ci_scripts */, 3EB89029251A55950028FED0 /* Frameworks */, 3EB89012251A55700028FED0 /* Products */, ); @@ -440,16 +544,18 @@ 3EB89013251A55700028FED0 /* Oscar° */ = { isa = PBXGroup; children = ( + 25CB17E62B470429001D973A /* Extensions */, 25BEDCE126CACF2900D90D6B /* Storage */, 3E89BBA6252EFEC5006F7BCC /* Views */, - 255C23A7258F90F30066B2BD /* ViewModels */, - 3E279B21252C752600BAAA20 /* Models */, + 25CB17E02B4702D1001D973A /* Networking */, 3EB89014251A55700028FED0 /* WeatherApp.swift */, - 25D003C526CD490200FFF8B8 /* LocationManager.swift */, + 2575A1D32B53519E006005FC /* Oscar°.entitlements */, 3EB89018251A55740028FED0 /* Assets.xcassets */, - 3EB8901D251A55740028FED0 /* Info.plist */, + 6EFBD1862B56FB2100D6E38E /* Info.plist */, + 6EE66C482B59DF3700885CB7 /* InfoPlist.xcstrings */, + 6E11533C2B59C965004D3273 /* Localizable.xcstrings */, + 2516BD552BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy */, 3EB8901A251A55740028FED0 /* Preview Content */, - 258428B72A18C5230033E5A3 /* Launch Screen.storyboard */, ); path = "Oscar°"; sourceTree = ""; @@ -474,12 +580,17 @@ 3EB8902E251A55950028FED0 /* Oscar°Widget */ = { isa = PBXGroup; children = ( + 259623CE2A2BD6A000BA75F6 /* Home */, 2546516B29E4941700D8C13D /* Models */, 2546516829E4933800D8C13D /* Lockscreen */, 2546516529E492D200D8C13D /* Radar */, + 256FDAC12BCB14B200E18655 /* GlobalRadarWidget */, 3ED4AEAF254551DD0057DF2F /* OscarWidgetsBundle.swift */, + 2575A1D42B5351B3006005FC /* Oscar°WidgetExtension.entitlements */, 3EB89031251A55980028FED0 /* Assets.xcassets */, - 3EB89033251A55980028FED0 /* Info.plist */, + 6EFBD1822B56FB1700D6E38E /* Info.plist */, + 6E1153402B59C98B004D3273 /* Localizable.xcstrings */, + 6E1153422B59C9A4004D3273 /* InfoPlist.xcstrings */, ); path = "Oscar°Widget"; sourceTree = ""; @@ -517,10 +628,12 @@ buildRules = ( ); dependencies = ( + 257EB3572BD8314200E46468 /* PBXTargetDependency */, ); name = "Oscar°WatchWidgetExtension"; packageProductDependencies = ( - 25429BF929E5FA5300D5979F /* Alamofire */, + 257EB3522BD8312000E46468 /* OpenAPIRuntime */, + 257EB3542BD8312500E46468 /* OpenAPIURLSession */, ); productName = "Oscar°WatchWidgetExtension"; productReference = 25429BE629E5F9B000D5979F /* Oscar°WatchWidgetExtension.appex */; @@ -533,20 +646,24 @@ 3EB8900D251A55700028FED0 /* Sources */, 3EB8900E251A55700028FED0 /* Frameworks */, 3EB8900F251A55700028FED0 /* Resources */, - 3EB8903A251A55980028FED0 /* Embed App Extensions */, + 3EB8903A251A55980028FED0 /* Embed Foundation Extensions */, 25429BDE29E5F94300D5979F /* Embed Watch Content */, + 99EB13A1B51E4E3299FDEFFF /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); dependencies = ( + 25CBB6352B44648400223B69 /* PBXTargetDependency */, 3EB89035251A55980028FED0 /* PBXTargetDependency */, 25429BDC29E5F94300D5979F /* PBXTargetDependency */, ); name = "Oscar°"; packageProductDependencies = ( - 25288A0026D130E300A612AF /* SPIndicator */, - 259704DE2757CB0D00DFCA53 /* Alamofire */, 258B223129A81E7500E4ECCE /* Charts */, + 25C4300E2AC36165001DA5FC /* OpenAPIRuntime */, + 25C430112AC36173001DA5FC /* OpenAPIURLSession */, + 4EBF1FE0D46648989064EF72 /* Sentry */, + 25B734162BD9BB86003C6756 /* SentrySwiftUI */, ); productName = Weather; productReference = 3EB89011251A55700028FED0 /* Oscar°.app */; @@ -563,10 +680,12 @@ buildRules = ( ); dependencies = ( + 253F708A2B53167D0075D093 /* PBXTargetDependency */, ); name = "Oscar°WidgetExtension"; packageProductDependencies = ( - 2590816A28EADDB500886A0E /* Alamofire */, + 253F708B2B5316A90075D093 /* OpenAPIRuntime */, + 253F708D2B5316A90075D093 /* OpenAPIURLSession */, ); productName = WeatherWidgetExtension; productReference = 3EB89028251A55950028FED0 /* Oscar°WidgetExtension.appex */; @@ -578,8 +697,9 @@ 3EB89009251A55700028FED0 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1200; + LastUpgradeCheck = 1520; TargetAttributes = { 25429BCF29E5F94100D5979F = { CreatedOnToolsVersion = 14.3; @@ -600,14 +720,19 @@ developmentRegion = de; hasScannedForEncodings = 0; knownRegions = ( - Base, de, + en, + tr, + Base, ); mainGroup = 3EB89008251A55700028FED0; packageReferences = ( - 252889FF26D130E300A612AF /* XCRemoteSwiftPackageReference "SPIndicator" */, 259704DD2757CB0D00DFCA53 /* XCRemoteSwiftPackageReference "Alamofire" */, 258B223029A81E7500E4ECCE /* XCRemoteSwiftPackageReference "swiftui-charts" */, + 25C430062AC3608E001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-generator" */, + 25C4300D2AC36165001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-runtime" */, + 25C430102AC36173001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-urlsession" */, + 61BF2619978C4D10BB7D4A9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */, ); productRefGroup = 3EB89012251A55700028FED0 /* Products */; projectDirPath = ""; @@ -628,6 +753,7 @@ files = ( 25429BDA29E5F94300D5979F /* Preview Assets.xcassets in Resources */, 25429BD729E5F94300D5979F /* Assets.xcassets in Resources */, + 6E00C52A2B59E44A00C1A805 /* Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -635,6 +761,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 2516BD582BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy in Resources */, + 257EB34E2BD830F300E46468 /* openapi.yml in Resources */, + 257EB34F2BD830F300E46468 /* openapi-generator-config.yml in Resources */, + 6E5CBE2E2B5F12400045DCE4 /* InfoPlist.xcstrings in Resources */, + 6E00C5282B59E36D00C1A805 /* Localizable.xcstrings in Resources */, 25429BEE29E5F9B300D5979F /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -643,7 +774,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 258428B82A18C5230033E5A3 /* Launch Screen.storyboard in Resources */, + 6EE66C492B59DF3700885CB7 /* InfoPlist.xcstrings in Resources */, + 2516BD562BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy in Resources */, + 25C42FFD2AC35EE2001DA5FC /* openapi.yml in Resources */, + 25C42FFE2AC35EE2001DA5FC /* openapi-generator-config.yml in Resources */, + 6E11533D2B59C965004D3273 /* Localizable.xcstrings in Resources */, 3EB8901C251A55740028FED0 /* Preview Assets.xcassets in Resources */, 3EB89019251A55740028FED0 /* Assets.xcassets in Resources */, ); @@ -653,18 +788,41 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 2516BD572BD9AD1E00A522D1 /* PrivacyInfo.xcprivacy in Resources */, + 253F708F2B5316BC0075D093 /* openapi.yml in Resources */, + 6E1153432B59C9A4004D3273 /* InfoPlist.xcstrings in Resources */, + 6E1153412B59C98B004D3273 /* Localizable.xcstrings in Resources */, + 253F70902B5316BC0075D093 /* openapi-generator-config.yml in Resources */, 3EB89032251A55980028FED0 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 99EB13A1B51E4E3299FDEFFF /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + ); + name = "Upload Debug Symbols to Sentry"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script is responsable to upload debug symbols and source context for Sentry.\nif which sentry-cli >/dev/null; then\nexport SENTRY_ORG=philipp-bolte\nexport SENTRY_PROJECT=apple-ios\nERROR=$(sentry-cli debug-files upload --include-sources \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 25429BCC29E5F94100D5979F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 25429BF129E5F9B300D5979F /* Oscar_WatchWidget.intentdefinition in Sources */, + 25CB17EC2B4704E1001D973A /* LocationManager.swift in Sources */, 25429BD529E5F94100D5979F /* ContentView.swift in Sources */, 25429BD329E5F94100D5979F /* Oscar_WatchApp.swift in Sources */, ); @@ -675,13 +833,20 @@ buildActionMask = 2147483647; files = ( 25429C0229E5FAF600D5979F /* OMDayTemperature.swift in Sources */, + 257EB3692BD8322A00E46468 /* RetryClientMiddleware.swift in Sources */, 25429BFC29E5FAE600D5979F /* OscarWidgetsBundle.swift in Sources */, - 25429C0329E5FB0700D5979F /* LocationManager.swift in Sources */, + 257EB35F2BD831CB00E46468 /* LocationService.swift in Sources */, + 257EB3752BD832BC00E46468 /* DataModels.xcdatamodeld in Sources */, 25429BEB29E5F9B000D5979F /* Oscar_WatchWidget.swift in Sources */, - 25429BF029E5F9B300D5979F /* Oscar_WatchWidget.intentdefinition in Sources */, + 257EB3682BD8321B00E46468 /* GlobalViewExtensions.swift in Sources */, 25429BFB29E5FAC600D5979F /* LockscreenProvider.swift in Sources */, + 257EB3602BD831D200E46468 /* CityService.swift in Sources */, 25429C0129E5FAF200D5979F /* TemperatureLockscreenWidget.swift in Sources */, 25429C0029E5FAEF00D5979F /* PrecipitationLockscreenWidget.swift in Sources */, + 257EB3642BD8321700E46468 /* APIResultExtensions.swift in Sources */, + 25CB17ED2B4704E2001D973A /* LocationManager.swift in Sources */, + 257EB35B2BD831C300E46468 /* APIClient.swift in Sources */, + 257EB3792BD832C000E46468 /* PersistenceController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -690,47 +855,48 @@ buildActionMask = 2147483647; files = ( 251FE39127C5674400D26F0F /* WMSTileOverlay.swift in Sources */, + 255950952B45B16000122324 /* SearchCityView.swift in Sources */, 253F708B29510B06000BD4C0 /* AQIView.swift in Sources */, + 25CB17E32B470335001D973A /* APIClient.swift in Sources */, 2536438126DACCB800C8A952 /* LegalView.swift in Sources */, - 25BEDCE826CAD02A00D90D6B /* SearchViewModel.swift in Sources */, - 255ED6E327A6D67800AE9696 /* BrightskyResponse.swift in Sources */, - 25BF3F9A289FECDF008E7566 /* OpenMeteoResponse.swift in Sources */, + 250163DA2B093C0B00EEF882 /* CityService.swift in Sources */, + 253BA18C2B0941670070BD5E /* LocationService.swift in Sources */, + 258EE2ED2B5EF4E900AE942B /* RetryClientMiddleware.swift in Sources */, 25ED79BE29F1A7DF002E0AAB /* Array-GradientStop.swift in Sources */, - 25E30B2B26CD9B31007F468D /* CityService.swift in Sources */, 2533940A27C43F810087C220 /* AlertView.swift in Sources */, 25ED79B429F1A7DF002E0AAB /* Cloud.swift in Sources */, 3E61170C2544B2D300B68120 /* DailyView.swift in Sources */, 25D72B2727C67016001F43FC /* SettingService.swift in Sources */, 25ED79BD29F1A7DF002E0AAB /* SunView.swift in Sources */, 25ED79B029F1A7DF002E0AAB /* StormView.swift in Sources */, + 25CB17E82B47043A001D973A /* GlobalViewExtensions.swift in Sources */, 25ED79BB29F1A7DF002E0AAB /* Star.swift in Sources */, 25ED79BF29F1A7DF002E0AAB /* Storm.swift in Sources */, - 2596CBBF258BE65300B1C200 /* NowViewModel.swift in Sources */, - 2533940827C434900087C220 /* DWDAlerts.swift in Sources */, + 25CB17EA2B470461001D973A /* APIResultExtensions.swift in Sources */, 3E22B523251D151300D86A58 /* WeatherApp.swift in Sources */, - 25BEDCEA26CAD10B00D90D6B /* SearchView.swift in Sources */, 3EB89017251A55700028FED0 /* NowView.swift in Sources */, 25ED79B529F1A7DF002E0AAB /* Color-Custom.swift in Sources */, + 25CB17DE2B46EB61001D973A /* LegalTextView.swift in Sources */, 25DA7A1A27A420970062E02B /* MapDetailView.swift in Sources */, 25D003C626CD490200FFF8B8 /* LocationManager.swift in Sources */, 25BEDCE426CACF7D00D90D6B /* DataModels.xcdatamodeld in Sources */, + 25CBB63C2B44A13600223B69 /* WeatherSimulationView.swift in Sources */, 25ED79AB29F1A7DF002E0AAB /* Meteor.swift in Sources */, 3E6117082544B27600B68120 /* HourlyView.swift in Sources */, 25ED79B129F1A7DF002E0AAB /* MeteorShower.swift in Sources */, + 257EB3712BD8328A00E46468 /* HapticsExtension.swift in Sources */, 25ED79B829F1A7DF002E0AAB /* CloudsView.swift in Sources */, - 259704E12757D19C00DFCA53 /* AlertResponse.swift in Sources */, 25BEDCE626CACFC900D90D6B /* PersistenceController.swift in Sources */, 259704E52757D7E800DFCA53 /* AlertDetailView.swift in Sources */, + 25CB17E52B4703CD001D973A /* WeatherObservable.swift in Sources */, + 25AD38E72BE716E100A8F305 /* MemoryView.swift in Sources */, 25ED4A4727A2F5C60050C4A9 /* HeadView.swift in Sources */, - 25D90A5326C40DB800128F7A /* WeatherMapsResponse.swift in Sources */, 25ED79B329F1A7DF002E0AAB /* CloudGroup.swift in Sources */, - 2523367D27C3E9D500C2111A /* RainModel.swift in Sources */, 25ED79BC29F1A7DF002E0AAB /* StormDrop.swift in Sources */, 2523367F27C3EB3900C2111A /* RainView.swift in Sources */, 25A0CEDD26C4068300DD4A79 /* RadarView.swift in Sources */, 25ED79B229F1A7DF002E0AAB /* StarField.swift in Sources */, 25ED799529F1A7C6002E0AAB /* Color-Interpolation.swift in Sources */, - 253F708D2951118D000BD4C0 /* AQIResponse.swift in Sources */, 25ED79AF29F1A7DF002E0AAB /* StarsView.swift in Sources */, 259EDA6C29ABC19F00F94996 /* RainRadarView.swift in Sources */, ); @@ -741,17 +907,31 @@ buildActionMask = 2147483647; files = ( 25761D5129F1D083006976BE /* StormDrop.swift in Sources */, + 253F70972B5319EC0075D093 /* PersistenceController.swift in Sources */, 2546516D29E494DB00D8C13D /* OMDayTemperature.swift in Sources */, - 25E0170528EAE8460037ED8C /* OpenMeteoResponse.swift in Sources */, + 253F70872B5314B70075D093 /* APIClient.swift in Sources */, 25761D4F29F1CC85006976BE /* Cloud.swift in Sources */, + 25DEA6152BCDA4CA00D403D5 /* WMSTileOverlay.swift in Sources */, 25761D5029F1CF14006976BE /* Storm.swift in Sources */, + 253F70962B5319DD0075D093 /* CityService.swift in Sources */, + 259623D02A2BD6BF00BA75F6 /* HomeProvider.swift in Sources */, + 258EE2F62B5EF58100AE942B /* RetryClientMiddleware.swift in Sources */, + 253F70932B5319D20075D093 /* LocationService.swift in Sources */, + 2576B2032B586E6C004E288A /* GlobalViewExtensions.swift in Sources */, 2546516429E4905E00D8C13D /* TemperatureLockscreenWidget.swift in Sources */, - 25EE9F2326E4F7AF0066C362 /* LocationManager.swift in Sources */, + 253BA17F2B093CE30070BD5E /* DataModels.xcdatamodeld in Sources */, + 259623D52A2BD97300BA75F6 /* Array-GradientStop.swift in Sources */, + 256FDACA2BCB164F00E18655 /* GlobalRadarProvider.swift in Sources */, + 259623D42A2BD96600BA75F6 /* Color-Interpolation.swift in Sources */, 253F70892950FA0F000BD4C0 /* RadarWidget.swift in Sources */, - 2535259E26DB7FDF000AA927 /* WeatherMapsResponse.swift in Sources */, + 259623D32A2BD79200BA75F6 /* NowTodayWidget.swift in Sources */, 2546516729E492E500D8C13D /* RadarProvider.swift in Sources */, + 259623D62A2BD97C00BA75F6 /* Color-Custom.swift in Sources */, 3ED4AEB0254551DE0057DF2F /* OscarWidgetsBundle.swift in Sources */, + 256FDAC92BCB164C00E18655 /* GlobalRadarWidget.swift in Sources */, 2505C94D29E5F0D200BDB0A8 /* PrecipitationLockscreenWidget.swift in Sources */, + 253F709C2B5333BE0075D093 /* APIResultExtensions.swift in Sources */, + 25CB17EB2B4704E1001D973A /* LocationManager.swift in Sources */, 2546516A29E4935600D8C13D /* LockscreenProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -759,6 +939,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 253F708A2B53167D0075D093 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = 253F70892B53167D0075D093 /* OpenAPIGenerator */; + }; 25429BDC29E5F94300D5979F /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 25429BCF29E5F94100D5979F /* Oscar°Watch Watch App */; @@ -769,6 +953,14 @@ target = 25429BE529E5F9B000D5979F /* Oscar°WatchWidgetExtension */; targetProxy = 25429BF229E5F9B300D5979F /* PBXContainerItemProxy */; }; + 257EB3572BD8314200E46468 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = 257EB3562BD8314200E46468 /* OpenAPIGenerator */; + }; + 25CBB6352B44648400223B69 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = 25CBB6342B44648400223B69 /* OpenAPIGenerator */; + }; 3EB89035251A55980028FED0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 3EB89027251A55950028FED0 /* Oscar°WidgetExtension */; @@ -797,7 +989,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = cloud.bolte.Oscar.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -805,7 +997,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 9.4; + WATCHOS_DEPLOYMENT_TARGET = 10.0; }; name = Debug; }; @@ -829,7 +1021,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = cloud.bolte.Oscar.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -837,7 +1029,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 9.4; + WATCHOS_DEPLOYMENT_TARGET = 10.0; }; name = Release; }; @@ -860,7 +1052,7 @@ "@executable_path/../../Frameworks", "@executable_path/../../../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = "cloud.bolte.Oscar.watchkitapp.Oscar-WatchWidget"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -868,7 +1060,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 9.4; + WATCHOS_DEPLOYMENT_TARGET = 10.0; }; name = Debug; }; @@ -891,7 +1083,7 @@ "@executable_path/../../Frameworks", "@executable_path/../../../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = "cloud.bolte.Oscar.watchkitapp.Oscar-WatchWidget"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -899,7 +1091,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 9.4; + WATCHOS_DEPLOYMENT_TARGET = 10.0; }; name = Release; }; @@ -907,6 +1099,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -940,6 +1134,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -954,7 +1149,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -968,6 +1163,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1002,6 +1199,7 @@ "DEVELOPMENT_TEAM[sdk=*]" = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1010,7 +1208,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -1026,22 +1224,26 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "Oscar°/Oscar°.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 31; + CURRENT_PROJECT_VERSION = 32; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = "\"Oscar°/Preview Content\""; DEVELOPMENT_TEAM = N6J2M765XY; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = "Oscar°/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "Oscar°"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.weather"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.2.1; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = cloud.bolte.Oscar; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1053,22 +1255,26 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 31; + CODE_SIGN_ENTITLEMENTS = "Oscar°/Oscar°.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 32; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = "\"Oscar°/Preview Content\""; - DEVELOPMENT_TEAM = N6J2M765XY; + DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = "Oscar°/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "Oscar°"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.weather"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.2.1; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = cloud.bolte.Oscar; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1079,18 +1285,19 @@ buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CODE_SIGN_ENTITLEMENTS = "Oscar°Widget/Oscar°WidgetExtension.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 32; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = N6J2M765XY; INFOPLIST_FILE = "Oscar°Widget/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.2.1; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = cloud.bolte.Oscar.OscarWidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1104,18 +1311,19 @@ buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CODE_SIGN_ENTITLEMENTS = "Oscar°Widget/Oscar°WidgetExtension.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 32; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = N6J2M765XY; INFOPLIST_FILE = "Oscar°Widget/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.2.1; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = cloud.bolte.Oscar.OscarWidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1175,14 +1383,6 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 252889FF26D130E300A612AF /* XCRemoteSwiftPackageReference "SPIndicator" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/ivanvorobei/SPIndicator"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.0.0; - }; - }; 258B223029A81E7500E4ECCE /* XCRemoteSwiftPackageReference "swiftui-charts" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/spacenation/swiftui-charts"; @@ -1199,33 +1399,99 @@ minimumVersion = 5.0.0; }; }; + 25C430062AC3608E001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-generator" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-openapi-generator"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 1.1.0; + }; + }; + 25C4300D2AC36165001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-runtime" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-openapi-runtime"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 1.1.0; + }; + }; + 25C430102AC36173001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-urlsession" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-openapi-urlsession.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 1.0.0; + }; + }; + 61BF2619978C4D10BB7D4A9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/getsentry/sentry-cocoa/"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 8.0.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 25288A0026D130E300A612AF /* SPIndicator */ = { + 253F70892B53167D0075D093 /* OpenAPIGenerator */ = { + isa = XCSwiftPackageProductDependency; + package = 25C430062AC3608E001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-generator" */; + productName = "plugin:OpenAPIGenerator"; + }; + 253F708B2B5316A90075D093 /* OpenAPIRuntime */ = { isa = XCSwiftPackageProductDependency; - package = 252889FF26D130E300A612AF /* XCRemoteSwiftPackageReference "SPIndicator" */; - productName = SPIndicator; + package = 25C4300D2AC36165001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-runtime" */; + productName = OpenAPIRuntime; }; - 25429BF929E5FA5300D5979F /* Alamofire */ = { + 253F708D2B5316A90075D093 /* OpenAPIURLSession */ = { isa = XCSwiftPackageProductDependency; - package = 259704DD2757CB0D00DFCA53 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; + package = 25C430102AC36173001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-urlsession" */; + productName = OpenAPIURLSession; + }; + 257EB3522BD8312000E46468 /* OpenAPIRuntime */ = { + isa = XCSwiftPackageProductDependency; + package = 25C4300D2AC36165001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-runtime" */; + productName = OpenAPIRuntime; + }; + 257EB3542BD8312500E46468 /* OpenAPIURLSession */ = { + isa = XCSwiftPackageProductDependency; + package = 25C430102AC36173001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-urlsession" */; + productName = OpenAPIURLSession; + }; + 257EB3562BD8314200E46468 /* OpenAPIGenerator */ = { + isa = XCSwiftPackageProductDependency; + package = 25C430062AC3608E001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-generator" */; + productName = "plugin:OpenAPIGenerator"; }; 258B223129A81E7500E4ECCE /* Charts */ = { isa = XCSwiftPackageProductDependency; package = 258B223029A81E7500E4ECCE /* XCRemoteSwiftPackageReference "swiftui-charts" */; productName = Charts; }; - 2590816A28EADDB500886A0E /* Alamofire */ = { + 25B734162BD9BB86003C6756 /* SentrySwiftUI */ = { + isa = XCSwiftPackageProductDependency; + productName = SentrySwiftUI; + }; + 25C4300E2AC36165001DA5FC /* OpenAPIRuntime */ = { + isa = XCSwiftPackageProductDependency; + package = 25C4300D2AC36165001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-runtime" */; + productName = OpenAPIRuntime; + }; + 25C430112AC36173001DA5FC /* OpenAPIURLSession */ = { + isa = XCSwiftPackageProductDependency; + package = 25C430102AC36173001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-urlsession" */; + productName = OpenAPIURLSession; + }; + 25CBB6342B44648400223B69 /* OpenAPIGenerator */ = { isa = XCSwiftPackageProductDependency; - package = 259704DD2757CB0D00DFCA53 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; + package = 25C430062AC3608E001DA5FC /* XCRemoteSwiftPackageReference "swift-openapi-generator" */; + productName = "plugin:OpenAPIGenerator"; }; - 259704DE2757CB0D00DFCA53 /* Alamofire */ = { + 4EBF1FE0D46648989064EF72 /* Sentry */ = { isa = XCSwiftPackageProductDependency; - package = 259704DD2757CB0D00DFCA53 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; + package = 61BF2619978C4D10BB7D4A9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */; + productName = Sentry; }; /* End XCSwiftPackageProductDependency section */ diff --git "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved" "b/Oscar\302\260.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved" index 25ad618..c7435b4 100644 --- "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved" +++ "b/Oscar\302\260.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved" @@ -10,12 +10,93 @@ } }, { - "identity" : "spindicator", + "identity" : "openapikit", "kind" : "remoteSourceControl", - "location" : "https://github.com/ivanvorobei/SPIndicator", + "location" : "https://github.com/mattpolzin/OpenAPIKit.git", "state" : { - "revision" : "ec54c0e60a038ef7290280259638fcc22f0ceb69", - "version" : "1.3.1" + "revision" : "283454875cc6e5b2801d184d65835b92252d1784", + "version" : "3.1.2" + } + }, + { + "identity" : "sentry-cocoa", + "kind" : "remoteSourceControl", + "location" : "https://github.com/getsentry/sentry-cocoa/", + "state" : { + "revision" : "ef4fec9dfb8dd5027b09a4a5c9362feafd118e1a", + "version" : "8.24.0" + } + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms", + "state" : { + "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser.git", + "state" : { + "revision" : "c8ed701b513cf5177118a175d85fbbbcd707ab41", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "d029d9d39c87bed85b1c50adee7c41795261a192", + "version" : "1.0.6" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types", + "state" : { + "revision" : "1827dc94bdab2eb5f2fc804e9b0cb43574282566", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics", + "state" : { + "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-openapi-generator", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-generator", + "state" : { + "revision" : "76994bfc77061c6cfa3b82415613a9dfbfb47f28", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-openapi-runtime", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-runtime", + "state" : { + "revision" : "fd101c320185313bbf9c5a45b827b17eda9ff18a", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-openapi-urlsession", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-urlsession.git", + "state" : { + "revision" : "aac0a8273fa1186641e0b336da3f1be01aa6a0eb", + "version" : "1.0.0" } }, { @@ -35,6 +116,15 @@ "revision" : "c58b15c37eae9bd20525c6daa93a06a689ca75cb", "version" : "1.1.0" } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams.git", + "state" : { + "revision" : "0d9ee7ea8c4ebd4a489ad7a73d5c6cad55d6fed3", + "version" : "5.0.6" + } } ], "version" : 2 diff --git "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/bolte.xcuserdatad/UserInterfaceState.xcuserstate" "b/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/bolte.xcuserdatad/UserInterfaceState.xcuserstate" deleted file mode 100644 index 066bcff..0000000 Binary files "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/bolte.xcuserdatad/UserInterfaceState.xcuserstate" and /dev/null differ diff --git "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/bolte.xcuserdatad/WorkspaceSettings.xcsettings" "b/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/bolte.xcuserdatad/WorkspaceSettings.xcsettings" deleted file mode 100644 index 379adbe..0000000 --- "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/bolte.xcuserdatad/WorkspaceSettings.xcsettings" +++ /dev/null @@ -1,18 +0,0 @@ - - - - - BuildLocationStyle - UseAppPreferences - CustomBuildLocationType - RelativeToDerivedData - DerivedDataLocationStyle - Default - IssueFilterStyle - ShowActiveSchemeOnly - LiveSourceIssuesEnabled - - ShowSharedSchemesAutomaticallyEnabled - - - diff --git "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/philippbolte.xcuserdatad/UserInterfaceState.xcuserstate" "b/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/philippbolte.xcuserdatad/UserInterfaceState.xcuserstate" deleted file mode 100644 index fd49f02..0000000 Binary files "a/Oscar\302\260.xcodeproj/project.xcworkspace/xcuserdata/philippbolte.xcuserdatad/UserInterfaceState.xcuserstate" and /dev/null differ diff --git "a/Oscar\302\260.xcodeproj/xcshareddata/xcschemes/Oscar\302\260.xcscheme" "b/Oscar\302\260.xcodeproj/xcshareddata/xcschemes/Oscar\302\260.xcscheme" index 1bd5fe7..5bb3010 100644 --- "a/Oscar\302\260.xcodeproj/xcshareddata/xcschemes/Oscar\302\260.xcscheme" +++ "b/Oscar\302\260.xcodeproj/xcshareddata/xcschemes/Oscar\302\260.xcscheme" @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - diff --git "a/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/Weather.xcscheme" "b/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/Weather.xcscheme" deleted file mode 100644 index c356b6a..0000000 --- "a/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/Weather.xcscheme" +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git "a/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/WeatherWidgetExtension.xcscheme" "b/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/WeatherWidgetExtension.xcscheme" deleted file mode 100644 index 43a3e44..0000000 --- "a/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/WeatherWidgetExtension.xcscheme" +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git "a/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/xcschememanagement.plist" "b/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/xcschememanagement.plist" deleted file mode 100644 index 37f2664..0000000 --- "a/Oscar\302\260.xcodeproj/xcuserdata/bolte.xcuserdatad/xcschemes/xcschememanagement.plist" +++ /dev/null @@ -1,56 +0,0 @@ - - - - - SchemeUserState - - Oscar°.xcscheme_^#shared#^_ - - orderHint - 2 - - Oscar°Watch Watch App.xcscheme_^#shared#^_ - - orderHint - 4 - - Oscar°WatchWidgetExtension.xcscheme_^#shared#^_ - - orderHint - 5 - - Oscar°WidgetExtension.xcscheme_^#shared#^_ - - orderHint - 3 - - Weather.xcscheme - - isShown - - orderHint - 0 - - WeatherWidgetExtension.xcscheme - - isShown - - orderHint - 1 - - - SuppressBuildableAutocreation - - 3EB89010251A55700028FED0 - - primary - - - 3EB89027251A55950028FED0 - - primary - - - - - diff --git "a/Oscar\302\260.xcodeproj/xcuserdata/philippbolte.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist" "b/Oscar\302\260.xcodeproj/xcuserdata/philippbolte.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist" deleted file mode 100644 index bccd0e1..0000000 --- "a/Oscar\302\260.xcodeproj/xcuserdata/philippbolte.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist" +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git "a/Oscar\302\260.xcodeproj/xcuserdata/philippbolte.xcuserdatad/xcschemes/xcschememanagement.plist" "b/Oscar\302\260.xcodeproj/xcuserdata/philippbolte.xcuserdatad/xcschemes/xcschememanagement.plist" deleted file mode 100644 index 19afa58..0000000 --- "a/Oscar\302\260.xcodeproj/xcuserdata/philippbolte.xcuserdatad/xcschemes/xcschememanagement.plist" +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - Weather.xcscheme_^#shared#^_ - - orderHint - 0 - - WeatherWidgetExtension.xcscheme_^#shared#^_ - - orderHint - 1 - - - SuppressBuildableAutocreation - - 3EB89010251A55700028FED0 - - primary - - - 3EB89027251A55950028FED0 - - primary - - - - - diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/100.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/100.png" deleted file mode 100644 index 8a98f85..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/100.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/1024.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/1024.png" deleted file mode 100644 index 821e2b3..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/1024.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/114.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/114.png" deleted file mode 100644 index 65c1cd2..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/114.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/120.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/120.png" deleted file mode 100644 index 0e441ea..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/120.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/144.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/144.png" deleted file mode 100644 index e1735ab..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/144.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/152.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/152.png" deleted file mode 100644 index 4059e8e..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/152.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/167.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/167.png" deleted file mode 100644 index 1a13457..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/167.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/180.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/180.png" deleted file mode 100644 index defa16f..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/180.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/20.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/20.png" deleted file mode 100644 index 42ac144..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/20.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/29.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/29.png" deleted file mode 100644 index a1057d0..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/29.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/40.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/40.png" deleted file mode 100644 index 0b4750b..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/40.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/50.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/50.png" deleted file mode 100644 index a061b3e..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/50.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/57.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/57.png" deleted file mode 100644 index b5974c4..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/57.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/58.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/58.png" deleted file mode 100644 index 9dfd451..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/58.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/60.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/60.png" deleted file mode 100644 index 5eef906..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/60.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/72.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/72.png" deleted file mode 100644 index e167d3f..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/72.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/76.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/76.png" deleted file mode 100644 index 16c75a7..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/76.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/80.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/80.png" deleted file mode 100644 index e2247c7..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/80.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/87.png" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/87.png" deleted file mode 100644 index e34591f..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/87.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/Contents.json" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/Contents.json" index 4fdf882..25882ca 100644 --- "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/Contents.json" +++ "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/Contents.json" @@ -1,153 +1,9 @@ { "images" : [ { - "filename" : "40.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "60.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "58.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "87.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "80.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "57.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "57x57" - }, - { - "filename" : "114.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "57x57" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "180.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "20.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "40.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "58.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "40.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "80.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "50.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "50x50" - }, - { - "filename" : "100.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "50x50" - }, - { - "filename" : "72.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "72x72" - }, - { - "filename" : "144.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "72x72" - }, - { - "filename" : "76.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "152.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "167.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "1024.png", - "idiom" : "ios-marketing", - "scale" : "1x", + "filename" : "OscarIcon.jpg", + "idiom" : "universal", + "platform" : "ios", "size" : "1024x1024" } ], diff --git "a/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/OscarIcon.jpg" "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/OscarIcon.jpg" new file mode 100644 index 0000000..8d469d8 Binary files /dev/null and "b/Oscar\302\260/Assets.xcassets/AppIcon.appiconset/OscarIcon.jpg" differ diff --git "a/Oscar\302\260/Assets.xcassets/clear-day.imageset/26.png" "b/Oscar\302\260/Assets.xcassets/clear-day.imageset/26.png" deleted file mode 100644 index e5ef357..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/clear-day.imageset/26.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/clear-night.imageset/10.png" "b/Oscar\302\260/Assets.xcassets/clear-night.imageset/10.png" deleted file mode 100644 index af82ff3..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/clear-night.imageset/10.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/cloudy.imageset/35.png" "b/Oscar\302\260/Assets.xcassets/cloudy.imageset/35.png" deleted file mode 100644 index 6cf550f..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/cloudy.imageset/35.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/cloudy.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/daniela.imageset/Contents.json" similarity index 88% rename from "Oscar\302\260/Assets.xcassets/cloudy.imageset/Contents.json" rename to "Oscar\302\260/Assets.xcassets/daniela.imageset/Contents.json" index 3fe85eb..5c139df 100644 --- "a/Oscar\302\260/Assets.xcassets/cloudy.imageset/Contents.json" +++ "b/Oscar\302\260/Assets.xcassets/daniela.imageset/Contents.json" @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "35.png", + "filename" : "daniela.jpeg", "idiom" : "universal", "scale" : "1x" }, diff --git "a/Oscar\302\260/Assets.xcassets/daniela.imageset/daniela.jpeg" "b/Oscar\302\260/Assets.xcassets/daniela.imageset/daniela.jpeg" new file mode 100644 index 0000000..786787f Binary files /dev/null and "b/Oscar\302\260/Assets.xcassets/daniela.imageset/daniela.jpeg" differ diff --git "a/Oscar\302\260/Assets.xcassets/fog.imageset/fog.png" "b/Oscar\302\260/Assets.xcassets/fog.imageset/fog.png" deleted file mode 100644 index 904c45e..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/fog.imageset/fog.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-1.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-1.colorset/Contents.json" deleted file mode 100644 index 60c6ece..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-1.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.278", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.280", - "green" : "0.188", - "red" : "0.146" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-2.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-2.colorset/Contents.json" deleted file mode 100644 index 8c23e94..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-2.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.137", - "green" : "0.119", - "red" : "0.046" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.137", - "green" : "0.119", - "red" : "0.046" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-3.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-3.colorset/Contents.json" deleted file mode 100644 index 5e7b36e..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-3.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.314", - "green" : "0.046", - "red" : "0.126" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.314", - "green" : "0.046", - "red" : "0.126" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-4.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-4.colorset/Contents.json" deleted file mode 100644 index 8e17746..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-4.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.380", - "green" : "0.112", - "red" : "0.126" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.380", - "green" : "0.112", - "red" : "0.126" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-5.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-5.colorset/Contents.json" deleted file mode 100644 index 0a1c179..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-5.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.421", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.421", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-6.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-6.colorset/Contents.json" deleted file mode 100644 index 36a9dbb..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-6.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.466", - "green" : "0.155", - "red" : "0.081" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.466", - "green" : "0.155", - "red" : "0.081" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-7.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark-7.colorset/Contents.json" deleted file mode 100644 index 5c6d363..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark-7.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.360", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.360", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueDark.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueDark.colorset/Contents.json" deleted file mode 100644 index 983e55e..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueDark.colorset/Contents.json" +++ /dev/null @@ -1,41 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.278", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.278", - "green" : "0.188", - "red" : "0.145" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "localizable" : true - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-1.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueLight-1.colorset/Contents.json" deleted file mode 100644 index 82922f1..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-1.colorset/Contents.json" +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.165", - "green" : "0.110", - "red" : "0.086" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.166", - "green" : "0.112", - "red" : "0.086" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-2.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueLight-2.colorset/Contents.json" deleted file mode 100644 index 7cf1ee4..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-2.colorset/Contents.json" +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.482", - "green" : "0.231", - "red" : "0.000" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.482", - "green" : "0.231", - "red" : "0.000" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-3.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueLight-3.colorset/Contents.json" deleted file mode 100644 index ccd13f3..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-3.colorset/Contents.json" +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.686", - "green" : "0.377", - "red" : "0.000" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.686", - "green" : "0.377", - "red" : "0.000" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-4.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueLight-4.colorset/Contents.json" deleted file mode 100644 index 6efd515..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-4.colorset/Contents.json" +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.141", - "green" : "0.063", - "red" : "0.013" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.141", - "green" : "0.063", - "red" : "0.013" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-5.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueLight-5.colorset/Contents.json" deleted file mode 100644 index ff3a463..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueLight-5.colorset/Contents.json" +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.102", - "green" : "0.045", - "red" : "0.034" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.102", - "green" : "0.045", - "red" : "0.034" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/gradientBlueLight.colorset/Contents.json" "b/Oscar\302\260/Assets.xcassets/gradientBlueLight.colorset/Contents.json" deleted file mode 100644 index b0a817e..0000000 --- "a/Oscar\302\260/Assets.xcassets/gradientBlueLight.colorset/Contents.json" +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.165", - "green" : "0.110", - "red" : "0.086" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.165", - "green" : "0.110", - "red" : "0.086" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/hail.imageset/39.png" "b/Oscar\302\260/Assets.xcassets/hail.imageset/39.png" deleted file mode 100644 index d52f22d..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/hail.imageset/39.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/hail.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/hail.imageset/Contents.json" deleted file mode 100644 index 6729c6c..0000000 --- "a/Oscar\302\260/Assets.xcassets/hail.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "39.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/clear-night.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/halfsun.imageset/Contents.json" similarity index 88% rename from "Oscar\302\260/Assets.xcassets/clear-night.imageset/Contents.json" rename to "Oscar\302\260/Assets.xcassets/halfsun.imageset/Contents.json" index 1d3ed0c..83b9f2e 100644 --- "a/Oscar\302\260/Assets.xcassets/clear-night.imageset/Contents.json" +++ "b/Oscar\302\260/Assets.xcassets/halfsun.imageset/Contents.json" @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "10.png", + "filename" : "halfsun.png", "idiom" : "universal", "scale" : "1x" }, diff --git "a/Oscar\302\260/Assets.xcassets/halfsun.imageset/halfsun.png" "b/Oscar\302\260/Assets.xcassets/halfsun.imageset/halfsun.png" new file mode 100644 index 0000000..7845892 Binary files /dev/null and "b/Oscar\302\260/Assets.xcassets/halfsun.imageset/halfsun.png" differ diff --git "a/Oscar\302\260/Assets.xcassets/clear-day.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/oscar.imageset/Contents.json" similarity index 89% rename from "Oscar\302\260/Assets.xcassets/clear-day.imageset/Contents.json" rename to "Oscar\302\260/Assets.xcassets/oscar.imageset/Contents.json" index 182b24f..cd615a4 100644 --- "a/Oscar\302\260/Assets.xcassets/clear-day.imageset/Contents.json" +++ "b/Oscar\302\260/Assets.xcassets/oscar.imageset/Contents.json" @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "26.png", + "filename" : "oscar.jpg", "idiom" : "universal", "scale" : "1x" }, diff --git "a/Oscar\302\260/Assets.xcassets/oscar.imageset/oscar.jpg" "b/Oscar\302\260/Assets.xcassets/oscar.imageset/oscar.jpg" new file mode 100644 index 0000000..3a6bf10 Binary files /dev/null and "b/Oscar\302\260/Assets.xcassets/oscar.imageset/oscar.jpg" differ diff --git "a/Oscar\302\260/Assets.xcassets/oscarbg.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/oscarbg.imageset/Contents.json" deleted file mode 100644 index 8113ddc..0000000 --- "a/Oscar\302\260/Assets.xcassets/oscarbg.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "oscarbg.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/oscarbg.imageset/oscarbg.png" "b/Oscar\302\260/Assets.xcassets/oscarbg.imageset/oscarbg.png" deleted file mode 100644 index 0ca0bd1..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/oscarbg.imageset/oscarbg.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/oscarsun.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/oscarsun.imageset/Contents.json" deleted file mode 100644 index 4c4f284..0000000 --- "a/Oscar\302\260/Assets.xcassets/oscarsun.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "oscarsun.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/oscarsun.imageset/oscarsun.png" "b/Oscar\302\260/Assets.xcassets/oscarsun.imageset/oscarsun.png" deleted file mode 100644 index 09c5143..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/oscarsun.imageset/oscarsun.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/partly-cloudy-day.imageset/27 Kopie.png" "b/Oscar\302\260/Assets.xcassets/partly-cloudy-day.imageset/27 Kopie.png" deleted file mode 100644 index 9367cb8..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/partly-cloudy-day.imageset/27 Kopie.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/partly-cloudy-day.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/partly-cloudy-day.imageset/Contents.json" deleted file mode 100644 index 90d936b..0000000 --- "a/Oscar\302\260/Assets.xcassets/partly-cloudy-day.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "27 Kopie.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/partly-cloudy-night.imageset/15.png" "b/Oscar\302\260/Assets.xcassets/partly-cloudy-night.imageset/15.png" deleted file mode 100644 index a661170..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/partly-cloudy-night.imageset/15.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/partly-cloudy-night.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/partly-cloudy-night.imageset/Contents.json" deleted file mode 100644 index 0ac0fa8..0000000 --- "a/Oscar\302\260/Assets.xcassets/partly-cloudy-night.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "15.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/fog.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/reinhard.imageset/Contents.json" similarity index 88% rename from "Oscar\302\260/Assets.xcassets/fog.imageset/Contents.json" rename to "Oscar\302\260/Assets.xcassets/reinhard.imageset/Contents.json" index 25a6ef6..f6d7ebb 100644 --- "a/Oscar\302\260/Assets.xcassets/fog.imageset/Contents.json" +++ "b/Oscar\302\260/Assets.xcassets/reinhard.imageset/Contents.json" @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "fog.png", + "filename" : "reinhard.jpg", "idiom" : "universal", "scale" : "1x" }, diff --git "a/Oscar\302\260/Assets.xcassets/reinhard.imageset/reinhard.jpg" "b/Oscar\302\260/Assets.xcassets/reinhard.imageset/reinhard.jpg" new file mode 100644 index 0000000..c65ab1e Binary files /dev/null and "b/Oscar\302\260/Assets.xcassets/reinhard.imageset/reinhard.jpg" differ diff --git "a/Oscar\302\260/Assets.xcassets/sleet.imageset/22.png" "b/Oscar\302\260/Assets.xcassets/sleet.imageset/22.png" deleted file mode 100644 index fde4deb..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/sleet.imageset/22.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/sleet.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/sleet.imageset/Contents.json" deleted file mode 100644 index a095434..0000000 --- "a/Oscar\302\260/Assets.xcassets/sleet.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "22.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/snow.imageset/23.png" "b/Oscar\302\260/Assets.xcassets/snow.imageset/23.png" deleted file mode 100644 index 7b3eef0..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/snow.imageset/23.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/snow.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/snow.imageset/Contents.json" deleted file mode 100644 index 737588e..0000000 --- "a/Oscar\302\260/Assets.xcassets/snow.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "23.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/thunderstorm.imageset/17.png" "b/Oscar\302\260/Assets.xcassets/thunderstorm.imageset/17.png" deleted file mode 100644 index 0279e87..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/thunderstorm.imageset/17.png" and /dev/null differ diff --git "a/Oscar\302\260/Assets.xcassets/thunderstorm.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/thunderstorm.imageset/Contents.json" deleted file mode 100644 index bcdfca2..0000000 --- "a/Oscar\302\260/Assets.xcassets/thunderstorm.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "17.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/urselwerner.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/urselwerner.imageset/Contents.json" new file mode 100644 index 0000000..94531b2 --- /dev/null +++ "b/Oscar\302\260/Assets.xcassets/urselwerner.imageset/Contents.json" @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "urselwerner.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Oscar\302\260/Assets.xcassets/urselwerner.imageset/urselwerner.jpeg" "b/Oscar\302\260/Assets.xcassets/urselwerner.imageset/urselwerner.jpeg" new file mode 100644 index 0000000..26917b3 Binary files /dev/null and "b/Oscar\302\260/Assets.xcassets/urselwerner.imageset/urselwerner.jpeg" differ diff --git "a/Oscar\302\260/Assets.xcassets/wind.imageset/Contents.json" "b/Oscar\302\260/Assets.xcassets/wind.imageset/Contents.json" deleted file mode 100644 index 25a6ef6..0000000 --- "a/Oscar\302\260/Assets.xcassets/wind.imageset/Contents.json" +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "fog.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git "a/Oscar\302\260/Assets.xcassets/wind.imageset/fog.png" "b/Oscar\302\260/Assets.xcassets/wind.imageset/fog.png" deleted file mode 100644 index 904c45e..0000000 Binary files "a/Oscar\302\260/Assets.xcassets/wind.imageset/fog.png" and /dev/null differ diff --git "a/Oscar\302\260/Extensions/APIResultExtensions.swift" "b/Oscar\302\260/Extensions/APIResultExtensions.swift" new file mode 100644 index 0000000..1f5aebe --- /dev/null +++ "b/Oscar\302\260/Extensions/APIResultExtensions.swift" @@ -0,0 +1,42 @@ +// +// APIResultExtensions.swift +// Oscar° +// +// Created by Philipp Bolte on 04.01.24. +// + +import Foundation + +extension Components.Schemas.CurrentWeather { + public func getWindDirection() -> String { + let directions = [String(localized: "N_compass", comment: "North"), String(localized: "NE_compass", comment: "North-East"), + String(localized: "E_compass", comment: "East"), String(localized: "SE_compass", comment: "South-East"), + String(localized: "S_compass", comment: "South"), String(localized: "SW_compass", comment: "South-West"), + String(localized: "W_compass", comment: "West"), String(localized: "NW_compass", comment: "North-West")] + let index = Int((self.wind_direction_10m + 22.5) / 45.0) + return directions[min(max(index, 0), 8) % 8] + } +} + +extension Components.Schemas.RadarResponse { + func isRaining() -> Bool { + if (radar?.first) == nil { + return false + } + + if radar?.first?.precipitation_5?.first?.first ?? 0 > 0 { + return true + } + + return false + } +} + +extension Array { + var middle: Element? { + guard count != 0 else { return nil } + + let middleIndex = (count > 1 ? count - 1 : count) / 2 + return self[middleIndex] + } +} diff --git "a/Oscar\302\260/Extensions/GlobalViewExtensions.swift" "b/Oscar\302\260/Extensions/GlobalViewExtensions.swift" new file mode 100644 index 0000000..b890ef5 --- /dev/null +++ "b/Oscar\302\260/Extensions/GlobalViewExtensions.swift" @@ -0,0 +1,71 @@ +// +// GlobalViewExtensions.swift +// Oscar° +// +// Created by Philipp Bolte on 04.01.24. +// + +import Foundation +import SwiftUI +import CoreLocation + +extension View { + public func getCurrentHour() -> Int { + let currentDate = Date() + let calendar = Calendar.current + let hour = calendar.component(.hour, from: currentDate) + return hour + } + + public func roundTemperatureString(temperature: Double?) -> String { + if (temperature == nil) { + return "" + } else { + return "\(Int(temperature?.rounded() ?? 0))°" + } + } +} + +extension CLLocationCoordinate2D { + enum Country { + case spain + case portugal + case unknown + + var description: String { + switch self { + case .spain: + return "Spain" + case .portugal: + return "Portugal" + case .unknown: + return "Unknown" + } + } + } + + struct CountryBoundary { + var minLatitude: Double + var maxLatitude: Double + var minLongitude: Double + var maxLongitude: Double + + func contains(coordinate: CLLocationCoordinate2D) -> Bool { + return (coordinate.latitude >= minLatitude && coordinate.latitude <= maxLatitude) && + (coordinate.longitude >= minLongitude && coordinate.longitude <= maxLongitude) + } + } + + private static let spainBoundary = CountryBoundary(minLatitude: 36.0, maxLatitude: 43.8, minLongitude: -9.0, maxLongitude: 3.4) + private static let portugalBoundary = CountryBoundary(minLatitude: 36.9, maxLatitude: 42.2, minLongitude: -9.6, maxLongitude: -6.2) + + func country() -> Country { + if CLLocationCoordinate2D.spainBoundary.contains(coordinate: self) { + return .spain + } else if CLLocationCoordinate2D.portugalBoundary.contains(coordinate: self) { + return .portugal + } else { + return .unknown + } + } +} diff --git "a/Oscar\302\260/Extensions/HapticsExtension.swift" "b/Oscar\302\260/Extensions/HapticsExtension.swift" new file mode 100644 index 0000000..c56a49d --- /dev/null +++ "b/Oscar\302\260/Extensions/HapticsExtension.swift" @@ -0,0 +1,20 @@ +// +// HapticsExtension.swift +// Oscar° +// +// Created by Philipp Bolte on 23.04.24. +// + +import Foundation +import SwiftUI + +extension UIApplication { + func hideKeyboard() { + sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } + + func playHapticFeedback() { + let hapticFeedback = UIImpactFeedbackGenerator(style: .rigid) + hapticFeedback.impactOccurred(intensity: 0.5) + } +} diff --git "a/Oscar\302\260/Info.plist" "b/Oscar\302\260/Info.plist" index 7021ab0..be940c7 100644 --- "a/Oscar\302\260/Info.plist" +++ "b/Oscar\302\260/Info.plist" @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - de_DE + $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName Oscar° CFBundleExecutable @@ -25,13 +25,13 @@ LSRequiresIPhoneOS NSLocationAlwaysAndWhenInUseUsageDescription - Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen. + Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy. NSLocationAlwaysUsageDescription - Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen. + Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy. NSLocationUsageDescription - Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen. + Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy. NSLocationWhenInUseUsageDescription - Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen. + Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy. UIApplicationSceneManifest UIApplicationSupportsMultipleScenes @@ -41,8 +41,6 @@ UILaunchScreen - UILaunchStoryboardName - Launch Screen.storyboard UIRequiredDeviceCapabilities armv7 diff --git "a/Oscar\302\260/InfoPlist.xcstrings" "b/Oscar\302\260/InfoPlist.xcstrings" new file mode 100644 index 0000000..6d05917 --- /dev/null +++ "b/Oscar\302\260/InfoPlist.xcstrings" @@ -0,0 +1,144 @@ +{ + "sourceLanguage" : "de", + "strings" : { + "CFBundleDisplayName" : { + "comment" : "Bundle display name", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + } + } + }, + "CFBundleName" : { + "comment" : "Bundle name", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + } + } + }, + "NSLocationAlwaysAndWhenInUseUsageDescription" : { + "comment" : "Privacy - Location Always and When In Use Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your approximate location is used to display the weather at your current location and is transmitted to open-meteo.com for this purpose. More information at oscars.love/privacy." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaklaşık konumunuz, bulunduğunuz yerdeki hava durumunu görüntülemek için kullanılır ve bu amaçla open-meteo.com'a iletilir. Daha fazla bilgi için oscars.love/privacy'yi ziyaret edin." + } + } + } + }, + "NSLocationAlwaysUsageDescription" : { + "comment" : "Privacy - Location Always Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your approximate location is used to display the weather at your current location and is transmitted to open-meteo.com for this purpose. More information at oscars.love/privacy." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaklaşık konumunuz, bulunduğunuz yerdeki hava durumunu görüntülemek için kullanılır ve bu amaçla open-meteo.com'a iletilir. Daha fazla bilgi için oscars.love/privacy'yi ziyaret edin." + } + } + } + }, + "NSLocationUsageDescription" : { + "comment" : "Privacy - Location Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your approximate location is used to display the weather at your current location and is transmitted to open-meteo.com for this purpose. More information at oscars.love/privacy." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaklaşık konumunuz, bulunduğunuz yerdeki hava durumunu görüntülemek için kullanılır ve bu amaçla open-meteo.com'a iletilir. Daha fazla bilgi için oscars.love/privacy'yi ziyaret edin." + } + } + } + }, + "NSLocationWhenInUseUsageDescription" : { + "comment" : "Privacy - Location When In Use Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ihr ungefährer Standort wird verwendet, um Wetter am aktuellen Standort anzuzeigen und wird dazu an open-meteo.com übermittelt. Mehr Infos unter oscars.love/privacy." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your approximate location is used to display the weather at your current location and is transmitted to open-meteo.com for this purpose. More information at oscars.love/privacy." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaklaşık konumunuz, bulunduğunuz yerdeki hava durumunu görüntülemek için kullanılır ve bu amaçla open-meteo.com'a iletilir. Daha fazla bilgi için oscars.love/privacy'yi ziyaret edin." + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260/Launch Screen.storyboard" "b/Oscar\302\260/Launch Screen.storyboard" deleted file mode 100644 index 0d6145e..0000000 --- "a/Oscar\302\260/Launch Screen.storyboard" +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git "a/Oscar\302\260/Localizable.xcstrings" "b/Oscar\302\260/Localizable.xcstrings" new file mode 100644 index 0000000..55103c8 --- /dev/null +++ "b/Oscar\302\260/Localizable.xcstrings" @@ -0,0 +1,1366 @@ +{ + "sourceLanguage" : "de", + "strings" : { + "... wurde in liebevoller Erinnerung an diejenigen entwickelt, die nicht mehr unter uns sind. In unseren Herzen und Gedanken bleiben sie jedoch für immer lebendig." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "... wurde in liebevoller Erinnerung an diejenigen entwickelt, die nicht mehr unter uns sind. In unseren Herzen und Gedanken bleiben sie jedoch für immer lebendig." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "... was developed in loving memory of those who are no longer with us. However, they remain forever alive in our hearts and minds." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "... artık aramızda olmayanların sevgi dolu anısına geliştirilmiştir. Ancak onlar kalplerimizde ve zihinlerimizde sonsuza dek canlı kalacaklar." + } + } + } + }, + "%.0f %" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$.0f %2$" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%.1f km/h" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%.1f km/h" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%.1f mm" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%.1f mm" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%.1f mm/h" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%.1f mm/h" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%d-Tage" : { + "comment" : "Headline for Daily View", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d-Tage" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d-Day" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d-Günlük Tahmin" + } + } + } + }, + "0 mm/h" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "0 mm/h" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "2" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "2" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "2.5" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "2.5" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "3" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "3" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "10" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "10" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "Air" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Air" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Air" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hava" + } + } + } + }, + "Aktueller Standort" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktueller Standort" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Current Location" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konumum" + } + } + } + }, + "Alerts" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alerts" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alerts" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uyarılar" + } + } + } + }, + "AQI" : { + "comment" : "Environment AQI", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "AQI" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "AQI" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "HKI" + } + } + } + }, + "by Philipp Bolte" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "by Philipp Bolte" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "by Philipp Bolte" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Philipp Bolte" + } + } + } + }, + "Datenquellen" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datenquellen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data Sources" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veri Kaynakları" + } + } + } + }, + "Datenschutz" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datenschutz" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Privacy" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gizlilik" + } + } + } + }, + "E_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "E" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "E" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "D" + } + } + } + }, + "Ende: " : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ende: " + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "End:" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Son:" + } + } + } + }, + "Forecast" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forecast" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forecast" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tahmin" + } + } + } + }, + "Impressum" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impressum" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imprint" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baskı" + } + } + } + }, + "Location" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Location" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Location" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konumum" + } + } + } + }, + "Luftfeuchtigkeit" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Humidity" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hava nemi" + } + } + } + }, + "Meine Orte" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meine Orte" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "My Locations" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konumlarım" + } + } + } + }, + "N_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "N" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "N" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "K" + } + } + } + }, + "NE_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "NO" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "NE" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KD" + } + } + } + }, + "NO" : { + "comment" : "Environment NO", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "NO" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "NO" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "NO" + } + } + } + }, + "NW_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "NW" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "NW" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KB" + } + } + } + }, + "O" : { + "comment" : "Environment O", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "O" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "O" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "O" + } + } + } + }, + "Orte" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Orte" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Locations" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konumlarım" + } + } + } + }, + "Oscar°" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°" + } + } + } + }, + "Oscar° Weather" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar° Weather" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar° Weather" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar° Weather" + } + } + } + }, + "PM" : { + "comment" : "Environment PM", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "PM" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "PM" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "PM" + } + } + } + }, + "Quelle: Deutscher Wetterdienst" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quelle: Deutscher Wetterdienst" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Source: Deutscher Wetterdienst" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kaynak: Deutscher Wetterdienst" + } + } + } + }, + "Radar" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radar" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radar" + } + } + } + }, + "Rechtliche\nInformationen" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rechtliche\nInformationen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legal Information" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yasal Bilgiler" + } + } + } + }, + "Rechtliches" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rechtliches" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legal" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yasal Bilgiler" + } + } + } + }, + "Regen (DWD)" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regen (DWD)" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rain (DWD)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yağmur (DWD)" + } + } + } + }, + "Regen (Global)" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regen (Global)" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regen (Global)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yağmur (Küresel)" + } + } + } + }, + "Regenradar" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regenradar" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rain Radar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yağmur Radarı" + } + } + } + }, + "S_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "S" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "S" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "G" + } + } + } + }, + "SE_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "SO" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SE" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GD" + } + } + } + }, + "Services" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Services" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Services" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Servisler" + } + } + } + }, + "SO" : { + "comment" : "Environment SO", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "SO" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SO" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "SO" + } + } + } + }, + "Sonstiges" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sonstiges" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Miscellaneous" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diğer Bilgiler" + } + } + } + }, + "Start: " : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Start: " + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Begin:" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Başlangıç:" + } + } + } + }, + "Stündlich" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stündlich" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hourly" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saatlik Tahmin" + } + } + } + }, + "Suchen..." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suchen..." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search..." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arama..." + } + } + } + }, + "SW_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "SW" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SW" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GB" + } + } + } + }, + "Temperatur" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperatur" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperature" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sıcaklık" + } + } + } + }, + "Time" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Time" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Time" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saat" + } + } + } + }, + "Über" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Über" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "About" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hakkında" + } + } + } + }, + "Uhr" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uhr" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : " " + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : " " + } + } + } + }, + "Umwelt" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umwelt" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Environment" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Çevre" + } + } + } + }, + "Unwetterwarnungen" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unwetterwarnungen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weather Warnings" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hava Durumu Uyarıları" + } + } + } + }, + "UV" : { + "comment" : "Environment UV", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "UV" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "UV" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "UV" + } + } + } + }, + "W_compass" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "W" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "W" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "B" + } + } + } + }, + "Windgeschwindidkeit" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wind speed" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rüzgar hızı" + } + } + } + }, + "Windrichtung" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wind direction" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rüzgar yönü" + } + } + } + }, + "Wolken" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clouds" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bulutlar" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260/Models/AQIResponse.swift" "b/Oscar\302\260/Models/AQIResponse.swift" deleted file mode 100644 index d9985c2..0000000 --- "a/Oscar\302\260/Models/AQIResponse.swift" +++ /dev/null @@ -1,99 +0,0 @@ -import Foundation -import SwiftUI -// MARK: - Welcome -struct AQIResponse: Codable { - let latitude, longitude, generationtimeMS: Double - let utcOffsetSeconds: Int - let timezone, timezoneAbbreviation: String - let hourlyUnits: AQIHourlyUnits - let hourly: AQIHourly - - enum CodingKeys: String, CodingKey { - case latitude, longitude - case generationtimeMS = "generationtime_ms" - case utcOffsetSeconds = "utc_offset_seconds" - case timezone - case timezoneAbbreviation = "timezone_abbreviation" - case hourlyUnits = "hourly_units" - case hourly - } -} - -// MARK: - Hourly -struct AQIHourly: Codable { - let time: [String] - let europeanAqi, europeanAqiPm25, europeanAqiPm10, europeanAqiNo2: [Int?] - let europeanAqiO3, europeanAqiSo2: [Int?] - let uvIndex: [Double?] - - enum CodingKeys: String, CodingKey { - case time - case europeanAqi = "european_aqi" - case europeanAqiPm25 = "european_aqi_pm2_5" - case europeanAqiPm10 = "european_aqi_pm10" - case europeanAqiNo2 = "european_aqi_no2" - case europeanAqiO3 = "european_aqi_o3" - case europeanAqiSo2 = "european_aqi_so2" - case uvIndex = "uv_index" - } - - public func getCurrentHour() -> Int { - let now = Date() - let calendar = Calendar.current - let components = calendar.dateComponents([.hour], from: now) - return components.hour! - } - - public func getColorForAQI(aqi: Int) -> Color { - switch aqi { - case let x where x <= 20: - return .green - case let x where x > 20 && x <= 40: - return .orange - case let x where x > 40 && x <= 60: - return .orange - case let x where x > 60 && x <= 80: - return .red - case let x where x > 80: - return .purple - default: - return .gray - } - } - - public func getColorForUVI(uvi: Double) -> Color { - switch uvi { - case let x where x < 1: - return .green - case let x where x >= 1 && x < 2.5: - return .green - case let x where x >= 2.5 && x < 5.5: - return .orange - case let x where x >= 5.5 && x < 7.5: - return .orange - case let x where x >= 7.5 && x < 10.5: - return .orange - case let x where x >= 10.5: - return .purple - default: - return .gray - } - } -} - -// MARK: - HourlyUnits -struct AQIHourlyUnits: Codable { - let time, europeanAqi, europeanAqiPm25, europeanAqiPm10: String - let europeanAqiNo2, europeanAqiO3, europeanAqiSo2, uvIndex: String - - enum CodingKeys: String, CodingKey { - case time - case europeanAqi = "european_aqi" - case europeanAqiPm25 = "european_aqi_pm2_5" - case europeanAqiPm10 = "european_aqi_pm10" - case europeanAqiNo2 = "european_aqi_no2" - case europeanAqiO3 = "european_aqi_o3" - case europeanAqiSo2 = "european_aqi_so2" - case uvIndex = "uv_index" - } -} diff --git "a/Oscar\302\260/Models/AlertResponse.swift" "b/Oscar\302\260/Models/AlertResponse.swift" deleted file mode 100644 index 85ac54d..0000000 --- "a/Oscar\302\260/Models/AlertResponse.swift" +++ /dev/null @@ -1,107 +0,0 @@ -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse the JSON, add this file to your project and do: -// -// let welcome = try? newJSONDecoder().decode(Welcome.self, from: jsonData) - -import Foundation - -struct AWAlert: Codable, Hashable { - let countryCode: String - let alertID: Int - let description: Tion - let category: String - let priority: Int - let type, typeID, alertClass, level: String? - let source: String - let sourceID: Int - //let disclaimer: JSONNull? - let area: [Area] - let haveReadyStatements: Bool - let mobileLink, link: String - - enum CodingKeys: String, CodingKey { - case countryCode = "CountryCode" - case alertID = "AlertID" - case description = "Description" - case category = "Category" - case priority = "Priority" - case type = "Type" - case typeID = "TypeID" - case alertClass = "Class" - case level = "Level" - case source = "Source" - case sourceID = "SourceId" - //case disclaimer = "Disclaimer" - case area = "Area" - case haveReadyStatements = "HaveReadyStatements" - case mobileLink = "MobileLink" - case link = "Link" - } - - static func == (lhs: AWAlert, rhs: AWAlert) -> Bool { - lhs.alertID == rhs.alertID - } - public func hash(into hasher: inout Hasher) { - hasher.combine(alertID) - } -} - -// MARK: - Area -struct Area: Codable { - let name: String - let startTime: String - let epochStartTime: Int - let endTime: String - let epochEndTime: Int - let lastAction: Tion - let summary: String - - enum CodingKeys: String, CodingKey { - case name = "Name" - case startTime = "StartTime" - case epochStartTime = "EpochStartTime" - case endTime = "EndTime" - case epochEndTime = "EpochEndTime" - case lastAction = "LastAction" - case summary = "Summary" - } -} - -// MARK: - Tion -struct Tion: Codable { - let localized, english: String - - enum CodingKeys: String, CodingKey { - case localized = "Localized" - case english = "English" - } -} - -typealias AlertResponse = [AWAlert] - -// MARK: - Encode/decode helpers - -class JSONNull: Codable, Hashable { - - public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool { - return true - } - - public var hashValue: Int { - return 0 - } - - public init() {} - - public required init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - if !container.decodeNil() { - throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull")) - } - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - try container.encodeNil() - } -} diff --git "a/Oscar\302\260/Models/BrightskyResponse.swift" "b/Oscar\302\260/Models/BrightskyResponse.swift" deleted file mode 100644 index be9fc9e..0000000 --- "a/Oscar\302\260/Models/BrightskyResponse.swift" +++ /dev/null @@ -1,84 +0,0 @@ -// -// BrightskyResponse.swift -// Oscar° -// -// Created by Philipp Bolte on 30.01.22. -// - -import Foundation - -// MARK: - Welcome -struct BrightskyResponse: Codable { - let current: BDetail - let hourly: [BDetail] - let daily: [BDaily] -} - -// MARK: - Current -struct BDetail: Codable, Hashable { - let timestamp: Int - let temp, wind: Double? - let windDir: Int? - let gust, prec, press: Double? - let vis, clouds: Int? - let icon: String - - // convenience function - public func getDate() -> Date { - return Date(timeIntervalSince1970: TimeInterval(self.timestamp / 1000)) - } - - public func getHourString() -> String { - let date = getDate() - let calendar = Calendar.current - let hours = calendar.component(.hour, from: date) - return String(format:"%02d", hours) - } - - public func getRoundedTemp() -> String { - return String(describing: (temp ?? 0.0).rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public static func == (lhs: BDetail, rhs: BDetail) -> Bool { - lhs.timestamp == rhs.timestamp - } - - public func hash(into hasher: inout Hasher) { - hasher.combine(timestamp) - } -} - -// MARK: - Daily -struct BDaily: Codable, Hashable { - let timestamp: Int - let maxTemp, minTemp, prec: Double? - let icon: String - - public func getDate() -> Date { - return Date(timeIntervalSince1970: TimeInterval(self.timestamp / 1000)) - } - - public func getWeekDay() -> String { - let dateFormatter = DateFormatter() - dateFormatter.locale = Locale(identifier: "de_DE") - dateFormatter.dateFormat = "EEEE" - return dateFormatter.string(from: self.getDate()) - } - - public func getRoundedMinTemp() -> String { - return String(describing: (minTemp ?? 0.0).rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getRoundedMaxTemp() -> String { - return String(describing: (maxTemp ?? 0.0).rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public static func == (lhs: BDaily, rhs: BDaily) -> Bool { - lhs.timestamp == rhs.timestamp - } - - public func hash(into hasher: inout Hasher) { - hasher.combine(timestamp) - } -} - diff --git "a/Oscar\302\260/Models/DWDAlerts.swift" "b/Oscar\302\260/Models/DWDAlerts.swift" deleted file mode 100644 index af64b66..0000000 --- "a/Oscar\302\260/Models/DWDAlerts.swift" +++ /dev/null @@ -1,49 +0,0 @@ -// -// DWDAlerts.swift -// Oscar° -// -// Created by Philipp Bolte on 21.02.22. -// - -import Foundation - -struct DWDAlert: Codable, Hashable { - let warnId: String - let type, level, start, end: Int - let bn: Bool - let instruction, description, descriptionText, event: String - let headline: String - - public func getFormattedHeadline() -> String { - return self.headline - .replacingOccurrences(of: "Amtliche", with: "") - .replacingOccurrences(of: "UNWETTER", with: "") - } - - public func getStartDate() -> String { - return formatDate(time: self.start) - } - - public func getEndDate() -> String { - return formatDate(time: self.end) - } - - public func formatDate(time: Int) -> String { - let date = Date(timeIntervalSince1970: TimeInterval(time / 1000)) - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .short - dateFormatter.timeStyle = .short - dateFormatter.locale = Locale(identifier: "de") - return dateFormatter.string(from: date) - } - - public static func == (lhs: DWDAlert, rhs: DWDAlert) -> Bool { - lhs.warnId == rhs.warnId - } - - public func hash(into hasher: inout Hasher) { - hasher.combine(warnId) - } -} - -typealias DWDAlerts = [DWDAlert] diff --git "a/Oscar\302\260/Models/OpenMeteoResponse.swift" "b/Oscar\302\260/Models/OpenMeteoResponse.swift" deleted file mode 100644 index 3a42084..0000000 --- "a/Oscar\302\260/Models/OpenMeteoResponse.swift" +++ /dev/null @@ -1,452 +0,0 @@ -// -// OpenMeteoResponse.swift -// Oscar° -// -// Created by Philipp Bolte on 07.08.22. -// - -import Foundation -import UIKit - -// MARK: - OpenMeteoResponse -struct OpenMeteoResponse: Codable { - let latitude, longitude, generationtimeMS: Double - let utcOffsetSeconds, elevation: Int - let timezoneAbbreviation: String - let currentWeather: CurrentWeather - let hourlyUnits: HourlyUnits - let hourly: Hourly - let dailyUnits: DailyUnits - let daily: Daily - - enum CodingKeys: String, CodingKey { - case latitude, longitude - case generationtimeMS = "generationtime_ms" - case utcOffsetSeconds = "utc_offset_seconds" - case timezoneAbbreviation = "timezone_abbreviation" - case elevation - case currentWeather = "current_weather" - case hourlyUnits = "hourly_units" - case hourly - case dailyUnits = "daily_units" - case daily - } - - public func getDate(timestamp: Double) -> Date { - return Date(timeIntervalSince1970: TimeInterval(timestamp)) - } - - public func getWeekDay(timestamp: Double) -> String { - let dateFormatter = DateFormatter() - //dateFormatter.locale = Locale(identifier: "Europe/Istanbul") - dateFormatter.timeZone = TimeZone(abbreviation: "UTC\(self.timezoneAbbreviation)") - dateFormatter.dateFormat = "EEEE" - return dateFormatter.string(from: getDate(timestamp: timestamp)) - } - - - public func getWeatherIcon(weathercode: Double, timestamp: Double, sunrise: Double, sunset: Double) -> String { - let now = getDate(timestamp: timestamp) - let sunriseDate = getDate(timestamp: sunrise) - let sunsetDate = getDate(timestamp: sunset) - - - if (now > sunriseDate && now < sunsetDate) { - switch weathercode { - case 0, 1: - return "01d" - case 2: - return "02d" - case 3: - return "04d" - case 45, 48: - return "50d" - case 51: - return "10d" - case 71, 73, 75, 77: - return "13d" - case 95, 96, 99: - return "11d" - default: - return "09d" - } - } else { - switch weathercode { - case 0, 1: - return "01n" - case 2: - return "02n" - case 3: - return "04n" - case 45, 48: - return "50n" - case 51: - return "10n" - case 71, 73, 75, 77: - return "13n" - case 95, 96, 99: - return "11n" - default: - return "09n" - } - } - } - - - public func getCurrentHourPos() -> Int { - let now = Date().timeIntervalSince1970 - var lastIndex = 0 - for (idx, time) in (hourly.time).enumerated() { - if (now <= time ?? 0.0) { - return lastIndex - } - lastIndex = idx - } - return lastIndex - } - - public func getDayOfHour(timestamp: Double) -> Int { - var pos = 0 - for (idx, time) in (daily.time).enumerated() { - if (timestamp >= time ?? 0.0) { - pos = idx - } - } - return pos - } - - public func getHourlySize() -> Int { - return (hourly.time).count; - } - - public func getHourString(pos: Int) -> String { - let date = getDate(timestamp: hourly.time[pos] ?? 0.0) - let calendar = Calendar.current - let hours = calendar.component(.hour, from: date) - return String(format:"%02d", hours) - } - - - public func getHourTemp(pos: Int) -> String { - return String(describing: (hourly.temperature2M[pos] ?? 0.0).rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getHourPrec(pos: Int) -> Double { - return hourly.precipitation[pos] ?? 0.0 - } - - public func getHourPrecProbability(pos: Int) -> Int { - return hourly.precipitationProbability[pos] ?? 0 - } - - public func getHourIcon(pos: Int) -> String { - let timestamp = hourly.time[pos] ?? 0.0 - let currentDay = getDayOfHour(timestamp: timestamp) - return getWeatherIcon(weathercode: hourly.weathercode[pos] ?? 0.0, timestamp: timestamp, sunrise: daily.sunrise[currentDay], sunset: daily.sunset[currentDay]) - } - - public func getCurrentIcon() -> String { - let timestamp = currentWeather.time - return getWeatherIcon(weathercode: Double(currentWeather.weathercode), timestamp: Double(timestamp), sunrise: daily.sunrise[0], sunset: daily.sunset[0]) - } - - public func getCurrentCloudCover() -> Double { - let currentHour = getCurrentHourPos() - return hourly.cloudcover[currentHour] ?? 0.0 - } -} - -// MARK: - CurrentWeather -struct CurrentWeather: Codable { - let temperature, windspeed: Double - let winddirection, weathercode, time: Int - - public func getDate(timestamp: Double) -> Date { - return Date(timeIntervalSince1970: TimeInterval(timestamp)) - } - - public func getRoundedTempString() -> String { - return String(describing: temperature.rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getRoundedTemp() -> String { - return String(describing: temperature.rounded()).replacingOccurrences(of: ".0", with: "") - } - - public func getWindDirection() -> String { - switch self.winddirection { - case let x where x > 0 && x < 20: - return "N" - case let x where x >= 20 && x < 80: - return "NE" - case let x where x >= 80 && x < 100: - return "E" - case let x where x >= 100 && x < 170: - return "SE" - case let x where x >= 170 && x < 190: - return "S" - case let x where x >= 190 && x < 260: - return "SW" - case let x where x >= 260 && x < 330: - return "W" - case let x where x >= 330: - return "NW" - default: - return "N/A" - } - } - - public func getWeatherIcon() -> String { - switch self.weathercode { - case 0, 1: - return "01d" - case 2: - return "02d" - case 3: - return "04d" - case 45, 48: - return "50d" - case 51, 53, 55: - return "10d" - case 71, 73, 75, 77: - return "13d" - case 95, 96, 99: - return "11d" - default: - return "09d" - } - } - - public func getCloudDensity() -> Cloud.Thickness { - switch self.weathercode { - case 0: - return Cloud.Thickness.none - case 1: - return Cloud.Thickness.light - case 2: - return Cloud.Thickness.regular - case 3: - return Cloud.Thickness.thick - case 45, 48, 51, 52, 55, 61, 63, 65, 66, 67, 71, 73, 75, 77, 85, 86, 95, 96, 99: - return Cloud.Thickness.thick - default: - return Cloud.Thickness.light - } - } - - public func getStormType() -> Storm.Contents { - switch self.weathercode { - case 51, 52, 55, 61, 63, 65, 66, 67, 71, 73, 75, 77, 85, 86, 95, 96, 99: - return Storm.Contents.rain - default: - return Storm.Contents.none - } - } -} - -// MARK: - Daily -struct Daily: Codable { - let time, weathercode, temperature2MMax, temperature2MMin: [Double?] - let sunrise, sunset: [Double] - let precipitationSum, precipitationHours: [Double?] - let windspeed10MMax, winddirection10MDominant, shortwaveRadiationSum: [Double?] - let precipitationProbabilityMax: [Int?] - - enum CodingKeys: String, CodingKey { - case time, weathercode - case temperature2MMax = "temperature_2m_max" - case temperature2MMin = "temperature_2m_min" - case sunrise, sunset - case precipitationSum = "precipitation_sum" - case precipitationHours = "precipitation_hours" - case windspeed10MMax = "windspeed_10m_max" - case winddirection10MDominant = "winddirection_10m_dominant" - case shortwaveRadiationSum = "shortwave_radiation_sum" - case precipitationProbabilityMax = "precipitation_probability_max" - } - - public func getDate(timestamp: Double) -> Date { - return Date(timeIntervalSince1970: TimeInterval(timestamp)) - } - - public func getRoundedMinTemp(pos: Int) -> String { - return String(describing: (temperature2MMin[pos] ?? 0.0).rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getRoundedMaxTemp(pos: Int) -> String { - return String(describing: (temperature2MMax[pos] ?? 0.0).rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getWeatherIcon(pos: Int) -> String { - switch weathercode[pos] { - case 0, 1: - return "01d" - case 2: - return "02d" - case 3: - return "04d" - case 45, 48: - return "50d" - case 51: - return "10d" - case 71, 73, 75, 77: - return "13d" - case 95, 96, 99: - return "11d" - default: - return "09d" - } - } -} - -// MARK: - DailyUnits -struct DailyUnits: Codable { - let time, weathercode, temperature2MMax, temperature2MMin: String - let sunrise, sunset, precipitationSum, precipitationHours: String - let windspeed10MMax, winddirection10MDominant, shortwaveRadiationSum, precipitationProbabilityMax: String - - enum CodingKeys: String, CodingKey { - case time, weathercode - case temperature2MMax = "temperature_2m_max" - case temperature2MMin = "temperature_2m_min" - case sunrise, sunset - case precipitationSum = "precipitation_sum" - case precipitationHours = "precipitation_hours" - case windspeed10MMax = "windspeed_10m_max" - case winddirection10MDominant = "winddirection_10m_dominant" - case shortwaveRadiationSum = "shortwave_radiation_sum" - case precipitationProbabilityMax = "precipitation_probability_max" - } - - public func getDate(timestamp: Double) -> Date { - return Date(timeIntervalSince1970: TimeInterval(timestamp)) - } - - public func getRoundedTempString(temperature: Double) -> String { - return String(describing: temperature.rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getWeatherIcon(weathercode: Double) -> String { - switch weathercode { - case 0, 1: - return "01d" - case 2: - return "02d" - case 3: - return "04d" - case 45, 48: - return "50d" - case 51: - return "10d" - case 71, 73, 75, 77: - return "13d" - case 95, 96, 99: - return "11d" - default: - return "09d" - - } - } -} - -// MARK: hourly -struct Hourly: Codable { - let time, temperature2M, apparentTemperature, surfacePressure: [Double?] - let precipitation, weathercode, cloudcover, windspeed10M: [Double?] - let winddirection10M, soilTemperature6CM, soilMoisture3_9CM: [Double?] - let precipitationProbability: [Int?] - - enum CodingKeys: String, CodingKey { - case time - case temperature2M = "temperature_2m" - case apparentTemperature = "apparent_temperature" - case surfacePressure = "surface_pressure" - case precipitation, weathercode, cloudcover - case windspeed10M = "windspeed_10m" - case winddirection10M = "winddirection_10m" - case soilTemperature6CM = "soil_temperature_6cm" - case soilMoisture3_9CM = "soil_moisture_3_9cm" - case precipitationProbability = "precipitation_probability" - } - - public func getDate(timestamp: Double) -> Date { - return Date(timeIntervalSince1970: TimeInterval(timestamp)) - } - - public func getRoundedTempString(temperature: Double) -> String { - return String(describing: temperature.rounded()).replacingOccurrences(of: ".0", with: "") + "°" - } - - public func getWeatherIcon(weathercode: Double, timestamp: Double, sunrise: Double, sunset: Double) -> String { - let now = getDate(timestamp: timestamp) - let sunriseDate = getDate(timestamp: sunrise) - let sunsetDate = getDate(timestamp: sunset) - - if (now > sunriseDate && now < sunsetDate) { - switch weathercode { - case 0, 1: - return "01d" - case 2: - return "02d" - case 3: - return "04d" - case 45, 48: - return "50d" - case 51: - return "10d" - case 71, 73, 75, 77: - return "13d" - case 95, 96, 99: - return "11d" - default: - return "09d" - } - } else { - switch weathercode { - case 0, 1: - return "01n" - case 2: - return "02n" - case 3: - return "04n" - case 45, 48: - return "50n" - case 51: - return "10n" - case 71, 73, 75, 77: - return "13n" - case 95, 96, 99: - return "11n" - default: - return "09n" - } - } - } - - public func getHour() -> Int { - let now = Date() - let calendar = Calendar.current - let components = calendar.dateComponents([.hour], from: now) - return components.hour! - 1 - } -} - -// MARK: - HourlyUnits -struct HourlyUnits: Codable { - let time, temperature2M, apparentTemperature, surfacePressure: String - let precipitation, weathercode, cloudcover, windspeed10M: String - let winddirection10M, soilTemperature6CM, soilMoisture3_9CM, precipitationProbability: String - - enum CodingKeys: String, CodingKey { - case time - case temperature2M = "temperature_2m" - case apparentTemperature = "apparent_temperature" - case surfacePressure = "surface_pressure" - case precipitation, weathercode, cloudcover - case windspeed10M = "windspeed_10m" - case winddirection10M = "winddirection_10m" - case soilTemperature6CM = "soil_temperature_6cm" - case soilMoisture3_9CM = "soil_moisture_3_9cm" - case precipitationProbability = "precipitation_probability" - } -} diff --git "a/Oscar\302\260/Models/RainModel.swift" "b/Oscar\302\260/Models/RainModel.swift" deleted file mode 100644 index 022110c..0000000 --- "a/Oscar\302\260/Models/RainModel.swift" +++ /dev/null @@ -1,159 +0,0 @@ -// -// RainModel.swift -// Oscar° -// -// Created by Philipp Bolte on 21.02.22. -// - -import Foundation - -struct RainRadarForecast: Codable { - var data: [RainRadarDatapoint] - - public func getStartTime() -> String { - let iso = ISO8601DateFormatter() - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - return formatter.string(from: iso.date(from: data.first?.time ?? "2022-01-01") ?? Date()) - } - - public func getMidTime() -> String { - let iso = ISO8601DateFormatter() - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - return formatter.string(from: iso.date(from: data.middle?.time ?? "2022-01-01") ?? Date()) - } - - public func getFormattedTime(time: String) -> String { - let iso = ISO8601DateFormatter() - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - return formatter.string(from: iso.date(from: time) ?? Date()) - } - - - public func getEndTime() -> String { - let iso = ISO8601DateFormatter() - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - return formatter.string(from: iso.date(from: data.last?.time ?? "2022-01-01") ?? Date()) - } - - func getMaxPreci() -> Double { - var maxPreci = 0.0 - for datapoint in data { - if (datapoint.mmh > maxPreci) { - maxPreci = datapoint.mmh - } - } - - if (maxPreci <= 1 && maxPreci > 0) { - return 1 - } - return maxPreci - } - - -} - -struct RainRadarDatapoint: Codable, Hashable { - let time: String - let mmh: Double - - func hash(into hasher: inout Hasher) { - hasher.combine(time) - } -} - - -// MARK: - Rain Forecats -struct RainForecast: Codable { - let hasRain: Bool - var data: [RainData] - - init() { - self.hasRain = false - self.data = [] - for index in 0...23 { - data.insert(RainData(), at: index) - } - } - - public func getStartTime() -> String { - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - let rainData = getTimeAdjustedData() - let startTime = Date(timeIntervalSince1970: Double(rainData.first?.timestamp ?? "0") ?? 0.0) - return formatter.string(from: startTime) - } - - public func getMidTime() -> String { - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - let rainData = getTimeAdjustedData() - let startTime = Date(timeIntervalSince1970: Double(rainData.middle?.timestamp ?? "0") ?? 0.0) - return formatter.string(from: startTime) - } - - - public func getEndTime() -> String { - let formatter = DateFormatter() - formatter.timeStyle = .short - formatter.dateStyle = .none - let rainData = getTimeAdjustedData() - let startTime = Date(timeIntervalSince1970: Double(rainData.last?.timestamp ?? "0") ?? 0.0) - return formatter.string(from: startTime) - } - - func getMaxPreci() -> Double { - var maxPreci = 0.0 - for datapoint in getTimeAdjustedData() { - if (datapoint.mm > maxPreci) { - maxPreci = datapoint.mm - } - } - - if (maxPreci <= 2) { - return 2 - } - return maxPreci - } - - func getTimeAdjustedData() -> [RainData] { - let timestamp = NSDate().timeIntervalSince1970 - return data.filter {(Double($0.timestamp) ?? 0) >= timestamp } - } - - func hasRainTimeAdjusted() -> Bool { - let rain = getTimeAdjustedData().map( {$0.mm }) - return rain.reduce(0, +) > 0 - } -} - -// MARK: - Datum -struct RainData: Codable { - let time, timestamp, dbz: String - let mm: Double - init () { - self.time = "" - self.timestamp = "" - self.dbz = "" - self.mm = 0.0 - } -} - -extension Array { - var middle: Element? { - guard count != 0 else { return nil } - - let middleIndex = (count > 1 ? count - 1 : count) / 2 - return self[middleIndex] - } - -} diff --git "a/Oscar\302\260/Models/WeatherMapsResponse.swift" "b/Oscar\302\260/Models/WeatherMapsResponse.swift" deleted file mode 100644 index d23cf73..0000000 --- "a/Oscar\302\260/Models/WeatherMapsResponse.swift" +++ /dev/null @@ -1,29 +0,0 @@ -// -// RadarTimeResponse.swift -// RadarTimeResponse -// -// Created by Philipp Bolte on 11.08.21. -// - -import Foundation - -struct WeatherMapsResponse: Codable { - let version: String - let generated: Int - let host: String - let radar: Radar - let satellite: Satellite -} - -struct Radar: Codable { - let past, nowcast: [Nowcast] -} - -struct Nowcast: Codable { - let time: Int - let path: String -} - -struct Satellite: Codable { - let infrared: [Nowcast] -} diff --git "a/Oscar\302\260/Networking/APIClient.swift" "b/Oscar\302\260/Networking/APIClient.swift" new file mode 100644 index 0000000..aec1f70 --- /dev/null +++ "b/Oscar\302\260/Networking/APIClient.swift" @@ -0,0 +1,153 @@ +// +// APIClient.swift +// Oscar° +// +// Created by Philipp Bolte on 04.01.24. +// + +import Foundation +import OpenAPIRuntime +import OpenAPIURLSession +import CoreLocation + +// TODO: Caching for API results +class APIClient { + var openMeteo: Client + var openMeteoAqi: Client + var openMeteoGeo: Client + var brightsky: Client + + init () { + openMeteo = APIClient.get(url: try! Servers.server1()) + openMeteoAqi = APIClient.get(url: try! Servers.server2()) + openMeteoGeo = APIClient.get(url: try! Servers.server3()) + brightsky = APIClient.get(url: try! Servers.server4()) + } + + class func get(url: URL) -> Client { + return Client( + serverURL: url, + transport: URLSessionTransport(), + middlewares: [ + RetryingMiddleware( + signals: [.code(429), .range(500..<600), .errorThrown], + policy: .upToAttempts(count: 3), + delay: .constant(seconds: 1) + ) + ] + ) + } + + func getForecast(coordinates: CLLocationCoordinate2D, forecastDays: Operations.getForecast.Input.Query.forecast_daysPayload? = ._14) async throws -> Operations.getForecast.Output.Ok.Body.jsonPayload { + let fallbackForecast: Operations.getForecast.Output.Ok.Body.jsonPayload = .init(latitude: coordinates.latitude, longitude: coordinates.longitude, current: .init(cloudcover: 0.0, time: 0.0, temperature: 0.0, windspeed: 0.0, wind_direction_10m: 0.0, weathercode: 0.0)) + + var query: Operations.getForecast.Input.Query = .init( + latitude: coordinates.latitude, + longitude: coordinates.longitude, + hourly: [.temperature_2m, .apparent_temperature, .precipitation, .weathercode, .cloudcover, .windspeed_10m, .winddirection_10m, .precipitation_probability, .is_day], + daily: [.precipitation_probability_max, .precipitation_sum, .sunrise, .sunset, .temperature_2m_max, .temperature_2m_min, .weathercode], + current: [.cloudcover, .temperature, .wind_direction_10m, .weathercode, .windspeed, .precipitation, .is_day], + timeformat: .unixtime, + timezone: "auto", + forecast_days: forecastDays + ) + + // Open Meteo does not have a model for Spain and falls back to a very unreliable mix of models + // Pin the DWD ICON model for Spain and Portugal + if coordinates.country() == .spain || coordinates.country() == .portugal { + query.models = .icon_seamless + query.forecast_days = ._7 + } + + let response = try await openMeteo.getForecast(.init(query: query)) + + switch response { + case let .ok(response): + switch response.body { + case .json(let result): + return result + } + case .badRequest(_): + return fallbackForecast + case .undocumented(statusCode: _, _): + return fallbackForecast + } + } + + func getAirQuality(coordinates: CLLocationCoordinate2D) async throws -> Operations.getAirQuality.Output.Ok.Body.jsonPayload { + let fallbackForecast: Operations.getAirQuality.Output.Ok.Body.jsonPayload = .init(latitude: 0, longitude: 0) + + let response = try await openMeteoAqi.getAirQuality(.init( + query: .init( + latitude: coordinates.latitude, + longitude: coordinates.longitude, + timezone: "auto", timeformat: .unixtime, forecast_days: ._1, + hourly: [.european_aqi, .european_aqi_no2, .european_aqi_o3, .european_aqi_pm10, .european_aqi_pm10, .european_aqi_pm2_5, .european_aqi_so2, .uv_index] + ) + )) + + switch response { + case let .ok(response): + switch response.body { + case .json(let result): + return result + } + case .undocumented(statusCode: _, _): + return fallbackForecast + } + } + + func getAlerts(coordinates: CLLocationCoordinate2D) async throws -> Operations.getAlerts.Output.Ok.Body.jsonPayload { + let response = try await brightsky.getAlerts(.init( + query: .init( + lat: coordinates.latitude, + lon: coordinates.longitude + ) + )) + + switch response { + case let .ok(response): + switch response.body { + case .json(let result): + return result + } + case .undocumented: + return .init() + } + + } + + func getGeocodeSearchResult(name: String) async throws -> Components.Schemas.SearchResponse { + let appLanguage = Locale.current.language.languageCode?.identifier ?? "de" + let response = try await openMeteoGeo.search(.init( + query: .init(name: name, language: Operations.search.Input.Query.languagePayload(rawValue: appLanguage)) + )) + switch response { + case let .ok(response): + switch response.body { + case .json(let result): + return result + } + case .undocumented: + return .init() + } + } + + func getRainRadar(coordinates: CLLocationCoordinate2D) async throws -> Components.Schemas.RadarResponse { + let formatter = ISO8601DateFormatter() + formatter.timeZone = TimeZone.current + let iso8601String = formatter.string(from: Date()) + let response = try await brightsky.getRainRadar(.init( + query: .init(date: iso8601String, lat: coordinates.latitude, lon: coordinates.longitude, distance: 0, tz: "Europe/Berlin", format: .plain) + )) + switch response { + case let .ok(response): + switch response.body { + case .json(let result): + return result + } + case .undocumented: + return .init() + } + } +} diff --git "a/Oscar\302\260/LocationManager.swift" "b/Oscar\302\260/Networking/LocationManager.swift" similarity index 80% rename from "Oscar\302\260/LocationManager.swift" rename to "Oscar\302\260/Networking/LocationManager.swift" index 6869fa9..113c197 100644 --- "a/Oscar\302\260/LocationManager.swift" +++ "b/Oscar\302\260/Networking/LocationManager.swift" @@ -53,4 +53,14 @@ class LocationManager: NSObject, CLLocationManagerDelegate, ObservableObject { self.gpsLocation = self.manager.location?.coordinate } } + + func getLocation() -> CLLocationCoordinate2D { + self.authStatus = self.manager.authorizationStatus + let fallbackLocation = CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0) + + if (self.manager.authorizationStatus == CLAuthorizationStatus.authorizedAlways || self.manager.authorizationStatus == CLAuthorizationStatus.authorizedWhenInUse) { + return self.manager.location?.coordinate ?? fallbackLocation + } + return fallbackLocation + } } diff --git "a/Oscar\302\260/Networking/LocationService.swift" "b/Oscar\302\260/Networking/LocationService.swift" new file mode 100644 index 0000000..c9221aa --- /dev/null +++ "b/Oscar\302\260/Networking/LocationService.swift" @@ -0,0 +1,141 @@ +// +// LocationService.swift +// Oscar° +// +// Created by Philipp Bolte on 18.11.23. +// + +import Foundation +import CoreLocation +import Combine +import SwiftUI + +@Observable +class Location { + var coordinates: CLLocationCoordinate2D + var name: String + + init() { + coordinates = CLLocationCoordinate2D(latitude: 52.52, longitude: 13.4) + name = "" + } +} + +@Observable +class LocationService: NSObject, CLLocationManagerDelegate { + static let shared = LocationService() + var city = CityServiceNew() + var authStatus: CLAuthorizationStatus? + var gpsLocation: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 52.52, longitude: 13.4) + private let manager = CLLocationManager() + private let notificationCenter = NotificationCenter.default + + private override init() { + super.init() + self.manager.delegate = self + self.manager.desiredAccuracy = kCLLocationAccuracyBest + self.manager.requestAlwaysAuthorization() + self.manager.startUpdatingLocation() + self.authStatus = self.manager.authorizationStatus + updateGPSCoordinates() + + } + + /// Update class state with all cities from storage and the current GPS coordinates, if available + func update() { + city.update() + updateGPSCoordinates() + } + + /// Update class state with current user GPS coordinates, if available + func updateGPSCoordinates() { + if let newGPSCoordinates = getGPSCoordinates() { + gpsLocation = newGPSCoordinates + } + } + + /// Get current user GPS coordinates, if available + func getGPSCoordinates() -> CLLocationCoordinate2D? { + authStatus = manager.authorizationStatus + + if (manager.authorizationStatus == CLAuthorizationStatus.authorizedAlways || manager.authorizationStatus == CLAuthorizationStatus.authorizedWhenInUse) { + return manager.location?.coordinate + } + return nil + } + + /// Get current coordinates of the user's GPS or city, if selected + func getCoordinates() -> CLLocationCoordinate2D { + if let selectedCity = city.getSelectedCity() { + return CLLocationCoordinate2D(latitude: selectedCity.lat, longitude: selectedCity.lon) + } + return gpsLocation + } + + /// Get current location name of the user's GPS reverse-geocoded cooridinates or city, if selected + func getLocationName() async -> String { + let selectedCity = city.getSelectedCity() + + if (selectedCity !== nil) { + return selectedCity!.label ?? "" + } + + let geocoder = CLGeocoder() + let coordinates = gpsLocation + let location = CLLocation(latitude: coordinates.latitude, longitude: coordinates.longitude) + do { + let placemarks = try await geocoder.reverseGeocodeLocation(location) + if let placemark = placemarks.first { + return placemark.locality ?? "" + } + } catch { + print("Error reverse geocoding: \(error)") + } + + return "" + } + + /// Get current Location object of the user's GPS reverse-geocoded cooridinates or city, if selected + func getLocation() async -> Location { + let coordinates = getCoordinates() + let name = await getLocationName() + + let location = Location() + location.coordinates = coordinates + location.name = name + + return location + } + + internal func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + if status == .authorizedWhenInUse || status == .authorizedAlways { + updateGPSCoordinates() + notificationCenter.post(name: Notification.Name("ChangedLocation"), object: nil) + } + } + + internal func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + if let location = locations.last { + if (location.distance(from: CLLocation(latitude: gpsLocation.latitude , longitude: gpsLocation.longitude )) > 2500) { // if distance change > 2.5 km + gpsLocation = location.coordinate + notificationCenter.post(name: Notification.Name("ChangedLocation"), object: nil) // notify view + } + } + } +} + +extension CLGeocoder { + func reverseGeocodeLocation(_ location: CLLocation) async throws -> [CLPlacemark] { + return try await withCheckedThrowingContinuation { continuation in + self.reverseGeocodeLocation(location) { placemarks, error in + if let error = error { + continuation.resume(throwing: error) + } else if let placemarks = placemarks { + continuation.resume(returning: placemarks) + } else { + continuation.resume(throwing: NSError(domain: "CLGeocoderError", code: 0, userInfo: nil)) + } + } + } + } +} diff --git "a/Oscar\302\260/Networking/RetryClientMiddleware.swift" "b/Oscar\302\260/Networking/RetryClientMiddleware.swift" new file mode 100644 index 0000000..1730c1b --- /dev/null +++ "b/Oscar\302\260/Networking/RetryClientMiddleware.swift" @@ -0,0 +1,148 @@ +// +// RetryClientMiddleware.swift +// Oscar° +// +// Created by Philipp Bolte on 22.01.24. +// + +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftOpenAPIGenerator open source project +// +// Copyright (c) 2023 Apple Inc. and the SwiftOpenAPIGenerator project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftOpenAPIGenerator project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import OpenAPIRuntime +import Foundation +import HTTPTypes + +/// A middleware that retries the request under certain conditions. +/// +/// Only meant to be used for illustrative purposes. +struct RetryingMiddleware { + + /// The failure signal that can lead to a retried request. + enum RetryableSignal: Hashable { + + /// Retry if the response code matches this code. + case code(Int) + + /// Retry if the response code falls into this range. + case range(Range) + + /// Retry if an error is thrown by a downstream middleware or transport. + case errorThrown + } + + /// The policy to use when a retryable signal hints that a retry might be appropriate. + enum RetryingPolicy: Hashable { + + /// Don't retry. + case never + + /// Retry up to the provided number of attempts. + case upToAttempts(count: Int) + } + + /// The policy of delaying the retried request. + enum DelayPolicy: Hashable { + + /// Don't delay, retry immediately. + case none + + /// Constant delay. + case constant(seconds: TimeInterval) + } + + /// The signals that lead to the retry policy being evaluated. + var signals: Set + + /// The policy used to evaluate whether to perform a retry. + var policy: RetryingPolicy + + /// The delay policy for retries. + var delay: DelayPolicy + + /// Creates a new retrying middleware. + /// - Parameters: + /// - signals: The signals that lead to the retry policy being evaluated. + /// - policy: The policy used to evaluate whether to perform a retry. + /// - delay: The delay policy for retries. + init( + signals: Set = [.code(429), .range(500..<600), .errorThrown], + policy: RetryingPolicy = .upToAttempts(count: 3), + delay: DelayPolicy = .constant(seconds: 1) + ) { + self.signals = signals + self.policy = policy + self.delay = delay + } +} + +extension RetryingMiddleware: ClientMiddleware { + func intercept( + _ request: HTTPRequest, + body: HTTPBody?, + baseURL: URL, + operationID: String, + next: (HTTPRequest, HTTPBody?, URL) async throws -> (HTTPResponse, HTTPBody?) + ) async throws -> (HTTPResponse, HTTPBody?) { + guard case .upToAttempts(count: let maxAttemptCount) = policy else { + return try await next(request, body, baseURL) + } + if let body { guard body.iterationBehavior == .multiple else { return try await next(request, body, baseURL) } } + func willRetry() async throws { + switch delay { + case .none: return + case .constant(seconds: let seconds): try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000)) + } + } + for attempt in 1...maxAttemptCount { + let (response, responseBody): (HTTPResponse, HTTPBody?) + if signals.contains(.errorThrown) { + do { (response, responseBody) = try await next(request, body, baseURL) } catch { + if attempt == maxAttemptCount { + throw error + } else { + print("Retrying after an error") + try await willRetry() + continue + } + } + } else { + (response, responseBody) = try await next(request, body, baseURL) + } + if signals.contains(response.status.code) && attempt < maxAttemptCount { + print("Retrying with code \(response.status.code)") + try await willRetry() + continue + } else { + return (response, responseBody) + } + } + preconditionFailure("Unreachable") + } +} + +extension Set where Element == RetryingMiddleware.RetryableSignal { + /// Checks whether the provided response code matches the retryable signals. + /// - Parameter code: The provided code to check. + /// - Returns: `true` if the code matches at least one of the signals, `false` otherwise. + func contains(_ code: Int) -> Bool { + for signal in self { + switch signal { + case .code(let int): if code == int { return true } + case .range(let range): if range.contains(code) { return true } + case .errorThrown: break + } + } + return false + } +} diff --git "a/Oscar\302\260/Networking/WeatherObservable.swift" "b/Oscar\302\260/Networking/WeatherObservable.swift" new file mode 100644 index 0000000..546021a --- /dev/null +++ "b/Oscar\302\260/Networking/WeatherObservable.swift" @@ -0,0 +1,52 @@ +// +// WeatherObservable.swift +// Oscar° +// +// Created by Philipp Bolte on 04.01.24. +// + +import Foundation + +@Observable +class Weather { + var isLoading: Bool = false + var forecast: Operations.getForecast.Output.Ok.Body.jsonPayload + var alerts: Operations.getAlerts.Output.Ok.Body.jsonPayload + var air: Operations.getAirQuality.Output.Ok.Body.jsonPayload + var time: Double + var radar: Components.Schemas.RadarResponse + var error: String = "" + var debug = false + + init() { + time = 0 + forecast = Operations.getForecast.Output.Ok.Body.jsonPayload.init( + latitude: 0.0, + longitude: 0.0, + current: .init(cloudcover: 0.0, time: 0.0, temperature: 0.0, windspeed: 0.0, wind_direction_10m: 0.0, weathercode: 0.0) + ) + alerts = .init() + air = Operations.getAirQuality.Output.Ok.Body.jsonPayload.init(latitude: 0, longitude: 0, hourly: nil) + radar = .init() + } + + // Update internal clock used for day simulation background + func updateTime() { + let dayBegin = self.forecast.hourly?.time.first ?? 0 + self.time = (Date.now.timeIntervalSince1970-dayBegin)/86400.0 + } + + private func currentTimeScaled() -> Double { + let now = Date() + let calendar = Calendar.current + + let hour = calendar.component(.hour, from: now) + let minute = calendar.component(.minute, from: now) + let second = calendar.component(.second, from: now) + + let totalSeconds = hour * 3600 + minute * 60 + second + let secondsInADay = 24 * 3600 + + return Double(totalSeconds) / Double(secondsInADay) + } +} diff --git "a/Oscar\302\260/Networking/openapi-generator-config.yml" "b/Oscar\302\260/Networking/openapi-generator-config.yml" new file mode 100644 index 0000000..ecefb47 --- /dev/null +++ "b/Oscar\302\260/Networking/openapi-generator-config.yml" @@ -0,0 +1,3 @@ +generate: + - types + - client diff --git "a/Oscar\302\260/Networking/openapi.yml" "b/Oscar\302\260/Networking/openapi.yml" new file mode 100644 index 0000000..2b78d51 --- /dev/null +++ "b/Oscar\302\260/Networking/openapi.yml" @@ -0,0 +1,1070 @@ +openapi: 3.1.0 +info: + title: Underlying Oscar Endpoints + description: 'This OpenAPI document outline all endpoints being used by Oscar for retrieving weather-related data.' + version: '1.0' + contact: + name: Philipp Bolte + url: https://bolte.id/ + email: oscar@bolte.id + license: + name: Attribution 4.0 International (CC BY 4.0) + url: https://creativecommons.org/licenses/by/4.0/ +servers: + - url: https://api.open-meteo.com + description: "Public Open-Meteo endpoint" + - url: https://air-quality-api.open-meteo.com + description: "Public AQI Open-Meteo endpoint" + - url: https://geocoding-api.open-meteo.com/v1 + description: "Public Geocoding Open-Meteo endpoint" + - url: https://api.brightsky.dev + description: "Public BrightSky endpoint" +paths: + /v1/forecast: + servers: + - url: https://api.open-meteo.com + get: + operationId: getForecast + tags: + - Weather Forecast APIs + summary: 7 day weather forecast for coordinates + description: 7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide. + parameters: + - name: latitude + in: query + required: true + description: "WGS84 coordinate" + schema: + type: number + format: number + - name: longitude + in: query + required: true + description: "WGS84 coordinate" + schema: + type: number + format: number + - name: hourly + in: query + explode: false + schema: + type: array + items: + type: string + enum: + - temperature_2m + - relativehumidity_2m + - dewpoint_2m + - apparent_temperature + - pressure_msl + - cloudcover + - cloudcover_low + - cloudcover_mid + - cloudcover_high + - windspeed_10m + - windspeed_80m + - windspeed_120m + - windspeed_180m + - winddirection_10m + - winddirection_80m + - winddirection_120m + - winddirection_180m + - windgusts_10m + - shortwave_radiation + - direct_radiation + - direct_normal_irradiance + - diffuse_radiation + - vapor_pressure_deficit + - evapotranspiration + - precipitation + - precipitation_probability + - weathercode + - snow_height + - freezinglevel_height + - soil_temperature_0cm + - soil_temperature_6cm + - soil_temperature_18cm + - soil_temperature_54cm + - soil_moisture_0_1cm + - soil_moisture_1_3cm + - soil_moisture_3_9cm + - soil_moisture_9_27cm + - soil_moisture_27_81cm + - is_day + - name: daily + in: query + schema: + type: array + items: + type: string + enum: + - temperature_2m_max + - temperature_2m_min + - apparent_temperature_max + - apparent_temperature_min + - precipitation_sum + - precipitation_hours + - precipitation_probability_max + - weathercode + - sunrise + - sunset + - windspeed_10m_max + - windgusts_10m_max + - winddirection_10m_dominant + - shortwave_radiation_sum + - uv_index_max + - uv_index_clear_sky_max + - et0_fao_evapotranspiration + - name: current + in: query + schema: + type: array + items: + type: string + enum: + - cloudcover + - temperature + - windspeed + - wind_direction_10m + - weathercode + - precipitation + - is_day + - name: temperature_unit + in: query + schema: + type: string + default: celsius + enum: + - celsius + - fahrenheit + - name: windspeed_unit + in: query + schema: + type: string + default: kmh + enum: + - kmh + - ms + - mph + - kn + - name: timeformat + in: query + description: If format `unixtime` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply `utc_offset_seconds` again to get the correct date. + schema: + type: string + default: iso8601 + enum: + - iso8601 + - unixtime + - name: timezone + in: query + description: If `timezone` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported. + schema: + type: string + - name: past_days + in: query + description: If `past_days` is set, yesterdays or the day before yesterdays data are also returned. + schema: + type: integer + enum: + - 1 + - 2 + - name: forecast_days + in: query + description: If `forecast_days` is set, the specified number of days will be included in the forecast + schema: + type: integer + enum: + - 1 + - 7 + - 14 + - name: models + in: query + description: Weather model + schema: + type: string + enum: + - best_match + - icon_seamless + responses: + 200: + description: OK + content: + application/json: + schema: + type: object + properties: + latitude: + type: number + example: 52.52 + description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. + longitude: + type: number + example: 13.419.52 + description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. + elevation: + type: number + example: 44.812 + description: The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect. + generationtime_ms: + type: number + example: 2.2119 + description: Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements. + utc_offset_seconds: + type: integer + example: 3600 + description: Applied timezone offset from the &timezone= parameter. + timezone_abbreviation: + type: string + hourly: + type: object + required: + - time + properties: + time: + type: array + items: + type: number + temperature_2m: + type: array + items: + type: number + relativehumidity_2m: + type: array + items: + type: number + dewpoint_2m: + type: array + items: + type: number + apparent_temperature: + type: array + items: + type: number + pressure_msl: + type: array + items: + type: number + cloudcover: + type: array + items: + type: number + cloudcover_low: + type: array + items: + type: number + cloudcover_mid: + type: array + items: + type: number + cloudcover_high: + type: array + items: + type: number + windspeed_10m: + type: array + items: + type: number + windspeed_80m: + type: array + items: + type: number + windspeed_120m: + type: array + items: + type: number + windspeed_180m: + type: array + items: + type: number + winddirection_10m: + type: array + items: + type: number + winddirection_80m: + type: array + items: + type: number + winddirection_120m: + type: array + items: + type: number + winddirection_180m: + type: array + items: + type: number + windgusts_10m: + type: array + items: + type: number + shortwave_radiation: + type: array + items: + type: number + direct_radiation: + type: array + items: + type: number + direct_normal_irradiance: + type: array + items: + type: number + diffuse_radiation: + type: array + items: + type: number + vapor_pressure_deficit: + type: array + items: + type: number + evapotranspiration: + type: array + items: + type: number + precipitation: + type: array + items: + type: number + precipitation_probability: + type: [array, null] + items: + type: [number, null] + weathercode: + type: array + items: + type: number + snow_height: + type: array + items: + type: number + freezinglevel_height: + type: array + items: + type: number + soil_temperature_0cm: + type: array + items: + type: number + soil_temperature_6cm: + type: array + items: + type: number + soil_temperature_18cm: + type: array + items: + type: number + soil_temperature_54cm: + type: array + items: + type: number + soil_moisture_0_1cm: + type: array + items: + type: number + soil_moisture_1_3cm: + type: array + items: + type: number + soil_moisture_3_9cm: + type: array + items: + type: number + soil_moisture_9_27cm: + type: array + items: + type: number + soil_moisture_27_81cm: + type: array + items: + type: number + is_day: + type: array + items: + type: number + description: For each selected weather variable, data will be returned as a numbering point array. Additionally a `time` array will be returned with ISO8601 timestamps. + hourly_units: + type: object + additionalProperties: + type: string + description: For each selected weather variable, the unit will be listed here. + daily: + $ref: '#/components/schemas/DailyResponse' + description: For each selected daily weather variable, data will be returned as a numbering point array. Additionally a `time` array will be returned with ISO8601 timestamps. + daily_units: + type: object + additionalProperties: + type: string + description: For each selected daily weather variable, the unit will be listed here. + current: + $ref: '#/components/schemas/CurrentWeather' + description: "Current weather conditions with the attributes: time, temperature, windspeed, winddirection and weathercode" + 400: + description: Bad Request + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + description: Always set true for errors + reason: + type: string + description: Description of the error + example: "Latitude must be in range of -90 to 90°. Given: 300" + /v1/air-quality: + servers: + - url: https://air-quality-api.open-meteo.com + get: + operationId: getAirQuality + tags: + - Weather Forecast APIs + parameters: + - name: latitude + in: query + required: true + description: "WGS84 coordinate" + schema: + type: number + format: number + - name: longitude + in: query + required: true + description: "WGS84 coordinate" + schema: + type: number + format: number + - name: timezone + in: query + description: If `timezone` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported. + schema: + type: string + - name: timeformat + in: query + description: If format `unixtime` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply `utc_offset_seconds` again to get the correct date. + schema: + type: string + default: iso8601 + enum: + - iso8601 + - unixtime + - name: forecast_days + in: query + schema: + type: integer + enum: + - 1 + - name: hourly + in: query + explode: false + schema: + type: array + items: + type: string + enum: + - time + - european_aqi + - european_aqi_pm2_5 + - european_aqi_pm10 + - european_aqi_no2 + - european_aqi_o3 + - european_aqi_so2 + - uv_index + responses: + 200: + description: OK + content: + application/json: + schema: + type: object + properties: + latitude: + type: number + example: 52.52 + description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. + longitude: + type: number + example: 13.419.52 + description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. + timezone_abbreviation: + type: string + hourly: + $ref: '#/components/schemas/AirQuality' + /search: + servers: + - url: https://geocoding-api.open-meteo.com/v1 + get: + operationId: search + summary: Search for geocoding information by name. + parameters: + - name: name + in: query + required: true + schema: + type: string + description: Name of the location to search for. + - name: count + in: query + schema: + type: integer + description: Number of results to return. + - name: language + in: query + schema: + type: string + default: de + enum: + - de + - en + - tr + description: Language of the response. + - name: format + in: query + schema: + type: string + enum: [json] + description: Format of the response. + responses: + '200': + description: A list of locations matching the search criteria. + content: + application/json: + schema: + $ref: '#/components/schemas/SearchResponse' + /radar: + servers: + - url: https://api.brightsky.dev + get: + operationId: getRainRadar + summary: Get weather radar data + parameters: + - name: date + in: query + required: true + schema: + type: string + description: The date and time for the requested radar data. + - name: bbox + in: query + schema: + type: array + items: + type: number + description: Bounding box coordinates. + - name: lat + in: query + required: true + schema: + type: number + description: Latitude of the location. + - name: lon + in: query + required: true + schema: + type: number + description: Longitude of the location. + - name: distance + in: query + schema: + type: integer + description: Distance parameter for radar data. + - name: tz + in: query + schema: + type: string + description: Time zone of the location. + - name: format + in: query + schema: + type: string + enum: [plain, otherFormats] + description: The format of the output data. + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RadarResponse' + /alerts: + servers: + - url: https://api.brightsky.dev + description: "Public BrightSky endpoint for weather alerts" + get: + operationId: getAlerts + tags: + - Alerts + summary: Fetch weather alerts for a specific location + description: Retrieves current weather alerts based on latitude and longitude coordinates. + parameters: + - name: lat + in: query + required: true + description: Latitude of the location + schema: + type: number + format: double + - name: lon + in: query + required: true + description: Longitude of the location + schema: + type: number + format: double + responses: + 200: + description: An array of weather alerts + content: + application/json: + schema: + type: object + properties: + alerts: + type: array + items: + $ref: '#/components/schemas/WeatherAlert' + location: + $ref: '#/components/schemas/AlertLocation' +components: + schemas: + WeatherAlert: + type: object + properties: + id: + type: integer + alert_id: + type: string + effective: + type: string + format: date-time + onset: + type: string + format: date-time + expires: + type: string + format: date-time + category: + type: string + response_type: + type: string + urgency: + type: string + severity: + type: string + certainty: + type: string + event_code: + type: integer + event_en: + type: string + event_de: + type: string + headline_en: + type: string + headline_de: + type: string + description_en: + type: string + description_de: + type: string + instruction_en: + type: string + nullable: true + instruction_de: + type: string + nullable: true + AlertLocation: + type: object + properties: + warn_cell_id: + type: integer + name: + type: string + name_short: + type: string + district: + type: string + state: + type: string + state_short: + type: string + HourlyResponse: + type: object + required: + - time + properties: + time: + type: array + items: + type: string + temperature_2m: + type: array + items: + type: number + relativehumidity_2m: + type: array + items: + type: number + dewpoint_2m: + type: array + items: + type: number + apparent_temperature: + type: array + items: + type: number + pressure_msl: + type: array + items: + type: number + cloudcover: + type: array + items: + type: number + cloudcover_low: + type: array + items: + type: number + cloudcover_mid: + type: array + items: + type: number + cloudcover_high: + type: array + items: + type: number + windspeed_10m: + type: array + items: + type: number + windspeed_80m: + type: array + items: + type: number + windspeed_120m: + type: array + items: + type: number + windspeed_180m: + type: array + items: + type: number + winddirection_10m: + type: array + items: + type: number + winddirection_80m: + type: array + items: + type: number + winddirection_120m: + type: array + items: + type: number + winddirection_180m: + type: array + items: + type: number + windgusts_10m: + type: array + items: + type: number + shortwave_radiation: + type: array + items: + type: number + direct_radiation: + type: array + items: + type: number + direct_normal_irradiance: + type: array + items: + type: number + diffuse_radiation: + type: array + items: + type: number + vapor_pressure_deficit: + type: array + items: + type: number + evapotranspiration: + type: array + items: + type: number + precipitation: + type: array + items: + type: number + precipitation_probability: + type: array + nullable: true + items: + nullable: true + type: number + weathercode: + type: array + items: + type: number + snow_height: + type: array + items: + type: number + freezinglevel_height: + type: array + items: + type: number + soil_temperature_0cm: + type: array + items: + type: number + soil_temperature_6cm: + type: array + items: + type: number + soil_temperature_18cm: + type: array + items: + type: number + soil_temperature_54cm: + type: array + items: + type: number + soil_moisture_0_1cm: + type: array + items: + type: number + soil_moisture_1_3cm: + type: array + items: + type: number + soil_moisture_3_9cm: + type: array + items: + type: number + soil_moisture_9_27cm: + type: array + items: + type: number + soil_moisture_27_81cm: + type: array + items: + type: number + DailyResponse: + type: object + properties: + time: + type: array + items: + type: number + temperature_2m_max: + type: array + items: + type: number + temperature_2m_min: + type: array + items: + type: number + apparent_temperature_max: + type: array + items: + type: number + apparent_temperature_min: + type: array + items: + type: number + precipitation_sum: + type: array + items: + type: number + precipitation_hours: + type: array + items: + type: number + precipitation_probability_max: + type: [array, null] + items: + type: [number, null] + weathercode: + type: array + items: + type: number + sunrise: + type: array + items: + type: number + sunset: + type: array + items: + type: number + windspeed_10m_max: + type: array + items: + type: number + windgusts_10m_max: + type: array + items: + type: number + winddirection_10m_dominant: + type: array + items: + type: number + shortwave_radiation_sum: + type: array + items: + type: number + uv_index_max: + type: array + items: + type: number + uv_index_clear_sky_max: + type: array + items: + type: number + et0_fao_evapotranspiration: + type: array + items: + type: number + required: + - time + CurrentWeather: + type: object + properties: + cloudcover: + type: number + time: + type: number + temperature: + type: number + windspeed: + type: number + wind_direction_10m: + type: number + weathercode: + type: number + precipitation: + type: number + is_day: + type: number + required: + - cloudcover + - time + - temperature + - windspeed + - wind_direction_10m + - weathercode + AirQuality: + type: object + properties: + time: + type: array + items: + type: number + european_aqi: + type: array + items: + type: number + european_aqi_pm2_5: + type: array + items: + type: number + european_aqi_pm10: + type: array + items: + type: number + european_aqi_no2: + type: array + items: + type: number + european_aqi_o3: + type: array + items: + type: number + european_aqi_so2: + type: array + items: + type: number + uv_index: + type: array + items: + type: number + SearchResponse: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Location' + generationtime_ms: + type: number + format: float + description: Time taken to generate the response, in milliseconds. + + Location: + type: object + properties: + id: + type: integer + name: + type: string + latitude: + type: number + format: float + longitude: + type: number + format: float + elevation: + type: number + format: float + feature_code: + type: string + country_code: + type: string + admin1_id: + type: integer + admin3_id: + type: integer + admin4_id: + type: integer + timezone: + type: string + country_id: + type: integer + country: + type: string + admin1: + type: string + admin3: + type: string + admin4: + type: string + population: + type: integer + nullable: true + postcodes: + type: array + items: + type: string + nullable: true + RadarResponse: + type: object + properties: + radar: + type: array + items: + $ref: '#/components/schemas/RadarData' + RadarData: + type: object + properties: + timestamp: + type: string + format: date-time + source: + type: string + precipitation_5: + type: array + items: + type: array + items: + type: integer diff --git "a/Oscar\302\260/Oscar\302\260.entitlements" "b/Oscar\302\260/Oscar\302\260.entitlements" new file mode 100644 index 0000000..425394c --- /dev/null +++ "b/Oscar\302\260/Oscar\302\260.entitlements" @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.cloud.bolte.Oscar + + + diff --git "a/Oscar\302\260/PrivacyInfo.xcprivacy" "b/Oscar\302\260/PrivacyInfo.xcprivacy" new file mode 100644 index 0000000..c43da1f --- /dev/null +++ "b/Oscar\302\260/PrivacyInfo.xcprivacy" @@ -0,0 +1,17 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + + + + diff --git "a/Oscar\302\260/Storage/CityService.swift" "b/Oscar\302\260/Storage/CityService.swift" index 5665cf6..a97c224 100644 --- "a/Oscar\302\260/Storage/CityService.swift" +++ "b/Oscar\302\260/Storage/CityService.swift" @@ -8,10 +8,10 @@ import CoreData import SwiftUI import Combine import MapKit -import SPIndicator +import WidgetKit + +public class CityService: ObservableObject { -public class LocationViewModel: ObservableObject { - @Published var cities: [City] private let context: NSManagedObjectContext @@ -28,7 +28,6 @@ public class LocationViewModel: ObservableObject { do { try self.context.save() update() - UIApplication.shared.playHapticFeedback() nc.post(name: Notification.Name("CityToggle"), object: nil) } catch { let nsError = error as NSError @@ -47,6 +46,7 @@ public class LocationViewModel: ObservableObject { } } + #if os(iOS) func addCity(searchResult: MKLocalSearchCompletion) { self.getCoordinates(searchCompletion: searchResult) { coords in let label = searchResult.title.split(separator: ",")[0].description @@ -64,6 +64,7 @@ public class LocationViewModel: ObservableObject { } } } + #endif func addCity(city: Array) { let newCity = City(context: self.context) @@ -84,7 +85,6 @@ public class LocationViewModel: ObservableObject { city.selected = false } save() - //nc.post(name: Notification.Name("CityToggle"), object: nil) } func toggleActiveCity(city: City) { @@ -97,9 +97,153 @@ public class LocationViewModel: ObservableObject { city.selected = true } save() + } + + func getSelectedCity() -> Optional { + let selectedCities = self.cities.filter{$0.selected} + if (selectedCities.isEmpty) { + return nil + } + return selectedCities.first! + } + + func getSelectedCityCoordinates() ->Optional { + let selectedCity = getSelectedCity() + if let city = selectedCity { + return CLLocationCoordinate2D(latitude: city.lat, longitude: city.lon) + } + return nil + } + + #if os(iOS) + private func getCoordinates(searchCompletion: MKLocalSearchCompletion, completion: @escaping (CLLocationCoordinate2D) -> Void) { + let searchRequest = MKLocalSearch.Request(completion: searchCompletion) + let search = MKLocalSearch(request: searchRequest) + + search.start { response, error in + let coordinates = response?.mapItems[0].placemark.coordinate ?? CLLocationCoordinate2D(latitude: 0, longitude: 0) + completion(coordinates) + } + } + #endif +} + +@Observable +public class CityServiceNew { + var cities: [City] + + private let context: NSManagedObjectContext + private let pc = PersistenceController.shared + private let nc = NotificationCenter.default + + init() { + self.cities = [] + self.context = pc.container.viewContext + self.update() + } + + private func save() { + do { + try self.context.save() + update() + nc.post(name: Notification.Name("CityToggle"), object: nil) + WidgetCenter.shared.reloadAllTimelines() + } catch { + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + } + } + + func update() { + do { + self.context.refreshAllObjects() + let fetchRequest: NSFetchRequest = City.fetchRequest() + fetchRequest.sortDescriptors = [NSSortDescriptor(key: "orderIndex", ascending: true)] + self.cities = try self.context.fetch(fetchRequest) + } catch { + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + } + } + + func addCity(searchResult: Components.Schemas.Location) { + guard let lat = searchResult.latitude, let lon = searchResult.longitude else { + return + } + if let existingCity = self.getExistingCity(latitude: Double(lat), longitude: Double(lon)) { + self.toggleActiveCity(city: existingCity) + } else { + let newCity = City(context: self.context) + newCity.label = searchResult.name + newCity.lat = Double(lat) + newCity.lon = Double(lon) + newCity.selected = false + newCity.orderIndex = self.getMaxOrderIndex() + 1 + + save() + self.toggleActiveCity(city: newCity) + } + } + + func deleteCity(offsets: IndexSet) { + let indicesToDelete = offsets.map { cities[$0].orderIndex } + offsets.map { cities[$0] }.forEach(context.delete) + save() + updateOrderIndexesAfterDeletion(deletedIndices: indicesToDelete) + } + + func disableAllCities() { + for city in cities { + city.selected = false + } + save() + //nc.post(name: Notification.Name("CityToggle"), object: nil) + } + + func toggleActiveCity(city: City) { + if (city.selected) { + city.selected = false + } else { + for city in cities { + city.selected = false + } + city.selected = true + } + self.save() //nc.post(name: Notification.Name("CityToggle"), object: nil) } + func moveCity(from source: IndexSet, to destination: Int) { + var revisedCities = cities + revisedCities.move(fromOffsets: source, toOffset: destination) + + // Update the orderIndex to reflect the new order + for (index, city) in revisedCities.enumerated() { + city.orderIndex = Int64(index) + } + + // Save the updated order to the context + save() + } + + + func getSelectedCity() -> Optional { + let selectedCities = self.cities.filter{$0.selected} + if (selectedCities.isEmpty) { + return nil + } + return selectedCities.first! + } + + func getSelectedCityCoordinates() ->Optional { + let selectedCity = getSelectedCity() + if let city = selectedCity { + return CLLocationCoordinate2D(latitude: city.lat, longitude: city.lon) + } + return nil + } + + #if os(iOS) private func getCoordinates(searchCompletion: MKLocalSearchCompletion, completion: @escaping (CLLocationCoordinate2D) -> Void) { let searchRequest = MKLocalSearch.Request(completion: searchCompletion) let search = MKLocalSearch(request: searchRequest) @@ -109,6 +253,72 @@ public class LocationViewModel: ObservableObject { completion(coordinates) } } + #endif + + private func hasEntitiesWithoutOrderId() -> Bool { + let fetchRequest: NSFetchRequest = City.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "orderIndex == nil") + + do { + let results = try context.fetch(fetchRequest) + return !results.isEmpty + } catch { + print("Error fetching entities without orderIndex: \(error)") + return false + } + } + + private func assignOrderIndexesToExistingEntities() { + do { + let fetchRequest: NSFetchRequest + fetchRequest = City.fetchRequest() + let results = try self.context.fetch(fetchRequest) + + for (index, entity) in results.enumerated() { + entity.orderIndex = Int64(index) + } + + try context.save() + } catch { + print("Error assigning orderIndexes: \(error)") + } + } + + private func getMaxOrderIndex() -> Int64 { + let fetchRequest: NSFetchRequest = City.fetchRequest() + let sortDescriptor = NSSortDescriptor(key: "orderIndex", ascending: false) + fetchRequest.sortDescriptors = [sortDescriptor] + fetchRequest.fetchLimit = 1 + + do { + let results = try context.fetch(fetchRequest) + return results.first?.orderIndex ?? 0 + } catch { + print("Error fetching max order index: \(error)") + return 0 + } + } + + private func updateOrderIndexesAfterDeletion(deletedIndices: [Int64]) { + let fetchRequest: NSFetchRequest = City.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "orderIndex > %@", argumentArray: deletedIndices) + + do { + let results = try context.fetch(fetchRequest) + for city in results { + city.orderIndex -= Int64(deletedIndices.count) + } + try context.save() + } catch { + print("Error updating order indexes after deletion: \(error)") + } + } + + private func getExistingCity(latitude: Double, longitude: Double) -> City? { + return self.cities.first { $0.lat == latitude && $0.lon == longitude } + } } + + diff --git "a/Oscar\302\260/Storage/DataModels.xcdatamodeld/DataModels.xcdatamodel/contents" "b/Oscar\302\260/Storage/DataModels.xcdatamodeld/DataModels.xcdatamodel/contents" index 7fa9488..ad784f4 100644 --- "a/Oscar\302\260/Storage/DataModels.xcdatamodeld/DataModels.xcdatamodel/contents" +++ "b/Oscar\302\260/Storage/DataModels.xcdatamodeld/DataModels.xcdatamodel/contents" @@ -1,20 +1,19 @@ - + + + + - - - - \ No newline at end of file diff --git "a/Oscar\302\260/Storage/PersistenceController.swift" "b/Oscar\302\260/Storage/PersistenceController.swift" index bdd2920..e40340b 100644 --- "a/Oscar\302\260/Storage/PersistenceController.swift" +++ "b/Oscar\302\260/Storage/PersistenceController.swift" @@ -14,24 +14,28 @@ struct PersistenceController { init(inMemory: Bool = false) { container = NSPersistentContainer(name: "DataModels") + let url = URL.storeURL(for: "group.cloud.bolte.Oscar", dbName: "DataModels") + let storeDescription = NSPersistentStoreDescription(url: url) + container.persistentStoreDescriptions = [storeDescription] + if inMemory { container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null") } + container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - - /* - Typical reasons for an error here include: - * The parent directory does not exist, cannot be created, or disallows writing. - * The persistent store is not accessible, due to permissions or data protection when the device is locked. - * The device is out of space. - * The store could not be migrated to the current model version. - Check the error message to determine what the actual problem was. - */ fatalError("Unresolved error \(error), \(error.userInfo)") } }) + container.viewContext.automaticallyMergesChangesFromParent = true + } +} + +public extension URL { + static func storeURL(for appGroup: String, dbName: String) -> URL { + guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup) else { + fatalError("Shared file container could not be created.") + } + return fileContainer.appendingPathComponent("\(dbName).sqlite") } } diff --git "a/Oscar\302\260/Storage/SettingService.swift" "b/Oscar\302\260/Storage/SettingService.swift" index 98977a6..fb27f59 100644 --- "a/Oscar\302\260/Storage/SettingService.swift" +++ "b/Oscar\302\260/Storage/SettingService.swift" @@ -51,6 +51,8 @@ public class SettingService: ObservableObject { defaultSettings.rainviewerLayer = false defaultSettings.infrarotLayer = false defaultSettings.tempLayer = false + defaultSettings.humidityLayer = false + defaultSettings.windDirectionLayer = false self.save() } else { self.settings = result.first! diff --git "a/Oscar\302\260/ViewModels/NowViewModel.swift" "b/Oscar\302\260/ViewModels/NowViewModel.swift" deleted file mode 100644 index 62aa3d3..0000000 --- "a/Oscar\302\260/ViewModels/NowViewModel.swift" +++ /dev/null @@ -1,479 +0,0 @@ -// -// NowViewModel.swift -// Weather -// -// -// Created by Philipp Bolte on 17.12.20. -// -import Foundation -import CoreLocation -import Combine -import SwiftUI -import SPIndicator -import WidgetKit -import Alamofire - -class NowViewModel: NSObject, CLLocationManagerDelegate, ObservableObject { - @Published var lm: LocationManager = LocationManager() - @Published var cs: LocationViewModel = LocationViewModel() - @Published var updateDidFinish: Bool = true - @Published var time: Double = 1.0 - - let dispatchGroup = DispatchGroup() - private let defaultCoordinates = CLLocationCoordinate2D(latitude: 52.01, longitude: 10.77) // just in case... - - var anyCancellable = Set() - let objectWillChange = ObservableObjectPublisher() - var weather: OpenMeteoResponse? { - willSet { - objectWillChange.send() - } - } - - var aqi: AQIResponse? { - willSet { - objectWillChange.send() - } - } - - - var currentRadarMetadata: WeatherMapsResponse? { - willSet { - objectWillChange.send() - } - } - - var placemark: String? { - willSet { - objectWillChange.send() - } - } - - var alerts: [DWDAlert]? { - willSet { - objectWillChange.send() - } - } - - var rain: RainRadarForecast? { - willSet { - objectWillChange.send() - } - } - - - override init() { - super.init() - - // Init Location and City model - lm.objectWillChange.sink { - self.objectWillChange.send() - } - .store(in: &anyCancellable) - - cs.objectWillChange.sink { - self.objectWillChange.send() - } - .store(in: &anyCancellable) - - // For our Maplayer - fetchCurrentRadarMetadata() - } - - - /* - * Update all info like location, stored cities, forecast, and radar data - */ - func update() { - if !self.updateDidFinish { - return - } - - self.updateDidFinish = false - - cs.update() - lm.update() - - fetchCurrentPlacemark() - fetchOpenMeteoData() - fetchCurrentRainData() - fetchWeatherAlerts() - fetchCurrentRadarMetadata() - fetchAQIData() - - dispatchGroup.notify(queue: DispatchQueue.global()) { - self.updateDidFinish = true - } - - WidgetCenter.shared.reloadAllTimelines() - } - - func getCurrentCoords() -> CLLocationCoordinate2D { - // Get weather location - var coordinates: CLLocationCoordinate2D - let selectedCities = cs.cities.filter{$0.selected} - - if (selectedCities.count > 0) { - let city = selectedCities.first! - coordinates = CLLocationCoordinate2D(latitude: round(city.lat * 1000) / 1000.0, longitude: round(city.lon * 1000) / 1000.0) - } else { - let coords = lm.gpsLocation ?? defaultCoordinates - coordinates = CLLocationCoordinate2D(latitude: round(coords.latitude * 1000) / 1000.0, longitude: round(coords.longitude * 1000) / 1000.0) - } - return coordinates - } - - - func getActiveLocation() -> CLLocationCoordinate2D { - var coordinates: CLLocationCoordinate2D - let selectedCities = cs.cities.filter{$0.selected} - - if (selectedCities.count > 0) { - let city = selectedCities.first! - coordinates = CLLocationCoordinate2D(latitude: city.lat, longitude: city.lon) - } else { - let coords = lm.gpsLocation ?? defaultCoordinates - coordinates = CLLocationCoordinate2D(latitude: coords.latitude, longitude: coords.longitude) - } - return coordinates - } - - /* - * Fetch placemark object of users current location - */ - func fetchCurrentPlacemark() { - dispatchGroup.enter() - - // Get weather location - var location: CLLocation - let selectedCities = cs.cities.filter{$0.selected} - - if (selectedCities.count > 0) { - let city = selectedCities.first! - self.placemark = city.label - location = CLLocation(latitude: city.lat, longitude: city.lon) - dispatchGroup.leave() - return - } else { - let coords = lm.gpsLocation ?? defaultCoordinates - location = CLLocation(latitude: coords.latitude, longitude: coords.longitude) - } - - - let geocoder = CLGeocoder() - geocoder.reverseGeocodeLocation(location, - completionHandler: { - [self] (placemarks, error) in - if error == nil { - let firstLocation = placemarks?[0] - self.placemark = firstLocation?.locality ?? "..." - dispatchGroup.leave() - } else { - print("Error fetching Coordinates") - dispatchGroup.leave() - } - }) - } - - /* - * Fetch weather of current user location via external service - */ - func fetchCurrentWeather() { - dispatchGroup.enter() - - let coordinates = self.getCurrentCoords() - let url = "https://forecast.bolte.id/api/v3/weather/forecast?lat=\(coordinates.latitude)&lon=\(coordinates.longitude)&key=4d0ddebf-918f-495c-bc9c-fefa333a30c7" - AF.request(url).validate().responseDecodable(of: BrightskyResponse.self) { [self] response in - switch response.result { - case .success: - //self.weather = response.value - dispatchGroup.leave() - case let .failure(error): - print(error) - dispatchGroup.leave() - } - } - } - - func fetchCurrentRadarMetadata() { - dispatchGroup.enter() - let url = "https://api.rainviewer.com/public/weather-maps.json" - - // Call rainviewer and get current tile URL - AF.request(url).validate().responseDecodable(of: WeatherMapsResponse.self) { [self] response in - switch response.result { - case .success: - self.currentRadarMetadata = response.value - dispatchGroup.leave() - case let .failure(error): - print(error) - dispatchGroup.leave() - } - } - } - - func fetchCurrentRainData() { - dispatchGroup.enter() - let url = "https://api.oscars.love/api/v1/rain?lat=\(getCurrentCoords().latitude.description)&lon=\(getCurrentCoords().longitude.description)" - // Call rainviewer and get current tile URL - AF.request(url).validate().responseDecodable(of: RainRadarForecast.self) { [self] response in - switch response.result { - case .success: - self.rain = response.value - dispatchGroup.leave() - case let .failure(error): - print(error) - dispatchGroup.leave() - } - } - } - - func fetchWeatherAlerts() { - dispatchGroup.enter() - let url: String = "https://api.oscars.love/api/v1/alerts?lat=\(getCurrentCoords().latitude.description)&lon=\(getCurrentCoords().longitude.description)" - AF.request(url).validate().responseDecodable(of: DWDAlerts.self) { [self] response in - switch response.result { - case .success: - self.alerts = response.value - dispatchGroup.leave() - case let .failure(error): - print(error) - dispatchGroup.leave() - } - } - } - - func fetchOpenMeteoData() { - dispatchGroup.enter() - let url: String = "https://api.open-meteo.com/v1/forecast?latitude=\(getCurrentCoords().latitude.description)&longitude=\(getCurrentCoords().longitude.description)&hourly=temperature_2m,apparent_temperature,surface_pressure,precipitation,weathercode,cloudcover,windspeed_10m,winddirection_10m,soil_temperature_6cm,soil_moisture_3_9cm,precipitation_probability&daily=weathercode,temperature_2m_max,temperature_2m_min,sunrise,sunset,precipitation_sum,precipitation_hours,windspeed_10m_max,winddirection_10m_dominant,shortwave_radiation_sum,precipitation_probability_max¤t_weather=true&timeformat=unixtime&forecast_days=14&timezone=auto" - AF.request(url).validate().responseDecodable(of: OpenMeteoResponse.self) { [self] response in - switch response.result { - case .success: - self.weather = response.value - let dayBegin = response.value!.hourly.time.first! - // We take the time from the API to correctlz handle different timezones - self.time = (Date.now.timeIntervalSince1970-dayBegin!)/86400.0 - dispatchGroup.leave() - case let .failure(error): - print(error) - dispatchGroup.leave() - } - } - } - - func fetchAQIData() { - dispatchGroup.enter() - let url: String = "https://air-quality-api.open-meteo.com/v1/air-quality?latitude=\(getCurrentCoords().latitude.description)&longitude=\(getCurrentCoords().longitude.description)&hourly=european_aqi,european_aqi_pm2_5,european_aqi_pm10,european_aqi_no2,european_aqi_o3,european_aqi_so2,uv_index&timezone=auto" - AF.request(url).validate().responseDecodable(of: AQIResponse.self) { [self] response in - switch response.result { - case .success: - self.aqi = response.value - dispatchGroup.leave() - case let .failure(error): - print(error) - dispatchGroup.leave() - } - } - } - - func getBackgroundTopStops() -> [Gradient.Stop] { - if (self.weather == nil) { - return [ - .init(color: .midnightStart, location: 0), - .init(color: .midnightStart, location: 0.25), - .init(color: .sunriseStart, location: 0.33), - .init(color: .sunnyDayStart, location: 0.38), - .init(color: .sunnyDayStart, location: 0.7), - .init(color: .sunsetStart, location: 0.78), - .init(color: .midnightStart, location: 0.82), - .init(color: .midnightStart, location: 1) - ] - } - - let dayLength = 86400.0 - let dayBegin = self.weather!.hourly.time.first! - let sunrise = self.weather!.daily.sunrise.first! - let sunset = self.weather!.daily.sunset.first! - - if self.isRaining() { - return [ - .init(color: .midnightStart, location: 0), - .init(color: .midnightStart, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .rainyStart, location: (sunrise - dayBegin!)/dayLength), - .init(color: .rainyStart, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .rainyStart, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .rainyStart, location: (sunset - dayBegin!)/dayLength), - .init(color: .midnightStart, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .midnightStart, location: 1) - ] - } - - return [ - .init(color: .midnightStart, location: 0), - .init(color: .midnightStart, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .sunriseStart, location: (sunrise - dayBegin!)/dayLength), - .init(color: .sunnyDayStart, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .sunnyDayStart, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .sunsetStart, location: (sunset - dayBegin!)/dayLength), - .init(color: .midnightStart, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .midnightStart, location: 1) - ] - - } - - func getBackgroundBottomStops() -> [Gradient.Stop] { - if (self.weather == nil) { - return [ - .init(color: .midnightEnd, location: 0), - .init(color: .midnightEnd, location: 0.25), - .init(color: .sunriseEnd, location: 0.33), - .init(color: .sunnyDayEnd, location: 0.38), - .init(color: .sunnyDayEnd, location: 0.7), - .init(color: .sunsetEnd, location: 0.78), - .init(color: .midnightEnd, location: 0.82), - .init(color: .midnightEnd, location: 1) - ] - } - - let dayLength = 86400.0 - let dayBegin = self.weather!.hourly.time.first! - let sunrise = self.weather!.daily.sunrise.first! - let sunset = self.weather!.daily.sunset.first! - - if self.isRaining() { - return [ - .init(color: .midnightEnd, location: 0), - .init(color: .midnightEnd, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .rainyEnd, location: (sunrise - dayBegin!)/dayLength), - .init(color: .rainyEnd, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .rainyEnd, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .rainyEnd, location: (sunset - dayBegin!)/dayLength), - .init(color: .midnightEnd, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .midnightEnd, location: 1) - ] - } - - return [ - .init(color: .midnightEnd, location: 0), - .init(color: .midnightEnd, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .sunriseEnd, location: (sunrise - dayBegin!)/dayLength), - .init(color: .sunnyDayEnd, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .sunnyDayEnd, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .sunsetStart, location: (sunset - dayBegin!)/dayLength), - .init(color: .midnightEnd, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .midnightEnd, location: 1) - ] - } - - func getCloudTopStops() -> [Gradient.Stop] { - if (self.weather == nil) { - return [ - .init(color: .darkCloudStart, location: 0), - .init(color: .darkCloudStart, location: 0.25), - .init(color: .sunriseCloudStart, location: 0.33), - .init(color: .lightCloudStart, location: 0.38), - .init(color: .lightCloudStart, location: 0.7), - .init(color: .sunsetCloudStart, location: 0.78), - .init(color: .darkCloudStart, location: 0.82), - .init(color: .darkCloudStart, location: 1) - ] - } - - let dayLength = 86400.0 - let dayBegin = self.weather!.hourly.time.first! - let sunrise = self.weather!.daily.sunrise.first! - let sunset = self.weather!.daily.sunset.first! - - if self.isRaining() { - return [ - .init(color: .darkCloudStart, location: 0), - .init(color: .darkCloudStart, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .rainCloudStart, location: (sunrise - dayBegin!)/dayLength), - .init(color: .rainCloudStart, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .rainCloudStart, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .rainCloudStart, location: (sunset - dayBegin!)/dayLength), - .init(color: .darkCloudStart, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .darkCloudStart, location: 1) - ] - } - - return [ - .init(color: .darkCloudStart, location: 0), - .init(color: .darkCloudStart, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .sunriseCloudStart, location: (sunrise - dayBegin!)/dayLength), - .init(color: .lightCloudStart, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .lightCloudStart, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .sunsetCloudStart, location: (sunset - dayBegin!)/dayLength), - .init(color: .darkCloudStart, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .darkCloudStart, location: 1) - ] - } - - func getCloudBottomStops() -> [Gradient.Stop] { - if (self.weather == nil) { - return [ - .init(color: .darkCloudEnd, location: 0), - .init(color: .darkCloudEnd, location: 0.25), - .init(color: .sunriseCloudEnd, location: 0.33), - .init(color: .lightCloudEnd, location: 0.38), - .init(color: .lightCloudEnd, location: 0.7), - .init(color: .sunsetCloudEnd, location: 0.78), - .init(color: .darkCloudEnd, location: 0.92), - .init(color: .darkCloudEnd, location: 1) - ] - } - - let dayLength = 86400.0 - let dayBegin = self.weather!.hourly.time.first! - let sunrise = self.weather!.daily.sunrise.first! - let sunset = self.weather!.daily.sunset.first! - - if self.isRaining() { - return [ - .init(color: .darkCloudEnd, location: 0), - .init(color: .darkCloudEnd, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .rainCloudEnd, location: (sunrise - dayBegin!)/dayLength), - .init(color: .rainCloudEnd, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .rainCloudEnd, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .rainCloudEnd, location: (sunset - dayBegin!)/dayLength), - .init(color: .darkCloudEnd, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .darkCloudEnd, location: 1) - ] - } - - return [ - .init(color: .darkCloudEnd, location: 0), - .init(color: .darkCloudEnd, location: (sunrise - dayBegin!)/dayLength - 0.08), - .init(color: .sunriseCloudEnd, location: (sunrise - dayBegin!)/dayLength), - .init(color: .lightCloudEnd, location: (sunrise - dayBegin!)/dayLength + 0.05), - .init(color: .lightCloudEnd, location: (sunset - dayBegin!)/dayLength - 0.08), - .init(color: .sunsetCloudEnd, location: (sunset - dayBegin!)/dayLength), - .init(color: .darkCloudEnd, location: (sunset - dayBegin!)/dayLength + 0.04), - .init(color: .darkCloudEnd, location: 1) - ] - } - - let starStops: [Gradient.Stop] = [ - .init(color: .white, location: 0), - .init(color: .white, location: 0.25), - .init(color: .clear, location: 0.33), - .init(color: .clear, location: 0.38), - .init(color: .clear, location: 0.7), - .init(color: .clear, location: 0.78), - .init(color: .white, location: 0.82), - .init(color: .white, location: 1) - ] - - var starOpacity: Double { - let color = starStops.interpolated(amount: self.time) - return color.getComponents().alpha - } - - func isRaining() -> Bool { - if self.weather?.currentWeather.getStormType() != Storm.Contents.none || (self.rain?.data.first?.mmh ?? 0.0) > 0.0 { - return true - } - return false - } -} - diff --git "a/Oscar\302\260/ViewModels/SearchViewModel.swift" "b/Oscar\302\260/ViewModels/SearchViewModel.swift" deleted file mode 100644 index 9f1080c..0000000 --- "a/Oscar\302\260/ViewModels/SearchViewModel.swift" +++ /dev/null @@ -1,70 +0,0 @@ -// -// SearchViewModel.swift -// SearchViewModel -// -// Created by Philipp Bolte on 16.08.21. -// Credits to https://www.peteralt.com/blog/mapkit-location-search-with-swiftui/ -// - -import Foundation -import Combine -import MapKit - -class SearchViewModel: NSObject, ObservableObject { - - enum SearchStatus: Equatable { - case idle - case noResults - case isSearching - case error(String) - case result - } - - @Published var queryFragment: String = "" - @Published var status: SearchStatus = .idle - @Published private(set) var searchResults: [MKLocalSearchCompletion] = [] - - private var queryCancellable: AnyCancellable? - private let searchCompleter: MKLocalSearchCompleter! - - init(searchCompleter: MKLocalSearchCompleter = MKLocalSearchCompleter()) { - self.searchCompleter = searchCompleter - super.init() - self.searchCompleter.delegate = self - - queryCancellable = $queryFragment - .receive(on: DispatchQueue.main) - .debounce(for: .milliseconds(150), scheduler: RunLoop.main, options: nil) - .sink(receiveValue: { fragment in - self.status = .isSearching - if !fragment.isEmpty { - self.searchCompleter.queryFragment = fragment - } else { - self.status = .idle - self.searchResults = [] - } - }) - } - - func getCoordinates(searchCompletion: MKLocalSearchCompletion, completion: @escaping (CLLocationCoordinate2D) -> Void) { - let searchRequest = MKLocalSearch.Request(completion: searchCompletion) - let search = MKLocalSearch(request: searchRequest) - - search.start { response, error in - let coordinates = response?.mapItems[0].placemark.coordinate ?? CLLocationCoordinate2D(latitude: 0, longitude: 0) - completion(coordinates) - } - } -} - -extension SearchViewModel: MKLocalSearchCompleterDelegate { - func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) { - self.searchResults = completer.results - self.status = completer.results.isEmpty ? .noResults : .result - } - - func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) { - self.status = .error(error.localizedDescription) - } -} - diff --git "a/Oscar\302\260/Views/AlertDetailView.swift" "b/Oscar\302\260/Views/AlertDetailView.swift" index b2a1a00..8ef9df2 100644 --- "a/Oscar\302\260/Views/AlertDetailView.swift" +++ "b/Oscar\302\260/Views/AlertDetailView.swift" @@ -8,18 +8,18 @@ import SwiftUI struct AlertListView: View { - @Binding var alerts: [DWDAlert]? @Environment(\.presentationMode) var presentationMode + @Environment(Weather.self) private var weather: Weather var body: some View { NavigationView { - List(alerts ?? [], id: \.self) { alert in + List(weather.alerts.alerts ?? [] , id: \.self) { alert in AlertDetailView(alert: alert) } .navigationBarTitle(Text("Unwetterwarnungen"), displayMode: .inline) .toolbar(content: { ToolbarItem(placement: .navigationBarTrailing, content: { - Button("Fertig", action: { + Button(String(localized: "Fertig"), action: { presentationMode.wrappedValue.dismiss() UIApplication.shared.playHapticFeedback() }) @@ -30,7 +30,7 @@ struct AlertListView: View { } struct AlertDetailView: View { - var alert: DWDAlert + var alert: Components.Schemas.WeatherAlert var body: some View { VStack { HStack { @@ -38,22 +38,22 @@ struct AlertDetailView: View { .resizable() .foregroundColor(.orange) .frame(width: 15, height: 15) - Text(alert.event) - .font(.title3) + Text(getHeadline()) + .font(.headline) .bold() Spacer() } .padding(.bottom, 1) HStack { - Text("Start: " + alert.getStartDate()) + Text("Start: " + getStartDate()) .font(.subheadline) .lineLimit(5) .minimumScaleFactor(0.5) Spacer() } HStack { - Text("Ende: " + alert.getEndDate()) + Text("Ende: " + getEndDate()) .font(.subheadline) .lineLimit(5) .minimumScaleFactor(0.5) @@ -62,7 +62,15 @@ struct AlertDetailView: View { .padding(.bottom, 1.5) HStack { - Text(alert.descriptionText) + Text(getDescription()) + .font(.subheadline) + .minimumScaleFactor(0.5) + Spacer() + } + .padding(.bottom, 1.5) + + HStack { + Text(getInstruction()) .font(.subheadline) .minimumScaleFactor(0.5) Spacer() @@ -78,3 +86,45 @@ struct AlertDetailView: View { .padding([.top, .bottom]) } } + +extension AlertDetailView { + public func getStartDate() -> String { + return formatDate(date: alert.onset ?? Date()) + } + + public func getEndDate() -> String { + return formatDate(date: alert.expires ?? Date()) + } + + public func formatDate(date: Date) -> String { + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .short + dateFormatter.timeStyle = .short + dateFormatter.locale = Locale(identifier: "de") + return dateFormatter.string(from: date) + } + + public func getHeadline() -> String { + let langStr = Locale.current.language.languageCode?.identifier ?? "de" + let headlineDe = alert.event_de ?? "" + let headlineEn = (alert.event_en ?? "").capitalized + let localizedEvent = langStr == "de" ? headlineDe : headlineEn + return localizedEvent + } + + public func getDescription() -> String { + let langStr = Locale.current.language.languageCode?.identifier ?? "de" + let descriptionDe = alert.description_de ?? "" + let descriptionEn = alert.description_en ?? "" + let localizedDescription = langStr == "de" ? descriptionDe : descriptionEn + return localizedDescription + } + + public func getInstruction() -> String { + let langStr = Locale.current.language.languageCode?.identifier ?? "de" + let instructionDe = alert.instruction_de ?? "" + let instructionEn = alert.instruction_en ?? "" + let localizedInstruction = langStr == "de" ? instructionDe : instructionEn + return localizedInstruction + } +} diff --git "a/Oscar\302\260/Views/Backgrounds/StarsView.swift" "b/Oscar\302\260/Views/Backgrounds/StarsView.swift" index a6cc3e1..e2b91fd 100644 --- "a/Oscar\302\260/Views/Backgrounds/StarsView.swift" +++ "b/Oscar\302\260/Views/Backgrounds/StarsView.swift" @@ -11,10 +11,28 @@ struct StarsView: View { @State var isShown = false @State var starField = StarField() @State var meteorShower = MeteorShower() + + @Environment(Weather.self) private var weather: Weather + + let starStops: [Gradient.Stop] = [ + .init(color: .white, location: 0), + .init(color: .white, location: 0.25), + .init(color: .clear, location: 0.33), + .init(color: .clear, location: 0.38), + .init(color: .clear, location: 0.7), + .init(color: .clear, location: 0.78), + .init(color: .white, location: 0.82), + .init(color: .white, location: 1) + ] + + var starOpacity: Double { + let color = starStops.interpolated(amount: weather.time) + return color.getComponents().alpha + } var body: some View { TimelineView(.animation) { timeline in - if isShown { + if starOpacity > 0.01 { Canvas { context, size in let timeInterval = timeline.date.timeIntervalSince1970 starField.update(date: timeline.date) @@ -81,12 +99,13 @@ struct StarsView: View { .transition(.opacity) } } + .opacity(starOpacity) .ignoresSafeArea() .mask( LinearGradient(colors: [.white, .clear], startPoint: .top, endPoint: .bottom) ) .onAppear { - withAnimation(.easeInOut(duration: 0.3)) { + withAnimation(.default) { self.isShown = true } } diff --git "a/Oscar\302\260/Views/Backgrounds/SunView.swift" "b/Oscar\302\260/Views/Backgrounds/SunView.swift" index a9211d8..312cae3 100644 --- "a/Oscar\302\260/Views/Backgrounds/SunView.swift" +++ "b/Oscar\302\260/Views/Backgrounds/SunView.swift" @@ -44,7 +44,7 @@ struct SunView: View { } .transition(.opacity) .blendMode(.screen) - .position(x: proxy.frame(in: .global).width * sunX, y: 50) + .position(x: (proxy.frame(in: .global).width - 75) * sunX, y: 60) .rotationEffect(.degrees((progress - 0.5) * 180)) .onAppear { withAnimation(.easeInOut(duration: 7).repeatForever(autoreverses: true)) { @@ -76,6 +76,7 @@ struct SunView: View { struct SunView_Previews: PreviewProvider { static var previews: some View { - SunView(progress: 0.5) + SunView(progress: 0.4) + .background(.black) } } diff --git "a/Oscar\302\260/Views/LegalView.swift" "b/Oscar\302\260/Views/LegalView.swift" index d152e50..0b89188 100644 --- "a/Oscar\302\260/Views/LegalView.swift" +++ "b/Oscar\302\260/Views/LegalView.swift" @@ -12,7 +12,7 @@ struct LegalView: View { @Environment(\.presentationMode) var presentationMode var body: some View { - NavigationView { + NavigationStack { VStack { Form { Section(header: Text("Über")) { @@ -22,7 +22,7 @@ struct LegalView: View { .foregroundColor(.white) .background(Color.blue) .cornerRadius(5) - Link("Datenschutz", destination: URL(string: "https://oscars.love/")!) + Link(String(localized: "Datenschutz"), destination: URL(string: "https://oscars.love/")!) .foregroundColor(colorScheme == .dark ? .white : .black) .font(.body) } @@ -32,7 +32,7 @@ struct LegalView: View { .foregroundColor(.white) .background(Color.blue) .cornerRadius(5) - Link("Impressum", destination: URL(string: "https://oscars.love/")!) + Link(String(localized: "Impressum"), destination: URL(string: "https://oscars.love/")!) .foregroundColor(colorScheme == .dark ? .white : .black) .font(.body) } @@ -155,28 +155,28 @@ struct LegalView: View { } } - HStack { - Spacer() - VStack { - Text("Oscar° Weather") - .font(.body) - .bold() - Text("by Philipp Bolte") - .font(.caption) - .padding(.bottom, 2) - Text("In Gedenken an Kater Oscar von der Katzenfreiheit") - .font(.caption2) - .foregroundColor(.gray) - Text("* 17.04.02 – † 03.08.21") - .font(.caption2) - .foregroundColor(.gray) - } - Spacer() + NavigationLink { + MemoryView() + .navigationBarBackButtonHidden() + } label: { + HStack { + Spacer() + VStack { + Text("Oscar° Weather") + .font(.body) + .bold() + Text("by Philipp Bolte") + .font(.caption) + .padding(.bottom, 2) + } + Spacer() + } + .padding(.bottom, 1) } - .padding(.bottom, 1) + } } - .navigationBarTitle(Text("Rechtliches"), displayMode: .inline) + .navigationTitle("Rechtliches") .toolbar(content: { ToolbarItem(placement: .navigationBarTrailing, content: { Button("Fertig", action: { diff --git "a/Oscar\302\260/Views/MapDetailView.swift" "b/Oscar\302\260/Views/MapDetailView.swift" index d8b830b..814ed3d 100644 --- "a/Oscar\302\260/Views/MapDetailView.swift" +++ "b/Oscar\302\260/Views/MapDetailView.swift" @@ -8,20 +8,19 @@ import SwiftUI struct MapDetailView: View { - @ObservedObject var now: NowViewModel @ObservedObject var settingsService: SettingService @Environment(\.presentationMode) var presentationMode var body: some View { NavigationView { ZStack { - RadarView(settingsService: settingsService, now: now, radarMetadata: $now.currentRadarMetadata, showLayerSettings: true) + RadarView(settingsService: settingsService, showLayerSettings: true) } .ignoresSafeArea(edges: [.bottom]) .navigationBarTitle(Text("Regenradar"), displayMode: .inline) .toolbar(content: { ToolbarItem(placement: .navigationBarTrailing, content: { - Button("Fertig", action: { + Button(String(localized: "Fertig"), action: { presentationMode.wrappedValue.dismiss() UIApplication.shared.playHapticFeedback() }) diff --git "a/Oscar\302\260/Views/NowSubViews/AQIView.swift" "b/Oscar\302\260/Views/NowSubViews/AQIView.swift" index 3d0078b..3565382 100644 --- "a/Oscar\302\260/Views/NowSubViews/AQIView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/AQIView.swift" @@ -8,224 +8,318 @@ import SwiftUI struct AQIView: View { - @Binding var aqi: AQIResponse? - + @Environment(Weather.self) private var weather: Weather + var body: some View { - Text("Umwelt") - .font(.title3) - .bold() - .foregroundColor(Color(UIColor.label)) - .padding([.leading, .bottom]) - .padding(.top, 30) - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 14) { - VStack { - Text("UV") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.uvIndex[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.uvIndex[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForUVI(uvi: aqi?.hourly.uvIndex[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(11))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) - } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) - } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - - VStack { - Text("AQI") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.europeanAqi[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.europeanAqi[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForAQI(aqi: aqi?.hourly.europeanAqi[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(100))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) - } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) - } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - - VStack { - Text("PM") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - + Text("2.5") - .font(.system(size: 12)) - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.europeanAqiPm25[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.europeanAqiPm25[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForAQI(aqi: aqi?.hourly.europeanAqiPm25[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(100))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) - } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) - } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - - VStack { - Text("PM") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - + Text("10") - .font(.system(size: 12)) - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.europeanAqiPm10[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.europeanAqiPm10[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForAQI(aqi: aqi?.hourly.europeanAqiPm10[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(100))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) - } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) - } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - - VStack { - Text("NO") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - + Text("2") - .font(.system(size: 12)) - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.europeanAqiNo2[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.europeanAqiNo2[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForAQI(aqi: aqi?.hourly.europeanAqiNo2[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(100))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) + VStack(alignment: .leading) { + Text("Umwelt") + .font(.title3) + .bold() + .foregroundColor(Color(UIColor.label)) + .padding([.leading, .bottom]) + .padding(.top, 30) + if ((weather.air.hourly == nil)) { + ProgressView() + .padding() + } else { + ScrollView(.horizontal, showsIndicators: false) { + LazyHStack(spacing: 14) { + VStack { + Text("UV", comment: "Environment UV") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.uv_index?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.uv_index?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForUVI(uvi: weather.air.hourly?.uv_index?[getCurrentHour()] ?? 0)) + } minimumValueLabel: { + Text("\(Int(11))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + + VStack { + Text("AQI", comment: "Environment AQI") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.european_aqi?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.european_aqi?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForAQI(aqi: Int(weather.air.hourly?.european_aqi?[getCurrentHour()] ?? 0))) + } minimumValueLabel: { + Text("\(Int(100))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + + VStack { + Text("PM", comment: "Environment PM") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + + Text("2.5") + .font(.system(size: 12)) + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.european_aqi_pm2_5?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.european_aqi_pm2_5?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForAQI(aqi: Int(weather.air.hourly?.european_aqi_pm2_5?[getCurrentHour()] ?? 0))) + } minimumValueLabel: { + Text("\(Int(100))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + + VStack { + Text("PM", comment: "Environment PM") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + + Text("10") + .font(.system(size: 12)) + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.european_aqi_pm10?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.european_aqi_pm10?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForAQI(aqi: Int(weather.air.hourly?.european_aqi_pm10?[getCurrentHour()] ?? 0))) + } minimumValueLabel: { + Text("\(Int(100))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + + VStack { + Text("NO", comment: "Environment NO") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + + Text("2") + .font(.system(size: 12)) + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.european_aqi_no2?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.european_aqi_no2?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForAQI(aqi: Int(weather.air.hourly?.european_aqi_no2?[getCurrentHour()] ?? 0))) + } minimumValueLabel: { + Text("\(Int(100))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + + VStack { + Text("O", comment: "Environment O") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + + Text("3") + .font(.system(size: 12)) + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.european_aqi_o3?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.european_aqi_o3?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForAQI(aqi: Int(weather.air.hourly?.european_aqi_o3?[getCurrentHour()] ?? 0))) + } minimumValueLabel: { + Text("\(Int(100))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + + VStack { + Text("SO", comment: "Environment SO") + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + + Text("2") + .font(.system(size: 12)) + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + Gauge(value: max(100 - Double(weather.air.hourly?.european_aqi_so2?[getCurrentHour()] ?? 0), 0), in:0...100) { + Image(systemName: "heart.fill") + .foregroundColor(.red) + } currentValueLabel: { + Text("\(Int(weather.air.hourly?.european_aqi_so2?[getCurrentHour()] ?? 0))") + .foregroundColor(getColorForAQI(aqi: Int(weather.air.hourly?.european_aqi_so2?[getCurrentHour()] ?? 0))) + } minimumValueLabel: { + Text("\(Int(100))") + .foregroundColor(Color.purple) + } maximumValueLabel: { + Text("\(Int(0))") + .foregroundColor(Color.green) + } + .gaugeStyle(.accessoryCircular) + .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) + .scrollTargetLayout() + .font(.system(size: 18)) + .padding([.leading, .trailing]) } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - - VStack { - Text("O") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - + Text("3") - .font(.system(size: 12)) - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.europeanAqiO3[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.europeanAqiO3[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForAQI(aqi: aqi?.hourly.europeanAqiO3[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(100))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) - } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) - } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - - VStack { - Text("SO") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - + Text("2") - .font(.system(size: 12)) - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - Gauge(value: max(100 - Double(aqi?.hourly.europeanAqiSo2[aqi?.hourly.getCurrentHour() ?? 0] ?? 0), 0), in:0...100) { - Image(systemName: "heart.fill") - .foregroundColor(.red) - } currentValueLabel: { - Text("\(Int(aqi?.hourly.europeanAqiSo2[aqi?.hourly.getCurrentHour() ?? 0] ?? 0))") - .foregroundColor(aqi?.hourly.getColorForAQI(aqi: aqi?.hourly.europeanAqiSo2[aqi?.hourly.getCurrentHour() ?? 0] ?? 0)) - - } minimumValueLabel: { - Text("\(Int(100))") - .foregroundColor(Color.purple) - } maximumValueLabel: { - Text("\(Int(0))") - .foregroundColor(Color.green) - } - .gaugeStyle(.accessoryCircular) - .tint(Gradient(colors: [.purple, .red, .orange, .yellow, .green])) - } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - + .scrollTargetBehavior(.viewAligned) + .frame(maxWidth: .infinity) + .padding(.bottom, 20) } - .font(.system(size: 18)) - .padding([.leading, .trailing]) } - .frame(maxWidth: .infinity) - .padding(.bottom, 20) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + } +} + +extension AQIView { + public func getCurrentHour() -> Int { + let now = Date() + let calendar = Calendar.current + let components = calendar.dateComponents([.hour], from: now) + return components.hour! + } + + public func getColorForAQI(aqi: Int) -> Color { + switch aqi { + case let x where x <= 20: + return .green + case let x where x > 20 && x <= 40: + return .orange + case let x where x > 40 && x <= 60: + return .orange + case let x where x > 60 && x <= 80: + return .red + case let x where x > 80: + return .purple + default: + return .gray + } + } + + public func getColorForUVI(uvi: Double) -> Color { + switch uvi { + case let x where x < 1: + return .green + case let x where x >= 1 && x < 2.5: + return .green + case let x where x >= 2.5 && x < 5.5: + return .orange + case let x where x >= 5.5 && x < 7.5: + return .orange + case let x where x >= 7.5 && x < 10.5: + return .orange + case let x where x >= 10.5: + return .purple + default: + return .gray + } } } diff --git "a/Oscar\302\260/Views/NowSubViews/AlertView.swift" "b/Oscar\302\260/Views/NowSubViews/AlertView.swift" index e6b9b9b..1683f99 100644 --- "a/Oscar\302\260/Views/NowSubViews/AlertView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/AlertView.swift" @@ -8,8 +8,8 @@ import SwiftUI struct AlertView: View { - @Binding var alerts: [DWDAlert]? @State private var isAlterSheetPresented = false + @Environment(Weather.self) private var weather: Weather var body: some View { HStack { @@ -17,13 +17,8 @@ struct AlertView: View { .resizable() .foregroundColor(.orange) .frame(width: 15, height: 15) - if (alerts!.count > 1) { - Text((alerts?.first?.getFormattedHeadline().uppercased() ?? "...") + " (+"+String(alerts!.count-1)+")") - .font(.caption2) - .foregroundColor(.orange) - .bold() - } else { - Text(alerts?.first?.getFormattedHeadline().uppercased() ?? "...") + if hasAlert() { + Text(getFormattedHeadline()) .font(.caption2) .foregroundColor(.orange) .bold() @@ -40,8 +35,39 @@ struct AlertView: View { isAlterSheetPresented.toggle() } .sheet(isPresented: $isAlterSheetPresented) { - AlertListView(alerts: $alerts) + AlertListView() } .padding(.top, -10) + .shadow(radius: 15) + } +} + +extension AlertView { + func hasAlert() -> Bool { + return (weather.alerts.alerts?.count ?? 0) > 0 + } + + func getAlertCont() -> Int { + return weather.alerts.alerts?.count ?? 0 + } + + func getFormattedHeadline() -> String { + let langStr = Locale.current.language.languageCode?.identifier ?? "de" + let alertCount = getAlertCont() + let headlineDe = (weather.alerts.alerts?.first?.headline_de ?? "") + .replacingOccurrences(of: "Amtliche", with: "") + .replacingOccurrences(of: "UNWETTER", with: "") + let headlineEn = (weather.alerts.alerts?.first?.event_en ?? "") + .replacingOccurrences(of: "Official", with: "") + let localizedEvent = langStr == "de" + ? headlineDe.uppercased() + : headlineEn.uppercased() + + if alertCount > 1 { + return "\(localizedEvent) (+\(alertCount-1))" + } else { + return localizedEvent + } + } } diff --git "a/Oscar\302\260/Views/NowSubViews/DailyView.swift" "b/Oscar\302\260/Views/NowSubViews/DailyView.swift" index 0ac6e82..40d7cbb 100644 --- "a/Oscar\302\260/Views/NowSubViews/DailyView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/DailyView.swift" @@ -8,67 +8,135 @@ import SwiftUI struct DailyView: View { - @Binding var weather: OpenMeteoResponse? - + @Environment(Weather.self) private var weather: Weather + var body: some View { - Text("10-Tage") - .font(.title3) - .bold() - .foregroundColor(Color(UIColor.label)) - .padding([.leading, .top, .bottom]) - HStack { + // Cap at 12 days to keep View from getting too large with too much (unreliable) data + let dayNumber = (weather.forecast.daily?.time.count ?? 1) > 12 ? 12 : (weather.forecast.daily?.time.count ?? 1) + let heading = String.localizedStringWithFormat(NSLocalizedString("%d-Tage", comment: "Headline for Daily View"), dayNumber) + + VStack(alignment: .leading) { + Text(heading) + .font(.title3) + .bold() + .foregroundColor(Color(UIColor.label)) + .padding([.leading, .top, .bottom]) - VStack(alignment: .leading, spacing: 20) { - ForEach(0...9, id: \.self) { dayPos in - Text(weather?.getWeekDay(timestamp: weather?.daily.time[dayPos] ?? 0.0) ?? "") - .foregroundColor(Color(UIColor.label)) - } - } - .padding(.leading) - Spacer() - VStack(spacing: 11) { - ForEach(0...9, id: \.self) { dayPos in - Image(weather?.daily.getWeatherIcon(pos: dayPos) ?? "") - .resizable() - .scaledToFit() - .frame(width: 30, height: 30) - } - } - VStack(alignment: .leading, spacing: 13) { - ForEach(0...9, id: \.self) { dayPos in - VStack { - Text("\(weather?.daily.precipitationSum[dayPos] ?? 0, specifier: "%.1f") mm") - .font(.caption) - .foregroundColor(Color(UIColor.label)) - Text("\(weather?.daily.precipitationProbabilityMax[dayPos] ?? 0) %") - .font(.caption) - .foregroundColor(Color(UIColor.secondaryLabel)) + if weather.forecast.daily?.time == nil && weather.isLoading { + VStack { + Spacer() + HStack { + Spacer() + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + Spacer() } + Spacer() } - } - Spacer() - VStack(alignment: .trailing, spacing: 20) { - ForEach(0...9, id: \.self) { dayPos in - Text(weather?.daily.getRoundedMaxTemp(pos: dayPos) ?? "") - .fontWeight(.semibold) - .foregroundColor(Color(UIColor.label)) - } - } - Spacer() - VStack(alignment: .trailing, spacing: 20) { - ForEach(0...9, id: \.self) { dayPos in - Text(weather?.daily.getRoundedMinTemp(pos: dayPos) ?? "") - .fontWeight(.light) - .foregroundColor(Color(UIColor.label)) + .frame( + minWidth: 0, + maxWidth: .infinity, + minHeight: 400, + maxHeight: 400, + alignment: .topLeading + ) + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .font(.system(size: 18)) + .padding([.leading, .trailing]) + } else { + HStack { + VStack(alignment: .leading, spacing: 22) { + ForEach(0...dayNumber-1, id: \.self) { dayPos in + Text(getWeekDay(timestamp: weather.forecast.daily?.time[dayPos] ?? 0.0) ) + .foregroundColor(Color(UIColor.label)) + } + } + .padding(.leading) + Spacer() + VStack(spacing: 14) { + ForEach(0...dayNumber-1, id: \.self) { dayPos in + Image(getWeatherIcon(pos: dayPos)) + .resizable() + .scaledToFit() + .frame(width: 30, height: 30) + } + } + VStack(alignment: .leading, spacing: 13) { + ForEach(0...dayNumber-1, id: \.self) { dayPos in + VStack { + Text("\(weather.forecast.daily?.precipitation_sum?[dayPos] ?? 0, specifier: "%.1f") mm") + .font(.caption) + .foregroundColor(Color(UIColor.label)) + Text("\(weather.forecast.daily?.precipitation_probability_max?[dayPos] ?? 0, specifier: "%.0f") %") + .font(.caption) + .foregroundColor(Color(UIColor.secondaryLabel)) + } + } + } + Spacer() + VStack(alignment: .trailing, spacing: 22) { + ForEach(0...dayNumber-1, id: \.self) { dayPos in + Text(roundTemperatureString(temperature: weather.forecast.daily?.temperature_2m_max?[dayPos])) + .fontWeight(.semibold) + .foregroundColor(Color(UIColor.label)) + } + } + Spacer() + VStack(alignment: .trailing, spacing: 22) { + ForEach(0...dayNumber-1, id: \.self) { dayPos in + Text(roundTemperatureString(temperature: weather.forecast.daily?.temperature_2m_min?[dayPos])) + .fontWeight(.light) + .foregroundColor(Color(UIColor.label)) + } + } + .padding(.trailing) } + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .font(.system(size: 18)) + .padding([.leading, .trailing]) } - .padding(.trailing) } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - .font(.system(size: 18)) - .padding([.leading, .trailing]) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + } +} + +extension DailyView { + public func getWeekDay(timestamp: Double) -> String { + let dateFormatter = DateFormatter() + dateFormatter.timeZone = TimeZone(secondsFromGMT: weather.forecast.utc_offset_seconds ?? 0) ?? TimeZone.current + dateFormatter.dateFormat = "EEEE" + return dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) + } + + public func getWeatherIcon(pos: Int) -> String { + switch weather.forecast.daily?.weathercode?[pos] ?? 0 { + case 0, 1: + return "01d" + case 2: + return "02d" + case 3: + return "04d" + case 45, 48: + return "50d" + case 51: + return "10d" + case 71, 73, 75, 77: + return "13d" + case 95, 96, 99: + return "11d" + default: + return "09d" + } } } diff --git "a/Oscar\302\260/Views/NowSubViews/HeadView.swift" "b/Oscar\302\260/Views/NowSubViews/HeadView.swift" index 8e937db..752f870 100644 --- "a/Oscar\302\260/Views/NowSubViews/HeadView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/HeadView.swift" @@ -9,8 +9,8 @@ import CoreLocation import Charts struct HeadView: View { - @ObservedObject var searchModel: SearchViewModel = SearchViewModel() - @ObservedObject var now: NowViewModel + @Environment(Weather.self) private var weather: Weather + @Environment(Location.self) private var location: Location @State private var isLocationSheetPresented = false var body: some View { @@ -18,57 +18,70 @@ struct HeadView: View { Spacer() Image(systemName: "magnifyingglass") .foregroundColor(Color(UIColor.label)) - Text(now.placemark ?? "...") - .font(.title2) - .fontWeight(.bold) - .lineSpacing(/*@START_MENU_TOKEN@*/10.0/*@END_MENU_TOKEN@*/) - .foregroundColor(Color(UIColor.label)) + Text(location.name) + .font(.title2) + .fontWeight(.bold) + .lineSpacing(10) + .foregroundColor(Color(UIColor.label)) Spacer() } + .shadow(radius: 5) .onTapGesture { UIApplication.shared.playHapticFeedback() isLocationSheetPresented.toggle() } .sheet(isPresented: $isLocationSheetPresented) { - SearchView(searchModel: searchModel, now: now, cities: $now.cs.cities) + SearchCityView() } - .padding(.bottom, 40) + .padding(.bottom, 35) .padding(.leading, -20) .padding(.top) - LazyVStack { + VStack { VStack { Spacer() - // MARK: Current Temperature - Text(now.weather?.currentWeather.getRoundedTempString() ?? "") - .foregroundColor(Color(UIColor.label)) - .font(.system(size: 120)) + Text(roundTemperatureString(temperature: weather.forecast.current?.temperature)) + .foregroundColor(Color(UIColor.label)) + .font(.system(size: 120)) + .shadow(radius: 15) } .padding(.bottom, 150) - + HStack { Spacer() Image(systemName: "cloud") .frame(width: 30, height: 30) .foregroundColor(Color(UIColor.label)) - Text("\(now.weather?.getCurrentCloudCover() ?? 0, specifier: "%.0f") %") + Text("\(weather.forecast.current!.cloudcover, specifier: "%.0f") %") .foregroundColor(Color(UIColor.label)) Image(systemName: "wind") .frame(width: 30, height: 30) .foregroundColor(Color(UIColor.label)) - Text("\(now.weather?.currentWeather.windspeed ?? 0, specifier: "%.1f") km/h") + Text("\(weather.forecast.current!.windspeed, specifier: "%.1f") km/h") .foregroundColor(Color(UIColor.label)) Image(systemName: "location") .frame(width: 30, height: 30) .foregroundColor(Color(UIColor.label)) - Text("\(now.weather?.currentWeather.getWindDirection() ?? "N/A")") + Text("\(weather.forecast.current!.getWindDirection())") Spacer() } .padding(.bottom) - - if ((now.alerts?.count ?? 0) > 0) { - AlertView(alerts: $now.alerts) + + if hasWeatherAlerts() { + AlertView() } } + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + } +} + +extension HeadView { + func hasWeatherAlerts() -> Bool { + return weather.alerts.alerts?.count ?? 0 > 0 } } diff --git "a/Oscar\302\260/Views/NowSubViews/HourlyView.swift" "b/Oscar\302\260/Views/NowSubViews/HourlyView.swift" index 891b81a..43c6c34 100644 --- "a/Oscar\302\260/Views/NowSubViews/HourlyView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/HourlyView.swift" @@ -9,49 +9,298 @@ import SwiftUI import Charts struct HourlyView: View { - @Binding var weather: OpenMeteoResponse? + @Environment(Weather.self) private var weather: Weather var body: some View { - Text("Stündlich") - .font(.title3) - .bold() - .foregroundColor(Color(UIColor.label)) - .padding(.leading) - .padding(.bottom, -10) - .padding(.top) - - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 14) { - ForEach(((weather?.getCurrentHourPos() ?? 0) ... ((weather?.getHourlySize() ?? 0) >= 60 ? 60 : (weather?.getHourlySize() ?? 10))), id: \.self) { hour in - VStack { - Text((weather?.getHourString(pos: hour) ?? "") + " Uhr") - .foregroundColor(Color(UIColor.label)) - .bold() - Text("\(weather?.getHourPrec(pos: hour) ?? 0, specifier: "%.1f") mm") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - .padding(.top, 3) - Text("\(weather?.getHourPrecProbability(pos: hour) ?? 0) %") - .font(.footnote) - .foregroundColor(Color(UIColor.secondaryLabel)) - Image(weather?.getHourIcon(pos: hour) ?? "") - .resizable() - .scaledToFit() - .frame(width: 35, height: 35) - Text(weather?.getHourTemp(pos: hour) ?? "") - .foregroundColor(Color(UIColor.label)) + VStack(alignment: .leading) { + Text("Stündlich") + .font(.title3) + .bold() + .foregroundColor(Color(UIColor.label)) + .padding(.leading) + .padding(.bottom, -10) + .padding(.top) + + ScrollView(.horizontal, showsIndicators: false) { + if weather.isLoading && weather.forecast.hourly == nil { + HStack(spacing: 12) { + ForEach((1...5).reversed(), id: \.self) {_ in + ProgressView() + .frame(width: 55, height: 140) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + } + .padding(.vertical, 12) + } + .padding(.leading) + .padding(.top, 7) + } else { + LazyHStack(spacing: 12) { + ForEach(getLocalizedHourIndex() ... getLocalizedHourIndex() + 48, id: \.self) { index in + VStack { + Text(getHourString(timestamp: weather.forecast.hourly?.time[index] ?? 0)) + .foregroundColor(Color(UIColor.label)) + .bold() + Text("\(weather.forecast.hourly?.precipitation?[index] ?? 0, specifier: "%.1f") mm") + .font(.footnote) + .foregroundColor(Color(UIColor.label)) + .padding(.top, 3) + Text("\(weather.forecast.hourly?.precipitation_probability?[index] ?? 0, specifier: "%.0f") %") + .font(.footnote) + .foregroundColor(Color(UIColor.secondaryLabel)) + Image(getWeatherIcon( + weathercode: weather.forecast.hourly?.weathercode?[index] ?? 0, + isDay: weather.forecast.hourly?.is_day?[index] ?? 0)) + .resizable() + .scaledToFit() + .frame(width: 35, height: 35) + Text(roundTemperatureString(temperature: weather.forecast.hourly?.temperature_2m?[index])) + .foregroundColor(Color(UIColor.label)) + } + .padding(.horizontal, 12) + .padding(.vertical, 12) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + SunsetSunriseCard(index: index) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.5) + .scaleEffect(phase.isIdentity ? 1 : 0.9) + .blur(radius: phase.isIdentity ? 0 : 2) + } + } + .padding(.vertical, 20) } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) + .scrollTargetLayout() + .font(.system(size: 18)) + .padding(.leading) } - .padding(.vertical, 20) + + } + .scrollTargetBehavior(.viewAligned) + .frame(maxWidth: .infinity) + } + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + } +} +extension HourlyView { + public func getLocalizedHourIndex() -> Int { + let currentUnixTime = weather.forecast.current?.time ?? 0 + let hours = weather.forecast.hourly?.time ?? [] + + // Initialize variables to track the closest time and its index + var closestTime = Double.greatestFiniteMagnitude + var closestIndex = -1 + + for (index, time) in hours.enumerated() { + // Check the absolute difference between current time and each time in the array + let difference = abs(currentUnixTime - time) + if difference < closestTime { + closestTime = difference + closestIndex = index + } + } + + // Check if a closest time was found + if closestIndex != -1 { + return closestIndex + } else { + return 0 + } + } + + public func getWeatherIcon(weathercode: Double, isDay: Double) -> String { + if (isDay > 0) { + switch weathercode { + case 0, 1: + return "01d" + case 2: + return "02d" + case 3: + return "04d" + case 45, 48: + return "50d" + case 51: + return "10d" + case 71, 73, 75, 77: + return "13d" + case 95, 96, 99: + return "11d" + default: + return "09d" + } + } else { + switch weathercode { + case 0, 1: + return "01n" + case 2: + return "02n" + case 3: + return "04n" + case 45, 48: + return "50n" + case 51: + return "10n" + case 71, 73, 75, 77: + return "13n" + case 95, 96, 99: + return "11n" + default: + return "09n" } - .font(.system(size: 18)) - .padding(.leading) } - .frame(maxWidth: .infinity) + } + + public func getHourString(timestamp: Double) -> String { + let date = Date(timeIntervalSince1970: TimeInterval(timestamp)) + var calendar = Calendar.current + calendar.timeZone = TimeZone(secondsFromGMT: weather.forecast.utc_offset_seconds ?? 0) ?? TimeZone.current + let hours = calendar.component(.hour, from: date) + return String(format:"%02d %@", hours, String(localized: "Uhr")).trimmingCharacters(in: .whitespaces) + } + + func isWithinHourOfInterest(eventTimestamp: Int, referenceHour: Int) -> Bool { + let eventDate = Date(timeIntervalSince1970: TimeInterval(eventTimestamp)) + let referenceDate = Date(timeIntervalSince1970: TimeInterval(referenceHour)) + let calendar = Calendar.current + let eventHour = calendar.component(.hour, from: eventDate) + let referenceHour = calendar.component(.hour, from: referenceDate) + + return eventHour == referenceHour + } + + func getDayIndexForHourlyForecast(hourlyTimestamp: Int) -> Int { + let hourlyDate = Date(timeIntervalSince1970: TimeInterval(hourlyTimestamp)) + let calendar = Calendar.current + for (index, sunriseTimestamp) in (weather.forecast.daily?.sunrise ?? []).enumerated() { + let sunriseDate = Date(timeIntervalSince1970: TimeInterval(sunriseTimestamp)) + if calendar.isDate(hourlyDate, inSameDayAs: sunriseDate) { + return index + } + } + return 0 // Default to first day if no match found + } +} + +struct SunsetSunriseCard: View { + @Environment(Weather.self) private var weather: Weather + var index: Int + + var body: some View { + let hourlyTimestamp = weather.forecast.hourly?.time[index] ?? 0 + let dayIndex = getDayIndexForHourlyForecast(hourlyTimestamp: hourlyTimestamp) + + if isWithinHourOfInterest(eventTimestamp: hourlyTimestamp, referenceHour: weather.forecast.daily?.sunrise?[dayIndex] ?? 0) { + VStack { + Text(getTimeString(timestamp: weather.forecast.daily?.sunrise?[dayIndex] ?? 0)) + .foregroundColor(Color(UIColor.label)) + .bold() + Text(getWeekDay(timestamp: weather.forecast.daily?.sunrise?[dayIndex] ?? 0)) + .foregroundColor(Color(UIColor.label)) + .font(.footnote) + .padding(.top, 3) + Spacer() + Image("halfsun") + .resizable() + .scaledToFit() + .shadow( + color: .orange, + radius: CGFloat(10), + x: CGFloat(0), y: CGFloat(-5)) + .frame(width: 50, height: 50) + .padding(.bottom, -3) + Image(systemName: "arrow.up") + } + .padding(.horizontal, 12) + .padding(.vertical, 12) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + } else if isWithinHourOfInterest(eventTimestamp: hourlyTimestamp, referenceHour: weather.forecast.daily?.sunset?[dayIndex] ?? 0) { + VStack { + Text(getTimeString(timestamp: weather.forecast.daily?.sunset?[dayIndex] ?? 0)) + .foregroundColor(Color(UIColor.label)) + .bold() + Text(getWeekDay(timestamp: weather.forecast.daily?.sunset?[dayIndex] ?? 0)) + .foregroundColor(Color(UIColor.label)) + .font(.footnote) + .padding(.top, 3) + Spacer() + Image("halfsun") + .resizable() + .scaledToFit() + .shadow( + color: .orange, + radius: CGFloat(10), + x: CGFloat(0), y: CGFloat(-5)) + .frame(width: 50, height: 50) + .padding(.bottom, -3) + Image(systemName: "arrow.down") + } + .padding(.horizontal, 12) + .padding(.vertical, 12) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + } } } + +extension SunsetSunriseCard { + func isWithinHourOfInterest(eventTimestamp: Double, referenceHour: Double) -> Bool { + let eventDate = Date(timeIntervalSince1970: TimeInterval(eventTimestamp)) + let referenceDate = Date(timeIntervalSince1970: TimeInterval(referenceHour)) + let calendar = Calendar.current + let eventHour = calendar.component(.hour, from: eventDate) + let referenceHour = calendar.component(.hour, from: referenceDate) + + return eventHour == referenceHour + } + + func getDayIndexForHourlyForecast(hourlyTimestamp: Double) -> Int { + let hourlyDate = Date(timeIntervalSince1970: TimeInterval(hourlyTimestamp)) + let calendar = Calendar.current + for (index, sunriseTimestamp) in (weather.forecast.daily?.sunrise ?? []).enumerated() { + let sunriseDate = Date(timeIntervalSince1970: TimeInterval(sunriseTimestamp)) + if calendar.isDate(hourlyDate, inSameDayAs: sunriseDate) { + return index + } + } + return 0 // Default to first day if no match found + } + + public func getTimeString(timestamp: Double) -> String { + let date = Date(timeIntervalSince1970: TimeInterval(timestamp)) + var calendar = Calendar.current + calendar.timeZone = TimeZone(secondsFromGMT: weather.forecast.utc_offset_seconds ?? 0) ?? TimeZone.current + let hours = calendar.component(.hour, from: date) + let minutes = calendar.component(.minute, from: date) + return String(format:"%02d:%02d", hours, minutes) + } + + public func getWeekDay(timestamp: Double) -> String { + let dateFormatter = DateFormatter() + dateFormatter.timeZone = TimeZone(secondsFromGMT: weather.forecast.utc_offset_seconds ?? 0) ?? TimeZone.current + dateFormatter.dateFormat = "EEEE" + return dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) + } +} + diff --git "a/Oscar\302\260/Views/NowSubViews/LegalTextView.swift" "b/Oscar\302\260/Views/NowSubViews/LegalTextView.swift" new file mode 100644 index 0000000..0f4468a --- /dev/null +++ "b/Oscar\302\260/Views/NowSubViews/LegalTextView.swift" @@ -0,0 +1,47 @@ +// +// LegalTextView.swift +// Oscar° +// +// Created by Philipp Bolte on 04.01.24. +// + +import SwiftUI + +struct LegalTextView: View { + @State private var isLegalSheetPresented = false + + var body: some View { + HStack { + Spacer() + Image(systemName: "info.circle.fill") + .resizable() + .scaledToFit() + .frame(width: 20, height: 20) + .foregroundColor(Color(UIColor.label)) + Text("Rechtliche\nInformationen") + .foregroundColor(Color(UIColor.label)) + .font(.system(size: 10)) + .bold() + Spacer() + } + .padding(.top) + .padding(.bottom, 50) + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + .onTapGesture { + UIApplication.shared.playHapticFeedback() + isLegalSheetPresented.toggle() + } + .sheet(isPresented: $isLegalSheetPresented) { + LegalView() + } + } +} + +#Preview { + LegalTextView() +} diff --git "a/Oscar\302\260/Views/NowSubViews/MemoryView.swift" "b/Oscar\302\260/Views/NowSubViews/MemoryView.swift" new file mode 100644 index 0000000..f114017 --- /dev/null +++ "b/Oscar\302\260/Views/NowSubViews/MemoryView.swift" @@ -0,0 +1,141 @@ +// +// MemoryView.swift +// Oscar° +// +// Created by Philipp Bolte on 05.05.24. +// + +import SwiftUI + +struct MemoryView: View { + var body: some View { + ZStack { + MemoryStars() + VStack { + ImageCircleView() + .padding(30) + Spacer() + VStack { + Text("Oscar°") + .font(.system(size: 50)) + .fontWeight(.medium) + .padding(.bottom, 1) + Text("... wurde in liebevoller Erinnerung an diejenigen entwickelt, die nicht mehr unter uns sind. In unseren Herzen und Gedanken bleiben sie jedoch für immer lebendig.") + .font(.body) + .fontWeight(.regular) + .multilineTextAlignment(.center) + .padding([.leading, .trailing], 50) + } + .foregroundColor(.white.opacity(0.9)) + .shadow(radius: 15) + .padding(.bottom, 60) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(LinearGradient(colors: [.midnightStart, .midnightEnd], startPoint: .top, endPoint: .bottom)) + } +} + +#Preview { + MemoryView() +} + +struct ImageCircleView: View { + let imageNames = ["oscar", "reinhard", "urselwerner", "daniela"] + + var body: some View { + GeometryReader { geometry in + let diameter = min(geometry.size.width, geometry.size.height) + let radius = diameter / 3.4 + + ForEach(0.. 0 { + var contextCopy = context + contextCopy.opacity = flashLevel + contextCopy.addFilter(.blur(radius: 3)) + + contextCopy.fill(path, with: .color(white: 1)) + contextCopy.fill(path, with: .color(white: 1)) + contextCopy.fill(path, with: .color(white: 1)) + } + + context.opacity = 1 + } + + if index.isMultiple(of: 5) { + context.fill(path, with: .color(red: 1, green: 0.85, blue: 0.8)) + } else { + context.fill(path, with: .color(white: 1)) + } + } + } + } + .mask( + LinearGradient(colors: [.white, .clear], startPoint: .top, endPoint: .bottom) + ) + .ignoresSafeArea() + } +} diff --git "a/Oscar\302\260/Views/NowSubViews/RadarView.swift" "b/Oscar\302\260/Views/NowSubViews/RadarView.swift" index 7243d9e..12fa5a9 100644 --- "a/Oscar\302\260/Views/NowSubViews/RadarView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/RadarView.swift" @@ -10,38 +10,51 @@ import MapKit struct RadarView: View { @ObservedObject var settingsService: SettingService - @ObservedObject var now: NowViewModel - @Binding var radarMetadata: WeatherMapsResponse? var showLayerSettings: Bool - + var locationService = LocationService.shared + var userActionAllowed = true var body: some View { ZStack { RadarMapView( - overlay: getOverlay(host: radarMetadata?.host ?? "", path: radarMetadata?.radar.past[radarMetadata!.radar.past.count-1].path ?? "", color: "2", options: "1_1"), + settingsService: settingsService, overlayOpacity: 0.7, - cloudOverlay: getOverlay(host: radarMetadata?.host ?? "", path: radarMetadata?.satellite.infrared.last?.path ?? "", color: "0", options: "0_0"), - coordinates: now.getActiveLocation(), - cities: now.cs.cities, - settings: settingsService.settings + coordinates: locationService.getCoordinates(), + cities: locationService.city.cities, + userActionAllowed: userActionAllowed ) + if (showLayerSettings && settingsService.settings != nil) { + VStack { + Spacer() + ScrollView(.horizontal, showsIndicators: false) { + HStack { + if (settingsService.settings?.rainviewerLayer ?? false) { + LegendView(legendURL: "https://files.readme.io/6efe1f9-precipitation-si-spectrum.png") + } + if (settingsService.settings?.tempLayer ?? false) { + LegendView(legendURL: "https://files.readme.io/e19fcb3-temperature-si-spectrum.png") + } + if (settingsService.settings?.windDirectionLayer ?? false) { + LegendView(legendURL: "https://files.readme.io/bf5392a-wind-direction-spectrum.png") + } + if (settingsService.settings?.druckLayer ?? false) { + LegendView(legendURL: "https://files.readme.io/e8317b1-wind-speed-si-spectrum.png") + } + if (settingsService.settings?.humidityLayer ?? false) { + LegendView(legendURL: "https://files.readme.io/70de95d-humidity-spectrum.png") + } + if (settingsService.settings?.infrarotLayer ?? false) { + LegendView(legendURL: "https://files.readme.io/168dd28-cloud-cover-spectrum.png") + } + } + } + } + } if (showLayerSettings) { VStack { HStack { Spacer() Menu { - Button(action: { - if (settingsService.settings != nil) { - settingsService.settings!.infrarotLayer.toggle() - settingsService.save() - } - }) { - if (settingsService.settings?.infrarotLayer ?? false) { - Label("Infrarot", systemImage: "checkmark") - } else { - Text("Infrarot") - } - } Button(action: { if (settingsService.settings != nil) { settingsService.settings!.rainviewerLayer.toggle() @@ -49,9 +62,9 @@ struct RadarView: View { } }) { if (settingsService.settings?.rainviewerLayer ?? false) { - Label("Regen (Rainviewer)", systemImage: "checkmark") + Label(String(localized: "Regen (Global)"), systemImage: "checkmark") } else { - Text("Regen (Rainviewer)") + Text("Regen (Global)") } } Button(action: { @@ -61,7 +74,7 @@ struct RadarView: View { } }) { if (settingsService.settings?.dwdLayer ?? false) { - Label("Regen (DWD)", systemImage: "checkmark") + Label(String(localized: "Regen (DWD)"), systemImage: "checkmark") } else { Text("Regen (DWD)") } @@ -73,7 +86,7 @@ struct RadarView: View { } }) { if (settingsService.settings?.tempLayer ?? false) { - Label("Temperatur", systemImage: "checkmark") + Label(String(localized: "Temperatur"), systemImage: "checkmark") } else { Text("Temperatur") } @@ -85,9 +98,45 @@ struct RadarView: View { } }) { if (settingsService.settings?.druckLayer ?? false) { - Label("Wind & Druck", systemImage: "checkmark") + Label(String(localized: "Windgeschwindidkeit"), systemImage: "checkmark") + } else { + Text("Windgeschwindidkeit") + } + } + Button(action: { + if (settingsService.settings != nil) { + settingsService.settings!.infrarotLayer.toggle() + settingsService.save() + } + }) { + if (settingsService.settings?.infrarotLayer ?? false) { + Label(String(localized: "Wolken"), systemImage: "checkmark") + } else { + Text("Wolken") + } + } + Button(action: { + if (settingsService.settings != nil) { + settingsService.settings!.humidityLayer.toggle() + settingsService.save() + } + }) { + if (settingsService.settings?.humidityLayer ?? false) { + Label(String(localized: "Luftfeuchtigkeit"), systemImage: "checkmark") + } else { + Text("Luftfeuchtigkeit") + } + } + Button(action: { + if (settingsService.settings != nil) { + settingsService.settings!.windDirectionLayer.toggle() + settingsService.save() + } + }) { + if (settingsService.settings?.windDirectionLayer ?? false) { + Label(String(localized: "Windrichtung"), systemImage: "checkmark") } else { - Text("Wind & Druck") + Text("Windrichtung") } } } label: { @@ -109,6 +158,63 @@ struct RadarView: View { } } +struct LegendView: View { + var legendURL: String + var body: some View { + AsyncImage( + url: URL(string: legendURL), + content: { image in + image + .resizable() + .cornerRadius(10) + .opacity(0.8) + .aspectRatio(contentMode: .fit) + .frame(width: 300, height: 200) + }, + placeholder: { + VStack(alignment: .leading) { + Spacer() + HStack { + Spacer() + ProgressView() + Spacer() + } + Spacer() + } + .frame(height: 350) + .background(Color(UIColor.secondarySystemFill)) + } + ) + .padding(10) + } + + } + + +extension RadarView { + func getLayerLegendURL() -> String? { + if (settingsService.settings!.rainviewerLayer) { + return "https://files.readme.io/6efe1f9-precipitation-si-spectrum.png" + } + if (settingsService.settings!.tempLayer) { + return "https://files.readme.io/e19fcb3-temperature-si-spectrum.png" + } + if (settingsService.settings!.windDirectionLayer) { + return "https://files.readme.io/bf5392a-wind-direction-spectrum.png" + } + if (settingsService.settings!.druckLayer) { + return "https://files.readme.io/e8317b1-wind-speed-si-spectrum.png" + } + if (settingsService.settings!.humidityLayer) { + return "https://files.readme.io/e8317b1-wind-speed-si-spectrum.png" + } + if (settingsService.settings!.infrarotLayer) { + return "https://files.readme.io/e8317b1-wind-speed-si-spectrum.png" + } + return nil + } +} + struct WebMapServiceConstants { static let baseUrl = "https://maps.dwd.de/geoserver/dwd/wms" static let version = "1.3.0" @@ -119,12 +225,11 @@ struct WebMapServiceConstants { } struct RadarMapView: UIViewRepresentable { - var overlay: MKTileOverlay + @ObservedObject var settingsService: SettingService var overlayOpacity: Double - var cloudOverlay: MKTileOverlay var coordinates: CLLocationCoordinate2D var cities: [City] - var settings: Settings? + var userActionAllowed: Bool class Coordinator: NSObject, MKMapViewDelegate { var parent: RadarMapView @@ -146,13 +251,14 @@ struct RadarMapView: UIViewRepresentable { } func makeUIView(context: Context) -> MKMapView { - return MKMapView() + let mapView = MKMapView() + let coordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: coordinates.latitude, longitude: coordinates.longitude), latitudinalMeters: 100000, longitudinalMeters: 100000) + mapView.setRegion(coordinateRegion, animated: false) + return mapView } func updateUIView(_ mapView: MKMapView, context: Context) { let overlays = mapView.overlays - let hour = Calendar.current.component(.hour, from: Date()) - mapView.removeAnnotations(mapView.annotations) @@ -170,53 +276,80 @@ struct RadarMapView: UIViewRepresentable { mapView.delegate = context.coordinator //mapView.overrideUserInterfaceStyle = .dark mapView.removeOverlays(overlays) - - if (settings?.druckLayer ?? false) { - let overlay = MKTileOverlay(urlTemplate: "https://services.meteored.com/img/tiles/cep010/{z}/{x}/{y}/0\(String(format: "%02d",hour-2))_prsvie.png") - mapView.addOverlay(overlay) - //https://services.meteored.com/img/tiles/cep010/6/31/21/014_temp2m@2x.png - } - if (settings?.tempLayer ?? false) { - let overlay = MKTileOverlay(urlTemplate: "https://services.meteored.com/img/tiles/cep010/{z}/{x}/{y}/0\(String(format: "%02d",hour-2))_temp2m.png") - mapView.addOverlay(overlay) - } - if (settings?.infrarotLayer ?? false) { - mapView.addOverlay(cloudOverlay) - } - if (settings?.rainviewerLayer ?? false) { - mapView.addOverlay(overlay) - } - if (settings?.dwdLayer ?? true) { - var referenceSystem = "" - if WebMapServiceConstants.version == "1.1.1" { - referenceSystem = "SRS" - } else { - referenceSystem = "CRS" + + if let settings = settingsService.settings { + if settings.druckLayer { + let overlay = MKTileOverlay(urlTemplate: "https://api.tomorrow.io/v4/map/tile/{z}/{x}/{y}/windSpeed/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ") + mapView.addOverlay(overlay) + //https://services.meteored.com/img/tiles/cep010/6/31/21/014_temp2m@2x.png + } + if settings.tempLayer { + let overlay = MKTileOverlay(urlTemplate: "https://api.tomorrow.io/v4/map/tile/{z}/{x}/{y}/temperature/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ") + mapView.addOverlay(overlay) } + if settings.infrarotLayer { + let overlay = MKTileOverlay(urlTemplate: "https://api.tomorrow.io/v4/map/tile/{z}/{x}/{y}/cloudCover/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ") + mapView.addOverlay(overlay) + } + if settings.rainviewerLayer { + let overlay = MKTileOverlay(urlTemplate: "https://api.tomorrow.io/v4/map/tile/{z}/{x}/{y}/precipitationIntensity/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ") + mapView.addOverlay(overlay) + } + if settings.windDirectionLayer { + let overlay = MKTileOverlay(urlTemplate: "https://api.tomorrow.io/v4/map/tile/{z}/{x}/{y}/windDirection/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ") + mapView.addOverlay(overlay) + } + if settings.humidityLayer { + let overlay = MKTileOverlay(urlTemplate: "https://api.tomorrow.io/v4/map/tile/{z}/{x}/{y}/humidity/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ") + mapView.addOverlay(overlay) + } + if settings.dwdLayer { + var referenceSystem = "" + if WebMapServiceConstants.version == "1.1.1" { + referenceSystem = "SRS" + } else { + referenceSystem = "CRS" + } - let urlLayers = "layers=dwd:Niederschlagsradar&" - let urlVersion = "version=\(WebMapServiceConstants.version)&" - let urlReferenceSystem = "\(referenceSystem)=EPSG:\(WebMapServiceConstants.epsg)&" - let urlWidthAndHeight = "width=\(WebMapServiceConstants.tileSize)&height=\(WebMapServiceConstants.tileSize)&" - let urlFormat = "format=\(WebMapServiceConstants.format)&format_options=MODE:refresh&" - let urlTransparent = "transparent=\(WebMapServiceConstants.transparent)&" + let urlLayers = "layers=dwd:Niederschlagsradar&" + let urlVersion = "version=\(WebMapServiceConstants.version)&" + let urlReferenceSystem = "\(referenceSystem)=EPSG:\(WebMapServiceConstants.epsg)&" + let urlWidthAndHeight = "width=\(WebMapServiceConstants.tileSize)&height=\(WebMapServiceConstants.tileSize)&" + let urlFormat = "format=\(WebMapServiceConstants.format)&format_options=MODE:refresh&" + let urlTransparent = "transparent=\(WebMapServiceConstants.transparent)&" - var useMercator = false - if(WebMapServiceConstants.epsg == "900913"){ - useMercator = true - } + var useMercator = false + if(WebMapServiceConstants.epsg == "900913"){ + useMercator = true + } - let urlString = WebMapServiceConstants.baseUrl + "?styles=&service=WMS&request=GetMap&" + urlLayers + urlVersion + urlReferenceSystem + urlWidthAndHeight + urlFormat + urlTransparent //+ "&time=" + time[index] - let overlay = WMSTileOverlay(urlArg: urlString, useMercator: useMercator, wmsVersion: WebMapServiceConstants.version) - mapView.addOverlay(overlay) + let urlString = WebMapServiceConstants.baseUrl + "?styles=&service=WMS&request=GetMap&" + urlLayers + urlVersion + urlReferenceSystem + urlWidthAndHeight + urlFormat + urlTransparent //+ "&time=" + time[index] + let overlay = WMSTileOverlay(urlArg: urlString, useMercator: useMercator, wmsVersion: WebMapServiceConstants.version) + mapView.addOverlay(overlay) + } } - // Define region to center map on -> Modify lat so selected city is visible in the map view (Map view extends down behind the weather sheet -> pull to refresh shows no blank space behind sheet - let coordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: coordinates.latitude, longitude: coordinates.longitude), latitudinalMeters: 100000, longitudinalMeters: 100000) - - mapView.setRegion(coordinateRegion, animated: false) - mapView.mapType = .hybridFlyover + // Let's auto-update the map region if users location changes for static views + if !userActionAllowed { + let currentCenter = mapView.centerCoordinate + let desiredCenter = coordinates + + let currentLocation = CLLocation(latitude: currentCenter.latitude, longitude: currentCenter.longitude) + let desiredLocation = CLLocation(latitude: desiredCenter.latitude, longitude: desiredCenter.longitude) + let distance = currentLocation.distance(from: desiredLocation) + + if distance > 1000 { + let coordinateRegion = MKCoordinateRegion(center: desiredCenter, latitudinalMeters: 100000, longitudinalMeters: 100000) + mapView.setRegion(coordinateRegion, animated: false) + } + } + mapView.showsUserLocation = true + if !userActionAllowed { + mapView.isScrollEnabled = false + mapView.isZoomEnabled = false + mapView.isRotateEnabled = false + } } } diff --git "a/Oscar\302\260/Views/NowSubViews/RainView.swift" "b/Oscar\302\260/Views/NowSubViews/RainView.swift" index 95c306d..f11be19 100644 --- "a/Oscar\302\260/Views/NowSubViews/RainView.swift" +++ "b/Oscar\302\260/Views/NowSubViews/RainView.swift" @@ -4,78 +4,116 @@ // // Created by Philipp Bolte on 24.10.20. // - import SwiftUI import Charts struct RainView: View { - @Binding var rain: RainRadarForecast? + @Environment(Weather.self) private var weather: Weather + var body: some View { - if ((rain?.getMaxPreci() ?? 0.0) > 0) { - Text("Radar") - .font(.system(size: 20)) - .bold() - .foregroundColor(Color(UIColor.label)) - .padding([.leading, .top]) - - HStack { - VStack { - Text("\(rain?.getMaxPreci() ?? 1, specifier: "%.1f") mm/h") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - Spacer() - Text("\((rain?.getMaxPreci() ?? 1) / 2, specifier: "%.1f") mm/h") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - Spacer() - Text("0 mm/h") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - Text("") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - } - VStack { - if ((rain?.getMaxPreci() ?? 1) <= 1) { - Chart(data: rain?.data.map{$0.mmh} ?? []) - .chartStyle( - AreaChartStyle(.quadCurve, fill: - LinearGradient(gradient: .init(colors: [Color.blue, Color.blue.opacity(0.5)]), startPoint: .top, endPoint: .bottom) - ) - ) - } else if ((rain?.data.count ?? 0) > 0) { - Chart(data: rain?.data.map{$0.mmh / (rain?.getMaxPreci() ?? 1.0)} ?? []) - .chartStyle( - AreaChartStyle(.quadCurve, fill: - LinearGradient(gradient: .init(colors: [Color.blue, Color.blue.opacity(0.5)]), startPoint: .top, endPoint: .bottom) - ) - ) - } - HStack() { - Text("\(rain?.getStartTime() ?? "")") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - Spacer() - if (rain?.data.count ?? 0 > 1) { - Text("\(rain?.getMidTime() ?? "")") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - Spacer() - } - Text("\(rain?.getEndTime() ?? "")") - .font(.footnote) - .foregroundColor(Color(UIColor.label)) - } - } - + if getMaxPreci() > 0 { + VStack(alignment: .leading) { + headerView + chartView + .padding(.horizontal, 10) + .padding(.vertical, 10) + .background(Color(UIColor.secondarySystemBackground).opacity(0.5)) + .cornerRadius(10) + .font(.system(size: 18)) + .padding([.leading, .trailing, .bottom]) + .frame(height: 165) + } + .scrollTransition { content, phase in + content + .opacity(phase.isIdentity ? 1 : 0.8) + .scaleEffect(phase.isIdentity ? 1 : 0.99) + .blur(radius: phase.isIdentity ? 0 : 0.5) + } + } + } +} + +private extension RainView { + var headerView: some View { + Text("Radar") + .font(.system(size: 20)) + .bold() + .foregroundColor(Color(UIColor.label)) + .padding([.leading, .top]) + } + + var chartView: some View { + HStack { + precipitationScale + VStack { + chart + timeLabels + } + } + } + + var precipitationScale: some View { + VStack { + Text("\(getMaxPreci(), specifier: "%.1f") mm/h") + Spacer() + Text("\(getMaxPreci() / 2, specifier: "%.1f") mm/h") + Spacer() + Text("0 mm/h") + } + .font(.footnote) + .foregroundColor(Color(UIColor.label)) + } + + var chart: some View { + VStack { + if getMaxPreci() <= 1 { + Chart(data: getRadarForecast()) + .chartStyle( + AreaChartStyle(.quadCurve, fill: blueGradient) + ) + } else if let radarCount = weather.radar.radar?.count, radarCount > 0 { + Chart(data: weather.radar.radar?.map { (Double($0.precipitation_5?.first?.first ?? 0) / 10) / getMaxPreci() } ?? []) + .chartStyle( + AreaChartStyle(.quadCurve, fill: blueGradient) + ) + } + } + } + + var timeLabels: some View { + HStack { + Text(getFormattedTime(time: weather.radar.radar?.first?.timestamp)) + Spacer() + if weather.radar.radar?.count ?? 0 > 1 { + Text(getFormattedTime(time: weather.radar.radar?.middle?.timestamp)) + Spacer() } - .padding(.horizontal, 10) - .padding(.vertical, 10) - .background(Color(UIColor.secondarySystemFill)) - .cornerRadius(10) - .font(.system(size: 18)) - .padding([.leading, .trailing, .bottom]) - .frame(height: 165) + Text(getFormattedTime(time: weather.radar.radar?.last?.timestamp)) + } + .font(.footnote) + .foregroundColor(Color(UIColor.label)) + } + + var blueGradient: LinearGradient { + LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.5)]), startPoint: .top, endPoint: .bottom) + } + + func getFormattedTime(time: Date?) -> String { + let formatter = DateFormatter() + formatter.timeStyle = .short + formatter.dateStyle = .none + return formatter.string(from: time ?? Date()) + } + + func getMaxPreci() -> Double { + let maxPreci = weather.radar.radar?.compactMap { Double($0.precipitation_5?.first?.first ?? 0) / 10 }.max() ?? 0 + return maxPreci <= 1 && maxPreci > 0 ? 1 : maxPreci + } + + func getRadarForecast() -> [Double] { + guard let radarEntries = weather.radar.radar else { return [] } + return radarEntries.flatMap { entry in + entry.precipitation_5?.flatMap { $0.map { Double($0) / 10.0 } } ?? [] } } } diff --git "a/Oscar\302\260/Views/NowSubViews/WeatherSimulationView.swift" "b/Oscar\302\260/Views/NowSubViews/WeatherSimulationView.swift" new file mode 100644 index 0000000..4939ace --- /dev/null +++ "b/Oscar\302\260/Views/NowSubViews/WeatherSimulationView.swift" @@ -0,0 +1,288 @@ +// +// WeatherSimulationView.swift +// Oscar° +// +// Created by Philipp Bolte on 02.01.24. +// + +import SwiftUI + +struct WeatherSimulationView: View { + @Environment(Weather.self) private var weather: Weather + + var body: some View { + ZStack { + if !weather.isLoading && weather.forecast.hourly != nil { + StarsView() + if getCloudDensity() != Cloud.Thickness.thick { + SunView(progress: weather.time) + } + CloudsView( + thickness: getCloudDensity(), + topTint: getCloudTopStops().interpolated(amount: weather.time), + bottomTint: getCloudBottomStops().interpolated(amount: weather.time) + ) + if shouldDisplayStorm { + StormView(type: getStormType(), direction: .degrees(30), strength: getStormIntensity()) + } + } + if weather.debug { + VStack { + Text(weather.isLoading.description) + Text(String(reflecting: weather.forecast.hourly == nil)) + } + } + } + .preferredColorScheme(.dark) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(backgroundGradient) + } +} + +#Preview { + WeatherSimulationView() +} + +extension WeatherSimulationView { + var backgroundGradient: LinearGradient { + LinearGradient(colors: [ + getBackgroundTopStops().interpolated(amount: weather.time), + getBackgroundBottomStops().interpolated(amount: weather.time) + ], startPoint: .top, endPoint: .bottom) + } + + var shouldDisplayStorm: Bool { + (weather.forecast.current?.weathercode ?? 0 >= 51 && weather.forecast.current?.precipitation ?? 0 > 0) || weather.radar.isRaining() + } + + func getBackgroundTopStops() -> [Gradient.Stop] { + if (weather.forecast.hourly == nil) { + return [ + .init(color: .midnightStart, location: 0), + .init(color: .midnightStart, location: 0.25), + .init(color: .sunriseStart, location: 0.33), + .init(color: .sunnyDayStart, location: 0.38), + .init(color: .sunnyDayStart, location: 0.65), + .init(color: .sunsetStart, location: 0.69), + .init(color: .midnightStart, location: 0.8), + .init(color: .midnightStart, location: 1) + ] + } + + let dayLength = 86400.0 + let dayBegin = weather.forecast.hourly?.time.first ?? 0 + let sunrise = weather.forecast.daily?.sunrise?.first ?? 0 + let sunset = weather.forecast.daily?.sunset?.first ?? 0 + + if (weather.forecast.current?.weathercode ?? 0 >= 51 && weather.forecast.current?.precipitation ?? 0 > 0) || weather.radar.isRaining() { + return [ + .init(color: .midnightStart, location: 0), + .init(color: .midnightStart, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .rainyStart, location: (sunrise - dayBegin)/dayLength), + .init(color: .rainyStart, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .rainyStart, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .rainyStart, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightStart, location: (sunset - dayBegin)/dayLength + 0.04), + .init(color: .midnightStart, location: 1) + ] + } + + return [ + .init(color: .midnightStart, location: 0), + .init(color: .midnightStart, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .sunriseStart, location: (sunrise - dayBegin)/dayLength), + .init(color: .sunnyDayStart, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .sunnyDayStart, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .sunsetStart, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightStart, location: (sunset - dayBegin)/dayLength + 0.04), + .init(color: .midnightStart, location: 1) + ] + } + + func getBackgroundBottomStops() -> [Gradient.Stop] { + if (weather.forecast.hourly == nil) { + return [ + .init(color: .midnightEnd, location: 0), + .init(color: .midnightEnd, location: 0.25), + .init(color: .sunriseEnd, location: 0.33), + .init(color: .sunnyDayEnd, location: 0.38), + .init(color: .sunnyDayEnd, location: 0.65), + .init(color: .sunsetEnd, location: 0.69), + .init(color: .midnightEnd, location: 0.8), + .init(color: .midnightEnd, location: 1) + ] + } + + let dayLength = 86400.0 + let dayBegin = weather.forecast.hourly?.time.first ?? 0 + let sunrise = weather.forecast.daily?.sunrise?.first ?? 0 + let sunset = weather.forecast.daily?.sunset?.first ?? 0 + + if (weather.forecast.current?.weathercode ?? 0 >= 51 && weather.forecast.current?.precipitation ?? 0 > 0) || weather.radar.isRaining() { + return [ + .init(color: .midnightEnd, location: 0), + .init(color: .midnightEnd, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .rainyEnd, location: (sunrise - dayBegin)/dayLength), + .init(color: .rainyEnd, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .rainyEnd, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .rainyEnd, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightEnd, location: (sunset - dayBegin)/dayLength + 0.015), + .init(color: .midnightEnd, location: 1) + ] + } + + return [ + .init(color: .midnightEnd, location: 0), + .init(color: .midnightEnd, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .sunriseEnd, location: (sunrise - dayBegin)/dayLength), + .init(color: .sunnyDayEnd, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .sunnyDayEnd, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .sunsetEnd, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightEnd, location: (sunset - dayBegin)/dayLength + 0.015), + .init(color: .midnightEnd, location: 1) + ] + } + + func getCloudTopStops() -> [Gradient.Stop] { + if (weather.forecast.hourly == nil) { + return [ + .init(color: .darkCloudStart, location: 0), + .init(color: .darkCloudStart, location: 0.25), + .init(color: .sunriseCloudStart, location: 0.33), + .init(color: .lightCloudStart, location: 0.38), + .init(color: .lightCloudStart, location: 0.7), + .init(color: .sunsetCloudStart, location: 0.78), + .init(color: .darkCloudStart, location: 0.82), + .init(color: .darkCloudStart, location: 1) + ] + } + + let dayLength = 86400.0 + let dayBegin = weather.forecast.hourly?.time.first ?? 0 + let sunrise = weather.forecast.daily?.sunrise?.first ?? 0 + let sunset = weather.forecast.daily?.sunset?.first ?? 0 + + if (weather.forecast.current?.weathercode ?? 0 >= 51 && weather.forecast.current?.precipitation ?? 0 > 0) || weather.radar.isRaining() { + return [ + .init(color: .darkCloudStart, location: 0), + .init(color: .darkCloudStart, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .rainCloudStart, location: (sunrise - dayBegin)/dayLength), + .init(color: .rainCloudStart, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .rainCloudStart, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .rainCloudStart, location: (sunset - dayBegin)/dayLength), + .init(color: .darkCloudStart, location: (sunset - dayBegin)/dayLength + 0.015), + .init(color: .darkCloudStart, location: 1) + ] + } + + return [ + .init(color: .darkCloudStart, location: 0), + .init(color: .darkCloudStart, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .sunriseCloudStart, location: (sunrise - dayBegin)/dayLength), + .init(color: .lightCloudStart, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .lightCloudStart, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .sunsetCloudStart, location: (sunset - dayBegin)/dayLength), + .init(color: .darkCloudStart, location: (sunset - dayBegin)/dayLength + 0.015), + .init(color: .darkCloudStart, location: 1) + ] + } + + func getCloudBottomStops() -> [Gradient.Stop] { + if (weather.forecast.hourly == nil) { + return [ + .init(color: .darkCloudEnd, location: 0), + .init(color: .darkCloudEnd, location: 0.25), + .init(color: .sunriseCloudEnd, location: 0.33), + .init(color: .lightCloudEnd, location: 0.38), + .init(color: .lightCloudEnd, location: 0.7), + .init(color: .sunsetCloudEnd, location: 0.78), + .init(color: .darkCloudEnd, location: 0.92), + .init(color: .darkCloudEnd, location: 1) + ] + } + + let dayLength = 86400.0 + let dayBegin = weather.forecast.hourly?.time.first ?? 0 + let sunrise = weather.forecast.daily?.sunrise?.first ?? 0 + let sunset = weather.forecast.daily?.sunset?.first ?? 0 + + if (weather.forecast.current?.weathercode ?? 0 >= 51 && weather.forecast.current?.precipitation ?? 0 > 0) || weather.radar.isRaining() { + return [ + .init(color: .darkCloudEnd, location: 0), + .init(color: .darkCloudEnd, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .rainCloudEnd, location: (sunrise - dayBegin)/dayLength), + .init(color: .rainCloudEnd, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .rainCloudEnd, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .rainCloudEnd, location: (sunset - dayBegin)/dayLength), + .init(color: .darkCloudEnd, location: (sunset - dayBegin)/dayLength + 0.04), + .init(color: .darkCloudEnd, location: 1) + ] + } + + return [ + .init(color: .darkCloudEnd, location: 0), + .init(color: .darkCloudEnd, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .sunriseCloudEnd, location: (sunrise - dayBegin)/dayLength), + .init(color: .lightCloudEnd, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .lightCloudEnd, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .sunsetCloudEnd, location: (sunset - dayBegin)/dayLength), + .init(color: .darkCloudEnd, location: (sunset - dayBegin)/dayLength + 0.04), + .init(color: .darkCloudEnd, location: 1) + ] + } + + public func getCloudDensity() -> Cloud.Thickness { + switch weather.forecast.current?.weathercode { + case 0: + return Cloud.Thickness.none + case 1: + return Cloud.Thickness.light + case 2: + return Cloud.Thickness.regular + case 3: + return Cloud.Thickness.thick + default: + return Cloud.Thickness.thick + } + } + + public func getStormType() -> Storm.Contents { + switch weather.forecast.current?.weathercode { + case 51, 53, 55, 61, 63, 65, 66, 67, 95, 96, 99: + return Storm.Contents.rain + case 71, 73, 75, 77, 85, 86: + return Storm.Contents.snow + default: + return Storm.Contents.none + } + } + + public func getStormIntensity() -> Int { + switch weather.forecast.current?.weathercode { + case 51, 53, 55, 56, 57: + return 30 + case 61: + return 40 + case 63: + return 50 + case 65, 67: + return 70 + case 71: + return 90 + case 73: + return 150 + case 75: + return 300 + case 77: + return 50 + case 80, 85, 95, 99: + return 20 + case 81: + return 80 + case 82, 86: + return 90 + default: + return 40 + } + } +} diff --git "a/Oscar\302\260/Views/NowView.swift" "b/Oscar\302\260/Views/NowView.swift" index 839c49a..468d686 100644 --- "a/Oscar\302\260/Views/NowView.swift" +++ "b/Oscar\302\260/Views/NowView.swift" @@ -5,151 +5,142 @@ // Created by Philipp Bolte on 22.09.20. import SwiftUI -import SPIndicator +import OpenAPIRuntime +import OpenAPIURLSession +import MapKit + +#Preview { + NowView().preferredColorScheme(.dark) +} struct NowView: View { - @ObservedObject var nowViewModel: NowViewModel = NowViewModel() - @ObservedObject var settingsService: SettingService = SettingService() - @State private var isLegalSheetPresented = false + @ObservedObject var settingsService: SettingService = SettingService() + @Environment(Weather.self) private var weather: Weather + @Environment(Location.self) private var location: Location @State private var isMapSheetPresented = false - - var body: some View { - ZStack { - ZStack { - if nowViewModel.updateDidFinish { - StarsView() - .opacity(nowViewModel.starOpacity) - if nowViewModel.isRaining() { - CloudsView( - thickness: Cloud.Thickness.thick, - topTint: nowViewModel.getCloudTopStops().interpolated(amount: nowViewModel.time), - bottomTint: nowViewModel.getCloudBottomStops().interpolated(amount: nowViewModel.time) - ) - StormView(type: Storm.Contents.rain, direction: .degrees(30), strength: 80) - } else { - if (nowViewModel.weather?.currentWeather.getCloudDensity() ?? Cloud.Thickness.none) != Cloud.Thickness.thick { - SunView(progress: nowViewModel.time) - } - CloudsView( - thickness: nowViewModel.weather?.currentWeather.getCloudDensity() ?? Cloud.Thickness.none, - topTint: nowViewModel.getCloudTopStops().interpolated(amount: nowViewModel.time), - bottomTint: nowViewModel.getCloudBottomStops().interpolated(amount: nowViewModel.time) - ) - } - } - } - .preferredColorScheme(.dark) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background( - LinearGradient(colors: [ - nowViewModel.getBackgroundTopStops().interpolated(amount: nowViewModel.time), - nowViewModel.getBackgroundBottomStops().interpolated(amount: nowViewModel.time) - ], startPoint: .top, endPoint: .bottom) - ) + @State private var tapCount = 0 - + private var client = APIClient() + private let locationService = LocationService.shared - // MARK: Weather Sheet + var body: some View { + ZStack { + WeatherSimulationView() ScrollView(.vertical, showsIndicators: false) { ZStack { VStack(alignment: .leading) { - HeadView(now: nowViewModel) + HeadView() .padding(.top, 50) - RainView(rain: $nowViewModel.rain) - HourlyView(weather: $nowViewModel.weather) - DailyView(weather: $nowViewModel.weather) - - Text("Radar") - .font(.title3) - .bold() - .foregroundColor(Color(UIColor.label)) - .padding([.leading, .top]) - - AsyncImage( - url: URL(string: "https://api.oscars.love/api/v1/mapshots/radar?lat=\(nowViewModel.getCurrentCoords().latitude)&lon=\(nowViewModel.getCurrentCoords().longitude)"), - content: { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - }, - placeholder: { - VStack(alignment: .leading) { - Spacer() - HStack { - Spacer() - ProgressView() - Spacer() - } - Spacer() + .onTapGesture { + self.tapCount += 1 + if self.tapCount == 10 { + self.tapCount = 0 // Reset the count if needed + weather.debug.toggle() + UIApplication.shared.playHapticFeedback() } - .frame(height: 350) - .background(Color(UIColor.secondarySystemFill)) } - ) - .cornerRadius(10) - .padding() - .onTapGesture { - UIApplication.shared.playHapticFeedback() - isMapSheetPresented.toggle() - } - .sheet(isPresented: $isMapSheetPresented) { - MapDetailView(now: nowViewModel, settingsService: settingsService) - } - - AQIView(aqi: $nowViewModel.aqi) - - HStack { - Spacer() - Image(systemName: "info.circle.fill") - .resizable() - .scaledToFit() - .frame(width: 20, height: 20) - .foregroundColor(Color(UIColor.label)) - Text("Rechtliche\nInformationen") - .foregroundColor(Color(UIColor.label)) - .font(.system(size: 10)) + RainView() + HourlyView() + DailyView() + VStack(alignment: .leading) { + Text("Radar") + .font(.title3) .bold() - Spacer() - } - .padding(.top) - .padding(.bottom, 50) - .onTapGesture { - UIApplication.shared.playHapticFeedback() - isLegalSheetPresented.toggle() + .foregroundColor(Color(UIColor.label)) + .padding([.leading, .top]) + RadarView(settingsService: settingsService, showLayerSettings: false, userActionAllowed: false) + .frame(height: 350) + .cornerRadius(10) + .padding() + .onTapGesture { + UIApplication.shared.playHapticFeedback() + isMapSheetPresented.toggle() + } + .sheet(isPresented: $isMapSheetPresented) { + MapDetailView(settingsService: settingsService) + } } - .sheet(isPresented: $isLegalSheetPresented) { - LegalView() + + AQIView() + LegalTextView() + if weather.debug { + VStack { + Text(weather.isLoading.description) + Text(weather.error) + Text("Air") + .padding(.top, 20) + Text(String(reflecting: weather.air)) + Text("Radar") + .padding(.top, 20) + Text(String(reflecting: weather.radar)) + Text("Alerts") + .padding(.top, 20) + Text(String(reflecting: weather.alerts)) + Text("Time") + .padding(.top, 20) + Text(String(reflecting: weather.time)) + Text("Location") + .padding(.top, 20) + Text(String(reflecting: location.coordinates)) + Text(String(reflecting: location.name)) + Text("Forecast") + .padding(.top, 20) + Text(String(reflecting: weather.forecast)) + } } } } } .padding(.top, 40) .refreshable { - nowViewModel.update() + await self.updateState() } } .background(Color(UIColor.secondarySystemBackground)) .edgesIgnoringSafeArea(.all) - .onAppear { - nowViewModel.update() - } .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in - nowViewModel.update() // Why again? onAppear does not seem to be enough --> bug in SwiftUI? + Task { + await self.updateState() + } } .onReceive(NotificationCenter.default.publisher(for: Notification.Name("ChangedLocation"), object: nil)) { _ in - nowViewModel.update() // GPS location has changed dramatically (2.5km) + Task { + await self.updateState() + } } .onReceive(NotificationCenter.default.publisher(for: Notification.Name("CityToggle"), object: nil)) { _ in - nowViewModel.update() // User selected city might have changed + Task { + await self.updateState() + } } } } -struct NowView_Previews: PreviewProvider { - static var previews: some View { - Group { - NowView() - .preferredColorScheme(.dark) +extension NowView { + func updateState() async { + do { + if weather.isLoading { return } + weather.isLoading = true + + locationService.update() + location.coordinates = locationService.getCoordinates() + location.name = await locationService.getLocationName() + + async let forecastRequest = client.getForecast(coordinates: location.coordinates) + async let airQualityRequest = client.getAirQuality(coordinates: location.coordinates) + async let radarRequest = client.getRainRadar(coordinates: location.coordinates) + let (forecastResponse, airQualityResponse, radarResponse) = try await (forecastRequest, airQualityRequest, radarRequest) + weather.forecast = forecastResponse + weather.air = airQualityResponse + weather.radar = radarResponse + weather.updateTime() + weather.isLoading = false + + let alertsResponse = try await client.getAlerts(coordinates: location.coordinates) + weather.alerts = alertsResponse + } catch { + print(error) + weather.error = error.localizedDescription } } } diff --git "a/Oscar\302\260/Views/RainRadarView.swift" "b/Oscar\302\260/Views/RainRadarView.swift" index 7babbba..2075373 100644 --- "a/Oscar\302\260/Views/RainRadarView.swift" +++ "b/Oscar\302\260/Views/RainRadarView.swift" @@ -47,54 +47,3 @@ struct RainRadarView: UIViewRepresentable { } } - -struct ContentView2 : View { - - @State private var timer : Timer? - @State private var overlay : MKTileOverlay? - @State private var pos = 0 - @State private var time: String? - @Binding var radarMetadata: WeatherMapsResponse? - - var body : some View { - - VStack{ - RainRadarView(timer: $timer, overlay: $overlay) - Text(time ?? "") - - Button(action:{ - if self.timer == nil{ - self.timer = Timer.scheduledTimer(withTimeInterval : 1 ,repeats:true){_ in - - let path = radarMetadata?.radar.past[pos].path - self.time = Date(timeIntervalSince1970: TimeInterval(radarMetadata?.radar.past[pos].time ?? 0)).formatted() - - // Create rain radar tile overlay with date parameter - let template = "https://tilecache.rainviewer.com\(path ?? "")/256/{z}/{x}/{y}/2/1_0.png" - let overlay = MKTileOverlay(urlTemplate : template) - - // Remove previous overlay if any and add new one - self.overlay = overlay - - if (pos == (radarMetadata?.radar.past.count ?? 0 )-1) { - pos = 0 - } else { - pos += 1 - } - } - }else{ - self.timer?.invalidate() - self.timer=nil - - } - }){ - Text(self.timer == nil ? "Play" : "Stop") - .font(.largeTitle) - - } - - } - - } - -} diff --git "a/Oscar\302\260/Views/SearchCityView.swift" "b/Oscar\302\260/Views/SearchCityView.swift" new file mode 100644 index 0000000..0cd30c2 --- /dev/null +++ "b/Oscar\302\260/Views/SearchCityView.swift" @@ -0,0 +1,123 @@ +import SwiftUI + +struct SearchCityView: View { + @Environment(\.presentationMode) var presentationMode + @State private var searchText = "" + @State private var searchIsActive = false + @State private var searchResult: Components.Schemas.SearchResponse = .init() + private var client = APIClient() + private var locationService = LocationService.shared + + var body: some View { + + NavigationStack { + VStack { + if searchIsActive { + if (searchText.count > 0 && (searchResult.results?.isEmpty) == nil) { + ContentUnavailableView.search + } else { + List { + ForEach(searchResult.results ?? [], id: \.self) { result in + HStack { + Text(getFormattedLocationString(location: result)) + .onTapGesture { + locationService.city.addCity(searchResult: result) + searchIsActive = false + searchText = "" + UIApplication.shared.hideKeyboard() + } + } + .lineLimit(1) + } + } + } + } + } + .navigationBarTitle(String(localized: "Orte"), displayMode: .inline) + .toolbar(content: { + ToolbarItem(placement: .navigationBarTrailing, content: { + Button(String(localized: "Fertig"), action: { + presentationMode.wrappedValue.dismiss() + UIApplication.shared.playHapticFeedback() + }) + }) + }) + + if !searchIsActive { + Form { + Section(header: Text("Meine Orte")) { + List { + if (locationService.authStatus == .authorizedWhenInUse || locationService.authStatus == .authorizedAlways) { + if (locationService.city.cities.filter {$0.selected == true}.count < 1) { + HStack { + Image(systemName: "location.fill") + .foregroundColor(.blue) + Text("Aktueller Standort") + Spacer() + Image(systemName: "checkmark") + .foregroundColor(.blue) + } + } else { + HStack { + Image(systemName: "location.fill") + .foregroundColor(.blue) + Text("Aktueller Standort") + Spacer() + } + .contentShape(Rectangle()) + .onTapGesture { + locationService.city.disableAllCities() + } + } + } + + ForEach(locationService.city.cities) { city in + HStack { + if (city.selected) { + Text("\(city.label ?? "")") + Spacer() + Image(systemName: "checkmark") + .foregroundColor(.blue) + + } else { + Text("\(city.label ?? "")") + Spacer() + } + } + .contentShape(Rectangle()) + .onTapGesture { + locationService.city.toggleActiveCity(city: city) + } + } + .onDelete(perform: locationService.city.deleteCity) + .onMove(perform: locationService.city.moveCity) + } + } + } + } + } + .searchable(text: $searchText, isPresented: $searchIsActive, placement: .navigationBarDrawer(displayMode: .always), prompt: Text("Suchen...")) + .onChange(of: searchText, { + Task { + if searchText.count < 1 { return } + searchResult = try await client.getGeocodeSearchResult(name: searchText) + } + }) + } +} + +extension SearchCityView { + public func getFormattedLocationString(location: Components.Schemas.Location) -> String { + let locationDetails = [location.name, location.admin3, location.admin1, location.country] + let formattedString = locationDetails.compactMap { $0 }.joined(separator: ", ") + + return formattedString.isEmpty ? "Unknown Entry" : formattedString + } +} + +// Preview +struct SearchCityView_Previews: PreviewProvider { + static var previews: some View { + SearchCityView() + } +} diff --git "a/Oscar\302\260/Views/SearchView.swift" "b/Oscar\302\260/Views/SearchView.swift" deleted file mode 100644 index e154487..0000000 --- "a/Oscar\302\260/Views/SearchView.swift" +++ /dev/null @@ -1,142 +0,0 @@ -// -// SearchView.swift -// SearchView -// -// Created by Philipp Bolte on 16.08.21. -// Credits to https://www.peteralt.com/blog/mapkit-location-search-with-swiftui/ - -import SwiftUI -import MapKit - -struct SearchView: View { - @ObservedObject var searchModel: SearchViewModel - @ObservedObject var now: NowViewModel - @Binding var cities: [City] - @Environment(\.presentationMode) var presentationMode - @State private var showCityList = true - - var body: some View { - NavigationView { - VStack { - Form { - Section(header: Text("Ort suchen")) { - ZStack(alignment: .trailing) { - TextField("Suchen", text: $searchModel.queryFragment) - } - } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)) { _ in - searchModel.queryFragment = "" - searchModel.status = .idle - showCityList = true - } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { _ in - showCityList = false - } - - if(self.showCityList) { - Section(header: Text("Meine Orte")) { - List { - if (now.lm.authStatus == .authorizedWhenInUse || now.lm.authStatus == .authorizedAlways) { - if (now.cs.cities.filter {$0.selected == true}.count < 1) { - HStack { - Image(systemName: "location.fill") - .foregroundColor(.blue) - Text("Aktueller Standort") - Spacer() - Image(systemName: "checkmark") - .foregroundColor(.blue) - } - } else { - HStack { - Image(systemName: "location.fill") - .foregroundColor(.blue) - Text("Aktueller Standort") - Spacer() - } - .contentShape(Rectangle()) - .onTapGesture { - now.cs.disableAllCities() - } - } - } - - ForEach(now.cs.cities) { city in - HStack { - if (city.selected) { - Text("\(city.label ?? "")") - Spacer() - Image(systemName: "checkmark") - .foregroundColor(.blue) - - } else { - Text("\(city.label ?? "")") - Spacer() - } - } - .contentShape(Rectangle()) - .onTapGesture { - now.cs.toggleActiveCity(city: city) - } - } - .onDelete(perform: now.cs.deleteCity) - } - } - } - - - Section { - List { - Group { () -> AnyView in - switch searchModel.status { - case .noResults: return AnyView(Text("No Results")) - case .error(let description): return AnyView(Text("Error: \(description)")) - default: return AnyView(EmptyView()) - } - }.foregroundColor(Color.gray) - - if(searchModel.searchResults.filter{$0.title.contains("Hessen")}.count > 0) { - Label("Hessen, Sachsen-Anhalt", systemImage: "plus") - .onTapGesture { - now.cs.addCity(city: ["Hessen", "52.01", "10.77", "false"]) - UIApplication.shared.hideKeyboard() - } - } - - ForEach(searchModel.searchResults, id: \.self) { completionResult in - Label("\(completionResult.title)", systemImage: "plus") - .onTapGesture { - now.cs.addCity(searchResult: completionResult) - UIApplication.shared.hideKeyboard() - } - } - } - } - - } - } - //.animation(nil) - .navigationBarTitle(Text("Orte"), displayMode: .inline) - .toolbar(content: { - ToolbarItem(placement: .navigationBarTrailing, content: { - Button("Fertig", action: { - presentationMode.wrappedValue.dismiss() - UIApplication.shared.playHapticFeedback() - }) - }) - }) - } - } -} - -// Thank you to https://stackoverflow.com/questions/56491386/how-to-hide-keyboard-when-using-swiftui -extension UIApplication { - func hideKeyboard() { - sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) - } - - func playHapticFeedback() { - let hapticFeedback = UIImpactFeedbackGenerator(style: .rigid) - hapticFeedback.impactOccurred(intensity: 0.5) - } -} - diff --git "a/Oscar\302\260/WeatherApp.swift" "b/Oscar\302\260/WeatherApp.swift" index 3a99b0b..1363c1f 100644 --- "a/Oscar\302\260/WeatherApp.swift" +++ "b/Oscar\302\260/WeatherApp.swift" @@ -6,15 +6,72 @@ // import SwiftUI +import Sentry +import SentrySwiftUI + @main struct WeatherApp: App { - let persistenceController = PersistenceController.shared + init() { + SentrySDK.start { options in + options.dsn = "https://f6b7fe82cd8cd8bb11dc0dc38db42255@o4507143648772096.ingest.de.sentry.io/4507143650148432" + options.debug = false + options.enableTracing = true + options.tracesSampleRate = 0.5 + options.attachScreenshot = true + options.attachViewHierarchy = true + options.enableMetricKit = true + options.enableTimeToFullDisplayTracing = true + options.swiftAsyncStacktraces = true + options.enableAppLaunchProfiling = true + } + } + + @State private var weather = Weather() + @State private var location = Location() + private let locationService = LocationService.shared + private let client = APIClient() + private let persistenceController = PersistenceController.shared + var body: some Scene { WindowGroup { NowView() .environment(\.managedObjectContext, persistenceController.container.viewContext) + .environment(weather) + .environment(location) .preferredColorScheme(.dark) + .task { + await updateState() + } + .sentryTrace("NowView") + } + } +} + +extension WeatherApp { + public func updateState() async { + do { + if weather.isLoading { return } + weather.isLoading = true + + locationService.update() + location = await locationService.getLocation() + + async let forecastRequest = client.getForecast(coordinates: location.coordinates) + async let airQualityRequest = client.getAirQuality(coordinates: location.coordinates) + async let radarRequest = client.getRainRadar(coordinates: location.coordinates) + let (forecastResponse, airQualityResponse, radarResponse) = try await (forecastRequest, airQualityRequest, radarRequest) + weather.forecast = forecastResponse + weather.air = airQualityResponse + weather.radar = radarResponse + weather.updateTime() + weather.isLoading = false + + let alertsResponse = try await client.getAlerts(coordinates: location.coordinates) + weather.alerts = alertsResponse + } catch { + print(error) + weather.error = error.localizedDescription } } } diff --git "a/Oscar\302\260Watch Watch App/Localizable.xcstrings" "b/Oscar\302\260Watch Watch App/Localizable.xcstrings" new file mode 100644 index 0000000..5ee66fa --- /dev/null +++ "b/Oscar\302\260Watch Watch App/Localizable.xcstrings" @@ -0,0 +1,7 @@ +{ + "sourceLanguage" : "de", + "strings" : { + + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260WatchWidget/InfoPlist.xcstrings" "b/Oscar\302\260WatchWidget/InfoPlist.xcstrings" new file mode 100644 index 0000000..a2e55f9 --- /dev/null +++ "b/Oscar\302\260WatchWidget/InfoPlist.xcstrings" @@ -0,0 +1,167 @@ +{ + "sourceLanguage" : "de", + "strings" : { + "CFBundleDisplayName" : { + "comment" : "Bundle display name", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°WatchWidget" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°WatchWidget" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°WatchWidget" + } + } + } + }, + "CFBundleName" : { + "comment" : "Bundle name", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°WatchWidgetExtension" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°WatchWidgetExtension" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oscar°WatchWidgetExtension" + } + } + } + }, + "NSHumanReadableCopyright" : { + "comment" : "Copyright (human-readable)", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "NSLocationAlwaysAndWhenInUseUsageDescription" : { + "comment" : "Privacy - Location Always and When In Use Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Only required to display weather at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yalnızca geçerli konumdaki hava durumunu görüntülemek için gereklidir." + } + } + } + }, + "NSLocationAlwaysUsageDescription" : { + "comment" : "Privacy - Location Always Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Only required to display weather at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yalnızca geçerli konumdaki hava durumunu görüntülemek için gereklidir." + } + } + } + }, + "NSLocationUsageDescription" : { + "comment" : "Privacy - Location Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Only required to display weather at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yalnızca geçerli konumdaki hava durumunu görüntülemek için gereklidir." + } + } + } + }, + "NSLocationWhenInUseUsageDescription" : { + "comment" : "Privacy - Location When In Use Usage Description", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lediglich benötigt, um Wetter am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Only required to display weather at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yalnızca geçerli konumdaki hava durumunu görüntülemek için gereklidir." + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260WatchWidget/Localizable.xcstrings" "b/Oscar\302\260WatchWidget/Localizable.xcstrings" new file mode 100644 index 0000000..cb32f39 --- /dev/null +++ "b/Oscar\302\260WatchWidget/Localizable.xcstrings" @@ -0,0 +1,210 @@ +{ + "sourceLanguage" : "de", + "strings" : { + "%.1fmm" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%.1fmm" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%lld" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%lld %% • %.1f mm" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld %% • %.1f mm" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%lld°" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld°" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "Aktuelle Temperatur und heute zu erwartende Temperaturen" : { + "comment" : "LS Widget", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktuelle Temperatur und heute zu erwartende Temperaturen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Current temperature and expected temperatures today" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mevcut sıcaklık ve bugün beklenen sıcaklıklar" + } + } + } + }, + "E_compass" : { + "comment" : "East" + }, + "N_compass" : { + "comment" : "North" + }, + "NE_compass" : { + "comment" : "North-East" + }, + "NW_compass" : { + "comment" : "North-West" + }, + "Regen" : { + "comment" : "LS Widget Regen", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rain" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yağmur" + } + } + } + }, + "Regenmenge und -wahrscheinlichkeit für die aktuelle Stunde" : { + "comment" : "LS Widget Regenmenge und -wahrscheinlichkeit", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regenmenge und -wahrscheinlichkeit für die aktuelle Stunde" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Probability of rain and current rainfall" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mevcut saat için yağmur miktarı ve olasılığı" + } + } + } + }, + "S_compass" : { + "comment" : "South" + }, + "SE_compass" : { + "comment" : "South-East" + }, + "SW_compass" : { + "comment" : "South-West" + }, + "Temperatur" : { + "comment" : "LS Temperatur", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperatur" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperature" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sıcaklık" + } + } + } + }, + "W_compass" : { + "comment" : "West" + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260WatchWidget/Oscar_WatchWidget.intentdefinition" "b/Oscar\302\260WatchWidget/Oscar_WatchWidget.intentdefinition" deleted file mode 100644 index bdb4045..0000000 --- "a/Oscar\302\260WatchWidget/Oscar_WatchWidget.intentdefinition" +++ /dev/null @@ -1,59 +0,0 @@ - - - - - INEnums - - INIntentDefinitionModelVersion - 1.2 - INIntentDefinitionNamespace - 88xZPY - INIntentDefinitionSystemVersion - 20A294 - INIntentDefinitionToolsBuildVersion - 12A6144 - INIntentDefinitionToolsVersion - 12.0 - INIntents - - - INIntentCategory - information - INIntentDescriptionID - tVvJ9c - INIntentEligibleForWidgets - - INIntentIneligibleForSuggestions - - INIntentName - Configuration - INIntentResponse - - INIntentResponseCodes - - - INIntentResponseCodeName - success - INIntentResponseCodeSuccess - - - - INIntentResponseCodeName - failure - - - - INIntentTitle - Configuration - INIntentTitleID - gpCwrM - INIntentType - Custom - INIntentVerb - View - - - INTypes - - - diff --git "a/Oscar\302\260Widget/GlobalRadarWidget/GlobalRadarProvider.swift" "b/Oscar\302\260Widget/GlobalRadarWidget/GlobalRadarProvider.swift" new file mode 100644 index 0000000..87b2f0e --- /dev/null +++ "b/Oscar\302\260Widget/GlobalRadarWidget/GlobalRadarProvider.swift" @@ -0,0 +1,160 @@ +import SwiftUI +import MapKit +import WidgetKit + +struct GlobalRadarEntry: TimelineEntry { + let date: Date + let image: UIImage +} + +struct GlobalRadarProvider: TimelineProvider { + let locationService = LocationService.shared + + init() { + locationService.update() + } + + func placeholder(in context: Context) -> GlobalRadarEntry { + GlobalRadarEntry(date: Date(), image: UIImage(systemName: "map")!) + } + + func getSnapshot(in context: Context, completion: @escaping (GlobalRadarEntry) -> Void) { + generateMapSnapshot { entry in + completion(entry) + } + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { + generateMapSnapshot { entry in + let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 15, to: Date())! + let timeline = Timeline(entries:[entry], policy: .after(nextUpdateDate)) + completion(timeline) + } + } + + private func generateMapSnapshot(completion: @escaping (GlobalRadarEntry) -> Void) { + locationService.update() + let coordinate = locationService.getCoordinates() + + let zoomLevel = 14 + // https://gis.stackexchange.com/questions/7430/what-ratio-scales-do-google-maps-zoom-levels-correspond-to + let meters = 591657550.500000 / pow(2, Double(zoomLevel)) + + let region = MKCoordinateRegion(center: coordinate, latitudinalMeters: meters, longitudinalMeters: meters) + + captureMapSnapshot(at: coordinate, region: region) { snapshotImage in + guard let snapshot = snapshotImage else { + let errorEntry = GlobalRadarEntry(date: Date(), image: UIImage(systemName: "exclamationmark.triangle")!) + completion(errorEntry) + return + } + + let tiles = tilesCoveringRegion(region: region, zoomLevel: zoomLevel) + overlayTiles(on: snapshot, tiles: tiles, zoomLevel: zoomLevel) { overlaidImage in + let entry = GlobalRadarEntry(date: Date(), image: overlaidImage) + completion(entry) + } + } + } + + private func captureMapSnapshot(at coordinate: CLLocationCoordinate2D, region: MKCoordinateRegion, completion: @escaping (UIImage?) -> Void) { + let mapSnapshotOptions = MKMapSnapshotter.Options() + mapSnapshotOptions.region = region + mapSnapshotOptions.size = CGSize(width: 300, height: 300) + mapSnapshotOptions.scale = UIScreen.main.scale + mapSnapshotOptions.traitCollection = UITraitCollection(userInterfaceStyle: .dark) + + let snapshotter = MKMapSnapshotter(options: mapSnapshotOptions) + snapshotter.start { snapshot, error in + guard let snapshot = snapshot, error == nil else { + completion(nil) + return + } + completion(snapshot.image) + } + } + + private func tilesCoveringRegion(region: MKCoordinateRegion, zoomLevel: Int) -> [(x: Int, y: Int)] { + func tileCoords(for coordinate: CLLocationCoordinate2D, zoomLevel: Int) -> (x: Int, y: Int) { + let x = Int(floor((coordinate.longitude + 180.0) / 360.0 * pow(2.0, Double(zoomLevel)))) + let y = Int(floor((1.0 - log(tan(coordinate.latitude * .pi / 180.0) + 1.0 / cos(coordinate.latitude * .pi / 180.0)) / .pi) / 2.0 * pow(2.0, Double(zoomLevel)))) + return (x, y) + } + + let topLeft = CLLocationCoordinate2D(latitude: region.center.latitude + region.span.latitudeDelta / 2, + longitude: region.center.longitude - region.span.longitudeDelta / 2) + let bottomRight = CLLocationCoordinate2D(latitude: region.center.latitude - region.span.latitudeDelta / 2, + longitude: region.center.longitude + region.span.longitudeDelta / 2) + + let topLeftTile = tileCoords(for: topLeft, zoomLevel: zoomLevel) + let bottomRightTile = tileCoords(for: bottomRight, zoomLevel: zoomLevel) + + var tiles = [(Int, Int)]() + for x in topLeftTile.x...bottomRightTile.x { + for y in topLeftTile.y...bottomRightTile.y { + tiles.append((x, y)) + } + } + return tiles + } + + private func overlayTiles(on snapshot: UIImage, tiles: [(x: Int, y: Int)], zoomLevel: Int, completion: @escaping (UIImage) -> Void) { + let group = DispatchGroup() + var tileImages = [(image: UIImage, x: Int, y: Int)]() + + let minX = tiles.min(by: { $0.x < $1.x })!.x + let maxX = tiles.max(by: { $0.x < $1.x })!.x + let minY = tiles.min(by: { $0.y < $1.y })!.y + let maxY = tiles.max(by: { $0.y < $1.y })!.y + + let totalXtiles = maxX - minX + 1 + let totalYtiles = maxY - minY + 1 + + let tileWidth = snapshot.size.width / CGFloat(totalXtiles) + let tileHeight = snapshot.size.height / CGFloat(totalYtiles) + + for (x, y) in tiles { + group.enter() + fetchTileImage(x: x, y: y, z: zoomLevel) { tileImage in + if let tile = tileImage { + tileImages.append((tile, x, y)) + } + group.leave() + } + } + + group.notify(queue: DispatchQueue.main) { + UIGraphicsBeginImageContextWithOptions(snapshot.size, true, snapshot.scale) + snapshot.draw(at: .zero) + + for (tile, x, y) in tileImages { + let originX = CGFloat(x - minX) * tileWidth + let originY = CGFloat(y - minY) * tileHeight + tile.draw(in: CGRect(x: originX, y: originY, width: tileWidth + 0.05, height: tileHeight + 0.05), blendMode: .normal, alpha: 0.7) + } + + let compositeImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + completion(compositeImage ?? snapshot) + } + } + + + + private func fetchTileImage(x: Int, y: Int, z: Int, completion: @escaping (UIImage?) -> Void) { + let urlString = "https://api.tomorrow.io/v4/map/tile/\(z)/\(x)/\(y)/precipitationIntensity/now.png?apikey=XjlExJsvt4ftR9UgSXvacuTwvwEEebiQ" + guard let url = URL(string: urlString) else { + completion(nil) + return + } + + let task = URLSession.shared.dataTask(with: url) { data, response, error in + guard let data = data, error == nil, let image = UIImage(data: data) else { + completion(nil) + return + } + completion(image) + } + task.resume() + } +} diff --git "a/Oscar\302\260Widget/GlobalRadarWidget/GlobalRadarWidget.swift" "b/Oscar\302\260Widget/GlobalRadarWidget/GlobalRadarWidget.swift" new file mode 100644 index 0000000..5b58721 --- /dev/null +++ "b/Oscar\302\260Widget/GlobalRadarWidget/GlobalRadarWidget.swift" @@ -0,0 +1,65 @@ +// +// LocalRadarWidget.swift +// Oscar° +// +// Created by Philipp Bolte on 13.04.24. +// + +import SwiftUI +import WidgetKit + +struct GlobalRadarEntryWidget: View { + var entry: GlobalRadarProvider.Entry + let dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + return formatter + }() + + var body: some View { + ZStack { + Image(uiImage: entry.image) + .resizable() + .aspectRatio(contentMode: .fill) + + Circle() + .fill(Color.blue) + .overlay( + Circle() + .stroke(Color.white.opacity(0.8), lineWidth: 2) + ) + .frame(width: 10, height: 10) + .shadow(radius: 3) + + VStack { + HStack { + Text(dateFormatter.string(from: entry.date)) + .font(.footnote) + .foregroundColor(.white) + .padding(.horizontal, 5) + .padding(.vertical, 2) + .background(Color.gray.opacity(0.6)) + .cornerRadius(5) + Spacer() + } + Spacer() + } + .padding(15) + } + .containerBackground(.clear, for: .widget) + } +} + +struct GlobalRadarWidget: Widget { + let kind: String = "GlobalRadarWidget" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: GlobalRadarProvider()) { entry in + GlobalRadarEntryWidget(entry: entry) + } + .contentMarginsDisabled() + .configurationDisplayName(String(localized: "Regenradar (Global)")) + .description(String(localized: "Regenradar für aktuellen Standort mit globaler Reichweite")) + .supportedFamilies([.systemSmall, .systemLarge]) + } +} diff --git "a/Oscar\302\260Widget/Home/HomeProvider.swift" "b/Oscar\302\260Widget/Home/HomeProvider.swift" new file mode 100644 index 0000000..0dc5915 --- /dev/null +++ "b/Oscar\302\260Widget/Home/HomeProvider.swift" @@ -0,0 +1,209 @@ +// +// HomeProvider.swift +// Oscar°WidgetExtension +// +// Created by Philipp Bolte on 03.06.23. +// + +import Foundation +import CoreLocation +import SwiftUI +import WidgetKit + +struct HomeEntry: TimelineEntry { + let date: Date + let location: String + let temperatureMin: Double + let temperatureMax: Double + let temperatureNow: Double + let icon: String + let backgroundGradients: [Color] +} + +class HomeProvider: TimelineProvider { + let client = APIClient() + let locationService = LocationService.shared + + init() { + locationService.update() + } + + func placeholder(in context: Context) -> HomeEntry { + HomeEntry(date: Date(), location: "Berlin", temperatureMin: 0, temperatureMax: 22, temperatureNow: 10, icon: "cloud.fill", backgroundGradients: [.sunriseStart, .sunnyDayEnd]) + } + + func getSnapshot(in context: Context, completion: @escaping (HomeEntry) -> ()) { + let entry = HomeEntry(date: Date(), location: "Berlin", temperatureMin: 0, temperatureMax: 22, temperatureNow: 10, icon: "cloud.fill", backgroundGradients: [.sunriseStart, .sunnyDayEnd]) + completion(entry) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + locationService.update() + + Task { + let coordinates = locationService.getCoordinates() + let locationName = await locationService.getLocationName() + + // TODO: Do a different API call to get JUST the data we need here. The call gets too much. + async let weatherRequest = client.getForecast(coordinates: coordinates, forecastDays: ._1) + async let radarRequest = client.getRainRadar(coordinates: coordinates) + let (weather, radar) = try await (weatherRequest, radarRequest) + + let dayBegin = weather.hourly?.time.first ?? 0 + let currentTime = (Date.now.timeIntervalSince1970-Double(dayBegin))/86400.0 + + let temperatureMin = weather.daily?.temperature_2m_min?.first ?? 0 + let temperatureMax = weather.daily?.temperature_2m_max?.first ?? 0 + let temperatureNow = weather.current?.temperature ?? 0 + let weathercode = weather.current?.weathercode ?? 0 + let isDay = weather.current?.is_day ?? 0 + let precipitation = weather.current?.precipitation ?? 0 + let sunrise = weather.daily?.sunrise?.first ?? 0 + let sunset = weather.daily?.sunset?.first ?? 0 + + let entry = HomeEntry( + date: Date(), + location: locationName, + temperatureMin: temperatureMin, + temperatureMax: temperatureMax, + temperatureNow: temperatureNow, + icon: getWeatherIcon(weathercode: weathercode, isDay: isDay, isRaining: radar.isRaining(), precipitation: precipitation), + backgroundGradients: [ + self.getBackgroundTopStops( + dayBegin: dayBegin, + sunrise: sunrise, + sunset: sunset, + weathercode: weathercode, + isRaining: radar.isRaining(), + precipitation: precipitation) + .interpolated(amount: currentTime), + self.getBackgroundBottomStops( + dayBegin: dayBegin, + sunrise: sunrise, + sunset: sunset, + weathercode: weathercode, + isRaining: radar.isRaining(), + precipitation: precipitation) + .interpolated(amount: currentTime) + ] + ) + + let currentDate = Date() + let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 30, to: currentDate)! + let timeline = Timeline(entries:[entry], policy: .after(nextUpdateDate)) + completion(timeline) + } + } + + public func getWeatherIcon(weathercode: Double, isDay: Double, isRaining: Bool, precipitation: Double) -> String { + let shouldShowRainingIcon = isRaining || precipitation > 0 + + if (isDay > 0) { + switch weathercode { + case 0, 1: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "sun.max.fill" + case 2: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.sun.fill" + case 3: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 45, 48: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fog.fill" + case 51, 53, 55, 61, 63, 65: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 56, 57: + return shouldShowRainingIcon ? "cloud.sleet.fill" : "cloud.fill" + case 71, 73, 75, 77: + return shouldShowRainingIcon ?"cloud.snow.fill" : "cloud.fill" + case 80, 81, 82, 85, 86: + return shouldShowRainingIcon ? "cloud.heavyrain.fill" : "cloud.fill" + case 95, 96, 99: + return shouldShowRainingIcon ? "cloud.bolt.rain.fill" : "cloud.fill" + default: + return "cloud.fill" + } + } else { + switch weathercode { + case 0, 1: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "moon.stars.fill" + case 2: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.moon.fill" + case 3: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 45, 48: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fog.fill" + case 51, 53, 55, 61, 63, 65: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 56, 57: + return shouldShowRainingIcon ? "cloud.sleet.fill" : "cloud.fill" + case 71, 73, 75, 77: + return shouldShowRainingIcon ? "cloud.snow.fill" : "cloud.fill" + case 80, 81, 82, 85, 86: + return shouldShowRainingIcon ? "cloud.heavyrain.fill" : "cloud.fill" + case 95, 96, 99: + return shouldShowRainingIcon ? "cloud.bolt.rain.fill" : "cloud.fill" + default: + return "cloud.fill" + } + } + } + + + func getBackgroundTopStops(dayBegin: Double, sunrise: Double, sunset: Double, weathercode: Double, isRaining: Bool, precipitation: Double) -> [Gradient.Stop] { + let dayLength = 86400.0 + let isRaining = ((weathercode >= 51 && weathercode <= 99) && precipitation > 0) || isRaining + + if isRaining { + return [ + .init(color: .midnightStart, location: 0), + .init(color: .midnightStart, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .rainyStart, location: (sunrise - dayBegin)/dayLength), + .init(color: .rainyStart, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .rainyStart, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .rainyStart, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightStart, location: (sunset - dayBegin)/dayLength + 0.04), + .init(color: .midnightStart, location: 1) + ] + } + + return [ + .init(color: .midnightStart, location: 0), + .init(color: .midnightStart, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .sunriseStart, location: (sunrise - dayBegin)/dayLength), + .init(color: .sunnyDayStart, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .sunnyDayStart, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .sunsetStart, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightStart, location: (sunset - dayBegin)/dayLength + 0.04), + .init(color: .midnightStart, location: 1) + ] + + } + + func getBackgroundBottomStops(dayBegin: Double, sunrise: Double, sunset: Double, weathercode: Double, isRaining: Bool, precipitation: Double) -> [Gradient.Stop] { + let dayLength = 86400.0 + let isRaining = ((weathercode >= 51 && weathercode <= 99) && precipitation > 0) || isRaining + + if isRaining { + return [ + .init(color: .midnightEnd, location: 0), + .init(color: .midnightEnd, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .rainyEnd, location: (sunrise - dayBegin)/dayLength), + .init(color: .rainyEnd, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .rainyEnd, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .rainyEnd, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightEnd, location: (sunset - dayBegin)/dayLength + 0.015), + .init(color: .midnightEnd, location: 1) + ] + } + + return [ + .init(color: .midnightEnd, location: 0), + .init(color: .midnightEnd, location: (sunrise - dayBegin)/dayLength - 0.08), + .init(color: .sunriseEnd, location: (sunrise - dayBegin)/dayLength), + .init(color: .sunnyDayEnd, location: (sunrise - dayBegin)/dayLength + 0.05), + .init(color: .sunnyDayEnd, location: (sunset - dayBegin)/dayLength - 0.08), + .init(color: .sunsetEnd, location: (sunset - dayBegin)/dayLength), + .init(color: .midnightEnd, location: (sunset - dayBegin)/dayLength + 0.015), + .init(color: .midnightEnd, location: 1) + ] + } +} diff --git "a/Oscar\302\260Widget/Home/NowTodayWidget.swift" "b/Oscar\302\260Widget/Home/NowTodayWidget.swift" new file mode 100644 index 0000000..9bc9b85 --- /dev/null +++ "b/Oscar\302\260Widget/Home/NowTodayWidget.swift" @@ -0,0 +1,76 @@ +// +// NowTodayWidget.swift +// Oscar°WidgetExtension +// +// Created by Philipp Bolte on 03.06.23. +// +import SwiftUI +import WidgetKit + +struct NowTodayEntryView: View { + var entry: HomeProvider.Entry + @Environment(\.widgetFamily) var family + + var body: some View { + VStack { + HStack { + Text(entry.location) + .font(.callout) + .fontWeight(.medium) + Spacer() + } + HStack { + Text(roundTemperatureString(temperature: entry.temperatureNow)) + .font(.system(size: 45)) + .fontWeight(.regular) + Spacer() + } + HStack { + Image(systemName: entry.icon) + Spacer() + } + .padding(.bottom, 1) + HStack { + Text("H: \(roundTemperatureString(temperature: entry.temperatureMax))", comment: "Höchste Temperatur") + .font(.footnote) + .fontWeight(.bold) + Text("T: \(roundTemperatureString(temperature: entry.temperatureMin))", comment: "Niedrigste Temperatur") + .font(.footnote) + .fontWeight(.bold) + Spacer() + } + Spacer() + } + .padding() + .foregroundColor(.white) + .background( + LinearGradient(colors: [ + entry.backgroundGradients.first!, + entry.backgroundGradients.last!, + ], startPoint: .top, endPoint: .bottom) + ) + .containerBackground(.clear, for: .widget) + } +} + +struct NowTodayWidget: Widget { + let kind: String = "TodayWidget" + + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: HomeProvider()) { entry in + NowTodayEntryView(entry: entry) + } + .contentMarginsDisabled() + .configurationDisplayName(String(localized: "Vorhersage")) + .description(String(localized: "Aktuelle Wetterbedingungen und Temperaturen für heute.")) + .supportedFamilies([.systemSmall]) + } +} + +struct NowTodayEntryView_Previews: PreviewProvider { + static var previews: some View { + NowTodayEntryView(entry: HomeEntry(date: Date(), location: "Berlin", temperatureMin: 12.0, temperatureMax: 21.0, temperatureNow: 19.0, icon: "sun.max.fill", backgroundGradients: [.sunriseStart, .sunnyDayEnd])) + .previewContext(WidgetPreviewContext(family: .systemSmall)) + } +} diff --git "a/Oscar\302\260Widget/Info.plist" "b/Oscar\302\260Widget/Info.plist" index 761bc36..763c1cd 100644 --- "a/Oscar\302\260Widget/Info.plist" +++ "b/Oscar\302\260Widget/Info.plist" @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - de_DE + $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName OscarWidget CFBundleExecutable @@ -28,13 +28,13 @@ com.apple.widgetkit-extension NSLocationAlwaysAndWhenInUseUsageDescription - Location is needed to show weather at your current location. + Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen. NSLocationAlwaysUsageDescription - Location is needed to show weather at your current location. + Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen. NSLocationUsageDescription - Lediglich benötigt, um Radar am aktuellen Standort anzuzeigen. + Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen. NSLocationWhenInUseUsageDescription - Location is needed to show weather at your current location. + Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen. NSWidgetWantsLocation diff --git "a/Oscar\302\260Widget/InfoPlist.xcstrings" "b/Oscar\302\260Widget/InfoPlist.xcstrings" new file mode 100644 index 0000000..eb38fb9 --- /dev/null +++ "b/Oscar\302\260Widget/InfoPlist.xcstrings" @@ -0,0 +1,150 @@ +{ + "sourceLanguage" : "de", + "strings" : { + "CFBundleDisplayName" : { + "comment" : "Bundle display name", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "OscarWidget" + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "OscarWidget" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "OscarWidget" + } + } + } + }, + "CFBundleName" : { + "comment" : "Bundle name", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Oscar°WidgetExtension" + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Oscar°WidgetExtension" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Oscar°WidgetExtension" + } + } + } + }, + "NSLocationAlwaysAndWhenInUseUsageDescription" : { + "comment" : "Privacy - Location Always and When In Use Usage Description", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Only needed to display the rain radar at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Yalnızca geçerli konumdaki yağmur radarını görüntülemek için gereklidir." + } + } + } + }, + "NSLocationAlwaysUsageDescription" : { + "comment" : "Privacy - Location Always Usage Description", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Only needed to display the rain radar at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Yalnızca geçerli konumdaki yağmur radarını görüntülemek için gereklidir." + } + } + } + }, + "NSLocationUsageDescription" : { + "comment" : "Privacy - Location Usage Description", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Only needed to display the rain radar at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Yalnızca geçerli konumdaki yağmur radarını görüntülemek için gereklidir." + } + } + } + }, + "NSLocationWhenInUseUsageDescription" : { + "comment" : "Privacy - Location When In Use Usage Description", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Lediglich benötigt, um den Regenradar am aktuellen Standort anzuzeigen." + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Only needed to display the rain radar at the current location." + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Yalnızca geçerli konumdaki yağmur radarını görüntülemek için gereklidir." + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260Widget/Localizable.xcstrings" "b/Oscar\302\260Widget/Localizable.xcstrings" new file mode 100644 index 0000000..4c60f07 --- /dev/null +++ "b/Oscar\302\260Widget/Localizable.xcstrings" @@ -0,0 +1,111 @@ +{ + "sourceLanguage" : "de", + "strings" : { + "%.1fmm" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "%@ % • %.1f mm" : { + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ %2$ • %3$.1f mm" + } + }, + "en" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "" + } + } + } + }, + "%@°" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, + "H: %@" : { + "comment" : "Höchste Temperatur", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "H: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Y: %@" + } + } + } + }, + "T: %@" : { + "comment" : "Niedrigste Temperatur", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "L: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "D: %@" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/Oscar\302\260Widget/Lockscreen/LockscreenProvider.swift" "b/Oscar\302\260Widget/Lockscreen/LockscreenProvider.swift" index 3d728f6..e0f6c2c 100644 --- "a/Oscar\302\260Widget/Lockscreen/LockscreenProvider.swift" +++ "b/Oscar\302\260Widget/Lockscreen/LockscreenProvider.swift" @@ -9,7 +9,6 @@ import Foundation import CoreLocation import SwiftUI import WidgetKit -import Alamofire struct TemperatureLockScreenEntry: TimelineEntry { let date: Date @@ -22,15 +21,13 @@ struct TemperatureLockScreenEntry: TimelineEntry { } struct LockscreenProvider: TimelineProvider { - var lm: LocationManager - let defaultCoordinate = CLLocationCoordinate2D.init(latitude: 52.42, longitude: 12.52) - + let client = APIClient() + let locationService = LocationService.shared + init() { - lm = LocationManager() - lm.update() + locationService.update() } - func placeholder(in context: Context) -> TemperatureLockScreenEntry { TemperatureLockScreenEntry(date: Date(), temperatureMin: 0, temperatureMax: 22, temperatureNow: 10, icon: "cloud.fill", precipitation: 2.5, precipitationProbability: 72) } @@ -41,23 +38,112 @@ struct LockscreenProvider: TimelineProvider { } func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - lm.update() - let currentDate = Date() - let coordinate = lm.gpsLocation ?? self.defaultCoordinate - - guard let url = URL(string: "https://api.open-meteo.com/v1/forecast?latitude=\(coordinate.latitude)&longitude=\(coordinate.longitude)&hourly=precipitation_probability,precipitation,windspeed_10m,uv_index&daily=temperature_2m_max,temperature_2m_min¤t_weather=true&forecast_days=1&timezone=auto") else { return } + locationService.update() + + Task { + let coordinates = locationService.getCoordinates() + + // TODO: Do a different API call to get JUST the data we need here. The call gets too much. + async let weatherRequest = client.getForecast(coordinates: coordinates, forecastDays: ._1) + async let radarRequest = client.getRainRadar(coordinates: coordinates) + let (weather, radar) = try await (weatherRequest, radarRequest) - AF.request(url).validate().responseDecodable(of: OMDayTemperature.self) { response in - switch response.result { - case .success: - let entry = TemperatureLockScreenEntry(date: Date(), temperatureMin: response.value!.daily.temperature2MMin.first!, temperatureMax: response.value!.daily.temperature2MMax.first!, temperatureNow: response.value!.currentWeather.temperature, icon: response.value!.currentWeather.getWeatherIcon(), precipitation: response.value!.hourly.precipitation.first!, precipitationProbability: response.value!.hourly.precipitationProbability.first!) - let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 30, to: currentDate)! - let timeline = Timeline(entries:[entry], policy: .after(nextUpdateDate)) - completion(timeline) - case let .failure(error): - print(error) + let temperatureMin = weather.daily?.temperature_2m_min?.first ?? 0 + let temperatureMax = weather.daily?.temperature_2m_max?.first ?? 0 + let temperatureNow = weather.current?.temperature ?? 0 + let weathercode = weather.current?.weathercode ?? 0 + let isDay = weather.current?.is_day ?? 0 + + // TODO: Respect radar data for precipitation + probability + let precipitation = weather.current?.precipitation ?? 0.0 + let precipitationProbability = weather.hourly?.precipitation_probability?[getLocalizedHourIndex(weather: weather)] + + let isRaining = radar.isRaining() + let icon = getWeatherIcon(weathercode: weathercode, isDay: isDay, isRaining: isRaining, precipitation: precipitation) + + let entry = TemperatureLockScreenEntry(date: Date(), temperatureMin: temperatureMin, temperatureMax: temperatureMax, temperatureNow: temperatureNow, icon: icon, precipitation: precipitation, precipitationProbability: Int(precipitationProbability ?? 0)) + + let currentDate = Date() + let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 30, to: currentDate)! + let timeline = Timeline(entries:[entry], policy: .after(nextUpdateDate)) + completion(timeline) + } + } + + public func getLocalizedHourIndex(weather: Operations.getForecast.Output.Ok.Body.jsonPayload) -> Int { + let currentUnixTime = weather.current?.time ?? 0 + let hours = weather.hourly?.time ?? [] + + // Initialize variables to track the closest time and its index + var closestTime = Double.greatestFiniteMagnitude + var closestIndex = -1 + + for (index, time) in hours.enumerated() { + // Check the absolute difference between current time and each time in the array + let difference = abs(currentUnixTime - time) + if difference < closestTime { + closestTime = difference + closestIndex = index } } + // Check if a closest time was found + if closestIndex != -1 { + return closestIndex + } else { + return 0 + } + } + + public func getWeatherIcon(weathercode: Double, isDay: Double, isRaining: Bool, precipitation: Double) -> String { + let shouldShowRainingIcon = isRaining || precipitation > 0 + + if (isDay > 0) { + switch weathercode { + case 0, 1: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "sun.max.fill" + case 2: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.sun.fill" + case 3: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 45, 48: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fog.fill" + case 51, 53, 55, 61, 63, 65: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 56, 57: + return shouldShowRainingIcon ? "cloud.sleet.fill" : "cloud.fill" + case 71, 73, 75, 77: + return shouldShowRainingIcon ?"cloud.snow.fill" : "cloud.fill" + case 80, 81, 82, 85, 86: + return shouldShowRainingIcon ? "cloud.heavyrain.fill" : "cloud.fill" + case 95, 96, 99: + return shouldShowRainingIcon ? "cloud.bolt.rain.fill" : "cloud.fill" + default: + return "cloud.fill" + } + } else { + switch weathercode { + case 0, 1: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "moon.stars.fill" + case 2: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.moon.fill" + case 3: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 45, 48: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fog.fill" + case 51, 53, 55, 61, 63, 65: + return shouldShowRainingIcon ? "cloud.drizzle.fill" : "cloud.fill" + case 56, 57: + return shouldShowRainingIcon ? "cloud.sleet.fill" : "cloud.fill" + case 71, 73, 75, 77: + return shouldShowRainingIcon ? "cloud.snow.fill" : "cloud.fill" + case 80, 81, 82, 85, 86: + return shouldShowRainingIcon ? "cloud.heavyrain.fill" : "cloud.fill" + case 95, 96, 99: + return shouldShowRainingIcon ? "cloud.bolt.rain.fill" : "cloud.fill" + default: + return "cloud.fill" + } + } } } diff --git "a/Oscar\302\260Widget/Lockscreen/PrecipitationLockscreenWidget.swift" "b/Oscar\302\260Widget/Lockscreen/PrecipitationLockscreenWidget.swift" index 4ba3a09..0e37ec1 100644 --- "a/Oscar\302\260Widget/Lockscreen/PrecipitationLockscreenWidget.swift" +++ "b/Oscar\302\260Widget/Lockscreen/PrecipitationLockscreenWidget.swift" @@ -39,8 +39,8 @@ struct PrecipitationLockScreenWidget: Widget { StaticConfiguration(kind: kind, provider: LockscreenProvider()) { entry in PrecipitationLockScreenView(entry: entry) } - .configurationDisplayName("Regen") - .description("Regenmenge- und Wahrscheinlichkeit für die aktuelle Stunde") + .configurationDisplayName(String(localized: "Regen", comment: "LS Widget Regen")) + .description(String(localized: "Regenmenge und -wahrscheinlichkeit für die aktuelle Stunde", comment: "LS Widget Regenmenge und -wahrscheinlichkeit")) #if os(iOS) .supportedFamilies([.accessoryInline]) #elseif os(watchOS) diff --git "a/Oscar\302\260Widget/Lockscreen/TemperatureLockscreenWidget.swift" "b/Oscar\302\260Widget/Lockscreen/TemperatureLockscreenWidget.swift" index 87d4b0f..c0e6fab 100644 --- "a/Oscar\302\260Widget/Lockscreen/TemperatureLockscreenWidget.swift" +++ "b/Oscar\302\260Widget/Lockscreen/TemperatureLockscreenWidget.swift" @@ -51,14 +51,12 @@ struct TemperatureLockScreenView: View { struct TemperatureLockScreenWidget: Widget { let kind: String = "TemperatureLockScreenWidget" - - var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: LockscreenProvider()) { entry in TemperatureLockScreenView(entry: entry) } - .configurationDisplayName("Temperatur") - .description("Aktuelle Temperatur und heute zu erwartende Temperaturen") + .configurationDisplayName(String(localized: "Temperatur", comment: "LS Temperatur")) + .description(String(localized: "Aktuelle Temperatur und heute zu erwartende Temperaturen", comment: "LS Widget")) #if os(iOS) .supportedFamilies([.accessoryCircular, .accessoryInline]) #elseif os(watchOS) diff --git "a/Oscar\302\260Widget/Models/OMDayTemperature.swift" "b/Oscar\302\260Widget/Models/OMDayTemperature.swift" index 56dfe52..65f57b4 100644 --- "a/Oscar\302\260Widget/Models/OMDayTemperature.swift" +++ "b/Oscar\302\260Widget/Models/OMDayTemperature.swift" @@ -39,7 +39,7 @@ struct WidgetCurrentWeather: Codable { let temperature: Double let windspeed: Double let winddirection, weathercode, isDay: Int - let time: String + let time: Int enum CodingKeys: String, CodingKey { case temperature, windspeed, winddirection, weathercode @@ -100,30 +100,33 @@ struct WidgetCurrentWeather: Codable { // MARK: - Daily struct WidgetDaily: Codable { - let time: [String] + let time: [Int] let temperature2MMax, temperature2MMin: [Double] + let sunrise, sunset: [Int] enum CodingKeys: String, CodingKey { case time case temperature2MMax = "temperature_2m_max" case temperature2MMin = "temperature_2m_min" + case sunrise, sunset } } // MARK: - DailyUnits struct WidgetDailyUnits: Codable { - let time, temperature2MMax, temperature2MMin: String + let time, temperature2MMax, temperature2MMin, sunrise, sunset: String enum CodingKeys: String, CodingKey { case time case temperature2MMax = "temperature_2m_max" case temperature2MMin = "temperature_2m_min" + case sunrise, sunset } } // MARK: - Hourly struct WidgetHourly: Codable { - let time: [String] + let time: [Int] let precipitationProbability: [Int] let precipitation, windspeed10M, uvIndex: [Double] diff --git "a/Oscar\302\260Widget/OscarWidgetsBundle.swift" "b/Oscar\302\260Widget/OscarWidgetsBundle.swift" index 24c0209..4d2c576 100644 --- "a/Oscar\302\260Widget/OscarWidgetsBundle.swift" +++ "b/Oscar\302\260Widget/OscarWidgetsBundle.swift" @@ -14,6 +14,8 @@ struct OscarWidgetsBundle: WidgetBundle { var body: some Widget { #if os(iOS) RadarWidget() + NowTodayWidget() + GlobalRadarWidget() #endif TemperatureLockScreenWidget() PrecipitationLockScreenWidget() diff --git "a/Oscar\302\260Widget/Oscar\302\260WidgetExtension.entitlements" "b/Oscar\302\260Widget/Oscar\302\260WidgetExtension.entitlements" new file mode 100644 index 0000000..425394c --- /dev/null +++ "b/Oscar\302\260Widget/Oscar\302\260WidgetExtension.entitlements" @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.cloud.bolte.Oscar + + + diff --git "a/Oscar\302\260Widget/Radar/RadarProvider.swift" "b/Oscar\302\260Widget/Radar/RadarProvider.swift" index 187ea43..4a5a2ce 100644 --- "a/Oscar\302\260Widget/Radar/RadarProvider.swift" +++ "b/Oscar\302\260Widget/Radar/RadarProvider.swift" @@ -1,82 +1,135 @@ -// -// RadarProvider.swift -// Oscar°WidgetExtension -// -// Created by Philipp Bolte on 10.04.23. -// - -import Foundation -import CoreLocation -import SwiftUI import WidgetKit - -extension UIImage { - public static func loadFrom(url: URL, completion: @escaping (_ image: UIImage?) -> ()) { - DispatchQueue.global().async { - if let data = try? Data(contentsOf: url) { - DispatchQueue.main.async { - completion(UIImage(data: data)) - } - } else { - DispatchQueue.main.async { - completion(nil) - } - } - } - } -} +import SwiftUI +import MapKit struct RadarEntry: TimelineEntry { let date: Date - let image: Image - let snapshotTime: String + let image: UIImage } struct RadarProvider: TimelineProvider { - var lm: LocationManager - let defaultCoordinate = CLLocationCoordinate2D.init(latitude: 52.42, longitude: 12.52) - + let locationService = LocationService.shared + let wmsVersion = "1.1.1" + let zoomLevel = 1 + let radarOverlayAlpha = 0.7 + let mapColorType: UIUserInterfaceStyle = .dark + let pixelSize = 300 + init() { - lm = LocationManager() - lm.update() + locationService.update() } - func placeholder(in context: Context) -> RadarEntry { - RadarEntry(date: Date(), image: Image(uiImage: UIImage(named: "rain")!), snapshotTime: "12:00") + return RadarEntry(date: Date(), image: UIImage(named: "rain")!) } - - func getSnapshot(in context: Context, completion: @escaping (RadarEntry) -> ()) { - let entry = RadarEntry(date: Date(), image: Image(uiImage: UIImage(named: "rain")!), snapshotTime: "12:00") - completion(entry) + + func getSnapshot(in context: Context, completion: @escaping (RadarEntry) -> Void) { + getMapAndRadarImage(zoomLevel: zoomLevel) { image in + let entry = RadarEntry(date: Date(), image: image) + completion(entry) + } } - - func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - lm.update() - let currentDate = Date() - let coordinate = lm.gpsLocation ?? self.defaultCoordinate - - guard let url = URL(string: "https://api.oscars.love/api/v1/mapshots/radar?lat=\(coordinate.latitude)&lon=\(coordinate.longitude)") else { return } - - UIImage.loadFrom(url: url) { image in - if let image = image { - let date = Date() - let formatter = DateFormatter() - formatter.timeZone = .current - formatter.dateFormat = "HH:mm" - - let formattedTime = formatter.string(from: date) - let img = Image(uiImage: image) - - let entry = RadarEntry(date: date, image: img, snapshotTime: formattedTime) - let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 15, to: date)! - let timeline = Timeline(entries:[entry], policy: .after(nextUpdateDate)) - completion(timeline) - } else { - let entry = RadarEntry(date: currentDate, image: Image(uiImage: UIImage(named: "rain")!), snapshotTime: "12:00") - let timeline = Timeline(entries: [entry], policy: .atEnd) - completion(timeline) + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { + getMapAndRadarImage(zoomLevel: zoomLevel) { image in + let entry = RadarEntry(date: Date(), image: image) + let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 15, to: Date())! + let timeline = Timeline(entries:[entry], policy: .after(nextUpdateDate)) + completion(timeline) + } + } + + func getMapAndRadarImage(zoomLevel: Int, completion: @escaping (UIImage) -> Void) { + locationService.update() + let location = locationService.getCoordinates() + + let region = MKCoordinateRegion.region(for: location, zoomLevel: zoomLevel) + fetchMapSnapshot(region: region) { snapshotImage in + guard let mapImage = snapshotImage else { + completion(UIImage(systemName: "wifi.exclamationmark")!) // Provide an error image or default + return } + let bbox = calculateBBoxForRegion(region) + self.fetchRadarImage(for: mapImage, with: bbox) { radarOverlayImage in + completion(radarOverlayImage) + } + } + } + + + func fetchMapSnapshot(region: MKCoordinateRegion, completion: @escaping (UIImage?) -> Void) { + let mapSnapshotOptions = MKMapSnapshotter.Options() + mapSnapshotOptions.region = region + mapSnapshotOptions.size = CGSize(width: pixelSize, height: pixelSize) + mapSnapshotOptions.scale = UIScreen.main.scale + mapSnapshotOptions.traitCollection = UITraitCollection(userInterfaceStyle: mapColorType) + + let snapshotter = MKMapSnapshotter(options: mapSnapshotOptions) + snapshotter.start { snapshot, error in + if let error = error { + print("Error fetching map snapshot: \(error.localizedDescription)") + completion(nil) + return + } + guard let snapshot = snapshot else { + print("Snapshot completion is nil without error.") + completion(nil) + return + } + completion(snapshot.image) + } + } + + + func fetchRadarImage(for mapImage: UIImage, with bbox: String, completion: @escaping (UIImage) -> Void) { + let urlString = "https://maps.dwd.de/geoserver/dwd/wms?SERVICE=WMS&VERSION=\(wmsVersion)&REQUEST=GetMap&FORMAT=image/png8&TRANSPARENT=true&STYLES&LAYERS=dwd:Niederschlagsradar&exceptions=application/vnd.ogc.se_inimage&SRS=EPSG:4326&WIDTH=\(pixelSize)&HEIGHT=\(pixelSize)&BBOX=\(bbox)" + guard let url = URL(string: urlString) else { + print("Invalid URL: \(urlString)") + completion(mapImage) // Return map image on URL failure + return } + + URLSession.shared.dataTask(with: url) { data, response, error in + if let error = error { + print("Error fetching radar image: \(error.localizedDescription)") + completion(mapImage) // Return map image on fetch failure + return + } + guard let data = data, let image = UIImage(data: data) else { + print("Failed to load radar image data.") + completion(mapImage) + return + } + UIGraphicsBeginImageContext(mapImage.size) + mapImage.draw(at: CGPoint.zero) + image.draw(in: CGRect(x: 0, y: 0, width: mapImage.size.width, height: mapImage.size.height), blendMode: .normal, alpha: radarOverlayAlpha) + let combinedImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + completion(combinedImage ?? mapImage) + }.resume() + } + + func calculateBBoxForRegion(_ region: MKCoordinateRegion) -> String { + // Calculate the corners of the map region + let center = region.center + let span = region.span + + let minLatitude = max(min(center.latitude - (span.latitudeDelta / 2), 90.0), -90.0) + let maxLatitude = max(min(center.latitude + (span.latitudeDelta / 2), 90.0), -90.0) + let minLongitude = max(min(center.longitude - (span.longitudeDelta / 2), 180.0), -180.0) + let maxLongitude = max(min(center.longitude + (span.longitudeDelta / 2), 180.0), -180.0) + + // For WMS 1.1.1, the order is minX, minY, maxX, maxY (longitude, latitude) + return "\(minLongitude),\(minLatitude),\(maxLongitude),\(maxLatitude)" + } +} + +extension MKCoordinateRegion { + /// Adjusts the region size based on a zoom level (1-20, where 20 is very zoomed-in) + static func region(for location: CLLocationCoordinate2D, zoomLevel: Int) -> MKCoordinateRegion { + let baseMeters = 75000.0 // Starting point for zoom level 1 + let meters = baseMeters / pow(2, Double(zoomLevel - 1)) // Decrease area with increasing zoom level + return MKCoordinateRegion(center: location, latitudinalMeters: meters, longitudinalMeters: meters) } } diff --git "a/Oscar\302\260Widget/Radar/RadarWidget.swift" "b/Oscar\302\260Widget/Radar/RadarWidget.swift" index af907f0..d946216 100644 --- "a/Oscar\302\260Widget/Radar/RadarWidget.swift" +++ "b/Oscar\302\260Widget/Radar/RadarWidget.swift" @@ -9,27 +9,21 @@ struct RadarWidgetEntryView : View { var entry: RadarProvider.Entry - @Environment(\.widgetFamily) var family + let dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + return formatter + }() var body: some View { - ZStack { - entry.image + ZStack(alignment: .center) { + Image(uiImage: entry.image) .resizable() .aspectRatio(contentMode: .fill) - .overlay( - ZStack { - Circle() - .foregroundColor(.white) - .shadow(radius: 5) - .frame(width: 15, height: 15) - Circle() - .foregroundColor(.blue) - .frame(width: 10, height: 10) - } - ) + VStack { HStack { - Text(entry.snapshotTime) + Text(dateFormatter.string(from: entry.date)) .font(.footnote) .foregroundColor(.white) .padding(.horizontal, 5) @@ -41,27 +35,37 @@ Spacer() } .padding(15) + + Circle() + .fill(Color.blue) + .frame(width: 11, height: 11) + .overlay( + Circle() + .stroke(Color.white.opacity(0.8), lineWidth: 2) + ) + .shadow(radius: 3) } + .containerBackground(.clear, for: .widget) } } struct RadarWidget: Widget { let kind: String = "WeatherWidget" - var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: RadarProvider()) { entry in RadarWidgetEntryView(entry: entry) } - .configurationDisplayName("Regenradar") - .description("Regenradar für aktuellen Standort") + .contentMarginsDisabled() + .configurationDisplayName(String(localized: "Regenradar")) + .description(String(localized: "Regenradar für aktuellen Standort")) .supportedFamilies([.systemSmall, .systemLarge]) } } struct RadarWidget_Previews: PreviewProvider { static var previews: some View { - RadarWidgetEntryView(entry: RadarEntry(date: Date(), image: Image(uiImage: UIImage(named: "rain")!), snapshotTime: "12:00")) + RadarWidgetEntryView(entry: RadarEntry(date: Date(), image: UIImage(named: "rain")!)) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } diff --git a/api/.env.template b/api/.env.template deleted file mode 100644 index 8956722..0000000 --- a/api/.env.template +++ /dev/null @@ -1,3 +0,0 @@ -OWM_API_KEY= -API_KEY= -INTERNAL_ADRESS= \ No newline at end of file diff --git a/api/README.md b/api/README.md deleted file mode 100644 index 00a13b1..0000000 --- a/api/README.md +++ /dev/null @@ -1,73 +0,0 @@ -

- Nest Logo -

- -[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 -[circleci-url]: https://circleci.com/gh/nestjs/nest - -

A progressive Node.js framework for building efficient and scalable server-side applications.

-

-NPM Version -Package License -NPM Downloads -CircleCI -Coverage -Discord -Backers on Open Collective -Sponsors on Open Collective - - Support us - -

- - -## Description - -[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. - -## Installation - -```bash -$ npm install -``` - -## Running the app - -```bash -# development -$ npm run start - -# watch mode -$ npm run start:dev - -# production mode -$ npm run start:prod -``` - -## Test - -```bash -# unit tests -$ npm run test - -# e2e tests -$ npm run test:e2e - -# test coverage -$ npm run test:cov -``` - -## Support - -Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). - -## Stay in touch - -- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - -Nest is [MIT licensed](LICENSE). diff --git a/api/nest-cli.json b/api/nest-cli.json deleted file mode 100644 index f9aa683..0000000 --- a/api/nest-cli.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/nest-cli", - "collection": "@nestjs/schematics", - "sourceRoot": "src", - "compilerOptions": { - "deleteOutDir": true - } -} diff --git a/api/package-lock.json b/api/package-lock.json deleted file mode 100644 index 8300b8f..0000000 --- a/api/package-lock.json +++ /dev/null @@ -1,15365 +0,0 @@ -{ - "name": "oscar-weather", - "version": "0.0.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "oscar-weather", - "version": "0.0.1", - "license": "UNLICENSED", - "dependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0", - "@nestjs/platform-express": "^9.0.0", - "@nestjs/serve-static": "^3.0.0", - "cache-manager": "^4.1.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "nest-puppeteer": "^1.1.1", - "p-limit": "^3.1.0", - "puppeteer": "^19.6.3", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.2.0", - "xml2js": "^0.4.23" - }, - "devDependencies": { - "@nestjs/cli": "^9.0.0", - "@nestjs/schematics": "^9.0.0", - "@nestjs/testing": "^9.0.0", - "@types/express": "^4.17.13", - "@types/jest": "29.2.4", - "@types/node": "18.11.18", - "@types/puppeteer": "^7.0.4", - "@types/supertest": "^2.0.11", - "@types/xml2js": "^0.4.11", - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^8.0.1", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "jest": "29.3.1", - "prettier": "^2.3.2", - "source-map-support": "^0.5.20", - "supertest": "^6.1.3", - "ts-jest": "29.0.3", - "ts-loader": "^9.2.3", - "ts-node": "^10.0.0", - "tsconfig-paths": "4.1.1", - "typescript": "^4.7.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.4.tgz", - "integrity": "sha512-PW5MRmd9DHJR4FaXchwQtj9pXnsghSTnwRvfZeCRNYgU2sv0DKyTV+YTSJB+kNXnoPNG1Je6amDEkiXecpspXg==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/core/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/@angular-devkit/schematics": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.1.4.tgz", - "integrity": "sha512-jpddxo9Qd2yRQ1t9FLhAx5S+luz6HkyhDytq0LFKbxf9ikf1J4oy9riPBFl4pRmrNARWcHZ6GbD20/Ky8PjmXQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "15.1.4", - "jsonc-parser": "3.2.0", - "magic-string": "0.27.0", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics-cli": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-15.1.4.tgz", - "integrity": "sha512-qkM5Mfs28jZzNcJnSM6RlyrKkYvzhQmWFTxBXnn15k5T4EnSs1gI6O054Xn7jo/senfwNNt7h2Mlz2OmBLo6+w==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", - "ansi-colors": "4.1.3", - "inquirer": "8.2.4", - "symbol-observable": "4.0.0", - "yargs-parser": "21.1.1" - }, - "bin": { - "schematics": "bin/schematics.js" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/schematics/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/@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==", - "dev": true, - "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==", - "dev": 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/core/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==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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-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==", - "dev": true, - "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-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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-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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": 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/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.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==", - "dev": true, - "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-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "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==", - "dev": true, - "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/traverse/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "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/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "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/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/@eslint/eslintrc/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/@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/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.1.tgz", - "integrity": "sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/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/@jest/core": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.1.tgz", - "integrity": "sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.4.1", - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.4.0", - "jest-config": "^29.4.1", - "jest-haste-map": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.4.1", - "jest-resolve-dependencies": "^29.4.1", - "jest-runner": "^29.4.1", - "jest-runtime": "^29.4.1", - "jest-snapshot": "^29.4.1", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "jest-watcher": "^29.4.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/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/@jest/environment": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.1.tgz", - "integrity": "sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "jest-mock": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.1.tgz", - "integrity": "sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw==", - "dev": true, - "dependencies": { - "expect": "^29.4.1", - "jest-snapshot": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.1.tgz", - "integrity": "sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.1.tgz", - "integrity": "sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.4.1", - "jest-mock": "^29.4.1", - "jest-util": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.1.tgz", - "integrity": "sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.4.1", - "@jest/expect": "^29.4.1", - "@jest/types": "^29.4.1", - "jest-mock": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.1.tgz", - "integrity": "sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1", - "jest-worker": "^29.4.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/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/@jest/schemas": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz", - "integrity": "sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.1.tgz", - "integrity": "sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.1.tgz", - "integrity": "sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.4.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.1.tgz", - "integrity": "sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.4.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.4.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/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/@jest/types": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.1.tgz", - "integrity": "sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/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/@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==", - "dev": 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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/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==", - "dev": true, - "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/@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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@lukeed/csprng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", - "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nestjs/cli": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", - "integrity": "sha512-6B1IjDcJbrOu55oMF67L1x5lDUOZ3Zs9l7bKCBH9D78965m8wq/2rlEWl/gJto5TABLQWy3hVvV/s8VzUlRMxw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", - "@angular-devkit/schematics-cli": "15.1.4", - "@nestjs/schematics": "^9.0.0", - "chalk": "3.0.0", - "chokidar": "3.5.3", - "cli-table3": "0.6.3", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "7.3.0", - "inquirer": "7.3.3", - "node-emoji": "1.11.0", - "ora": "5.4.1", - "os-name": "4.0.1", - "rimraf": "4.1.2", - "shelljs": "0.8.5", - "source-map-support": "0.5.21", - "tree-kill": "1.2.2", - "tsconfig-paths": "4.1.2", - "tsconfig-paths-webpack-plugin": "4.0.0", - "typescript": "4.9.5", - "webpack": "5.75.0", - "webpack-node-externals": "3.0.0" - }, - "bin": { - "nest": "bin/nest.js" - }, - "engines": { - "node": ">= 12.9.0" - } - }, - "node_modules/@nestjs/cli/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/@nestjs/cli/node_modules/tsconfig-paths": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", - "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nestjs/common": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.3.2.tgz", - "integrity": "sha512-YUqY9qPMxiMqO/pRNXJehR18LFL6Y9BN5Qn0FylVbdpKd7/QKZHVWRKNaAYNu0mGfyJhRJI6oEr/1Tn5GEo6GQ==", - "dependencies": { - "iterare": "1.2.1", - "tslib": "2.5.0", - "uid": "2.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "cache-manager": "<=5", - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "cache-manager": { - "optional": true - }, - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/core": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.2.tgz", - "integrity": "sha512-79h4RvGAGFIIZJWIXqZ8xvhK/kIY6Fay7a1P0W4v7AUZsMIuNksct0uMzHaBqMT0lo+Ei+gU8PaWvzZt5lZvJw==", - "hasInstallScript": true, - "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "object-hash": "3.0.0", - "path-to-regexp": "3.2.0", - "tslib": "2.5.0", - "uuid": "9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/microservices": "^9.0.0", - "@nestjs/platform-express": "^9.0.0", - "@nestjs/websockets": "^9.0.0", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, - "node_modules/@nestjs/platform-express": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.3.2.tgz", - "integrity": "sha512-hzLfUcJIFw8NIPlG88QJr+uSgJzkBkhxVsHGtRs+rNShzlMNfX63CPbkI4yfG4Eq0s8oYe598p6OE5O1z924Dg==", - "dependencies": { - "body-parser": "1.20.1", - "cors": "2.8.5", - "express": "4.18.2", - "multer": "1.4.4-lts.1", - "tslib": "2.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0" - } - }, - "node_modules/@nestjs/schematics": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.0.4.tgz", - "integrity": "sha512-egurCfAc4e5i1r2TmeAF0UrOKejFmT5oTdv4b7HcOVPupc3QGU7CbEfGleL3mkM5AjrixTQeMxU9bJ00ttAbGg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "15.0.4", - "@angular-devkit/schematics": "15.0.4", - "fs-extra": "11.1.0", - "jsonc-parser": "3.2.0", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": "^4.3.5" - } - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.0.4.tgz", - "integrity": "sha512-4ITpRAevd652SxB+qNesIQ9qfbm7wT5UBU5kJOPPwGL77I21g8CQpkmV1n5VSacPvC9Zbz90feOWexf7w7JzcA==", - "dev": true, - "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.0.4.tgz", - "integrity": "sha512-/gXiLFS0+xFdx6wPoBpe/c6/K9I5edMpaASqPf4XheKtrsSvL+qTlIi3nsbfItzOiDXbaBmlbxGfkMHz/yg0Ig==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "15.0.4", - "jsonc-parser": "3.2.0", - "magic-string": "0.26.7", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@nestjs/schematics/node_modules/magic-string": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", - "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nestjs/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@nestjs/schematics/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/@nestjs/serve-static": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-3.0.0.tgz", - "integrity": "sha512-TpXjgs4136dQqWUjEcONqppqXDsrJhRkmKWzuBMOUAnP4HjHpNmlycvkHnDnWSoG2YD4a7Enh4ViYGWqCfHStA==", - "dependencies": { - "path-to-regexp": "0.2.5" - }, - "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0" - } - }, - "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", - "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" - }, - "node_modules/@nestjs/testing": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.2.tgz", - "integrity": "sha512-A1DleYwUpA/MX4XLTOJYEkhEjdI0HyujTmOUoPzSplAPWXbR48DTtY3Pu3A/qM7A8JwPzfB37glFUAJvFFOYpg==", - "dev": true, - "dependencies": { - "tslib": "2.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0", - "@nestjs/microservices": "^9.0.0", - "@nestjs/platform-express": "^9.0.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - } - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@nuxtjs/opencollective/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/@sinclair/typebox": { - "version": "0.25.21", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", - "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.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/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "devOptional": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "node_modules/@types/puppeteer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-7.0.4.tgz", - "integrity": "sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==", - "deprecated": "This is a stub types definition. puppeteer provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "puppeteer": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "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/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/superagent": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", - "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", - "dev": true, - "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "node_modules/@types/supertest": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", - "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", - "dev": true, - "dependencies": { - "@types/superagent": "*" - } - }, - "node_modules/@types/validator": { - "version": "13.7.12", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz", - "integrity": "sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==" - }, - "node_modules/@types/xml2js": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.11.tgz", - "integrity": "sha512-JdigeAKmCyoJUiQljjr7tQG3if9NkqGUgwEUqBvV0N7LM4HyQk7UXCnusRa1lnvXAEYJ8mw8GtZWioagNztOwA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.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/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.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.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.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.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.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.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "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.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.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/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.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/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.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/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "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/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "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==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "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/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/babel-jest": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.1.tgz", - "integrity": "sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.4.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/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/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz", - "integrity": "sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz", - "integrity": "sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.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/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "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/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-manager": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-4.1.0.tgz", - "integrity": "sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A==", - "dependencies": { - "async": "3.2.3", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^7.10.1" - } - }, - "node_modules/cache-manager/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "engines": { - "node": ">=12" - } - }, - "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==", - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001450", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", - "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "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/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - }, - "node_modules/class-validator": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", - "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", - "dependencies": { - "@types/validator": "^13.7.10", - "libphonenumber-js": "^1.10.14", - "validator": "^13.7.0" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "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/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "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-fetch/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/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/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/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "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/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1082910", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1082910.tgz", - "integrity": "sha512-RqoZ2GmqaNxyx+99L/RemY5CkwG9D0WEfOKxekwCRXOGrDCep62ngezEJUVMq6rISYQ+085fJnWDQqGHlxVNww==" - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz", - "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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": { - "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-prettier": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", - "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "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-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/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/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/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/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/eslint/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/eslint/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/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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/esquery/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/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/esrecurse/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/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/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.1.tgz", - "integrity": "sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.4.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "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==", - "dev": true, - "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-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/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "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==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/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==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "vue-template-compiler": "*", - "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dev": true, - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "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==", - "dev": true, - "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/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==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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==", - "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-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "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/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/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "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-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/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/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "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/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/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/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer/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/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "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/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.0.tgz", - "integrity": "sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.1.tgz", - "integrity": "sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.4.1", - "@jest/expect": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.4.1", - "jest-matcher-utils": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-runtime": "^29.4.1", - "jest-snapshot": "^29.4.1", - "jest-util": "^29.4.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/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/jest-cli": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.1.tgz", - "integrity": "sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/types": "^29.4.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.4.1", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/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/jest-config": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.1.tgz", - "integrity": "sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.4.1", - "@jest/types": "^29.4.1", - "babel-jest": "^29.4.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.4.1", - "jest-environment-node": "^29.4.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.4.1", - "jest-runner": "^29.4.1", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/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/jest-diff": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.1.tgz", - "integrity": "sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/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/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.1.tgz", - "integrity": "sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.4.1", - "pretty-format": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/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/jest-environment-node": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.1.tgz", - "integrity": "sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.4.1", - "@jest/fake-timers": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "jest-mock": "^29.4.1", - "jest-util": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.1.tgz", - "integrity": "sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.4.1", - "jest-worker": "^29.4.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.1.tgz", - "integrity": "sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz", - "integrity": "sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.4.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/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/jest-message-util": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.1.tgz", - "integrity": "sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.4.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/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/jest-mock": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.1.tgz", - "integrity": "sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "@types/node": "*", - "jest-util": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.1.tgz", - "integrity": "sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.1.tgz", - "integrity": "sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/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/jest-runner": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.1.tgz", - "integrity": "sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.4.1", - "@jest/environment": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.4.1", - "jest-haste-map": "^29.4.1", - "jest-leak-detector": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-runtime": "^29.4.1", - "jest-util": "^29.4.1", - "jest-watcher": "^29.4.1", - "jest-worker": "^29.4.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/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/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.1.tgz", - "integrity": "sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.4.1", - "@jest/fake-timers": "^29.4.1", - "@jest/globals": "^29.4.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-mock": "^29.4.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.4.1", - "jest-snapshot": "^29.4.1", - "jest-util": "^29.4.1", - "semver": "^7.3.5", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/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/jest-snapshot": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.1.tgz", - "integrity": "sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.4.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.4.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.4.1", - "jest-matcher-utils": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.4.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/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/jest-util": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.1.tgz", - "integrity": "sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/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/jest-validate": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.1.tgz", - "integrity": "sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.4.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.4.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/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/jest-watcher": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.1.tgz", - "integrity": "sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.4.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/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/jest-worker": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.1.tgz", - "integrity": "sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.4.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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-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==", - "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==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "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==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/libphonenumber-js": { - "version": "1.10.19", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz", - "integrity": "sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "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==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "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/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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/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==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "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/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "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/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nest-puppeteer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nest-puppeteer/-/nest-puppeteer-1.1.1.tgz", - "integrity": "sha512-kyYn4SuI9nVInEXrnf2ZMxrzRiQO6wJ5lkriaf5cODAflB/UQCNko3Cc4aqULlSW32Jfo6lErlfeU0JtCARpXg==", - "engines": { - "node": ">=10.21", - "yarn": ">=1.19" - }, - "peerDependencies": { - "@nestjs/common": ">=6", - "@nestjs/core": ">=6", - "puppeteer": ">=3" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "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-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", - "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.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==", - "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/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/prettier": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", - "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.1.tgz", - "integrity": "sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "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/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "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/puppeteer": { - "version": "19.6.3", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.6.3.tgz", - "integrity": "sha512-K03xTtGDwS6cBXX/EoqoZxglCUKcX2SLIl92fMnGMRjYpPGXoAV2yKEh3QXmXzKqfZXd8TxjjFww+tEttWv8kw==", - "hasInstallScript": true, - "dependencies": { - "cosmiconfig": "8.0.0", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "puppeteer-core": "19.6.3" - }, - "engines": { - "node": ">=14.1.0" - } - }, - "node_modules/puppeteer-core": { - "version": "19.6.3", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.6.3.tgz", - "integrity": "sha512-8MbhioSlkDaHkmolpQf9Z7ui7jplFfOFTnN8d5kPsCazRRTNIH6/bVxPskn0v5Gh9oqOBlknw0eHH0/OBQAxpQ==", - "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.1082910", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.11.0" - }, - "engines": { - "node": ">=14.1.0" - } - }, - "node_modules/puppeteer-core/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/puppeteer/node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "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/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "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/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", - "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.1.2.tgz", - "integrity": "sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==", - "dev": true, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/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/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/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/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/semver/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/semver/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/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "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/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "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/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "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": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/superagent": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", - "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=6.4.0 <13 || >=14" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/supertest": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", - "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^8.0.5" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "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/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/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/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz", - "integrity": "sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==", - "dev": true, - "dependencies": { - "json5": "^2.2.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.0.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/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/tsconfig-paths/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/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-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "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, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.1.tgz", - "integrity": "sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==", - "dependencies": { - "@lukeed/csprng": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "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/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/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==", - "dev": true - }, - "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "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/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "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/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "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/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/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/write-file-atomic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@angular-devkit/core": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.4.tgz", - "integrity": "sha512-PW5MRmd9DHJR4FaXchwQtj9pXnsghSTnwRvfZeCRNYgU2sv0DKyTV+YTSJB+kNXnoPNG1Je6amDEkiXecpspXg==", - "dev": true, - "requires": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.1.4.tgz", - "integrity": "sha512-jpddxo9Qd2yRQ1t9FLhAx5S+luz6HkyhDytq0LFKbxf9ikf1J4oy9riPBFl4pRmrNARWcHZ6GbD20/Ky8PjmXQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "15.1.4", - "jsonc-parser": "3.2.0", - "magic-string": "0.27.0", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/schematics-cli": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-15.1.4.tgz", - "integrity": "sha512-qkM5Mfs28jZzNcJnSM6RlyrKkYvzhQmWFTxBXnn15k5T4EnSs1gI6O054Xn7jo/senfwNNt7h2Mlz2OmBLo6+w==", - "dev": true, - "requires": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", - "ansi-colors": "4.1.3", - "inquirer": "8.2.4", - "symbol-observable": "4.0.0", - "yargs-parser": "21.1.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - } - } - } - }, - "@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==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@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==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": 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" - }, - "dependencies": { - "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==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@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==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@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==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.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==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@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==", - "dev": true, - "requires": { - "@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" - } - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@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==", - "dev": true - }, - "@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==" - }, - "@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==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": 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", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "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==" - }, - "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==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "dev": true, - "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", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@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, - "requires": { - "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" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - } - } - }, - "@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, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@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 - }, - "@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 - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.1.tgz", - "integrity": "sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jest/core": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.1.tgz", - "integrity": "sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA==", - "dev": true, - "requires": { - "@jest/console": "^29.4.1", - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.4.0", - "jest-config": "^29.4.1", - "jest-haste-map": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.4.1", - "jest-resolve-dependencies": "^29.4.1", - "jest-runner": "^29.4.1", - "jest-runtime": "^29.4.1", - "jest-snapshot": "^29.4.1", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "jest-watcher": "^29.4.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jest/environment": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.1.tgz", - "integrity": "sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "jest-mock": "^29.4.1" - } - }, - "@jest/expect": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.1.tgz", - "integrity": "sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw==", - "dev": true, - "requires": { - "expect": "^29.4.1", - "jest-snapshot": "^29.4.1" - } - }, - "@jest/expect-utils": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.1.tgz", - "integrity": "sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0" - } - }, - "@jest/fake-timers": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.1.tgz", - "integrity": "sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.4.1", - "jest-mock": "^29.4.1", - "jest-util": "^29.4.1" - } - }, - "@jest/globals": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.1.tgz", - "integrity": "sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA==", - "dev": true, - "requires": { - "@jest/environment": "^29.4.1", - "@jest/expect": "^29.4.1", - "@jest/types": "^29.4.1", - "jest-mock": "^29.4.1" - } - }, - "@jest/reporters": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.1.tgz", - "integrity": "sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1", - "jest-worker": "^29.4.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jest/schemas": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz", - "integrity": "sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.25.16" - } - }, - "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.1.tgz", - "integrity": "sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ==", - "dev": true, - "requires": { - "@jest/console": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.1.tgz", - "integrity": "sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w==", - "dev": true, - "requires": { - "@jest/test-result": "^29.4.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.1.tgz", - "integrity": "sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.4.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.4.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jest/types": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.1.tgz", - "integrity": "sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA==", - "dev": true, - "requires": { - "@jest/schemas": "^29.4.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@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==", - "dev": 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", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@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==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@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==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@lukeed/csprng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", - "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==" - }, - "@nestjs/cli": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", - "integrity": "sha512-6B1IjDcJbrOu55oMF67L1x5lDUOZ3Zs9l7bKCBH9D78965m8wq/2rlEWl/gJto5TABLQWy3hVvV/s8VzUlRMxw==", - "dev": true, - "requires": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", - "@angular-devkit/schematics-cli": "15.1.4", - "@nestjs/schematics": "^9.0.0", - "chalk": "3.0.0", - "chokidar": "3.5.3", - "cli-table3": "0.6.3", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "7.3.0", - "inquirer": "7.3.3", - "node-emoji": "1.11.0", - "ora": "5.4.1", - "os-name": "4.0.1", - "rimraf": "4.1.2", - "shelljs": "0.8.5", - "source-map-support": "0.5.21", - "tree-kill": "1.2.2", - "tsconfig-paths": "4.1.2", - "tsconfig-paths-webpack-plugin": "4.0.0", - "typescript": "4.9.5", - "webpack": "5.75.0", - "webpack-node-externals": "3.0.0" - }, - "dependencies": { - "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 - }, - "tsconfig-paths": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", - "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - } - } - }, - "@nestjs/common": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.3.2.tgz", - "integrity": "sha512-YUqY9qPMxiMqO/pRNXJehR18LFL6Y9BN5Qn0FylVbdpKd7/QKZHVWRKNaAYNu0mGfyJhRJI6oEr/1Tn5GEo6GQ==", - "requires": { - "iterare": "1.2.1", - "tslib": "2.5.0", - "uid": "2.0.1" - } - }, - "@nestjs/core": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.2.tgz", - "integrity": "sha512-79h4RvGAGFIIZJWIXqZ8xvhK/kIY6Fay7a1P0W4v7AUZsMIuNksct0uMzHaBqMT0lo+Ei+gU8PaWvzZt5lZvJw==", - "requires": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "object-hash": "3.0.0", - "path-to-regexp": "3.2.0", - "tslib": "2.5.0", - "uuid": "9.0.0" - } - }, - "@nestjs/platform-express": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.3.2.tgz", - "integrity": "sha512-hzLfUcJIFw8NIPlG88QJr+uSgJzkBkhxVsHGtRs+rNShzlMNfX63CPbkI4yfG4Eq0s8oYe598p6OE5O1z924Dg==", - "requires": { - "body-parser": "1.20.1", - "cors": "2.8.5", - "express": "4.18.2", - "multer": "1.4.4-lts.1", - "tslib": "2.5.0" - } - }, - "@nestjs/schematics": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.0.4.tgz", - "integrity": "sha512-egurCfAc4e5i1r2TmeAF0UrOKejFmT5oTdv4b7HcOVPupc3QGU7CbEfGleL3mkM5AjrixTQeMxU9bJ00ttAbGg==", - "dev": true, - "requires": { - "@angular-devkit/core": "15.0.4", - "@angular-devkit/schematics": "15.0.4", - "fs-extra": "11.1.0", - "jsonc-parser": "3.2.0", - "pluralize": "8.0.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.0.4.tgz", - "integrity": "sha512-4ITpRAevd652SxB+qNesIQ9qfbm7wT5UBU5kJOPPwGL77I21g8CQpkmV1n5VSacPvC9Zbz90feOWexf7w7JzcA==", - "dev": true, - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "@angular-devkit/schematics": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.0.4.tgz", - "integrity": "sha512-/gXiLFS0+xFdx6wPoBpe/c6/K9I5edMpaASqPf4XheKtrsSvL+qTlIi3nsbfItzOiDXbaBmlbxGfkMHz/yg0Ig==", - "dev": true, - "requires": { - "@angular-devkit/core": "15.0.4", - "jsonc-parser": "3.2.0", - "magic-string": "0.26.7", - "ora": "5.4.1", - "rxjs": "6.6.7" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "magic-string": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", - "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@nestjs/serve-static": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-3.0.0.tgz", - "integrity": "sha512-TpXjgs4136dQqWUjEcONqppqXDsrJhRkmKWzuBMOUAnP4HjHpNmlycvkHnDnWSoG2YD4a7Enh4ViYGWqCfHStA==", - "requires": { - "path-to-regexp": "0.2.5" - }, - "dependencies": { - "path-to-regexp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", - "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" - } - } - }, - "@nestjs/testing": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.2.tgz", - "integrity": "sha512-A1DleYwUpA/MX4XLTOJYEkhEjdI0HyujTmOUoPzSplAPWXbR48DTtY3Pu3A/qM7A8JwPzfB37glFUAJvFFOYpg==", - "dev": true, - "requires": { - "tslib": "2.5.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@sinclair/typebox": { - "version": "0.25.21", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", - "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==", - "dev": true - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, - "@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@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 - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "devOptional": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "@types/puppeteer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-7.0.4.tgz", - "integrity": "sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==", - "dev": true, - "requires": { - "puppeteer": "*" - } - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@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 - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/superagent": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", - "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", - "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "@types/supertest": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", - "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", - "dev": true, - "requires": { - "@types/superagent": "*" - } - }, - "@types/validator": { - "version": "13.7.12", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz", - "integrity": "sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==" - }, - "@types/xml2js": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.11.tgz", - "integrity": "sha512-JdigeAKmCyoJUiQljjr7tQG3if9NkqGUgwEUqBvV0N7LM4HyQk7UXCnusRa1lnvXAEYJ8mw8GtZWioagNztOwA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.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" - } - }, - "@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "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 - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "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, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "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 - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "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 - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "babel-jest": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.1.tgz", - "integrity": "sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg==", - "dev": true, - "requires": { - "@jest/transform": "^29.4.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz", - "integrity": "sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz", - "integrity": "sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "cache-manager": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-4.1.0.tgz", - "integrity": "sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A==", - "requires": { - "async": "3.2.3", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^7.10.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001450", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", - "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - }, - "class-validator": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", - "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", - "requires": { - "@types/validator": "^13.7.10", - "libphonenumber-js": "^1.10.14", - "validator": "^13.7.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "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, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "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 - }, - "deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "dev": true - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "devtools-protocol": { - "version": "0.0.1082910", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1082910.tgz", - "integrity": "sha512-RqoZ2GmqaNxyx+99L/RemY5CkwG9D0WEfOKxekwCRXOGrDCep62ngezEJUVMq6rISYQ+085fJnWDQqGHlxVNww==" - }, - "dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true - }, - "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, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz", - "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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 - }, - "eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "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 - } - } - }, - "eslint-config-prettier": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", - "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "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, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "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 - } - } - }, - "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 - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "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, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.1.tgz", - "integrity": "sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.4.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "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 - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@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" - } - }, - "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 - }, - "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 - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "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, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "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 - }, - "fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dev": true, - "requires": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "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==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "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" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "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 - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" - }, - "jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - } - }, - "jest-changed-files": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.0.tgz", - "integrity": "sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.1.tgz", - "integrity": "sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA==", - "dev": true, - "requires": { - "@jest/environment": "^29.4.1", - "@jest/expect": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.4.1", - "jest-matcher-utils": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-runtime": "^29.4.1", - "jest-snapshot": "^29.4.1", - "jest-util": "^29.4.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-cli": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.1.tgz", - "integrity": "sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ==", - "dev": true, - "requires": { - "@jest/core": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/types": "^29.4.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.4.1", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-config": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.1.tgz", - "integrity": "sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.4.1", - "@jest/types": "^29.4.1", - "babel-jest": "^29.4.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.4.1", - "jest-environment-node": "^29.4.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.4.1", - "jest-runner": "^29.4.1", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-diff": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.1.tgz", - "integrity": "sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.4.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.1.tgz", - "integrity": "sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.4.1", - "pretty-format": "^29.4.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-environment-node": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.1.tgz", - "integrity": "sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg==", - "dev": true, - "requires": { - "@jest/environment": "^29.4.1", - "@jest/fake-timers": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "jest-mock": "^29.4.1", - "jest-util": "^29.4.1" - } - }, - "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true - }, - "jest-haste-map": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.1.tgz", - "integrity": "sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.4.1", - "jest-worker": "^29.4.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.1.tgz", - "integrity": "sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.4.1" - } - }, - "jest-matcher-utils": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz", - "integrity": "sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.4.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.4.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-message-util": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.1.tgz", - "integrity": "sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.4.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-mock": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.1.tgz", - "integrity": "sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "@types/node": "*", - "jest-util": "^29.4.1" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true - }, - "jest-resolve": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.1.tgz", - "integrity": "sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.4.1", - "jest-validate": "^29.4.1", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.1.tgz", - "integrity": "sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg==", - "dev": true, - "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.4.1" - } - }, - "jest-runner": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.1.tgz", - "integrity": "sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg==", - "dev": true, - "requires": { - "@jest/console": "^29.4.1", - "@jest/environment": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.4.1", - "jest-haste-map": "^29.4.1", - "jest-leak-detector": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-runtime": "^29.4.1", - "jest-util": "^29.4.1", - "jest-watcher": "^29.4.1", - "jest-worker": "^29.4.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "jest-runtime": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.1.tgz", - "integrity": "sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA==", - "dev": true, - "requires": { - "@jest/environment": "^29.4.1", - "@jest/fake-timers": "^29.4.1", - "@jest/globals": "^29.4.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-mock": "^29.4.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.4.1", - "jest-snapshot": "^29.4.1", - "jest-util": "^29.4.1", - "semver": "^7.3.5", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.1.tgz", - "integrity": "sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.4.1", - "@jest/transform": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.4.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.4.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.4.1", - "jest-matcher-utils": "^29.4.1", - "jest-message-util": "^29.4.1", - "jest-util": "^29.4.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.4.1", - "semver": "^7.3.5" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-util": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.1.tgz", - "integrity": "sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-validate": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.1.tgz", - "integrity": "sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw==", - "dev": true, - "requires": { - "@jest/types": "^29.4.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.4.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-watcher": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.1.tgz", - "integrity": "sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.4.1", - "@jest/types": "^29.4.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.4.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-worker": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.1.tgz", - "integrity": "sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.4.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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 - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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 - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "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, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "libphonenumber-js": { - "version": "1.10.19", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz", - "integrity": "sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "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 - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", - "dev": true - }, - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "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" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "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 - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nest-puppeteer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nest-puppeteer/-/nest-puppeteer-1.1.1.tgz", - "integrity": "sha512-kyYn4SuI9nVInEXrnf2ZMxrzRiQO6wJ5lkriaf5cODAflB/UQCNko3Cc4aqULlSW32Jfo6lErlfeU0JtCARpXg==", - "requires": {} - }, - "node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", - "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "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==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "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==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "requires": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "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==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "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 - }, - "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==" - }, - "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 - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "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 - }, - "prettier": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", - "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.1.tgz", - "integrity": "sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.4.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "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==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "puppeteer": { - "version": "19.6.3", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.6.3.tgz", - "integrity": "sha512-K03xTtGDwS6cBXX/EoqoZxglCUKcX2SLIl92fMnGMRjYpPGXoAV2yKEh3QXmXzKqfZXd8TxjjFww+tEttWv8kw==", - "requires": { - "cosmiconfig": "8.0.0", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "puppeteer-core": "19.6.3" - }, - "dependencies": { - "cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - } - } - }, - "puppeteer-core": { - "version": "19.6.3", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.6.3.tgz", - "integrity": "sha512-8MbhioSlkDaHkmolpQf9Z7ui7jplFfOFTnN8d5kPsCazRRTNIH6/bVxPskn0v5Gh9oqOBlknw0eHH0/OBQAxpQ==", - "requires": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.1082910", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.11.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "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==" - }, - "resolve.exports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", - "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.1.2.tgz", - "integrity": "sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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 - } - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "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, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "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 - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "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 - }, - "superagent": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", - "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "dependencies": { - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - } - } - }, - "supertest": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", - "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^8.0.5" - } - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "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 - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - } - }, - "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz", - "integrity": "sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==", - "dev": true, - "requires": { - "json5": "^2.2.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "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 - } - } - }, - "tsconfig-paths-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "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, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "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 - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "uid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.1.tgz", - "integrity": "sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==", - "requires": { - "@lukeed/csprng": "^1.0.0" - } - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "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==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "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==" - }, - "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "requires": { - "execa": "^4.0.2" - }, - "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - } - } - }, - "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 - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "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==" - } - } -} diff --git a/api/package.json b/api/package.json deleted file mode 100644 index aa44bf5..0000000 --- a/api/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "oscar-weather", - "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", - "scripts": { - "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "start": "nest start", - "start:dev": "nest start --watch", - "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" - }, - "dependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0", - "@nestjs/platform-express": "^9.0.0", - "@nestjs/serve-static": "^3.0.0", - "cache-manager": "^4.1.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "nest-puppeteer": "^1.1.1", - "p-limit": "^3.1.0", - "puppeteer": "^19.6.3", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.2.0", - "xml2js": "^0.4.23" - }, - "devDependencies": { - "@nestjs/cli": "^9.0.0", - "@nestjs/schematics": "^9.0.0", - "@nestjs/testing": "^9.0.0", - "@types/express": "^4.17.13", - "@types/jest": "29.2.4", - "@types/node": "18.11.18", - "@types/puppeteer": "^7.0.4", - "@types/supertest": "^2.0.11", - "@types/xml2js": "^0.4.11", - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^8.0.1", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "jest": "29.3.1", - "prettier": "^2.3.2", - "source-map-support": "^0.5.20", - "supertest": "^6.1.3", - "ts-jest": "29.0.3", - "ts-loader": "^9.2.3", - "ts-node": "^10.0.0", - "tsconfig-paths": "4.1.1", - "typescript": "^4.7.4" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - } -} diff --git a/api/src/alerts/alerts.controller.ts b/api/src/alerts/alerts.controller.ts deleted file mode 100644 index e520131..0000000 --- a/api/src/alerts/alerts.controller.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - CacheInterceptor, - CacheTTL, - Controller, - Get, - Query, - UseInterceptors, -} from '@nestjs/common'; -import { AlertsService } from './alerts.service'; -import { LocationDto } from './dto/location.dto'; - -@Controller('alerts') -@UseInterceptors(CacheInterceptor) -export class AlertsController { - constructor(private readonly alertsService: AlertsService) {} - - @Get() - @CacheTTL(60) - getAlerts(@Query() location: LocationDto) { - return this.alertsService.getAlerts(location); - } -} diff --git a/api/src/alerts/alerts.module.ts b/api/src/alerts/alerts.module.ts deleted file mode 100644 index ff72554..0000000 --- a/api/src/alerts/alerts.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AlertsService } from './alerts.service'; -import { AlertsController } from './alerts.controller'; -@Module({ - imports: [], - controllers: [AlertsController], - providers: [AlertsService], -}) -export class AlertsModule {} diff --git a/api/src/alerts/alerts.service.ts b/api/src/alerts/alerts.service.ts deleted file mode 100644 index 2d39cca..0000000 --- a/api/src/alerts/alerts.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { LocationDto } from './dto/location.dto'; -import fetch from 'node-fetch'; - -type Alert = { - warnId: string; - type: number; - level: number; - start: number; - end: number; - bn: boolean; - instruction: string; - description: string; - descriptionText: string; - event: string; - headline: string; -}; - -@Injectable() -export class AlertsService { - async getAlerts(location: LocationDto): Promise { - const alertResponse = await fetch( - `https://maps.dwd.de/geoserver/dwd/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=dwd:Warnungen_Gemeinden&outputFormat=application%2Fjson&CQL_FILTER=CONTAINS(THE_GEOM,%20POINT(${location.lon}%20${location.lat}))`, - ); - const alerts: any = await alertResponse.json(); - const warnings = []; - for (const id in alerts.features) { - warnings.push({ - warnId: alerts.features[id].properties.IDENTIFIER, - type: 0, - level: 0, - start: new Date(alerts.features[id].properties.ONSET).getTime(), - end: new Date(alerts.features[id].properties.EXPIRES).getTime(), - bn: false, - instruction: alerts.features[id].properties.INSTRUCTION - ? alerts.features[id].properties.INSTRUCTION - : '', - description: alerts.features[id].properties.DESCRIPTION, - descriptionText: alerts.features[id].properties.DESCRIPTION, - event: alerts.features[id].properties.EVENT, - headline: alerts.features[id].properties.HEADLINE, - }); - } - return warnings; - } -} diff --git a/api/src/alerts/dto/location.dto.ts b/api/src/alerts/dto/location.dto.ts deleted file mode 100644 index f188ad9..0000000 --- a/api/src/alerts/dto/location.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Type } from 'class-transformer'; -import { IsNumber, IsString } from 'class-validator'; -export class LocationDto { - @IsNumber() - @Type(() => Number) - lat: number; - - @IsNumber() - @Type(() => Number) - lon: number; -} diff --git a/api/src/app.module.ts b/api/src/app.module.ts deleted file mode 100644 index c169b27..0000000 --- a/api/src/app.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { CacheModule, Module } from '@nestjs/common'; -import { AlertsModule } from './alerts/alerts.module'; -import { RainModule } from './rain/rain.module'; -import { MapshotsModule } from './mapshots/mapshots.module'; -import { ServeStaticModule } from '@nestjs/serve-static'; -import { join } from 'path'; - -@Module({ - imports: [ - AlertsModule, - RainModule, - MapshotsModule, - CacheModule.register({ isGlobal: true }), - ServeStaticModule.forRoot({ - rootPath: join(__dirname, '..', 'www'), - }), - ], -}) -export class AppModule {} diff --git a/api/src/main.ts b/api/src/main.ts deleted file mode 100644 index 26c3db2..0000000 --- a/api/src/main.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; -import { ValidationPipe } from '@nestjs/common'; - -async function bootstrap() { - const app = await NestFactory.create(AppModule); - app.useGlobalPipes(new ValidationPipe({ transform: true })); - app.setGlobalPrefix('api/v1'); - await app.listen(8080); -} -bootstrap(); diff --git a/api/src/mapshots/mapshots.controller.ts b/api/src/mapshots/mapshots.controller.ts deleted file mode 100644 index 6f07486..0000000 --- a/api/src/mapshots/mapshots.controller.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - CacheInterceptor, - CacheTTL, - Controller, - Get, - Header, - Query, - Res, - StreamableFile, - UseInterceptors, -} from '@nestjs/common'; -import { MapshotsService } from './mapshots.service'; -import { Response } from 'express'; -import { LocationDto } from '../alerts/dto/location.dto'; - -@Controller('mapshots') -export class MapshotsController { - constructor(private readonly mapshotsService: MapshotsService) {} - - @Get('radar') - @Header('Content-Type', 'image/jpeg') - async getMapshot( - @Res({ passthrough: true }) res: Response, - @Query() location: LocationDto, - ) { - const image = await this.mapshotsService.getMapshot(location); - res.set({ - 'Content-Type': 'image/jpeg', - }); - return new StreamableFile(image); - } -} diff --git a/api/src/mapshots/mapshots.module.ts b/api/src/mapshots/mapshots.module.ts deleted file mode 100644 index 69367dd..0000000 --- a/api/src/mapshots/mapshots.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { PuppeteerModule } from 'nest-puppeteer'; -import { MapshotsController } from './mapshots.controller'; -import { MapshotsService } from './mapshots.service'; - -@Module({ - imports: [PuppeteerModule.forRoot()], - controllers: [MapshotsController], - providers: [MapshotsService], -}) -export class MapshotsModule {} diff --git a/api/src/mapshots/mapshots.service.ts b/api/src/mapshots/mapshots.service.ts deleted file mode 100644 index 60ff438..0000000 --- a/api/src/mapshots/mapshots.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common'; -import { InjectContext } from 'nest-puppeteer'; -import type { BrowserContext } from 'puppeteer'; -import { LocationDto } from '../alerts/dto/location.dto'; -import { Cache } from 'cache-manager'; - -@Injectable() -export class MapshotsService { - constructor( - @InjectContext() private readonly browserContext: BrowserContext, - @Inject(CACHE_MANAGER) private cacheManager: Cache, - ) {} - async getMapshot(location: LocationDto): Promise { - const cached = await this.cacheManager.get( - `mapshot-${location.lat.toFixed(2)}-${location.lon.toFixed(2)}`, - ); - if (cached) { - return cached; - } - const page = await this.browserContext.newPage(); - await page.setViewport({ width: 512, height: 512 }); - await page.goto( - `http://localhost:8080/index.html?lat=${location.lat}&lon=${location.lon}&map=6`, - { waitUntil: 'networkidle2' }, - ); - const mapshot = await page.screenshot({ type: 'jpeg', quality: 80 }); - await new Promise((resolve) => setTimeout(resolve, 500)); - page.close(); - await this.cacheManager.set( - `mapshot-${location.lat.toFixed(2)}-${location.lon.toFixed(2)}`, - mapshot, - 60, - ); - return mapshot; - } -} diff --git a/api/src/rain/rain.controller.ts b/api/src/rain/rain.controller.ts deleted file mode 100644 index 5bd0b95..0000000 --- a/api/src/rain/rain.controller.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - CacheInterceptor, - CacheTTL, - Controller, - Get, - Query, - UseInterceptors, -} from '@nestjs/common'; -import { LocationDto } from '../alerts/dto/location.dto'; -import { RainService } from './rain.service'; - -@Controller('rain') -@UseInterceptors(CacheInterceptor) -export class RainController { - constructor(private readonly rainService: RainService) {} - - @Get() - @CacheTTL(60) - getRain(@Query() location: LocationDto) { - return this.rainService.getRainForecast(location); - } -} diff --git a/api/src/rain/rain.module.ts b/api/src/rain/rain.module.ts deleted file mode 100644 index 6f460a7..0000000 --- a/api/src/rain/rain.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { RainService } from './rain.service'; -import { RainController } from './rain.controller'; - -@Module({ - imports: [], - controllers: [RainController], - providers: [RainService], -}) -export class RainModule {} diff --git a/api/src/rain/rain.service.ts b/api/src/rain/rain.service.ts deleted file mode 100644 index c253135..0000000 --- a/api/src/rain/rain.service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { LocationDto } from '../alerts/dto/location.dto'; -import fetch from 'node-fetch'; -import { parseStringPromise } from 'xml2js'; -import * as pLimit from 'p-limit'; - -@Injectable() -export class RainService { - async getRainForecast(location: LocationDto): Promise { - // get capabilities for dwd:Niederschlagsradar - const capabilitiesResponse = await fetch( - 'https://maps.dwd.de/geoserver/dwd/Niederschlagsradar/wms?REQUEST=GetCapabilities&SERVICE=WMS&VERSION=1.3.0', - ); - const capabilities: any = await capabilitiesResponse.text(); - const parsedCapabilites = await parseStringPromise(capabilities); - - const [startTimestamp, endTimestamp] = - parsedCapabilites.WMS_Capabilities.Capability[0].Layer[0].Layer[0].Layer[0].Layer[0].Layer[0].Dimension[0][ - '_' - ].split('/'); - - // fetch current gray index - const lon1 = location.lon - 0.001; - const lat1 = location.lat - 0.001; - const lon2 = location.lon + 0.001; - const lat2 = location.lat + 0.001; - const url = `https://maps.dwd.de/geoserver/dwd/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&QUERY_LAYERS=dwd:Niederschlagsradar&STYLES&LAYERS=dwd:Niederschlagsradar&INFO_FORMAT=application/json&FEATURE_COUNT=50&X=50&Y=50&SRS=EPSG:4326&WIDTH=101&HEIGHT=101&BBOX=${lon1},${lat1},${lon2},${lat2}`; - const grayIndexResponse = await fetch(url); - const currentGrayIndex: any = await grayIndexResponse.json(); - - if (currentGrayIndex.features.length === 0) { - return { data: [] }; - } - - // generate dwd URLs for each timestamp between current time and endTimestamp in 5 minute steps - const urls = []; - const time = new Date(currentGrayIndex.features[0].properties.TIME); - while ( - time.getTime() <= new Date(endTimestamp).getTime() && - urls.length < 13 - ) { - urls.push( - `https://maps.dwd.de/geoserver/dwd/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&QUERY_LAYERS=dwd:Niederschlagsradar&STYLES&LAYERS=dwd:Niederschlagsradar&INFO_FORMAT=application/json&FEATURE_COUNT=50&X=50&Y=50&SRS=EPSG:4326&WIDTH=101&HEIGHT=101&BBOX=${lon1},${lat1},${lon2},${lat2}&TIME=${time.toISOString()}`, - ); - time.setMinutes(time.getMinutes() + 5); - } - - // fetch all urls and get the GRAY_INDEX from each json response - const limit = pLimit(5); - const grayIndexValues = await Promise.allSettled( - urls.map(async (url) => { - const grayIndexResponse = await limit(() => fetch(url)); - const grayIndex: any = await grayIndexResponse.json(); - return { - time: grayIndex.features[0].properties.TIME, - mmh: grayIndex.features[0].properties.GRAY_INDEX * 10, - }; - }), - ); - - const filteredValue = grayIndexValues - .filter((value) => value.status === 'fulfilled') - .map((value: any) => value.value); - - return { data: filteredValue }; - } -} diff --git a/api/test/app.e2e-spec.ts b/api/test/app.e2e-spec.ts deleted file mode 100644 index 50cda62..0000000 --- a/api/test/app.e2e-spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; -import { AppModule } from './../src/app.module'; - -describe('AppController (e2e)', () => { - let app: INestApplication; - - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], - }).compile(); - - app = moduleFixture.createNestApplication(); - await app.init(); - }); - - it('/ (GET)', () => { - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); - }); -}); diff --git a/api/test/jest-e2e.json b/api/test/jest-e2e.json deleted file mode 100644 index e9d912f..0000000 --- a/api/test/jest-e2e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } -} diff --git a/api/tsconfig.build.json b/api/tsconfig.build.json deleted file mode 100644 index 64f86c6..0000000 --- a/api/tsconfig.build.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] -} diff --git a/api/tsconfig.json b/api/tsconfig.json deleted file mode 100644 index adb614c..0000000 --- a/api/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "declaration": true, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "target": "es2017", - "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", - "incremental": true, - "skipLibCheck": true, - "strictNullChecks": false, - "noImplicitAny": false, - "strictBindCallApply": false, - "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": false - } -} diff --git a/api/www/index.html b/api/www/index.html deleted file mode 100644 index bf9f4ec..0000000 --- a/api/www/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - Map - - - - - - - - -
- - - diff --git a/ci_scripts/ci_post_clone.sh b/ci_scripts/ci_post_clone.sh new file mode 100755 index 0000000..c843784 --- /dev/null +++ b/ci_scripts/ci_post_clone.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES diff --git a/ci_scripts/ci_post_xcodebuild.sh b/ci_scripts/ci_post_xcodebuild.sh new file mode 100755 index 0000000..73f2931 --- /dev/null +++ b/ci_scripts/ci_post_xcodebuild.sh @@ -0,0 +1,21 @@ +set -e + +if [ ! -d "$CI_ARCHIVE_PATH" ]; then + echo "Archive does not exist, skipping Sentry upload" + exit 0 +fi + +# This is necessary in order to have sentry-cli +# install locally into the current directory +export INSTALL_DIR=$PWD + +if [[ $(command -v sentry-cli) == "" ]]; then + echo "Installing Sentry CLI" + curl -sL https://sentry.io/get-cli/ | bash +fi + +echo "Authenticate to Sentry" +$CI_PRIMARY_REPOSITORY_PATH/ci_scripts/sentry-cli login --auth-token $SENTRY_AUTH_TOKEN + +echo "Uploading dSYM to Sentry" +$CI_PRIMARY_REPOSITORY_PATH/ci_scripts/sentry-cli debug-files upload --include-sources -o 'philipp-bolte' -p 'oscar' $CI_ARCHIVE_PATH